必须同时设置 password_history 和 password_reuse_interval 才生效,任一为0则策略静默失效;二者均需非零值才能触发密码重用校验。

必须同时设置 password_history 和 password_reuse_interval,只改其中一个参数,策略完全不生效。
为什么单独设 password_reuse_interval 没反应
MySQL 8.0 的密码重用策略是「双条件触发」:只有当新密码同时满足「不在最近 N 次历史中」且「距上次使用已超 M 天」时,才允许通过。任一条件为默认值 0,整个策略就静默失效。
-
password_reuse_interval = 0(默认)→ 时间维度不限制,等价于关闭时间策略 -
password_history = 0(默认)→ 次数维度不限制,等价于关闭次数策略 - 二者至少一个为 0,
ALTER USER ... IDENTIFIED BY就不会做历史校验,也不会报错
如何正确启用基于天数的限制
典型场景:审计要求“旧密码 180 天内不得重用”。这不是单设 password_reuse_interval = 180 就能搞定的,得配对落地:
- 先确认 MySQL 版本 ≥ 8.0.19:
SELECT VERSION();,低于则忽略后续 - 检查用户插件是否为
caching_sha2_password:SELECT user, host, plugin FROM mysql.user WHERE user = 'xxx';,不是就执行ALTER USER 'xxx'@'%' IDENTIFIED WITH caching_sha2_password BY 'xxx'; - 执行两行命令(推荐用
PERSIST):SET PERSIST password_reuse_interval = 180;SET PERSIST password_history = 5; - 重启后验证:
SELECT @@global.password_reuse_interval, @@global.password_history;,两个都必须是非零值
password_reuse_interval 的单位和边界行为
单位是「自然日」,不是 24 小时滚动窗口;计算起点是该密码在 mysql.password_history 表中记录的 Password_timestamp。
- 设为
3:用户改密回 3 天前用过的密码 → 报错ERROR 3638 - 设为
0:不管隔多久,只要在password_history次数范围内,仍会被拦(此时只看次数) - 设为
1:不是“1 天内”,而是“最后一次使用该密码的时间戳 + 1 天之后才能重用” - 注意:空密码不进历史表,
password_reuse_interval对其无效
用户级配置优先于全局,但不能只设一边
如果想给某个账号单独加严(比如 DBA 账号要求 365 天+10 次),可以用 ALTER USER 语句覆盖全局策略:
ALTER USER 'dba'@'localhost' PASSWORD REUSE INTERVAL 365 DAY PASSWORD HISTORY 10;- 这条命令会把
mysql.user表里的password_reuse_history和password_reuse_interval字段写入对应值 - 但依然要确保全局
password_history和password_reuse_interval都非零——否则用户级字段即使有值,校验逻辑也不启动 - 验证方式:查
SELECT user, host, password_reuse_history, password_reuse_interval FROM mysql.user;
最容易被忽略的是:策略只在校验 ALTER USER ... IDENTIFIED BY 或 CREATE USER ... IDENTIFIED BY 时触发,用 GRANT ... IDENTIFIED BY 或 mysqladmin password 不走这套逻辑。别拿错命令去测。



















