必须先确认并启用validate_password插件,否则所有配置无效;执行select plugin_name, plugin_status from information_schema.plugins where plugin_name = 'validate_password',返回active才可继续配置policy、length等参数。

必须先确认并启用 validate_password 插件,否则所有后续配置都无效——这是最常被跳过的一步,也是报错 ERROR 1819 或 Unknown system variable 的根本原因。
怎么确认插件是否已启用
登录 MySQL 后直接执行:SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';
如果返回空行,或状态是 DISABLED,说明插件没加载。别急着设参数,先解决这个。
- 返回空 → 插件未安装(极少见,多见于精简版 MySQL 构建)
- 返回
DISABLED→ 已内置但未激活,需手动加载 - 返回
ACTIVE→ 可继续配置策略参数
注意:不要依赖 SHOW VARIABLES LIKE 'validate_password%' 判断是否启用——插件未启用时该语句可能返回默认值或空,不具备判断力。
MySQL 5.7 和 8.0+ 的启用方式不能混用
版本差异直接影响命令写法和文件名,写错就静默失败:
- MySQL 5.7:必须用
INSTALL PLUGIN validate_password SONAME 'validate_password.so';(Linux)或'validate_password.dll'(Windows) - MySQL 8.0.17+:优先用组件方式:
INSTALL COMPONENT 'file://component_validate_password';;若失败再退回到插件方式 - 8.0 中硬写
SONAME 'validate_password.so'可能报错ERROR 1126,因为新版已移除该文件
持久化推荐写入配置文件:
在 my.cnf(Linux)或 my.ini(Windows)的 [mysqld] 段添加:plugin_load_add = validate_password.so(5.7 / 兼容模式)
或component = file://component_validate_password(8.0.17+)
然后重启 mysqld。只改配置不重启,插件依然不会生效。
设置策略参数时的依赖顺序和常见错误
validate_password.policy 是总开关,不是独立选项——它决定哪些 count 参数起作用。乱序设置会导致校验逻辑错乱:
- 先设
SET GLOBAL validate_password.policy = MEDIUM;,再设其他参数;如果反过来,number_count等可能被忽略 -
validate_password.length必须协同设置:设了MEDIUM却不调长度,仍按默认 8 校验,12 位但缺数字的密码照样被拒 - 参数名大小写和分隔符敏感:
SET GLOBAL validate_password.length(SQL 中合法),但在配置文件里必须写成validate_password_length = 12(下划线、小写) -
STRONG策略下,validate_password.dictionary_file路径必须存在且可读,否则实际效果等同MEDIUM
推荐最小安全基线(MEDIUM):SET GLOBAL validate_password.policy = MEDIUM;SET GLOBAL validate_password.length = 12;SET GLOBAL validate_password.number_count = 1;SET GLOBAL validate_password.special_char_count = 1;SET GLOBAL validate_password.mixed_case_count = 1;
策略只对 CREATE/ALTER USER 生效,不追溯已有密码
启用后不会批量重检现有账户密码,这点极易被误解:
- 执行
ALTER USER 'root'@'localhost' IDENTIFIED BY 'weak';会立即触发校验并报错ERROR 1819 - 但已有密码不受影响,也不会自动提示“该密码已不合规”
- mysqld 初始化生成的 root 初始密码完全绕过策略校验
-
VALIDATE_PASSWORD_STRENGTH('MyPass123!')可用于测试单个密码得分(0–100),但不改变任何账户状态
真正容易被忽略的是:策略生效边界非常明确——仅限新建用户或显式修改密码的操作。没有后台扫描、没有登录时动态拦截、也没有定期过期提醒。想覆盖全部账户,得主动轮换一遍密码。











