
MySQL 8.0+ 怎么让密码 90 天自动过期
直接改系统变量 default_password_lifetime 就行,它控制所有新用户的默认过期天数。设为 90,新创建的用户密码就 90 天后强制重置。
注意:这个变量只影响「后续新建的用户」,对已有用户不生效。想批量改老用户,得单独执行 ALTER USER。
- 全局设置(重启后仍生效):
SET PERSIST default_password_lifetime = 90;
- 临时设置(重启失效):
SET GLOBAL default_password_lifetime = 90;
- 查看当前值:
SELECT @@global.default_password_lifetime;
已有用户怎么单独设置密码过期时间
用 ALTER USER 显式指定,比依赖全局变量更可控。比如让运维账号必须 30 天换一次:
ALTER USER 'admin'@'%' PASSWORD EXPIRE INTERVAL 30 DAY;
- 永久不过期:
ALTER USER 'backup'@'localhost' PASSWORD EXPIRE NEVER;
- 立即过期(下次登录强制改):
ALTER USER 'temp'@'%' PASSWORD EXPIRE;
错误现象:如果误写成 PASSWORD EXPIRE DEFAULT,会继承 default_password_lifetime 的值,而不是“不过期”——这是常见误解点。
密码过期后用户还能不能连上 MySQL
能连上,但只能执行有限命令:仅 SET、UNLOCK TABLES、SELECT(只读),以及 ALTER USER ... IDENTIFIED BY 这类改密操作。其他任何 DML 或 DDL 都报错:ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
所以别指望靠过期机制“锁死”账号访问,它本质是提醒+轻量拦截,不是访问控制手段。
- 客户端行为差异:MySQL Shell 会自动提示改密流程;而老版本
mysql命令行可能卡在报错里,需手动输ALTER USER才能继续 - 应用连接池要注意:过期后首次查询失败,若没捕获该错误码,可能持续报错或连接泄漏
MySQL 5.7 怎么实现类似效果
5.7 没有 default_password_lifetime,也不支持 PASSWORD EXPIRE 语法,只能靠外部手段模拟:
- 用
CREATE USER ... PASSWORD EXPIRE(5.7.11+ 支持)创建时即过期,但无法设具体天数 - 定期跑脚本查
mysql.user表的password_last_changed字段,结合业务逻辑发告警或调用ALTER USER ... PASSWORD EXPIRE - 升级到 8.0 是最省事的解法——5.7 的“过期”只是个开关,没有生命周期管理能力
兼容性坑:5.7 升级到 8.0 后,原有用户默认继承 default_password_lifetime = 0(永不过期),不会突然变过期,但新用户行为就按 8.0 规则走了。
真正容易被忽略的是:密码过期策略和认证插件强相关。如果用户用了 caching_sha2_password(8.0 默认),过期逻辑走通;但换成 mysql_native_password,某些旧客户端握手阶段就可能失败,不是等登录后再报过期——这点调试起来很隐蔽。











