default_password_lifetime是mysql 5.7.4+控制新建用户默认密码有效期的全局变量,仅对新创建用户生效,不影响已有用户;需用alter user显式设置现有用户过期策略。

default_password_lifetime 是什么,为什么它不生效
default_password_lifetime 是 MySQL 5.7.4+ 引入的全局系统变量,控制新创建账户的默认密码有效期(单位:天)。但它只影响「新建用户」,对已存在用户完全无作用——这是最常被误解的一点。
常见错误现象:SET GLOBAL default_password_lifetime = 90; 执行成功,但已有用户登录时毫无提示,也不强制改密。
- 必须配合
CREATE USER或ALTER USER显式设置单个用户的密码策略 - MySQL 8.0.19+ 开始,
default_password_lifetime默认值从 0(永不过期)改为 360(360 天),但仅对后续新建用户生效 - 如果设为 0,表示该用户密码永不过期;设为 NULL 表示继承全局值
如何给现有用户设置密码过期(ALTER USER 用法)
给已有用户启用密码过期,不能靠改全局变量,必须用 ALTER USER 显式指定。这是唯一可靠的方式。
使用场景:运维批量加固账号、合规审计要求定期换密、测试环境模拟过期流程。
-
ALTER USER 'app_user'@'%' PASSWORD EXPIRE;—— 立即过期,下次登录强制改密 -
ALTER USER 'app_user'@'%' PASSWORD EXPIRE INTERVAL 180 DAY;—— 180 天后过期 -
ALTER USER 'app_user'@'%' PASSWORD EXPIRE NEVER;—— 取消过期(注意不是DEFAULT) - 执行后无需重启 MySQL,立即生效;但用户当前连接不受影响,仅下次认证时触发
查看用户是否启用了密码过期及剩余天数
MySQL 不提供直接查“还剩几天过期”的字段,但可通过 mysql.user 表或 SHOW CREATE USER 推断状态。
关键判断依据是 password_expired 字段和 password_last_changed 时间戳。
SELECT user, host, password_expired, password_last_changed FROM mysql.user WHERE user = 'app_user';-
SHOW CREATE USER 'app_user'@'%';—— 输出中若含PASSWORD EXPIRE或PASSWORD EXPIRE INTERVAL即表示已配置 - 注意:
password_last_changed是 UTC 时间,需结合default_password_lifetime手动计算剩余天数(MySQL 不自动算) - MySQL 8.0.19+ 新增
password_reuse_history和password_reuse_time,但和过期无关,别混淆
密码过期策略在主从/集群中的行为差异
密码过期是用户元数据的一部分,会随 DDL 同步到从库,但同步时机和权限有细节坑。
使用场景:高可用集群中统一管控账号生命周期、避免主库过期后从库仍能登录。
-
ALTER USER ... PASSWORD EXPIRE是 DDL,会写入 binlog,从库回放后同样生效 - 但如果从库开启了
read_only=ON,且操作用户没有SUPER权限,ALTER USER会在从库报错:ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement - 解决办法:要么临时关闭
read_only(不推荐),要么在从库上单独执行相同ALTER USER(需有权限) - ProxySQL、MHA 等中间件不感知密码过期逻辑,不会拦截或提示,客户端直连才触发
default_password_lifetime 对老用户完全无效,以及 password_last_changed 不自动刷新——比如用户用 SET PASSWORD 改密,这个字段不会更新,得靠 ALTER USER ... IDENTIFIED BY 或认证插件触发。这点容易漏测。











