MySQL 8.0.19+才支持密码历史策略,必须同时设置非零的password_history和password_reuse_interval,并搭配caching_sha2_password插件与用户级ALTER USER显式声明,缺一不可;仅设变量或仅改全局配置对已有用户无效。

MySQL 8.0.19+ 才真正支持密码历史记录,低于该版本设了 password_history 变量会报错或静默忽略;且必须同时设置 password_history 和 password_reuse_interval,缺一不可。
确认版本与认证插件是否达标
没这一步,后面所有配置都白搭。先连上 MySQL 执行:
SELECT VERSION(); —— 输出必须 ≥ 8.0.19
SELECT user, host, plugin FROM mysql.user WHERE user = 'root'; —— plugin 必须是 caching_sha2_password(mysql_native_password 完全不支持)
若插件不对,执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'your_strong_pass';
改完别忘了:FLUSH PRIVILEGES;,否则新插件不加载
注意:旧版客户端(如 Navicat 12 以下)可能不兼容 caching_sha2_password,连接时会报 Plugin caching_sha2_password could not be loaded
必须同时设置两个全局变量
只设 password_history 或只设 password_reuse_interval 都不生效——不是“效果弱”,而是压根不触发校验逻辑。
推荐用 SET PERSIST(写入 mysqld-auto.cnf,重启不丢):
-
SET PERSIST password_history = 5;—— 记住最近 5 次密码哈希 -
SET PERSIST password_reuse_interval = 180;—— 同一密码 180 天内不可重用
验证是否写入成功:SELECT @@global.password_history, @@global.password_reuse_interval;,两个值都必须是非零整数
注意:SET GLOBAL 方式仅当前会话有效,服务重启后归零;配置文件方式需重启 MySQL,不推荐
已有用户必须显式绑定策略
全局变量只影响新建用户,对已存在的用户(包括 root)完全无效。哪怕你设了 password_history = 5,老用户照样能循环用旧密码。
必须逐个执行:ALTER USER 'root'@'localhost' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 180 DAY;
关键点:
- 两个关键词
PASSWORD HISTORY和PASSWORD REUSE INTERVAL必须出现在同一条ALTER USER语句里 - 单独写
PASSWORD HISTORY 5→ 不生效;单独写PASSWORD REUSE INTERVAL 180 DAY→ 报错ERROR 3753 - 查是否生效:
SELECT User, Host, password_reuse_history, password_reuse_interval FROM mysql.user WHERE User = 'root';,字段有值才表示绑定成功
注意:SET PASSWORD 已被弃用,且不触发历史记录;UPDATE mysql.user 手动改 authentication_string 更是彻底绕过机制
验证策略是否真在工作
别只看变量值,得看行为。最直接的验证方式就是故意重用一次旧密码:
先用目标用户登录,执行:ALTER USER USER() IDENTIFIED BY 'oldpass123';
如果该密码在最近 5 次历史中,或距上次使用未满 180 天,就会报:ERROR 3638 (HY000): Cannot use these credentials
常见失效原因:
- 客户端工具(如 phpMyAdmin)底层调用的是
SET PASSWORD,它不走校验路径 - 用户改密时用了
PASSWORD REQUIRE CURRENT,但没配PASSWORD HISTORY—— 这个子句本身不启用历史检查 - MySQL 未启用
validate_password插件(虽然不是强制依赖,但缺失时部分校验链路可能异常)
最后提醒:MySQL 自动维护的 mysql.password_history 表是只读的,禁止 TRUNCATE、INSERT 或 DELETE,否则后续改密会失败并报 ERROR 3716。


















