MySQL 8.0密码过期策略不能仅靠default_password_lifetime全局生效,该参数仅影响新用户,默认值0表示永不过期;已有用户必须用ALTER USER单独设置,如PASSWORD EXPIRE INTERVAL 90 DAY或NEVER。

MySQL 8.0 的密码过期策略不能靠改一个参数就全局生效,default_password_lifetime 只影响新用户,默认值是 0(永不过期),对已有用户完全无效——这是最常被误判为“已配置成功”却实际没起作用的点。
为什么设了 default_password_lifetime 却没效果
这个变量只是新建用户的“出厂设置”,不是开关。比如你执行 SET PERSIST default_password_lifetime = 90,之后用 CREATE USER 'new'@'localhost' 创建的账号才会默认 90 天后过期;但 'root'@'localhost'、'admin'@'%' 这些老用户依然按自己原有的 password_lifetime 值走,哪怕刚重启 MySQL 也一样。
- 查当前运行值:执行
SELECT @@global.default_password_lifetime;,返回0表示禁用,正整数才表示新用户默认天数 - 返回
NULL说明变量未初始化,行为等同于0 -
SET GLOBAL是临时生效,重启丢失;SET PERSIST写入mysqld-auto.cnf,推荐但需SYSTEM_VARIABLES_ADMIN权限 - 写进
my.cnf的[mysqld]段要重启 MySQL 才加载,适合长期策略
怎么让已有用户真正启用过期策略
必须逐个执行 ALTER USER,没有批量语法,也不能靠更新 mysql.user 表。
- 立即过期(用于临时回收权限):
ALTER USER 'dev'@'localhost' PASSWORD EXPIRE; - 90 天后过期:
ALTER USER 'admin'@'%' PASSWORD EXPIRE INTERVAL 90 DAY; - 取消过期(如服务账号):
ALTER USER 'app_rw'@'10.%.%.%' PASSWORD EXPIRE NEVER; - 别用
SET PASSWORD FOR 'u'@'h' = 'xxx'—— 它不更新password_expired字段,也不触发校验逻辑 - 查哪些用户需要处理:
SELECT user, host FROM mysql.user WHERE password_last_changed IS NOT NULL;(排除空密码或匿名账户)
密码过期后用户还能做什么
能登录,但几乎不能执行任何业务语句。首次执行非 SET 类命令(比如 SELECT 1;、SHOW TABLES;)就会报错:
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
允许的操作极少:
-
SET类命令(如SET NAMES utf8mb4) -
SELECT 1这种无表查询(仅限部分版本,不可依赖) - 有
ALTER USER权限的用户可跳过重置流程,这点容易被忽略
怎么验证策略是否真起效
别只看 password_expired = 'Y',那只是显式设为过期的状态快照,不代表“已超期”。真实超期要靠计算:
- 查自动超期用户(含已过期 + 7 天内将过期):
SELECT user, host, password_last_changed, TIMESTAMPADD(DAY, @@default_password_lifetime, password_last_changed) AS expires_at FROM mysql.user WHERE password_last_changed IS NOT NULL AND @@default_password_lifetime > 0 AND TIMESTAMPADD(DAY, @@default_password_lifetime, password_last_changed) - 最简验证方式:用目标用户登录后立刻执行
SELECT 1;,报ERROR 1820才算真正生效 -
password_last_changed是 UTC 时间,和本地时区无关
真正麻烦的地方不在配置本身,而在于:老用户必须手动覆盖、password_expired 字段只是结果不是开关、过期后的行为限制比想象中更严格——连 SHOW DATABASES 都可能被拦住。别等审计前夜才发现 root 账号根本没法登录。


















