必须先设 validate_password.policy = LOW,再重置mixed_case_count、number_count、special_char_count和length四个参数,否则旧值仍触发ERROR 1819;且需确认插件状态为ACTIVE,仅改my.cnf不重启无效。

直接改 validate_password.policy = LOW 不够,必须同步重置四个 count 参数,否则旧值仍会拦截密码;很多 ERROR 1819 就卡在这一步。
确认 validate_password 插件是否真在运行
很多操作失败不是配置错,是插件压根没加载。不能只看 my.cnf 有没有 plugin-load-add,得查 MySQL 实际状态:
-
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';—— 必须返回ACTIVE,否则后续所有SET GLOBAL都会报Unknown system variable -
SHOW VARIABLES LIKE 'validate_password%';—— 如果返回空,说明插件未加载,不是参数没设对 - Windows 下用
INSTALL PLUGIN validate_password SONAME 'validate_password.dll';,Linux 下用.so;plugin-load-add写进my.cnf后必须重启 MySQL,仅靠服务 reload 不生效
设 LOW 策略后仍报 ERROR 1819 的原因
validate_password.policy = LOW 只是开关,不自动清零依赖参数。比如你之前设过 mixed_case_count = 1,切到 LOW 后它仍保留为 1,校验时照样要求大小写字母——这违背 LOW 本意。
- 必须显式重置四个 count 参数:
SET GLOBAL validate_password.mixed_case_count = 0;、SET GLOBAL validate_password.number_count = 0;、SET GLOBAL validate_password.special_char_count = 0;、SET GLOBAL validate_password.length = 6; - 顺序不能乱:先
SET GLOBAL validate_password.policy = LOW;,再设其他参数;反过来设,MySQL 不会覆盖 - 验证是否生效:
SELECT @@validate_password_length, @@validate_password.mixed_case_count;,确认返回的是你刚设的值
绕过策略限制的临时方案(ALTER USER 场景)
即使策略已调低,某些用户(尤其原用 caching_sha2_password 认证的)执行 ALTER USER ... BY 'xxx' 仍可能触发 ERROR 1819。这不是 bug,是认证方式和策略耦合导致的。
- 最可靠绕过方式:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';—— 强制切换认证插件,跳过validate_password校验 - 注意:
mysql_native_password是兼容性方案,不推荐长期使用,仅用于紧急降级或迁移过渡 - 该语句不会改变全局策略,只影响当前用户的认证路径;之后再用
caching_sha2_password创建用户,仍受策略约束
真正难点不在“怎么设 LOW”,而在“设完是否真被识别”。每次 SET 后必须用 SHOW VARIABLES 实查变量值,再用 CREATE USER 或 ALTER USER 实测建/改密码,否则容易误以为生效了——而线上业务一跑就崩。


















