<p>可通过执行 SELECT * FROM information_schema.plugins WHERE plugin_name = 'validate_password'; 查询插件状态,若无结果或状态为 DISABLED,则未启用;需确保配置文件中正确设置 plugin_load_add = validate_password.so 并重启 mysqld。</p>

如何确认 validate_password 插件是否已启用
MySQL 默认不启用密码复杂度校验,得手动加载插件才能生效。直接查 show plugins; 或 select * from information_schema.plugins where plugin_name = 'validate_password';,如果没结果或状态是 DISABLED,说明它压根没开。
常见错误是只改了配置文件却忘了重启 mysqld,或者用 install plugin validate_password soname 'validate_password.so'; 但没加 soname 后缀(5.7+ 要求严格匹配),导致报错 ERROR 1123 (HY000): Can't initialize function 'validate_password'。
- Linux 下确保
validate_password.so文件真实存在,路径通常是/usr/lib64/mysql/plugin/validate_password.so或/usr/lib/mysql/plugin/ - MySQL 8.0+ 默认内置该插件,但依然要显式启用:运行
install plugin validate_password soname 'validate_password.so';(注意不是.dll) - 配置文件中写
plugin_load_add = validate_password.so比plugin_load更安全,避免覆盖其他插件
password_policy 设置为 LOW/MEDIUM/STRONG 的实际效果差异
validate_password.policy 不是开关,而是策略等级,直接影响校验项。设成 LOW 几乎等于没开——只检查长度;MEDIUM(默认)才开始真正起作用:要求同时含大小写字母、数字、特殊字符;STRONG 还额外查字典(validate_password.dictionary_file),但多数生产环境不用,因为性能差且维护成本高。
容易被忽略的是:这些策略只对新设或修改的密码生效,不会批量重检已有账户。比如你把 policy 从 LOW 改成 MEDIUM,root 密码不会立刻报错,但下次执行 alter user 'root'@'localhost' identified by '123'; 就会失败。
-
validate_password.length:最小长度,默认 8,MEDIUM下必须 ≥ 8 才能通过 -
validate_password.mixed_case_count:至少几个大写+小写字母,默认 1,即大小写都得有 -
validate_password.number_count和validate_password.special_char_count默认都是 1,缺一不可 - 设
validate_password.policy = 0等价于LOW,1是MEDIUM,2是STRONG—— 数字比单词更可靠,配置文件里建议用数字
为什么 set global 不生效,以及配置文件该怎么写
set global validate_password.length = 12; 看似成功,但 MySQL 重启后就还原。因为插件参数在内存里初始化后,只读取一次配置文件,后续 set global 对部分参数无效(尤其是插件加载前就存在的变量)。必须写进 my.cnf 的 [mysqld] 段落,并重启服务。
典型错误是把配置写到 [client] 或 [mysql] 下,或者漏掉 plugin_load_add,导致插件根本没加载,参数自然不生效。
- 正确写法(5.7+):
[mysqld] plugin_load_add = validate_password.so validate_password.policy = 1 validate_password.length = 12 validate_password.mixed_case_count = 2 validate_password.number_count = 2
- MySQL 8.0.4+ 开始支持动态修改部分参数,如
length和mixed_case_count,但policy仍需重启 - 如果用 Docker,确保
my.cnf挂载到容器内 /etc/my.cnf,且权限为 644,否则 mysqld 启动时静默跳过
遇到 ERROR 1819 (HY000) 怎么快速定位问题
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 是唯一报错信息,但不告诉你具体哪条没满足。这时候别猜,直接查当前策略值:
select @@validate_password.policy, @@validate_password.length, @@validate_password.mixed_case_count;
再拿目标密码逐项比对:长度够不够?有没有至少两个大写字母?有没有两个数字?特殊字符是不是用了 !#$%&* 这类白名单里的(默认只认这 10 个)?很多团队踩坑是因为前端传来的密码带空格或中文符号,MySQL 直接当无效字符处理。
- 临时绕过(仅调试):用
set global validate_password.check_user_names = OFF;关闭用户名相似性检查(比如密码不能含用户名) - 特殊字符范围可扩:设置
validate_password.special_char_count = 0并配合提高mixed_case_count和number_count,比硬塞符号更实用 - 应用层改密码时,最好先
select一遍策略参数,而不是等报错再查——避免用户感知到模糊错误
插件本身不记录拒绝日志,也没审计事件输出,出问题只能靠人工比对参数和密码规则。这点在自动化运维里特别容易被忽略。



















