mysql 8.0+ 启用密码重用限制需同时设置 password_history 和 password_reuse_interval 两个全局变量,缺一不可;仅设后者无效,且策略仅对 alter user 修改密码生效,不适用于 set password 或已登录会话。

MySQL 8.0+ 如何启用密码重用限制
MySQL 本身不支持直接“禁止用户重复使用旧密码”这一功能,password_reuse_interval 只是控制“多长时间内不能复用旧密码”,但前提是必须先开启密码历史记录(即启用 password_history)。否则设了 password_reuse_interval 也无效。
-
password_reuse_interval和password_history是配套参数,缺一不可 - 两者都属于全局系统变量,需在 MySQL 配置文件(
my.cnf或my.ini)中设置,或通过SET PERSIST动态生效(仅限支持持久化变量的版本) - 修改后,新密码策略只对后续的
ALTER USER ... IDENTIFIED BY或密码过期强制修改生效,不影响已有密码
配置 password_history 和 password_reuse_interval 的正确写法
必须同时设置两个变量,且值要合理。例如:要求用户 365 天内不能复用旧密码,且最多记住前 5 个旧密码:
SET PERSIST password_history = 5; SET PERSIST password_reuse_interval = 365;
或者写入配置文件的 [mysqld] 段:
构建并排查Microsoft Word邮件合并及DOCX模板工作流,使用合并域、内容控件、文档属性、重复区块、数据等
password_history = 5 password_reuse_interval = 365
- 若只设
password_reuse_interval而没设password_history,MySQL 会忽略该间隔限制 -
password_history值为 0 表示禁用历史记录(默认值),此时password_reuse_interval自动失效 - 数值单位均为“天”,不是秒、小时或月
为什么改了参数还是能复用旧密码?常见原因
最常踩的坑是以为设了 password_reuse_interval 就万事大吉,结果测试时仍能成功执行 ALTER USER 'u'@'%' IDENTIFIED BY 'same_old_pass';。
- 用户账户未启用密码历史策略:检查是否对特定用户单独设置了更宽松策略,如
CREATE USER 'u'@'%' PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT;中的DEFAULT会继承全局,但若显式写了PASSWORD HISTORY 0就绕过了 - 当前密码尚未被记录进历史:只有在用户真正修改过至少一次密码后,历史才开始积累;首次设密码不算“复用”
- 使用了
SET PASSWORD语句而非ALTER USER:MySQL 8.0.19+ 起,SET PASSWORD已弃用,且它不触发历史校验逻辑 - 客户端连接使用的仍是旧 session,未重新认证:修改策略后,已登录用户的当前会话不受影响,需重新登录才能触发校验
验证策略是否生效的实操方式
别只看变量值,要实际走一遍密码修改流程:
- 先用
SELECT * FROM mysql.password_history WHERE Host='%' AND User='testuser';查看历史记录(需有SELECT权限) - 对测试用户执行两次密码修改:
ALTER USER 'testuser'@'%' IDENTIFIED BY 'pass1';→ 等几秒 →ALTER USER 'testuser'@'%' IDENTIFIED BY 'pass2'; - 再尝试设回
pass1:如果报错ERROR 3031 (HY000): Cannot use the password from the last 365 days.,说明生效 - 注意:错误信息中的天数来自
password_reuse_interval,不是password_history
真正容易被忽略的是:密码历史只记录成功修改后的密码,且每条记录带时间戳;如果用户频繁失败重试,或管理员用 UPDATE mysql.user 直接改哈希值,这些都不会进入 mysql.password_history 表。










