validate_password组件需用install component安装并检查mysql.component表;启用后通过set global配置策略及参数,my.cnf中参数名须用下划线格式;strong模式需指定dictionary_file,否则密码操作报错。

确认 validate_password 组件是否已安装并启用
MySQL 8.0.17+ 默认不启用密码校验,validate_password 是组件(component),不是插件(plugin),用 INSTALL PLUGIN 会报错 ERROR 3510 (HY000) 或 ERROR 1126 (HY000)。别查 information_schema.plugins——它在 8.0+ 里对这个组件没用。
正确检查方式是:
-
SELECT * FROM mysql.component WHERE component_urn = 'file://component_validate_password';—— 有结果说明已安装 - 若无结果,执行:
INSTALL COMPONENT 'file://component_validate_password';(注意路径必须带file://前缀) - 安装后立即生效,无需重启,但若要持久化,需在
/etc/my.cnf的[mysqld]段加:validate_password=FORCE_PLUS_PERMANENT
设 policy = MEDIUM 或 STRONG 后再配具体参数
validate_password.policy 是总开关,不是可选配置项。设成 LOW(或 0)时,mixed_case_count、number_count 等全无效——你改了也白改。
推荐操作顺序(在线生效):
-
SET GLOBAL validate_password.policy = 'MEDIUM';(或'STRONG') SET GLOBAL validate_password.length = 12;-
SET GLOBAL validate_password.mixed_case_count = 1;(指大小写字母总数 ≥1,不是“大小写各一个”) SET GLOBAL validate_password.number_count = 1;SET GLOBAL validate_password.special_char_count = 1;-
SET GLOBAL validate_password.check_user_name = ON;(防密码含用户名,如app123)
STRONG 模式下还必须配 validate_password.dictionary_file,否则插件初始化失败,所有密码设置都会报错。
my.cnf 配置项名和 SQL 中不一样
写进配置文件的参数名不是 SQL 里的写法,写错就等于没配:
- SQL 中用:
validate_password.length、validate_password.policy - my.cnf 中必须写成:
validate_password_length、validate_password_policy(无下划线,首字母小写) - 常见错误:在配置文件里写
validate_password.length = 12→ 完全不生效,且无任何提示 - 所有参数都得写在
[mysqld]段下,写在客户端段落或注释行后无效
ALTER USER 报 ERROR 1820 不是 bug,是策略生效了
策略启用后,已有用户若密码不符合新规则,下次执行任意语句(比如 SELECT 1;)就会触发 ERROR 1820 (HY000): You must reset your password using ALTER USER。
这不是连接中断,而是 MySQL 强制要求重置:
- 必须用
ALTER USER 'user'@'host' IDENTIFIED BY 'NewPass@123';,不能用SET PASSWORD或直接更新mysql.user表 - 批量处理前,先查弱密码账户:
SELECT user, host FROM mysql.user WHERE LENGTH(authentication_string) (短哈希大概率是弱密) - 业务脚本中硬编码旧密码的,必须同步更新,否则上线即失败
最易被忽略的一点:策略只对 CREATE USER 和 ALTER USER ... IDENTIFIED BY 生效,root 初始密码、复制账号、或通过 authentication_string 直接赋值的密码不受校验——但这恰恰是审计重点。











