必须先确认validate_password插件已ACTIVE状态,再显式设置length、mixed_case_count等参数;仅设policy不生效,且配置需重启服务或用SET PERSIST持久化,否则仍为默认值。

validate_password 插件不是“开了就自动拦住所有弱密码”的开关,它必须显式加载、正确配置,并且只对新建或修改密码的操作生效。没加载插件、策略设成 LOW、或只改配置不重启服务,都会让策略形同虚设。
怎么确认 validate_password 插件是否真在运行
很多问题其实卡在第一步:插件压根没起来。
登录 MySQL 后执行:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';
如果没结果,或 PLUGIN_STATUS 是 DISABLED,说明插件未启用。
- MySQL 5.7:必须手动执行
INSTALL PLUGIN validate_password SONAME 'validate_password.so';—— 注意不能漏掉SONAME和后缀.so,否则报错ERROR 1123 (HY000): Can't initialize function 'validate_password' - MySQL 8.0+:插件已内置,但默认不激活,仍需执行
INSTALL PLUGIN;从 8.0.16 起也可用INSTALL COMPONENT 'file://component_validate_password';(更推荐,稳定性更好) - Linux 下检查文件是否存在:
/usr/lib64/mysql/plugin/validate_password.so或/usr/lib/mysql/plugin/validate_password.so;Windows 对应.dll
为什么设了 policy=1 还能设出弱密码
因为 validate_password.policy 不是布尔开关,而是策略等级,且它的实际校验逻辑和你直觉可能不同。
Word报告自动生成神器。自动生成专业Word文档报告,支持模板填充、目录生成、表格/图表插入、页眉页脚、多级标题、样式主题、批量邮件合并。当用户需要生成Word报告、创建合同文档、批量生成通知/证书、填充Word模板、制作商业计划书时触发。
-
policy = 0(LOW):只校验validate_password.length(默认 8),其他参数全被忽略 -
policy = 1(MEDIUM,MySQL 5.7+ 默认值):才真正启用多类字符要求——必须同时满足:mixed_case_count ≥ 1(即至少 1 个大写 + 1 个小写)、number_count ≥ 1、special_char_count ≥ 1;且length必须 ≥ 8 -
policy = 2(STRONG):额外启用字典检查(需指定validate_password.dictionary_file),但该操作会显著拖慢密码设置速度,生产环境慎用 - 关键点:已有用户的密码不会被回扫。把 policy 从 0 改成 1,
root密码不会立刻失效,但下次执行ALTER USER ... IDENTIFIED BY就会触发校验并报错
配置写进 my.cnf 但不生效的常见原因
写配置 ≠ 策略生效,中间漏掉一步就白干。
- 必须加在
[mysqld]段下,不能放在[client]或全局其他位置 - 推荐用
plugin-load-add = validate_password.so,而不是plugin-load,避免覆盖其他已加载插件 - 变量名要写全:
validate_password_policy、validate_password_length等,不能简写成password_policy -
改完配置必须重启 mysqld 服务(
systemctl restart mysql或service mysqld restart),仅 reload 配置不加载插件 - 重启后仍需验证:执行
SHOW VARIABLES LIKE 'validate_password%';,确认所有值是你设的,且validate_password_policy显示为1或2,不是0
怎么快速验证策略是否起作用
别等上线出问题,用一条语句当场测。
- 用内置函数打分:
SELECT VALIDATE_PASSWORD_STRENGTH('MyPass123!');返回 0–100 的整数,≥ 50 才算中等强度,≥ 80 才算强(注意:该函数不依赖插件是否启用,但结果受当前validate_password.*变量影响) - 直接试设密码:
CREATE USER 'test'@'localhost' IDENTIFIED BY '123';应该报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements - 注意客户端兼容性:某些老版本客户端(如 MySQL 5.7 客户端连 8.0 服务端)可能因协议差异导致密码设置失败,此时先确认是策略问题还是连接层问题
插件加载和策略生效之间存在明确的因果链:加载失败 → 全部无效;policy 设错 → 校验逻辑降级;配置未重启 → 参数不加载;已有密码不受影响 → 安全加固只从下次改密开始。最容易被跳过的,其实是重启服务这一步。










