MySQL 主从架构配置密码复杂度需要安装 validate_password 插件,且主库和从库都需要安装 ,因为插件是每个实例独立加载的,不会通过复制自动同步。具体方法取决于 MySQL 版本,5.7 用插件形式,8.0 及以上推荐用组件形式。
🔍 先确认版本和当前状态 登录每个实例后执行:
1 2 3 4 5 6 7 8 9 10 mysql> SELECT VERSION(); +-----------+ | VERSION() | +-----------+ | 8.0.34 | +-----------+ 1 row in set (0.00 sec) mysql> SHOW VARIABLES LIKE 'validate_password%'; Empty set (0.01 sec)
有返回结果,说明已安装,无需重复操作。
返回空集,说明未安装,继续下面的步骤。
🔍 查看mysql插件或组件 1 2 3 # ll /usr/local/mysql/lib/plugin/|grep password -rwxr-xr-x. 1 7161 31415 196008 Jun 22 2023 component_validate_password.so -rwxr-xr-x. 1 7161 31415 164760 Jun 22 2023 validate_password.so
🧩 MySQL 5.7 安装插件 Mysql5.7 使用 INSTALL PLUGIN 语句,运行时加载并注册到 mysql.plugin 表,后续重启自动加载。
1 INSTALL PLUGIN validate_password SONAME 'validate_password.so';
Windows 平台将 .so 换成 .dll。
验证安装:
1 2 3 4 SHOW PLUGINS; SHOW VARIABLES LIKE 'validate_password%'; SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'validate_password'; SELECT * FROM mysql.component; (Mysql8)
PLUGIN_STATUS 为 ACTIVE 即生效。
🧩 MySQL 8.0+ 安装组件 Mysql8.0 起 validate_password 已用组件重新实现,插件形式虽仍可用但已弃用,推荐直接用组件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 主库: mysql> INSTALL COMPONENT 'file://component_validate_password'; Query OK, 0 rows affected (0.02 sec) 从库: mysql> INSTALL COMPONENT 'file://component_validate_password'; Query OK, 0 rows affected (0.02 sec) 查看组件: mysql> SELECT * FROM mysql.component; +--------------+--------------------+------------------------------------+ | component_id | component_group_id | component_urn | +--------------+--------------------+------------------------------------+ | 1 | 1 | file://component_validate_password | +--------------+--------------------+------------------------------------+ 1 row in set (0.00 sec) mysql> SHOW VARIABLES LIKE 'validate_password%'; +-------------------------------------------------+--------+ | Variable_name | Value | +-------------------------------------------------+--------+ | validate_password.changed_characters_percentage | 0 | | validate_password.check_user_name | ON | | validate_password.dictionary_file | | | validate_password.length | 8 | | validate_password.mixed_case_count | 1 | | validate_password.number_count | 1 | | validate_password.policy | MEDIUM | | validate_password.special_char_count | 1 | +-------------------------------------------------+--------+ 8 rows in set (0.00 sec) 如果Mysql8使用插件方式安装,且会有提醒: mysql> install plugin validate_password soname 'validate_password.so'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> show warnings; +---------+------+----------------------------------------------------------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------------------------------------------------------------------------------------------------+ | Warning | 1287 | 'validate password plugin' is deprecated and will be removed in a future release. Please use validate_password component instead | +---------+------+----------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
该语句会注册到 mysql.component 表,后续重启自动加载,无需每次手动指定。
验证安装:
1 2 SELECT * FROM mysql.component; SHOW VARIABLES LIKE 'validate_password%';
🧩 卸载插件 1 2 mysql> uninstall plugin validate_password; Query OK, 0 rows affected, 1 warning (0.04 sec)
⚙️ 主从配置要点
主库和从库分别执行 :复制不会同步插件安装,从库需单独安装,否则从库密码策略缺失,主从密码强度不一致。
持久化配置(可选但推荐) :INSTALL PLUGIN 或 INSTALL COMPONENT 已实现持久化,但策略参数(如 validate_password.policy、validate_password.length)是全局变量,重启后丢失,需写入 my.cnf 的 [mysqld] 段。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [mysqld] validate_password.policy = MEDIUM validate_password.length = 8 validate_password.number_count = 1 validate_password.mixed_case_count = 1 validate_password.special_char_count = 1 -- 查看当前设置 SHOW VARIABLES LIKE 'validate_password%'; -- 设置密码的最小长度 SET GLOBAL validate_password.length = 8; -- 设置密码中包含的大小写字符的最少数量 SET GLOBAL validate_password.mixed_case_count = 1; -- 设置密码中包含的数字的最少数量 SET GLOBAL validate_password.number_count = 1; -- 设置密码中包含的特殊字符的最少数量 SET GLOBAL validate_password.special_char_count = 1; -- 设置密码策略级别 SET GLOBAL validate_password.policy = MEDIUM;
5.7 的变量名不带点前缀,如 validate_password_policy;8.0 组件用带点格式 validate_password.policy。
验证生效 :尝试设置弱密码,报 ERROR 1819 即插件已生效。
1 ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
⚠️ 注意事项
插件只校验 CREATE USER、ALTER USER、SET PASSWORD 三类操作的新密码,不强制检查已有账号密码。
主从复制账号(如 repl 用户)的密码也受策略约束,安装后修改复制账号密码需符合强度要求,否则复制可能中断。
从库安装前先确认复制账号密码已满足策略要求,避免安装后 START SLAVE 因密码不符合策略而失败。
若从库是只读实例,INSTALL PLUGIN 需要写权限,需在从库临时关闭 read_only 或使用超级权限执行。