必须使用INSTALL COMPONENT安装validate_password组件并设policy=STRONG,配字典文件路径,否则password_history等参数无效;需查mysql.component和PLUGINS表确认状态,SET PERSIST持久化参数。

MySQL 8.0 安装后默认加载了 validate_password 插件,但策略是 MEDIUM(只校验长度≥8、数字、大小写、特殊字符各1个),**不满足三级等保或生产环境强密码要求**——必须显式安装组件、设 STRONG 策略、配字典路径,否则所有参数修改都无效。
确认插件是否真正启用
别只看 SHOW VARIABLES LIKE 'validate_password%' 有输出就以为生效。MySQL 8.0 的插件机制分两层:加载(load)和启用(enable)。常见误判是变量存在但插件未初始化。
- 先查组件状态:
SELECT * FROM mysql.component WHERE component_id LIKE 'validate_password%';—— 若无结果,说明组件根本没安装 - 再查插件状态:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';—— 状态必须为ACTIVE,DISABLED或空行表示未启用 - 如果插件状态是
ACTIVE但变量全为空,大概率是组件路径错误或 MySQL 启动时未识别该组件名(尤其在非官方镜像或容器中)
用 INSTALL COMPONENT 而不是 INSTALL PLUGIN
MySQL 8.0.17+ 将密码校验逻辑从插件(plugin)升级为组件(component),INSTALL PLUGIN validate_password SONAME 'validate_password.so' 在新版中已废弃或不可靠,强行执行可能报错或静默失败。
- 正确命令:
INSTALL COMPONENT 'file://component_validate_password'; - 执行前确保 MySQL 进程对组件路径有读权限;若报错
Plugin 'validate_password' could not be initialized,八成是路径不对或文件缺失 - 为防重启失效,必须在
my.cnf的[mysqld]段落中添加:early_plugin_load=validate_password(部分版本需此配置才能启动时加载)
STRONG 策略必须配字典文件,否则任何密码设置都会失败
validate_password.policy = STRONG 不只是加几条规则——它强制启用字典检查,没字典路径,连 SET PASSWORD 都会直接报错。
- 准备纯文本字典文件,如
/etc/mysql/weak-passwords.txt,每行一个弱口令(admin、password、123456等) - 确保 MySQL 进程可读:
chown mysql:mysql /etc/mysql/weak-passwords.txt,且 SELinux/AppArmor 未拦截 - 设路径:
SET PERSIST validate_password.dictionary_file = '/etc/mysql/weak-passwords.txt';—— 注意是绝对路径,相对路径无效 - 验证:
SELECT @@validate_password.dictionary_file;返回值必须与你设置的完全一致
history 和 reuse_interval 只在 STRONG 下生效
很多团队设了 validate_password.password_history = 5 却发现旧密码还能复用,原因就是策略没设成 STRONG。这两个参数在 MEDIUM 或更低策略下被完全忽略,且不报错。
- 必须先设策略:
SET PERSIST validate_password.policy = STRONG; - 再设重用限制:
SET PERSIST validate_password.password_history = 5;和SET PERSIST validate_password.password_reuse_interval = 360;(单位:天) - 注意:
SET PERSIST写入mysqld-auto.cnf,比SET GLOBAL更可靠;但若 MySQL 未启用持久化变量功能(persisted_globals_load=ON),仍会重启丢失
最易被忽略的一点:即使所有参数都设对了,如果用户是升级而来,旧用户的认证插件仍是 caching_sha2_password,而新策略只约束密码本身,不自动切换认证方式——连接兼容性问题得单独用 ALTER USER ... IDENTIFIED WITH mysql_native_password 处理。


















