MySQL 8.0+ 默认密码永不过期(default_password_lifetime = 0),该值仅影响新用户,已有用户需用ALTER USER单独设置;查看用SELECT @@default_password_lifetime;,设为0禁用,正整数启用全局过期策略。

MySQL 8.0+ 默认密码永不过期(default_password_lifetime = 0),改这个参数才能启用全局过期策略,但仅影响新创建用户;已有用户不受影响,必须单独用 ALTER USER 设置。
查看当前全局密码过期设置
直接查变量最准,别猜配置文件有没有生效:
SELECT @@default_password_lifetime;
返回 0 表示禁用(永不过期),返回数字(如 90)表示新用户默认 90 天后密码过期。注意:该值不追溯已存在用户,也不影响 CREATE USER 时显式指定 PASSWORD EXPIRE 的行为。
运行时修改 default_password_lifetime
临时生效,MySQL 重启后丢失,适合测试或紧急调整:
- 执行
SET GLOBAL default_password_lifetime = 180;—— 新建用户默认 180 天过期 - 执行
SET GLOBAL default_password_lifetime = 0;—— 关闭全局过期(推荐生产环境默认值) - 必须有
SUPER或SYSTEM_VARIABLES_ADMIN权限 - 普通账号执行会报错:
ERROR 1227 (42501): Access denied; you need ... privilege(s)...
永久生效:写入配置文件
编辑 my.cnf(Linux/macOS)或 my.ini(Windows),在 [mysqld] 段落下添加:
Word报告自动生成神器。自动生成专业Word文档报告,支持模板填充、目录生成、表格/图表插入、页眉页脚、多级标题、样式主题、批量邮件合并。当用户需要生成Word报告、创建合同文档、批量生成通知/证书、填充Word模板、制作商业计划书时触发。
[mysqld] default_password_lifetime = 90
然后重启 MySQL 服务才生效。注意:
- Windows 下文件编码必须是 ANSI/GBK,不能是 UTF-8 BOM,否则启动失败报错:
Found option without preceding group - 修改后务必验证:
SELECT @@default_password_lifetime;确认读取的是配置值,不是旧缓存 - 如果启用了
skip-grant-tables,该参数会被忽略
为什么改了参数,老用户还是没过期?
这是最容易踩的坑:default_password_lifetime 只控制「新用户」的默认行为。已有用户(包括 root)的过期状态完全独立:
- 新建用户自动继承该值,等效于隐式加了
PASSWORD EXPIRE INTERVAL 90 DAY - 老用户仍按创建时或上次
ALTER USER ... PASSWORD EXPIRE设置的状态走 - 想让
root也 90 天过期?必须显式执行:ALTER USER 'root'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY; - 想批量处理?得自己写脚本查
mysql.user表 + 循环ALTER USER
真正要落地密码策略,default_password_lifetime 只是半截路,另一半一定得靠 ALTER USER 覆盖存量账号——这点常被运维忽略,直到某天 root 登录报 Your password has expired 才发现没生效。










