default_password_lifetime仅影响新建用户,对已有用户无效;需用alter user显式设置现有用户过期策略,如password expire interval 90 day或password expire never。

直接改 default_password_lifetime 只影响后续新建的用户,对已有账号完全无效——别指望它批量“激活”老用户的过期逻辑。
为什么改了 default_password_lifetime 却没效果
这个变量只是新用户的“出厂设置”,不是全局开关。比如你执行 SET PERSIST default_password_lifetime = 90,之后用 CREATE USER 'newuser'@'localhost' 创建的账号,password_lifetime 字段才会是 90;但 'olduser'@'%' 的过期时间仍由它自己被 ALTER USER 设置过的值决定,哪怕你刚重启 MySQL 也一样。
常见错误现象:
- 设完
default_password_lifetime = 30,立刻去查SELECT user, host, password_lifetime FROM mysql.user,发现老用户全是NULL或0—— 这是正常表现,不是配置失败 - 误以为设成
0就等于“关闭策略”,其实它只表示“新用户默认永不过期”,已有用户该过期还是过期
default_password_lifetime 的生效方式和风险点
它有两种设置路径,行为差异很大:
-
SET GLOBAL default_password_lifetime = N:仅当前运行周期有效,MySQL 重启后恢复原值 -
SET PERSIST default_password_lifetime = N:写入mysqld-auto.cnf,重启后仍生效 —— 但生产环境严禁在高峰期执行,容易遗漏导致连锁故障 - 写进
my.cnf的[mysqld]段:需重启 MySQL 才加载,适合长期稳定策略
性能上无开销,但要注意兼容性:default_password_lifetime = DEFAULT(即 NULL)在 8.0.19+ 默认解析为 0,而更早版本可能按 365 处理,升级前务必验证。
将 LaTeX(.tex)学术论文转换为 Word(.docx),支持可编辑的 OMML 公式、原生 Word 表格、嵌入图形、IEEE 双栏排版及参考文献
已有用户怎么真正启用过期策略
必须逐个执行 ALTER USER,没有捷径。例如:
- 让运维账号 30 天后强制改密:
ALTER USER 'dba'@'%' PASSWORD EXPIRE INTERVAL 30 DAY - 让服务账号永不过期(避免应用中断):
ALTER USER 'app_rw'@'10.%.%.%' PASSWORD EXPIRE NEVER - 立即触发过期(用于临时权限回收):
ALTER USER 'temp_dev'@'localhost' PASSWORD EXPIRE
注意:SET PASSWORD 在 8.0.19+ 已弃用,且不会更新 password_expired 字段;只有 ALTER USER 能同时改密码哈希和元数据标记。
密码过期后用户连不上,到底该执行什么语句
看到 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement 时,唯一合法操作是:
- 用该用户身份登录(带
--connect-expired-password参数),然后执行:ALTER USER USER() IDENTIFIED BY 'newpass' - 不能用
SET PASSWORD = 'xxx',也不能用ALTER USER 'xxx'@'yyy' IDENTIFIED BY(除非你有 SUPER 权限且知道目标账号) - 连接池类应用(如 HikariCP)需确认是否支持自动重连 + 密码重认证流程,否则会持续报错
真正容易被忽略的是:过期状态只在用户**成功认证后的第一条非 SET 类语句**时拦截,空闲长连接不会被主动踢出,也不会提前预警 —— 它不发邮件、不记日志、不触发监控,全靠你主动查 mysql.user 表里的 password_expired 字段。










