mysql 8.0 没有 password_reuse_delay 参数;真正有效的是 password_reuse_interval(控制旧密码多少天内不可重用)和 password_history(控制最多保留几条历史密码记录),二者需同时配置且仅在 alter user 修改密码时生效并写入 mysql.password_history 表。

MySQL 8.0 没有 password_reuse_delay 参数
直接说结论:password_reuse_delay 并不是 MySQL 8.0 的有效系统变量或用户属性,官方文档、源码和所有已知版本(包括 8.0.33 及最新 8.0.39)中均不存在该参数。如果你在某篇教程或配置文件里看到它,基本可以判定是拼写错误、混淆了其他数据库(如 Oracle 或 SQL Server)的术语,或是误将 password_reuse_interval 或 default_password_lifetime 记错成这个名称。
真正起作用的是 password_reuse_interval 和 password_history
MySQL 8.0 实现“密码不能太快重用”的机制,靠的是两个明确且可配的策略参数,它们控制的是「历史密码不可复用」的时间窗口或数量上限,而非“修改间隔”本身:
-
password_reuse_interval:单位为天,表示新密码不能与过去多少天内用过的密码重复。例如设为30,则用户改密时若输入了 30 天内任一旧密码,会报错ERROR 3031 (HY000): Cannot use the password which was used within the last 30 days -
password_history:表示最多保留多少条历史密码记录(按用户+主机维度),新密码不能与其中任意一条完全相同。该值影响mysql.password_history表的保留行数
这两个参数必须通过 SET PERSIST 或写入配置文件生效,且只对后续创建或修改的用户生效(已有用户需显式触发密码变更才会被纳入历史记录)。
如何正确设置密码重用最小时间窗口(即等效的“最小间隔”)
虽然 MySQL 不提供“强制用户隔 N 天才能改密”的开关,但你可以用 password_reuse_interval 实现**事实上的最小改密间隔**——只要用户每次改密都用新密码,那他就无法在设定天数内“绕回”旧密码。实操步骤如下:
- 以管理员身份登录:
mysql -u root -p - 启用持久化设置(推荐,重启不丢失):
SET PERSIST password_reuse_interval = 30;(设为 30 天) - 验证是否生效:
SELECT @@password_reuse_interval;,返回30即成功 - 注意:该设置仅约束「密码内容不得重复」,不阻止用户连续执行
ALTER USER ... IDENTIFIED BY 'new1'; ALTER USER ... IDENTIFIED BY 'new2';——只要两次新密码不同,就允许
如果想进一步限制频繁操作,需配合应用层审计或外部监控,MySQL 本身不提供“改密频率限流”能力。
容易踩的坑:global 变量 vs persist、权限与范围
常见错误不是参数名写错,而是生效方式和权限没配对:
- 用
SET GLOBAL password_reuse_interval = 30不生效:该变量不支持GLOBAL动态设置,只接受PERSIST或配置文件方式 - 普通用户执行
ALTER USER报错ERROR 1045:说明当前连接使用的认证插件(如caching_sha2_password)与客户端不兼容,应先用ALTER USER ... IDENTIFIED WITH mysql_native_password BY 'xxx'切换插件 - 设置了
password_reuse_interval但改密仍成功用了旧密码:检查是否对目标用户启用了策略——CREATE USER或ALTER USER时未加PASSWORD HISTORY或PASSWORD REUSE INTERVAL子句,默认不继承全局设置;需显式声明,例如:ALTER USER 'dev'@'localhost' PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 90 DAY;
最易被忽略的一点:这些策略只在用户真正执行 ALTER USER ... IDENTIFIED BY 时才写入 mysql.password_history 表。单纯调用 SET PASSWORD 或修改 mysql.user 表不会触发记录,也就无法参与比对。











