必须先手动安装validate_password插件并确认active状态,再显式设置length、mixed_case_count等全局变量,且mysql 5.7需通过启动后sql初始化,8.0+可用set persist持久化。

validate_password插件没启用,validate_password.length 之类的变量根本设不了
MySQL 5.7+ 默认不自动启用 validate_password 插件,哪怕你改了配置文件,变量也还是 OFF。直接查 SHOW VARIABLES LIKE 'validate_password%'; 会发现全为空或默认值——这不是配置错了,是插件压根没加载。
必须手动安装:
- 登录 MySQL 后执行
INSTALL PLUGIN validate_password SONAME 'validate_password.so';(Linux)或'validate_password.dll'(Windows) - 确认生效:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';,状态得是ACTIVE - 如果报错
Can't open shared library,说明插件文件缺失,检查plugin_dir路径(SHOW VARIABLES LIKE 'plugin_dir';),确认对应文件存在
设了 validate_password.policy 却没效果,密码还是能设成 123456
策略等级只是“开关组合”,真正起作用的是它背后的一组具体参数。比如 policy=1(MEDIUM)要求同时满足:长度 ≥8、含大小写字母、数字、特殊字符各至少一个;但如果你只改了 policy,其他参数仍为默认(如 validate_password.length=0),那校验就形同虚设。
必须显式设置关键参数:
SET GLOBAL validate_password.length = 8;SET GLOBAL validate_password.mixed_case_count = 1;SET GLOBAL validate_password.number_count = 1;SET GLOBAL validate_password.special_char_count = 1;- 注意:这些是全局变量,新连接才生效;已有连接不会重新校验已存在的用户密码
配置写进 my.cnf 重启后参数又变回默认值
MySQL 启动时读取配置文件,但 validate_password 相关变量属于“动态系统变量”,部分版本(尤其是 5.7.8 之前)不支持在 [mysqld] 下直接写 validate_password.length = 8 —— 启动时会被忽略,变量保持初始值。
可靠做法分两步:
- 在
my.cnf的[mysqld]段里加:plugin_load_add = validate_password.so(确保插件随服务启动) - 用
init_file或启动后执行 SQL 初始化变量:SET PERSIST validate_password.length = 8;(MySQL 8.0+ 支持PERSIST,会写入mysqld-auto.cnf) - MySQL 5.7 只能靠脚本或初始化 SQL,在
mysqld启动后自动执行SET GLOBAL ...命令
用户改密码时报 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
这个错误不是配置失败,恰恰说明插件正在工作。常见触发点不是密码太弱,而是客户端/驱动自动加了引号或转义——比如用 mysql -e "ALTER USER ... IDENTIFIED BY 'p@ss!2024';",shell 把 <code>! 当作历史扩展符,实际传给 MySQL 的密码被截断或变形。
安全做法:
- 改密码时用
mysql客户端交互模式,避免 shell 解析干扰 - 或者把密码放在文件里,用
--defaults-file传入 - 检查当前策略实际要求:
SELECT @@validate_password.policy, @@validate_password.length, @@validate_password.mixed_case_count;,别只看文档里的“MEDIUM”定义,以运行时值为准
最常被跳过的环节是插件加载和变量持久化——配置文件写了、SQL 也 SET 了,但没确认插件状态,也没验证变量是否真被全局应用。一出问题就怀疑策略逻辑,其实八成卡在第一步。











