必须先安装validate_password插件,否则所有策略配置均无效;mysql 8.0默认不启用,需执行install plugin validate_password soname 'validate_password.so'(linux)或'.dll'(windows)动态加载,再set persist配置policy=strong及history、reuse_interval等参数并指定可读字典文件。

validate_password插件没装,所有策略都白配
MySQL 8.0 默认不启用 validate_password 插件,哪怕你执行了 SET GLOBAL validate_password.policy = STRONG,它也完全不生效——连报错都不会有,只会静默忽略。必须先手动安装。
执行以下命令确认状态:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';
如果返回空或状态为 DISABLED,立刻安装:
- Linux:
INSTALL PLUGIN validate_password SONAME 'validate_password.so'; - Windows:
INSTALL PLUGIN validate_password SONAME 'validate_password.dll';
注意:plugin-load 写进 my.cnf 后重启的方式在部分 8.0.30+ 版本中存在加载失败风险,动态 INSTALL PLUGIN 更可靠、即时生效。
policy=STRONG 是 password_history 生效的硬门槛
password_history 和 password_reuse_interval 这两个参数只在 validate_password.policy = STRONG(即值为 2)时才被识别。设成 MEDIUM 或更低,它们会被 MySQL 完全无视,且不报错——这是最常踩的坑。
正确启用步骤:
- 先确保插件已加载,再执行:
SET GLOBAL validate_password.policy = STRONG; - 设置历史记录数:
SET PERSIST validate_password.history = 5; - 设置重用间隔:
SET PERSIST validate_password.reuse_interval = 90;
SET PERSIST 比 SET GLOBAL 更关键:前者写入 mysqld-auto.cnf,重启不丢失;后者重启即失效。
STRONG 模式强制要求字典文件,否则密码设置直接失败
很多人设了 policy = STRONG 却发现连 ALTER USER 都报错:
Plugin 'validate_password' could not be initialized
根本原因:STRONG 模式强制启用字典检查,但 validate_password.dictionary_file 为空或路径不可读。
实操要点:
- 准备一个纯文本字典文件(如
/etc/mysql/weak-passwords.txt),每行一个弱密码词(root、123456、admin等) - 确保 MySQL 进程有读权限:
chown mysql:mysql /etc/mysql/weak-passwords.txt - 执行:
SET PERSIST validate_password.dictionary_file = '/etc/mysql/weak-passwords.txt';
路径写错、权限不对、文件为空,都会导致插件初始化失败——不是警告,是直接拒绝所有密码修改操作。
用户级策略不能覆盖全局,但可叠加 require current
全局策略(如 history、reuse_interval)对所有用户生效,无法按用户单独定制。但你可以给特定用户加一层验证:
- 创建用户时加:
CREATE USER 'app'@'%' IDENTIFIED BY 'pwd' PASSWORD REQUIRE CURRENT; - 之后该用户改密必须带旧密码:
ALTER USER 'app'@'%' IDENTIFIED BY 'new' REPLACE 'old';
这个 PASSWORD REQUIRE CURRENT 是独立于 validate_password 插件的机制,即使插件未启用也能用,适合需要额外身份确认的敏感账号。
真正容易被忽略的点是:STRONG 模式下字典文件路径和权限必须一步到位,否则整个密码策略系统就卡死;而 SET PERSIST 不是可选项,是生产环境必须项——毕竟没人想每次重启后手动重设一遍 history 和 reuse_interval。











