validate_password插件未加载则所有密码策略配置无效;必须先执行install plugin使其状态为active,再set global配置policy、length等参数,且需写入my.cnf持久化。

validate_password插件没加载,所有配置都无效
MySQL 8.0 默认内置 validate_password,但状态是 DISABLED——不是“没装”,是“没启”。不先让它变成 ACTIVE,后面设的 validate_password.length、validate_password.policy 全部不生效,ALTER USER 依然能设 '123'。
确认方式:SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';。返回空或 DISABLED 就得手动加载。
- 运行时加载(临时):
INSTALL PLUGIN validate_password SONAME 'validate_password.so';(Linux)或'validate_password.dll'(Windows) - 持久化加载(推荐):在
my.cnf或my.ini的[mysqld]段加一行:plugin_load_add = validate_password.so - 某些云数据库(如阿里云 RDS)禁用该插件且不可安装,只能用控制台策略开关
validate_password.policy 设成 MEDIUM 后密码仍被拒
policy = MEDIUM 只是“启用校验项”,不代表所有规则自动开火。它依赖四个子参数的实际值,任何一个卡住都会失败。
比如设了 validate_password.policy = MEDIUM,但 validate_password.length 还是默认的 8,那一个 12 位含大小写+数字+符号的密码,只要长度没到 12 就直接被拦。
- 必须按顺序设置:先设
validate_password.length,再设number_count、special_char_count、mixed_case_count - 推荐最小基线:
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; -
validate_password.length最低实际生效值为 4,设成 3 也会按 4 处理
配置重启后失效,是因为没写进 my.cnf
SET GLOBAL 是运行时生效,MySQL 重启就还原。只有写进配置文件,才能持久。
特别注意:validate_password.dictionary_file 根本不能动态设置,必须在 my.cnf 中配置并重启 MySQL 才有效。
- 在
[mysqld]下添加:validate_password.length = 12、validate_password.policy = MEDIUM等参数 - 路径类参数(如
validate_password.dictionary_file)必须用绝对路径,且 MySQL 进程用户要有读权限 - 文件格式要求严格:每行一个单词,无空格、无注释、末尾必须有换行符
ALTER USER 报 ERROR 1819,不一定是密码问题
报错 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements,常见原因不是密码弱,而是执行者权限不足。
MySQL 在校验时会检查当前用户是否有修改用户定义的权限。普通账号只授了 SELECT 或 INSERT,执行 ALTER USER 就会触发这个错误,哪怕密码完全合规。
- 查当前身份:
SELECT CURRENT_USER(); - 查权限:
SHOW GRANTS;,确认是否含CREATE USER或全局UPDATE - 临时解决:用
root执行ALTER USER 'u'@'%' IDENTIFIED BY 'P@ssw0rd!';
真正容易被忽略的是:插件加载和参数配置必须分两步走,缺一不可;而 policy 和子参数之间存在隐式依赖,改了前者不调后者,等于白配。











