必须同时设置password_history和password_reuse_interval且非零,否则策略静默失效;二者为双条件绑定触发,缺一不可,且需caching_sha2_password插件支持及alter user显式声明用户级策略。

必须同时设置 password_history 和 password_reuse_interval,任一为 0 或未启用 caching_sha2_password 插件,策略就完全不生效——不是“效果弱”,而是压根不校验。
为什么只改 password_reuse_interval 没反应
MySQL 的密码重用策略是双条件绑定触发:新密码必须同时避开「最近 N 次历史」和「M 天内不可重用」两条线。常见错误包括:
-
SET PERSIST password_reuse_interval = 180;单独执行 →password_history仍是默认的 0,整个策略静默失效 - 看到报错
ERROR 3753 (HY000): The 'password_reuse_interval' option is not supported for accounts without a password history policy→ 明确提示缺password_history - 用
SET PASSWORD改密 → 该语句已弃用,且不写入历史表、不触发任何校验
如何确认用户真正受控
全局变量只影响后续新建用户,对已有用户无效。必须显式在用户级声明策略:
- 检查插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'xxx';,结果必须是caching_sha2_password - 切换插件(如需):
ALTER USER 'xxx'@'%' IDENTIFIED WITH caching_sha2_password BY 'newpass'; - 绑定策略:
ALTER USER 'xxx'@'%' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 180 DAY;(两个关键词必须同时出现) - 验证是否写入:
SELECT User, Host, password_reuse_interval FROM mysql.user WHERE User = 'xxx';,字段有值才表示生效
哪些操作不会触发历史记录
密码历史只在特定路径下积累,以下行为完全绕过机制:
- 直接
UPDATE mysql.user SET authentication_string = ...→ 不存档、不校验、不更新password_last_changed - 用 phpMyAdmin 图形界面“修改密码” → 底层调用
SET PASSWORD,策略失效 - root 用户执行
ALTER USER 'u'@'h' IDENTIFIED BY 'xxx';(没带PASSWORD HISTORY)→ 只改密,不启用检查 - 客户端连接未重连 → 已登录会话不受新策略影响,必须退出重登才触发校验
最容易被忽略的是:空密码不进历史表,password_reuse_interval 对它无效;另外,这两个参数对已存在的旧密码不追溯,第一次用 ALTER USER ... IDENTIFIED BY 改密后,旧密码才正式进入历史队列。











