mysql 5.7 必须手动安装并启用 validate_password 插件(状态为 active),否则所有 set global 配置均无效;插件启用后,还需显式设置 length、mixed_case_count 等参数,仅调 policy 不起作用。

MySQL 5.7 默认不启用密码复杂度校验,validate_password 插件必须手动安装、启用并调参,否则所有 SET GLOBAL 配置都无效——这是绝大多数人配置失败的根本原因。
插件没装上,其他全是白忙
很多操作卡在“改了 policy 没反应”,其实是插件压根没加载成功。必须先确认状态,再操作变量:
- 执行
SHOW PLUGINS;,查找validate_password行,PLUGIN_STATUS必须是ACTIVE - 如果没看到或状态是
DISABLED,立刻运行:INSTALL PLUGIN validate_password SONAME 'validate_password.so';(Linux)或'validate_password.dll'(Windows) - 插件安装后会自动注册到
mysql.plugins表,后续重启 MySQL 不会丢失;若用--plugin-load-add启动参数方式加载,则每次重启都得带该参数 - 云数据库(如阿里云 RDS、腾讯云 CDB)通常禁用该插件且无法手动安装,需改用平台提供的“密码策略”开关,
INSTALL PLUGIN会直接报错
policy=2 不等于强密码,子规则阈值才是关键
validate_password.policy 设为 MEDIUM(即 2)只是启用全部校验项,但每项是否生效,取决于对应 count 和 length 参数的实际值:
-
validate_password.length默认是 8,设成 6 就会让123456通过;建议设为12 -
validate_password.mixed_case_count默认是 1,表示“至少含 1 个大写字母 + 1 个小写字母”;设成 0 就跳过大小写检查 -
validate_password.number_count和validate_password.special_char_count同理,默认都是 1,设为 0 即放行纯字母密码 - 执行
SHOW VARIABLES LIKE 'validate_password%';确认当前所有值,避免只改policy忘调子项
SET GLOBAL 生效但重启失效?必须写进 my.cnf
临时设置用 SET GLOBAL 可以立即起效,但 MySQL 重启后全部还原。要永久生效,必须写入配置文件:
- 编辑
/etc/my.cnf或/etc/mysql/my.cnf(Linux),在[mysqld]段下添加:
plugin-load-add = validate_password.so validate_password_policy = MEDIUM validate_password_length = 12 validate_password_mixed_case_count = 1 validate_password_number_count = 1 validate_password_special_char_count = 1
validate_password_policy,不是 validate_password.policy;点号命名是 8.0+ component 的写法,5.7 用下划线systemctl restart mysqld(或 service mysql restart)SHOW VARIABLES LIKE 'validate_password%';,确认值已加载ALTER USER 报 ERROR 1819?不一定是密码问题
即使密码完全合规,仍可能报 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements,常见原因是权限不足:
- 执行者账号必须拥有
CREATE USER权限,或全局UPDATE权限;普通账号仅授SELECT/INSERT是不够的 - 用
SELECT CURRENT_USER();查看当前身份,再用SHOW GRANTS;确认权限列表 - root 用户一般无此问题;若用低权限账号操作,要么提权,要么换 root 执行:
ALTER USER 'u'@'%' IDENTIFIED BY 'P@ssw0rd!'; - 不推荐用已弃用的
SET PASSWORD FOR绕过(8.0+ 已移除支持)
真正容易被忽略的是:插件加载和权限校验是两个独立关卡,缺一不可;很多人反复调参却始终不生效,其实连第一道门都没推开。











