error 1819 是因 mysql 8.0+ 默认启用 validate_password 插件强制校验密码策略所致,create user 或 alter user 前即拦截,需通过 set global 调整 policy、length 等参数(如 set global validate_password.policy=0; set global validate_password.length=4;)并显式指定 mysql_native_password 插件方可解决。

ERROR 1819 出现时,密码策略正在拦截 CREATE USER
这不是权限或语法问题,而是 validate_password 插件在用户创建前就做了校验。只要密码不满足当前策略,CREATE USER 就会直接报错 ERROR 1819 (HY000),连执行授权步骤的机会都没有。
插件默认启用(MySQL 8.0+),且策略参数是运行时生效的——改配置文件不重启、或只改了 my.cnf 但没 reload,都无效。
- 先确认插件状态:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';,返回ACTIVE才说明它在管事 - 若返回空行,说明插件未加载,此时无需调策略,但要确认是否真不需要校验(比如测试环境)
- 别用
validate_password=OFF—— 这在 MySQL 8.0.26+ 已废弃,写进配置会导致服务启动失败
SET GLOBAL 是唯一能立即起效的方式
SET GLOBAL 命令不是“建议”,而是临时绕过策略的唯一可靠手段。它不依赖重启,也不依赖配置文件位置,只要权限够(需 SUPER 或 SYSTEM_VARIABLES_ADMIN),执行完立刻影响后续所有 CREATE USER 和 ALTER USER 操作。
- 必须按顺序设:先降
validate_password.policy,再调其他依赖参数。比如从MEDIUM(默认值 1)直接设为0(LOW)是允许的,但设为2(STRONG)后再回退就必须分步 - 关键参数要同步清零:
SET GLOBAL validate_password.length = 4;、SET GLOBAL validate_password.mixed_case_count = 0;、SET GLOBAL validate_password.number_count = 0;、SET GLOBAL validate_password.special_char_count = 0; - 注意拼写:
validate_password.policy带点号,不是下划线;validate_password.length不是validate_password_length(后者在 8.0+ 已失效)
CREATE USER 仍失败?检查认证插件类型
即使策略已调低,CREATE USER 'u'@'%' IDENTIFIED BY '123' 还是可能失败——根源常在认证方式不匹配。
- MySQL 8.0 默认用
caching_sha2_password,而该插件对弱密码更敏感,有时会绕过validate_password的宽松设置再次拦截 - 最稳妥写法是显式指定旧兼容插件:
CREATE USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY '123'; - 如果用户已存在且认证插件是
caching_sha2_password,改密时也得带插件声明:ALTER USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY '123';
临时调整后,哪些操作不受影响、哪些仍受限
SET GLOBAL 只约束“新创建/修改密码”的行为,对已有用户密码本身无任何影响——既不会重校验,也不会自动更新哈希格式。
- 已存在的用户仍可正常登录,哪怕其密码是 4 位纯数字
- 但如果你对已有用户执行
ALTER USER ... IDENTIFIED BY,就会触发新策略校验 -
FLTTAL(FAILED_LOGIN_ATTEMPTS/PASSWORD_LOCK_TIME)策略不受validate_password调整影响,它是独立控制账户锁定的,只能在CREATE USER或ALTER USER时显式设置
真正容易被忽略的是:这些 SET GLOBAL 设置在服务重启后全部丢失。如果需要长期宽松,必须写入 [mysqld] 段并重启,且要确保路径、段名、参数名三者全对——否则看似改了,实则没加载。











