MySQL密码策略由validate_password插件统一控制,启用后所有密码设置操作均强制校验;需先确认插件已加载(SHOW PLUGINS),再通过SET GLOBAL临时调整或my.cnf永久配置参数,注意参数间隐式约束关系。

MySQL密码长度和复杂度不是靠ALTER USER或CREATE USER语句直接指定的,而是由validate_password插件统一控制。只要插件启用,所有密码设置操作(包括SET PASSWORD、ALTER USER、CREATE USER)都会强制校验——不满足规则会报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。
确认插件是否已加载并生效
很多问题其实卡在插件根本没装上,而不是参数设错了。先查清楚状态再调参数:
- 执行
SHOW PLUGINS LIKE 'validate_password';,如果返回空,说明插件未安装 - 执行
SHOW VARIABLES LIKE 'validate_password%';,如果什么都没返回,也说明插件未加载 - 注意:MySQL 8.0.26+ 默认启用该插件;但某些发行版(如部分Ubuntu包)或手动编译版本可能默认禁用
用SET GLOBAL临时调整参数(立即生效但重启失效)
调试阶段常用这个方式快速验证效果,但别指望它撑到下次重启:
-
SET GLOBAL validate_password.policy = MEDIUM;—— 策略级别必须用LOW/MEDIUM/STRONG或对应数字0/1/2,不能写'1'字符串 -
SET GLOBAL validate_password.length = 12;—— 实际最小长度受其他参数约束:必须 ≥validate_password.number_count+validate_password.special_char_count+2 * validate_password.mixed_case_count(因为大小写算两类) -
SET GLOBAL validate_password.mixed_case_count = 1;表示至少含1个大写字母**或**1个小写字母;要两者都强制,得设为2(MySQL内部按“字符类别数”统计,大小写算不同类) -
SET GLOBAL validate_password.check_user_name = ON;可禁用密码与用户名/主机名相同的情况,这个常被忽略
写入my.cnf/my.ini实现永久生效
只改SET GLOBAL等于白干——服务一重启就恢复默认。必须落盘配置:
- 在
[mysqld]段下添加(Linux路径通常是/etc/my.cnf或/etc/mysql/my.cnf;Windows是my.ini):
validate_password.policy = 1 validate_password.length = 12 validate_password.number_count = 1 validate_password.mixed_case_count = 2 validate_password.special_char_count = 1 validate_password.check_user_name = ON
- 不要写
SET GLOBAL前缀,也不要加引号 - 参数名必须完全匹配:比如是
validate_password.length,不是validate_password_length(后者是旧版5.7的写法,8.0已弃用) - 改完必须重启
mysqld服务,systemctl restart mysqld或service mysql restart
常见踩坑点:策略冲突与隐式依赖
设了length = 12却仍被拒绝?大概率是参数之间互相卡住了:
-
validate_password.policy = LOW时,只校验长度,其他参数(如number_count)会被忽略 -
validate_password.policy = MEDIUM时,实际要求密码包含“数字、小写字母、大写字母、特殊字符”中的**至少三种**,不是每种都要有——这点文档写得模糊,实测如此 - 如果启用了
STRONG策略但没配validate_password.dictionary_file,插件会静默降级为MEDIUM,不会报错 - MySQL 8.0.33+ 新增
validate_password.legacy_passwords参数,用于兼容老客户端;若业务用mysql_native_password认证,建议显式设为ON避免握手失败
真正麻烦的不是设参数,而是搞清各参数之间的隐含约束关系。比如把mixed_case_count设成2又没调高length,系统会直接拒绝启动——它会在读取配置时做预校验,不等你连上去就崩。


















