mysql 8.0+通过alter user 'user'@'host' password expire interval 90 day启用密码90天强制更换,仅8.0.12+稳定支持;全局默认策略用set persist default_password_lifetime = 90配置,但仅影响新建用户,已有用户须逐个执行alter user设置。

MySQL 8.0+ 如何启用密码过期策略
MySQL 8.0 开始原生支持密码过期机制,核心是通过 ALTER USER 设置 PASSWORD EXPIRE 和 INTERVAL。5.7 及更早版本不支持该语法,强行执行会报错 ERROR 1064 (42000)。
确认版本:先运行 SELECT VERSION();,只有 8.0.12+ 才能稳定使用策略性过期(8.0.0–8.0.11 存在部分 bug)。
-
ALTER USER 'alice'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;—— 密码每 90 天强制更换 -
ALTER USER 'bob'@'%' PASSWORD EXPIRE NEVER;—— 关闭过期(注意:不是NULL,也不是空字符串) -
ALTER USER 'admin'@'localhost' PASSWORD EXPIRE DEFAULT;—— 恢复为全局默认策略(由default_password_lifetime决定)
全局默认密码有效期怎么设
全局设置影响所有新创建用户,但不会自动更新已有用户的过期状态。它只对后续 CREATE USER 或未显式指定过期策略的 ALTER USER 生效。
修改方式有两种:
- 运行时临时生效(重启失效):
SET PERSIST default_password_lifetime = 60; - 永久写入配置文件(需重启或用
SET PERSIST):在my.cnf的[mysqld]下加一行default_password_lifetime = 60
设为 0 表示永不过期;设为 DEFAULT(即不设值)则等同于 0,不是“继承上层”——这点容易误解。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
用户登录时密码过期了怎么办
过期后首次连接会直接拒绝,并返回错误:ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.
必须用支持过期密码重置的客户端操作,比如:
- MySQL Shell(推荐):
\connect root@localhost→ 输入旧密码 → 自动提示重置 -
mysql 命令行客户端(8.0.19+):连接后立刻执行
ALTER USER USER() IDENTIFIED BY 'newpass'; - 禁止用
SET PASSWORD或老式UPDATE mysql.user,这些绕过校验且可能破坏密码历史记录
如果应用连接池卡住,常见原因是连接复用时没处理过期响应,建议在连接建立后加一句 SELECT 1; 触发校验,再捕获异常做重连逻辑。
密码历史与重复限制怎么配合过期一起用
单靠过期不够,用户可能换回旧密码。MySQL 提供 password_history 和 password_reuse_interval 控制复用行为,需在用户级或全局启用:
-
ALTER USER 'alice'@'localhost' PASSWORD HISTORY 5;—— 最近 5 次密码不可重复 -
ALTER USER 'alice'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;—— 一年内不得复用旧密码 - 全局配置对应变量为
password_history和password_reuse_interval,同样支持SET PERSIST
注意:这两个参数和过期策略独立生效,但都依赖 caching_sha2_password 插件(MySQL 8.0 默认),如果用户仍用 mysql_native_password,历史记录功能将被忽略。










