mysql 8.0+通过alter user启用密码过期策略,如alter user 'app_user'@'%' password expire interval 90 day;全局策略default_password_lifetime需分层控制,避免影响线上服务。

MySQL 8.0+ 如何启用密码过期策略
MySQL 8.0 起原生支持密码过期,但默认关闭。关键不是“能不能设”,而是“设了会不会让应用连不上”。ALTER USER 是唯一推荐方式,SET PASSWORD 在 8.0.19+ 已弃用且不触发过期逻辑。
-
ALTER USER 'app_user'@'%' PASSWORD EXPIRE INTERVAL 90 DAY:强制 90 天后必须改密 -
ALTER USER 'app_user'@'%' PASSWORD EXPIRE NEVER:取消过期(适合服务账号) - 对已存在用户生效立即,无需重启 MySQL
- 注意:
PASSWORD EXPIRE DEFAULT会继承全局策略,别乱用
全局密码过期策略怎么配才不影响线上服务
全局策略(default_password_lifetime)是双刃剑:设得太短,批量用户突然无法登录;设为 0 表示永不过期,但失去安全兜底。生产环境建议分层控制。
- 先查现状:
SELECT @@default_password_lifetime,多数新装实例返回 0(永不过期) - 如需统一管控,设为非零值(如 180),但必须同步检查所有连接池配置是否支持自动重连+重认证
- Java 应用用 HikariCP 需确认
connection-init-sql或datasource-properties是否兼容密码变更流程 - 严禁在高峰期执行
SET PERSIST default_password_lifetime = 30,PERSIST 会写入mysqld-auto.cnf,重启即生效,容易遗漏
密码过期后用户连不上,错误信息怎么看
不是所有报错都叫“密码过期”。真正由过期触发的只有明确含 ERROR 1820 (HY000) 的提示,其他类似“Access denied”大概率是权限或账号锁定问题。
- 典型错误:
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement. - 此时用户只能执行
ALTER USER USER() IDENTIFIED BY 'newpass',其他任何操作(包括SELECT 1)都会被拒 - 如果看到
ERROR 1045 (28000),优先查mysql.user表里password_expired字段是否为'Y',别急着重置密码 - 监控脚本里建议加一条:
SELECT user, host, password_expired FROM mysql.user WHERE password_expired = 'Y'
MySQL 5.7 怎么模拟密码过期效果
5.7 没有原生过期字段,硬要实现只能靠外部机制,但要注意别引入单点故障或误杀。
- 禁止用定时任务删用户或改空密码——应用连接池可能缓存旧凭证,导致雪崩式重连失败
- 较稳妥的方式:在应用层拦截登录请求,查自建的
user_password_policy表判断是否超期,再跳转改密页 - 若必须数据库侧控制,可用
CREATE EVENT定期把超期用户ACCOUNT LOCK,但锁账户比过期更暴力,解锁需 DBA 干预 - 特别注意:
FLUSH PRIVILEGES不影响已存在的连接,已连上的会话仍可操作,直到断开重连
ERROR 1820 是不是真的来自密码过期。











