mysql 5.7+默认自带validate_password插件但不自动启用,需通过information_schema.plugins查询状态;安装须先install plugin再set global配置策略;仅对create/alter user和set password生效,不影响旧密码;参数如length、number_count等需显式设置并写入my.cnf持久化。

验证插件是否已加载:检查 validate_password 是否在运行
MySQL 5.7+ 默认自带 validate_password 插件,但不自动启用。直接查系统表最可靠:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password';如果返回空或
PLUGIN_STATUS 是 DISABLED,说明没装或没启。别信 SHOW PLUGINS; 的默认输出——它可能漏掉状态为 DISABLED 的条目。
安装并启用插件:两步不能颠倒,且必须有 SUPER 权限
插件安装和启用是两个独立操作,顺序错了会失败:
- 先执行
INSTALL PLUGIN validate_password SONAME 'validate_password.so';(Linux)或'validate_password.dll'(Windows) - 再执行
SET GLOBAL validate_password.policy = MEDIUM;等配置,否则插件加载后仍按默认策略(LOW)跑 - 若提示
ERROR 1702 (HY000): Plugin 'validate_password' is disabled,就是只装没启;若提示ERROR 1123 (HY000): Can't initialize function 'validate_password',通常是插件文件路径不对或权限不足
INSTALL COMPONENT 'file://component_validate_password';,老命令会报错。
密码策略生效范围:只管新设/修改密码,不强制改旧账号
插件对已有用户的密码不做校验,只拦截 CREATE USER、ALTER USER、SET PASSWORD 这三类操作。常见误判场景:
- 用
UPDATE mysql.user SET authentication_string=...绕过校验——这会破坏密码哈希一致性,下次登录可能失败 - 用
GRANT ... IDENTIFIED BY创建用户时,策略照常触发 -
validate_password.length设为 12,但用户用ALTER USER 'u'@'%' PASSWORD EXPIRE;再改回原密码,只要原密码没过期就不校验
策略参数调优:别只调 policy,number_count 和 mixed_case_count 容易被忽略
validate_password.policy 设成 MEDIUM 或 STRONG 只是开关,真正起效靠底层参数:
-
validate_password.length:最小长度,但若设太小(如 6),MEDIUM下仍要求含数字+大小写+特殊字符,实际门槛更高 -
validate_password.number_count:至少几个数字,默认 1;设 0 就跳过数字检查 -
validate_password.mixed_case_count:至少几个大小写字母组合,默认 1;设 0 才允许全小写 - MySQL 8.0+ 新增
validate_password.dictionary_file,可加载禁用词表,但必须提前用validate_password.load_dictionary_file()加载,否则参数设了也无效
SELECT @@validate_password.length; 确认生效,变量名带 @,别漏。
插件加载后不重启 MySQL 也能生效,但所有配置项都只是会话级或全局级变量,服务重启后会丢失——必须写进 my.cnf 的 [mysqld] 段里,比如 validate_password.policy = MEDIUM,否则一重启就回到默认的 LOW。











