mysql 8.0.19+密码重用限制必须同时设置password_history和password_reuse_interval为非零值才生效,缺一则策略静默失效;二者需配合caching_sha2_password插件与validate_password组件,且仅在alter user identified by时触发校验。

MySQL 8.0.19+ 才真正支持原生密码重用限制,且必须同时设置 password_history 和 password_reuse_interval,缺一不可;设了其中一个,策略完全不生效。
为什么只设 password_reuse_interval 没用
常见错误是只执行 SET PERSIST password_reuse_interval = 30;,结果改密时仍能复用旧密码。这是因为 MySQL 的重用校验逻辑是双条件绑定的:新密码必须同时避开「最近 N 次」和「M 天内」两条线。若 password_history 为 0(默认值),系统会直接跳过整个历史比对流程,password_reuse_interval 形同虚设。
典型报错就是:ERROR 3753 (HY000): The 'password_reuse_interval' option is not supported for accounts without a password history policy —— 这不是配置失败,而是明确告诉你:没配 password_history,这个间隔参数根本不被识别。
- 必须成对设置:
SET PERSIST password_history = 5;和SET PERSIST password_reuse_interval = 365; - 两个值都得是非零整数,单位统一为“天”
- 仅靠
my.cnf配置不够,需确认变量已写入mysqld-auto.cnf(SET PERSIST自动完成)
用户级策略必须显式声明,不能靠继承
全局变量只影响后续新建用户,对已有用户无效。哪怕你设了 password_history = 5 全局生效,老用户 alice@'%' 依然可以无限循环用旧密码,除非你单独给她加策略。
关键点在于:两个关键词必须出现在同一条 ALTER USER 语句中,顺序无关,但缺一不可。
- ✅ 正确:
ALTER USER 'alice'@'%' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 180 DAY; - ❌ 错误(只设次数):
ALTER USER 'alice'@'%' PASSWORD HISTORY 5;→ 不触发校验 - ❌ 错误(只设时间):
ALTER USER 'alice'@'%' PASSWORD REUSE INTERVAL 180 DAY;→ 直接报ERROR 3753
验证是否生效,查 mysql.user 表:SELECT User, Host, password_reuse_history, password_reuse_interval FROM mysql.user WHERE User = 'alice';,两列都有非 NULL 值才算绑定成功。
mysql.password_history 表不可读写,别碰它
MySQL 8.0 自动维护 mysql.password_history 表,记录每次 ALTER USER ... IDENTIFIED BY 的哈希与时间戳。但它是个只读系统表,任何 INSERT/UPDATE/DELETE/TRUNCATE 操作都会报错:ERROR 3716 (HY000): The 'mysql.password_history' table is read-only.
这意味着:
- 你无法手动清空历史、补录旧密码、或绕过校验
- 普通用户不能被授予对该表的
SELECT权限(即使授了也查不到) - 历史记录只从首次启用策略后的第一次改密开始积累,此前的密码不会被“回填”
想看当前有哪些历史记录?只能用管理员账号执行:SELECT * FROM mysql.password_history WHERE User = 'alice' AND Host = '%';,但字段 Password 是内部哈希(如 $A$ 开头),无法反推明文,也不建议用于应用层比对。
插件和组件依赖不能少
password_history 和 password_reuse_interval 不是独立开关,它们依赖两个底层机制:
-
caching_sha2_password插件:负责生成并存储可比对的密码哈希;若用户认证插件仍是mysql_native_password,策略直接失效 -
validate_password组件:提供校验逻辑;未加载该组件时,设置参数不会报错,但静默跳过检查
确认方式:
- 查用户插件:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'alice';→ 必须是caching_sha2_password - 查组件状态:
SELECT * FROM performance_schema.component_table WHERE component_name = 'validate_password';或确保已执行INSTALL COMPONENT 'file://component_validate_password';
最后注意:策略只在 ALTER USER ... IDENTIFIED BY 时触发,SET PASSWORD 已弃用且不校验;已登录会话不受新策略影响,必须重新认证才生效。











