Mysql设置密码复杂度

Mysql设置密码复杂度

𝓓𝓸𝓷 Lv6

‌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)

⚙️ 主从配置要点

  1. ‌主库和从库分别执行‌:复制不会同步插件安装,从库需单独安装,否则从库密码策略缺失,主从密码强度不一致。‌‌

  2. ‌持久化配置(可选但推荐)‌: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。‌‌

  3. ‌验证生效‌:尝试设置弱密码,报 ERROR 1819 即插件已生效。‌‌

    1
    ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

⚠️ 注意事项

  • 插件只校验 CREATE USER、ALTER USER、SET PASSWORD 三类操作的新密码,不强制检查已有账号密码。
  • 主从复制账号(如 repl 用户)的密码也受策略约束,安装后修改复制账号密码需符合强度要求,否则复制可能中断。
  • 从库安装前先确认复制账号密码已满足策略要求,避免安装后 START SLAVE 因密码不符合策略而失败。
  • 若从库是只读实例,INSTALL PLUGIN 需要写权限,需在从库临时关闭 read_only 或使用超级权限执行。‌‌
  • Title: Mysql设置密码复杂度
  • Author: 𝓓𝓸𝓷
  • Created at : 2026-11-02 16:20:08
  • Updated at : 2026-11-02 16:21:52
  • Link: https://www.zhangdong.me/mysql-validate-password.html
  • License: This work is licensed under CC BY-NC-SA 4.0.
评论