必须先启用validate_password插件(active状态),再协同配置policy、length及各类字符数量参数;length须不小于各字符类参数之和,且配置需持久化写入my.cnf并重启服务,否则策略无效。

MySQL密码长度和复杂度不能靠 ALTER USER 或 CREATE USER 语句直接指定,必须通过 validate_password 插件控制——没装插件或参数配错,改多少次密码都会报 ERROR 1819。
确认 validate_password 插件是否已加载
插件没启用,所有策略设置都无效。先查状态:
SHOW PLUGINS LIKE 'validate_password';
如果返回空,说明未加载。常见错误是误用 INSTALL PLUGIN validate_password SONAME 'validate_password.so' 但文件名不对(比如写成 validate_password.dll 在 Windows 上,或 validate_password.so 在某些 MySQL 8.0.33+ 版本中实际为 validate_password.so,但部分发行版打包为 component_validate_password.so)。
- Linux 下可先检查插件目录:
SELECT @@plugin_dir;,然后ls -l $plugin_dir | grep validate - 若插件文件存在但加载失败,可能是权限问题(
mysqld进程用户无读取权限) - MySQL 8.0.29+ 默认启用该插件,但某些云厂商定制版会禁用,需手动开启
设置密码长度和字符类型要求
validate_password.length 不是唯一决定项;它必须 ≥ 其他字符类参数之和(如 validate_password.number_count + validate_password.mixed_case_count + validate_password.special_char_count),否则 SET GLOBAL 会静默失败或被重置为默认值。
- 例如:设
validate_password.length = 10,但validate_password.number_count = 2、validate_password.mixed_case_count = 2、validate_password.special_char_count = 2→ 总和为 6,合法;但如果设为 3+3+3=9,则length至少得是 9,否则配置不生效 -
validate_password.policy设为MEDIUM(即 1)时,mixed_case_count实际检查的是「至少一个大写字母或一个小写字母」,不是两者都要;设为STRONG(即 2)才要求大小写都出现 - 特殊字符范围固定:
_+-&=!@#$%^*(),超出这个集合的字符(如 `~`、`[`、`{`)不计入validate_password.special_char_count统计
让配置永久生效的关键点
SET GLOBAL 只在当前实例生命周期内有效,重启后还原。必须写入配置文件,且格式稍有不慎就会导致 mysqld 启动失败。
- 配置项名要严格匹配:MySQL 5.7 是
validate_password_length,MySQL 8.0+ 统一为validate_password.length(带点号),写错成下划线会忽略 - 写入
[mysqld]段后,必须重启服务;仅 reload config(如mysqladmin reload)不生效 - 云数据库(如阿里云 RDS、腾讯云 CDB)不提供 my.cnf 修改权限,只能通过控制台开关或 API 设置,且部分参数不可调(如
validate_password.dictionary_file) - 某些版本要求同时配置
plugin-load-add=validate_password.so和validate-password=FORCE_PLUS_PERMANENT,否则插件可能在重启后自动卸载
最容易被忽略的是参数依赖关系:长度不够、字符类总和超限、插件未强制加载——这三者任一出问题,你看到的都是“密码不符合要求”,但根本原因藏在 SHOW VARIABLES LIKE 'validate_password%' 的输出里,而不是错误信息本身。











