mysql 8.0.19+密码重用限制需同时满足五条件:版本≥8.0.19、插件为caching_sha2_password、validate_password启用且policy=strong、password_history与password_reuse_interval均设非零值、用户级策略须用alter user同句声明二者,缺一即静默失效。

确认 MySQL 版本和插件是否达标
低于 8.0.19 的版本压根不支持 password_history,设了也无效,查询会报 Unknown system variable 'password_history'。必须先执行 SELECT VERSION(); 确认输出 ≥ 8.0.19。
同时检查用户认证插件:执行 SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';,结果必须是 caching_sha2_password。mysql_native_password 完全不支持该机制,需提前切换:ALTER USER 'your_user'@'%' IDENTIFIED WITH caching_sha2_password BY 'xxx';
必须同时启用 validate_password 插件并设为 STRONG 模式
password_history 和 password_reuse_interval 只在 validate_password 组件启用且 policy = STRONG 时才生效——设成 MEDIUM 或 LOW 会被静默忽略,且不报错。
安装并配置插件(需有 SYSTEM_VARIABLES_ADMIN 权限):
INSTALL PLUGIN validate_password SONAME 'validate_password.so'; SET GLOBAL validate_password.policy = STRONG;
注意:STRONG 模式还要求配置词典文件(validate_password.dictionary_file),否则设密码时可能报错 Plugin 'validate_password' could not be initialized。
两个参数必须同时设非零值,且用 SET PERSIST
password_history 和 password_reuse_interval 是“与”关系:任一为 0(包括默认值),策略完全不触发校验。常见错误是只设一个,或漏掉 SET PERSIST 导致重启后失效。
正确操作:
-
SET PERSIST password_history = 5;(保留最近 5 次密码哈希) -
SET PERSIST password_reuse_interval = 180;(同一密码 180 天内不可重用)
验证是否写入持久化配置:SELECT @@global.password_history, @@global.password_reuse_interval;,两个都必须是非零整数。
对已有用户必须显式用 ALTER USER 绑定策略
全局设置只影响后续新建用户;已有用户不会自动继承,必须单独执行 ALTER USER 才生效,且两个关键词必须出现在同一条语句中:
ALTER USER 'alice'@'%' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 180 DAY;
常见错误写法:
-
ALTER USER 'alice'@'%' PASSWORD HISTORY 5;(缺时间限制 → 报错ERROR 3753) -
ALTER USER 'alice'@'%' PASSWORD REUSE INTERVAL 180 DAY;(缺次数限制 → 同样报错)
生效后查 mysql.user 表:SELECT User, Host, password_reuse_history, password_reuse_interval FROM mysql.user WHERE User = 'alice';,字段有值才表示绑定成功。
真正容易被忽略的是:策略只在 ALTER USER ... IDENTIFIED BY 或当前用户执行 ALTER USER ... IDENTIFIED BY 时触发校验;SET PASSWORD 已弃用,不记录历史也不校验。验证时别只看变量值,得实际改密重试一次旧密码,观察是否报 ERROR 3638。











