validate_password插件未启用时SHOW VARIABLES LIKE 'validate_password%'无返回,需先按版本正确安装:5.7用INSTALL PLUGIN validate_password SONAME 'validate_password.so',8.0.17+用INSTALL COMPONENT;确认插件状态为ACTIVE或component表有记录后,再SET GLOBAL配置policy和length等参数,并写入my.cnf的[mysqld]段持久化。

validate_password插件没启用,SHOW VARIABLES LIKE 'validate_password%' 什么也不返回
这是最常卡住的第一步:插件根本没加载,后续所有 SET GLOBAL 都无效。MySQL 5.7 和 8.0+ 处理方式不同,不能混用。
- MySQL 5.7:执行
INSTALL PLUGIN validate_password SONAME 'validate_password.so';确认成功后查SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password',状态必须是ACTIVE - MySQL 8.0.17+:改用组件方式,运行
INSTALL COMPONENT 'file://component_validate_password';查SELECT * FROM mysql.component WHERE component_id = 'validate_password',有记录即表示已安装 - 如果提示
Plugin 'validate_password' is disabled,说明配置文件里写了disable-plugin-validate_password或类似项,得删掉再重启 mysqld
SET GLOBAL validate_password.* 不生效,ALTER USER 还是能设弱密码
原因很直接:你改的是会话级变量,或者插件虽加载但策略参数压根没设全。validate_password 不是“开了就自动变强”,它依赖一组显式参数协同生效。
- 必须至少设置
validate_password.policy(推荐先设为MEDIUM或STRONG)和validate_password.length(如12),否则默认策略可能退化为仅检查长度 -
validate_password.mixed_case_count、validate_password.number_count、validate_password.special_char_count这三个值如果为 0,对应类型字符就变成可选——不是“必须含”,而是“可不含” - 执行完
SET GLOBAL后,立刻用SHOW VARIABLES LIKE 'validate_password%'核对,确保看到的值是你刚设的,而不是OFF或空字符串
设置了全局参数,但 CREATE USER 仍不校验密码强度
validate_password 插件只在「用户创建或修改密码时」触发校验,但它不会 retroactively 检查已有账户。更重要的是:它只作用于 SQL 层的密码变更操作,不拦截客户端工具直连后的 SET PASSWORD 等绕过行为。
- 用
CREATE USER 'u'@'%' IDENTIFIED BY 'weak'或ALTER USER 'u'@'%' IDENTIFIED BY 'weak'才会触发校验;报错ERROR 1819 (HY000)就说明生效了 -
SET PASSWORD FOR 'u'@'%'在 MySQL 5.7 中仍会走校验,但在 8.0+ 默认被禁用(需显式开启password_history或依赖双密码机制),建议统一用ALTER USER - 云厂商托管实例(如阿里云 RDS、腾讯云 CDB)可能屏蔽了插件控制权,此时必须通过控制台「密码复杂度」开关配置,SQL 层的 SET 操作会被忽略
如何让 validate_password 配置重启后不丢失
SET GLOBAL 只影响当前运行实例,MySQL 一重启,所有值就回退到编译默认值。持久化必须写进配置文件,且注意路径和段落位置。
- Linux 下典型路径是
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf;Windows 是my.ini - 所有参数必须放在
[mysqld]段下,例如:[mysqld] validate_password_policy=MEDIUM validate_password_length=12 validate_password_number_count=1 validate_password_mixed_case_count=1 validate_password_special_char_count=1
- MySQL 5.7 还要额外加一行:
plugin-load-add=validate_password.so;8.0.17+ 则不需要,组件由 server 自动管理 - 改完配置必须重启服务:
systemctl restart mysqld(不是 reload),否则新参数不会加载
实际中容易忽略的是:策略生效只看 ALTER USER / CREATE USER 的那一刻,不监控后续登录行为;而且一旦设了 STRONG 级别又没配字典文件,validate_password_dictionary_file 为空时会静默降级为 MEDIUM,这种隐式退化很难排查。



















