mysql 8.0.17+ 必须用 install component 'file://component_validate_password' 安装并启用 validate_password 组件,确认版本、路径存在、权限正确且组件注册成功后,再以 dotted 格式(如 validate_password.length)配置参数并持久化,否则策略不生效。

MySQL 8.0.17+ 必须用 INSTALL COMPONENT 启用 validate_password,INSTALL PLUGIN 虽能执行成功,但底层不走组件逻辑,后续参数可能不生效或行为异常。
确认 MySQL 版本和组件路径是否支持
先查版本:SELECT VERSION();。低于 8.0.17 的不要硬套组件方式;8.0.17+ 还得确认组件文件真实存在。
运行 SELECT @@global.component_path;(或查 mysqld --help --verbose 输出里的 component path),常见路径是 /usr/share/mysql/component_validate_password 或 /usr/local/mysql/share/component_validate_password。
若路径下没有 component_validate_password 文件,INSTALL COMPONENT 'file://...' 一定失败——不是语法错,是文件找不到。
- 云数据库(如阿里云 RDS、腾讯云 CDB)通常已预装组件,跳过安装步骤,直接配参数即可
- Docker 官方镜像(
mysql:8.0)默认带组件;某些精简版(如mysql:8.0-oracle变体)可能删了它,得换镜像或手动挂载 - 执行
INSTALL COMPONENT前,确保当前用户有SYSTEM_USER权限,普通 DBA 权限不够
执行 INSTALL COMPONENT 并验证是否真正加载
命令必须写全路径且带 file:// 协议前缀:INSTALL COMPONENT 'file://component_validate_password';。
别漏单引号,也别写成 file:///(三个斜杠会报错 ER_COMPONENT_CANT_ACCESS_FILE)。
成功后立刻查:SELECT * FROM mysql.component WHERE component_urn LIKE '%validate_password%'; —— 有记录才表示注册成功。
仅靠 SHOW VARIABLES LIKE 'validate_password.%' 不够:变量可能因配置文件残留而显示,但组件未装时这些变量只是“占位符”,不触发校验。
- 如果报错
ERROR 3525 (HY000): Cannot load component from file 'component_validate_password',90% 是路径不对或文件权限问题(MySQL 进程需有读取权限) - 组件和插件可共存,但组件优先级更高;卸载插件(
UNINSTALL PLUGIN validate_password;)不是必须步骤,但建议做,避免混淆 - 装完不重启 mysqld,策略立即对后续
CREATE USER/ALTER USER生效
配置参数必须用 dotted 形式,不能沿用插件旧写法
组件的系统变量名带点号,比如 validate_password.length,不是插件时代的 validate_password_length。
在配置文件 my.cnf 的 [mysqld] 段里,必须写成:validate_password.dictionary_file = /var/lib/mysql/weak.dicvalidate_password.policy = STRONG
而不是:validate-password=FORCE_PLUS_PERMANENT(这是插件专用启动选项,对组件无效)。
-
SET GLOBAL也能设,但只影响当前会话生命周期;写进配置文件才能持久化 - 设
validate_password.policy = STRONG前,务必先确认validate_password.dictionary_file指向的文件存在且 MySQL 可读,否则下次重启可能卡住(日志报Failed to initialize validate_password component) - 参数名大小写敏感,
validate_password.Policy或VALIDATE_PASSWORD.LENGTH都无效
为什么 SHOW VARIABLES 显示参数却仍不校验密码
最常见原因是:参数设了,但没触发校验场景。validate_password 组件只拦截三类语句:CREATE USER、ALTER USER ... IDENTIFIED BY、SET PASSWORD。它不检查 GRANT ... IDENTIFIED BY,也不管客户端工具(如 MySQL Workbench)用「修改用户」GUI 点出来的密码框——那些可能绕过 SQL 层直接发包。
- 测试是否真生效,只用这一条:
CREATE USER 'test'@'localhost' IDENTIFIED BY '123';,必须报ERROR 1819 (HY000)才算到位 - 已有用户不受影响,
ALTER USER 'root'@'localhost' IDENTIFIED BY '123';才会触发校验 - 如果用了
skip-grant-tables或启用了super_read_only=ON,组件校验会被跳过
真正容易被忽略的是:组件初始化失败不会中断 MySQL 启动,但会让所有密码校验静默失效——查 error log 里有没有 validate_password 相关的 warning 或 failed 字样,比看变量更可靠。











