必须手动安装validate_password插件并设policy=STRONG,否则password_history和password_reuse_interval不生效;需用SELECT PLUGIN_NAME, PLUGIN_STATUS确认状态,INSTALL PLUGIN动态加载,STRONG模式强制要求配置可读字典文件,且history与reuse_interval参数须用SET PERSIST持久化。

必须手动安装 validate_password 插件并设 policy = STRONG,否则 password_history 和 password_reuse_interval 等字段完全不生效。
确认插件是否已安装并启用
MySQL 8.0 默认不启用该插件,即使版本是 8.0.17+,也需显式加载。执行以下命令检查:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';
若返回空行或状态为 DISABLED,需立即安装:
-
INSTALL PLUGIN validate_password SONAME 'validate_password.so';(Linux) -
INSTALL PLUGIN validate_password SONAME 'validate_password.dll';(Windows)
注意:plugin-load 写进 my.cnf 并重启的方式在部分 8.0 版本中不可靠,推荐用 INSTALL PLUGIN 动态加载,立刻生效。
设 policy = STRONG 后必须配字典文件
STRONG 模式不是只多加几个字符要求——它强制启用字典检查,若未配置 validate_password.dictionary_file,任何密码设置都会失败,并报错:
Plugin 'validate_password' could not be initialized
实操步骤:
- 准备一个纯文本字典文件(如
/etc/mysql/weak-passwords.txt),每行一个弱词(如admin、password、123456) - 确保 MySQL 进程对该文件有读权限:
chown mysql:mysql /etc/mysql/weak-passwords.txt - 执行:
SET PERSIST validate_password.dictionary_file = '/etc/mysql/weak-passwords.txt';
不设字典路径,policy = STRONG 就是无效的;设了但路径错或权限不足,插件会静默失效或直接报初始化失败。
开启密码重用限制:history 与 reuse_interval
这两个参数仅在 policy = STRONG 下才被识别。设成 MEDIUM 或更低,它们会被忽略,且不会报错,容易误以为配置成功。
启用方式(全部需用 SET PERSIST 持久化):
-
SET PERSIST validate_password.policy = 2;(等价于STRONG) -
SET PERSIST validate_password.history = 5;(保留最近 5 次旧密码) -
SET PERSIST validate_password.reuse_interval = 90;(90 天内禁止重用)
用户执行 ALTER USER ... IDENTIFIED BY 时,MySQL 自动写入 mysql.password_history 表(插件自动创建),无需手动建表。但要注意:该表只记录明文改密操作,不记录 SET PASSWORD 或哈希值直接写入 authentication_string 的行为。
为什么 SET GLOBAL 不够用?
SET GLOBAL 修改后重启即丢失,而生产环境不允许频繁重启。更关键的是:很多参数(如 validate_password.dictionary_file)在 GLOBAL 级别修改后,插件不会重新加载字典,导致配置“看似生效、实际无效”。
正确做法是统一用:
-
SET PERSIST:写入mysqld-auto.cnf,重启后自动加载,且插件会重新初始化 - 或直接写入
my.cnf的[mysqld]段,再重启(适合初始化部署)
绕过策略的临时方案(如批量重置测试用户)可用 SET SESSION validate_password.policy = LOW;,但它对 validate_password.length < 4 仍无效——这是 MySQL 硬编码限制,无法绕过。


















