mysql 5.7 默认启用 validate_password 插件,需先确认插件已加载并设为active,再显式配置 validate_password.length=4 等参数,且修改后须重启连接才能生效。

MySQL 5.7 默认启用 validate_password 插件,不手动调整策略等级和长度,SET PASSWORD 或 ALTER USER 会直接报错 ERROR 1819 (HY000) —— 这不是密码语法错了,是校验机制在拦你。
确认插件是否已加载且生效
很多操作失败的根源是:你以为配置了,其实插件压根没起来。执行以下命令验证:
SHOW VARIABLES LIKE 'validate_password%';
如果返回空或全为 OFF/NULL,说明插件未加载。此时 SET GLOBAL validate_password_policy = 0 会静默失败(无报错但不生效)。
- 先查插件路径:
SHOW VARIABLES LIKE 'plugin_dir';,确认目录下存在validate_password.so(Linux)或validate_password.dll(Windows) - 再安装插件:
INSTALL PLUGIN validate_password SONAME 'validate_password.so'; - 最后验证状态:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';,结果必须是ACTIVE
设 validate_password_policy = LOW 为什么还不够
LOW(即值 0)只启用长度检查,但它**不会自动覆盖其他参数的默认值**。比如 validate_password.length 默认仍是 8,哪怕你设了 policy = 0,设 6 位密码仍会失败。
🎯 HR面试评价助手(Word版格式) 生成可直接复制到Word文档的标准格式HR面试评价 【使用方式】 1. 发送口令:HR面试评价 2. 粘贴JD文字 3. 上传简历文档 4. 上传面试记录(可选) 5. 复制生成的评价到Word 【输出特点】 - 纯文本格式,可直接粘贴到Word - 层次清晰,标题加粗...
- 必须显式设置长度:
SET GLOBAL validate_password.length = 4;(最小允许值为 4) - 其他参数如
mixed_case_count、number_count等,在POLICY = LOW下虽不强制校验,但若它们值 >0,仍可能意外触发检查(部分 5.7.x 小版本有此行为) - 稳妥做法是全部归零:
SET GLOBAL validate_password.mixed_case_count = 0;、SET GLOBAL validate_password.number_count = 0;、SET GLOBAL validate_password.special_char_count = 0;
修改后密码仍报错:连接上下文没刷新
MySQL 的全局变量变更只对**新建立的连接**生效。你当前这个连接仍沿用旧策略,所以立刻执行 SET PASSWORD 会继续报错。
- 退出当前 MySQL 客户端:
EXIT; - 重新登录:
mysql -u root -p - 再执行密码修改:
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';(推荐)或SET PASSWORD = PASSWORD('123456'); - 注意:5.7.6+ 已弃用
PASSWORD()函数,建议用ALTER USER;若提示函数不存在,直接用明文:ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
my.cnf 配置重启后失效的真正原因
在 [mysqld] 段里直接写 validate_password.length = 4 是无效的 —— 这些是动态系统变量,MySQL 5.7 不支持在配置文件中直接初始化它们。
- 正确做法是在
my.cnf中仅加载插件:plugin-load-add = validate_password.so - 然后靠启动后 SQL 初始化:可写个
init-file(如/etc/mysql/init.sql),内容为多条SET GLOBAL ...语句,再在配置中加init-file = /etc/mysql/init.sql - 或者干脆不写配置,每次启动后手动执行一次初始化 SQL(开发/测试环境更省事)
复杂点在于:插件加载顺序、变量初始化时机、以及不同 5.7.x 小版本对 SET PERSIST 的支持差异 —— 8.0 才真正支持持久化,5.7 别信配置文件里直接写变量能生效。










