MySQL 8.0+ 默认内置但未启用 validate_password 插件,需手动 INSTALL PLUGIN 启用并按依赖顺序配置 policy、length 等参数,否则 ALTER USER 可能因密码不满足策略报错 ERROR 1819。

MySQL 8.0+ 默认已内置 validate_password,但默认不启用
MySQL 8.0 起 validate_password 插件是服务端内置组件,无需下载额外文件,但安装后需手动启用,且默认策略极宽松(仅要求长度 ≥8)。很多用户执行 SHOW PLUGINS; 看不到它,是因为没加载——这不是缺失,是未激活。
验证是否已编译支持(非运行状态):SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';
若返回空,说明该 MySQL 构建时禁用了该插件(极少见),需重装或换发行版;多数情况会返回 validate_password + DISABLED。
- 启用命令:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';(Linux)或'validate_password.dll'(Windows) - 确认加载成功:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';→ 应显示ACTIVE - 插件加载后,相关系统变量(如
validate_password.length)才可被 SET,否则报错Unknown system variable
设置密码复杂度参数:必须按依赖顺序配置
参数之间有强依赖关系,乱序设置会触发校验失败。例如:设 validate_password.mixed_case_count = 1 前,必须先确保 validate_password.number_count 和 validate_password.special_char_count 已设为 ≥1,否则 MySQL 启动或 SET 时直接拒绝。
核心参数(推荐最小安全基线):SET GLOBAL validate_password.policy = MEDIUM;SET GLOBAL validate_password.length = 12;SET GLOBAL validate_password.number_count = 1;SET GLOBAL validate_password.special_char_count = 1;SET GLOBAL validate_password.mixed_case_count = 1;
-
policy是总开关:取值LOW(仅长度)、MEDIUM(含大小写/数字/特殊字符)、STRONG(额外查字典表,需配置validate_password.dictionary_file) - 所有
validate_password.*_count参数在policy = LOW时无效;设为MEDIUM后,对应 count 值才生效 - 修改是动态的,但只影响后续新建/修改的密码;已有用户密码不会被自动重检
为什么 ALTER USER 报错 ERROR 1819?检查这三点
执行 ALTER USER 'root'@'localhost' IDENTIFIED BY 'weak123'; 报错 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements,常见原因不是策略设错了,而是:
🎯 HR面试评价助手(Word版格式) 生成可直接复制到Word文档的标准格式HR面试评价 【使用方式】 1. 发送口令:HR面试评价 2. 粘贴JD文字 3. 上传简历文档 4. 上传面试记录(可选) 5. 复制生成的评价到Word 【输出特点】 - 纯文本格式,可直接粘贴到Word - 层次清晰,标题加粗...
- 密码含用户名片段(如用户名
admin,密码含admin)→validate_password.check_user_name默认为ON,强制禁止 - 密码是常见弱口令(如
password,12345678)→ 即使policy = MEDIUM也会被拦截,这是硬编码在插件里的黑名单 - 客户端连接用的是旧协议(如 MySQL 5.7 客户端连 8.0 服务端),未正确发送认证信息 → 改用
--default-auth=mysql_native_password或升级客户端
临时绕过(仅调试用):SET SESSION validate_password.policy = LOW;,但生产环境严禁长期关闭校验。
持久化配置:my.cnf 里不能只写变量名
在 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf 中添加配置时,必须带 validate_password. 前缀,且注意大小写和下划线。写成 password_policy = MEDIUM 或 validate_password_policy = MEDIUM 都无效。
正确写法(放在 [mysqld] 段内):
plugin-load-add = validate_password.so validate_password.policy = MEDIUM validate_password.length = 12 validate_password.number_count = 1 validate_password.special_char_count = 1 validate_password.mixed_case_count = 1
⚠️ 注意:plugin-load-add 必须写在所有 validate_password.* 参数之前,否则 MySQL 启动时读到变量却找不到插件,直接启动失败。
改完配置后必须重启 MySQL(systemctl restart mysqld),仅 reload 不生效。


















