在MySQL 8.0中,密码历史记录策略用于防止用户将密码改回之前用过的旧密码。系统通过记录用户的历史密码哈希,在下次修改密码时检查新密码是否出现在历史记录中。核心控制参数就是password_history,它表示允许重用之前多少代以内的密码。如果该值设为2,则最近两次用过的密码不能被再次使用。

全局配置password_history参数
可以通过修改MySQL配置文件永久生效,也可以在运行时用SQL命令动态设置。推荐在配置文件my.cnf的[mysqld]段中加入以下内容:
[mysqld] # 全局要求新密码不能与最近5次使用过的密码相同 password_history = 5
若只想在运行的实例上临时生效,可执行:
-- 设置全局密码历史记录代数为5 SET PERSIST password_history = 5;
为用户单独配置策略
除了全局参数,还可以针对某个数据库账户单独限定更严格的策略。使用CREATE USER或ALTER USER语句时加上PASSWORD HISTORY子句:
-- 创建用户并限制其密码历史为10代 CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'InitPass!2023' PASSWORD HISTORY 10; -- 修改已有用户的历史策略 ALTER USER 'appuser'@'localhost' PASSWORD HISTORY 8;
验证策略是否生效
尝试将密码改回历史密码,数据库会抛出错误。我们可以用下面简单的测试流程确认:
-- 第一次修改密码 ALTER USER 'appuser'@'localhost' IDENTIFIED BY 'NewPass!001'; -- 尝试改回初始密码,若history包含则会报错 ALTER USER 'appuser'@'localhost' IDENTIFIED BY 'InitPass!2023';
如果返回类似ERROR 3638的提示,说明密码历史限制已经起作用。
注意事项与常见问题
- password_history只记录密码哈希,不存储明文,因此无法逆向查看旧密码。
- 全局参数修改后,已存在的用户若未单独设定,会继承全局值。
- 若使用主从复制,建议在主库配置,相关账户策略会通过DDL同步到从库。
| 参数位置 | 生效范围 | 修改方式 |
|---|---|---|
| 全局password_history | 所有未单独设置的用户 | 配置文件或SET PERSIST |
| 用户PASSWORD HISTORY | 指定账户 | CREATE/ALTER USER |
通过合理设置password_history,可以有效减少因密码循环使用带来的安全风险,是MySQL 8.0中实用的账户加固手段。
MySQL8.0password_history密码历史记录修改时间:2026-07-31 07:18:18