MySQL 8.0.12+ 支持密码过期策略,需用ALTER USER设置,phpMyAdmin不提供图形化配置;全局default_password_lifetime可设默认值,但单用户策略优先级更高。
MySQL 8.0+ 用户密码过期策略怎么配
phpmyadmin 本身不管理密码有效期,它只是个 web 界面;真正起作用的是 mysql 服务器端的 alter user 语句。如果你用的是 mysql 5.7 或更低版本,这个功能压根不存在——直接跳过后续步骤。
实操前先确认版本:SELECT VERSION();。只有 8.0.12 及以上才支持细粒度的密码过期控制(比如精确到天数、允许延期等)。
- 设置用户 90 天后强制改密:
ALTER USER 'username'@'host' PASSWORD EXPIRE INTERVAL 90 DAY; - 让密码永不过期:
ALTER USER 'username'@'host' PASSWORD EXPIRE NEVER; - 立即强制下次登录改密:
ALTER USER 'username'@'host' PASSWORD EXPIRE DEFAULT;(注意:DEFAULT 表示使用全局策略,不是“不生效”) - 查看当前用户的过期状态:
SELECT user, host, password_expired FROM mysql.user WHERE user = 'username';
phpMyAdmin 里点哪里都找不到「密码有效期」选项
这是正常现象。phpMyAdmin 的「用户账户」页面只暴露了最基础的权限和主机限制,PASSWORD EXPIRE 属于 DDL 级别操作,不在它的图形界面覆盖范围内。
你有两个选择:
- 在 phpMyAdmin 的「SQL」标签页中手动执行
ALTER USER语句(确保你有CREATE USER或ALTER USER权限) - 用命令行 MySQL 客户端操作,更稳妥(尤其当 phpMyAdmin 运行在低权限账户下时)
别试图在「编辑用户」表单里找隐藏字段——它真没有。强行改 mysql.user 表的 password_expired 字段属于危险直写,MySQL 不保证一致性,且重启后可能被重置。
立即学习“PHP免费学习笔记(深入)”;
密码过期后用户连不上,但错误信息很模糊
典型报错是:ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.,但有时只显示 Access denied,没提密码过期。
原因在于客户端行为差异:
- MySQL 命令行客户端会明确提示改密要求
- PHP 的
mysqli或PDO默认静默失败,需开启MYSQLI_REPORT_STRICT或捕获异常中的 SQLSTATEHY000才能看到真实原因 - 某些旧版连接池(如 PMA 自带的)可能缓存了过期凭据,导致反复重试失败
验证是否卡在过期环节,最简单方法是用 root 登录后执行:SELECT COUNT(*) FROM mysql.user WHERE password_expired = 'Y';
全局策略 vs 单用户策略,哪个优先级高
default_password_lifetime 是全局开关,但单用户 PASSWORD EXPIRE 设置永远优先生效。也就是说,即使你把全局设成 0(永不过期),只要对某个用户显式执行了 PASSWORD EXPIRE INTERVAL 30 DAY,他照样 30 天后被锁。
查看当前全局值:SHOW VARIABLES LIKE 'default_password_lifetime';
- 值为
0:所有用户默认永不过期(除非单独设置) - 值为
60:新创建用户默认 60 天过期,已有用户不受影响 - 修改全局策略需 SUPER 权限:
SET PERSIST default_password_lifetime = 90;(MySQL 8.0.22+ 推荐用PERSIST,避免重启失效)
真正容易被忽略的是:密码过期不会自动禁用账号,而是让认证通过后立刻进入「必须改密」状态;用户仍能连上,但第一条非 ALTER USER 语句就会报错。这点和操作系统账户锁定逻辑完全不同。











