下载页面
MySQL Community Downloads 多种社区产品选择
MySQL Community 社区版安装包的下载地址—https://dev.mysql.com/downloads/mysql/,
YUM仓库安装MySQL的yum配置文件的下载地址—https://dev.mysql.com/downloads/repo/yum/
页面会随时间而变化
Fedora41安装MySQL8.4.4对应的链接是
https://dev.mysql.com/get/mysql84-community-release-fc41-1.noarch.rpm
可以下载 mysql84-community-release-fc41-1.noarch.rpm
后用 rpm -ivh
或 yum install
安装仓库
也可以直接用 rpm -ivh
或 yum install
从网络下载并安装
sudo rpm -ivh https://dev.mysql.com/get/mysql84-community-release-fc41-1.noarch.rpm
sudo yum install -y https://dev.mysql.com/get/mysql84-community-release-fc41-1.noarch.rpm
更新yum
sudo yum update
此时就能用 yum 安装 mysql-server 了, 自动包含 mysql-client
sudo yum install -y mysql-server
或者
sudo yum install -y mysql-community-server.x86_64
效果一样
mysqld
服务Fedora,CentOS的mysql服务是mysqld
, Ubuntu是mysql
systemctl start mysqld
systemctl start mysql
sudo systemctl enable mysqld --now
或者
sudo systemctl enable mysqld
sudo systemctl start mysqld
Ubuntu20.04 下用apt安装的mysql8.0.30默认不带validate_password
组件,可以使用空密码
Fedora,CentOS7下用yum安装的mysql8.0.30带validate_password
组件,默认要大小写字母数字特殊符号一起用,还有长度要求,体验很差
密码可能以括号开头结尾
生成的初始密码在 /var/log/mysqld.log
日志文件中
可能包含冒号,但不会包含冒号加空格, 所以可以用 :
冒号空格进行拆分
sudo awk -F': ' '/A temporary password is generated for/{print $2}' /var/log/mysqld.log
查看密码所在行
sudo grep 'temporary password' /var/log/mysqld.log;
本地登录不用开防火墙端口,
远程登陆开放端口3306:
sudo firewall-cmd --zone=$(sudo firewall-cmd --get-default-zone) --add-port=3306/tcp --permanent ;
sudo systemctl restart firewalld ;
用初始密码登录
手动输入密码
mysql -uroot -p
或者直接在-p
后粘贴密码
用复制粘贴的话,因为有特殊字符,所以要加上单引号和双引号,最好用 单引号
并且-p
和单双引号
之间不能有空格
mysql -uroot -p':id(.aZr<1Tt'
必须先更改为另一个强密码, 可以不用记住它, 设好后, 降低密码强度, 或者卸载validate_password
这个组件
设置密码方法1
ALTER USER root@localhost IDENTIFIED BY 'ABCDEFGhijklmn1234567!!!';
设置密码方法2
SET PASSWORD='ABCDEFGhijklmn1234567!!!';
降低密码强度要求的方法有:
validate_password
的相关选项来降低密码强度要求validate_password
查看原始的 validate_password 各属性默认值
SHOW VARIABLES LIKE '%validate_password%';
结果
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.02 sec)
其中
validate_password.changed_characters_percentage
是msqyl8.0.34的新属性, 取值0-100百分比,表示修改密码时,新密码与旧密码的不相同程度要求validate_password.check_user_name
检查密码是否包含用户名validate_password.dictionary_file
指定自定义弱密码字典文件路径(仅 STRONG 策略生效)。validate_password.length
密码的最小长度。validate_password.mixed_case_count
密码中至少包含的大写和小写字母总数。(MEDIUM及以上策略生效)。validate_password.number_count
密码中至少包含的数字数量。(MEDIUM及以上策略生效)。validate_password.policy
策略, 可选: LOW(0)
, MEDIUM(1)
, STRONG(2)
LOW
或 0
: 仅检查密码长度。MEDIUM
或 1
:(默认):检查长度、大小写字母、数字和特殊字符。STRONG
或 2
: 在 MEDIUM 基础上,额外检查密码是否包含弱密码字典中的词汇。validate_password.special_char_count
密码中至少包含的特殊字符数量(MEDIUM及以上策略生效)。SET GLOBAL
命令来设置SET GLOBAL validate_password.policy=LOW;
降低密码复杂度要求SET GLOBAL validate_password.mixed_case_count=0;
最少大小写字符数SET GLOBAL validate_password.number_count=0;
最少数字字符数SET GLOBAL validate_password.special_char_count=0;
最少特殊字符数SET GLOBAL validate_password.check_user_name=OFF
; 允许用户名和密码相同SET GLOBAL validate_password.length=0;
设置密码最小长度, 要放到最后设置, 否则可能被其它值影响, 使其没法为0, 可能是4或者2### 密码策略: 0或LOW是只检查长度 , 1或MEDIUM是检查长度数字字母特殊字符的个数 , 2或STRONG是比1多检查字典文件 ;
SET GLOBAL validate_password.policy=LOW;
### 最少大小写字母数
SET GLOBAL validate_password.mixed_case_count=0;
### 最少数字字符数
SET GLOBAL validate_password.number_count=0;
### 最少特殊字符数
SET GLOBAL validate_password.special_char_count=0;
### 是否允许密码包含正反用户名 , 取值ON/OFF
SET GLOBAL validate_password.check_user_name=OFF;
### 密码最小长度, 要放到最后设置, 否则可能被其它值影响, 使其没法为0, 可能是4或者2
SET GLOBAL validate_password.length=0;
### 查看 validate_password 的相关MySQL系统变量
SHOW VARIABLES LIKE '%validate_password%';
用 INSTALL
和 UNINSTALL
命令
安装 validate_password 组件
INSTALL COMPONENT 'file://component_validate_password';
INSTALL COMPONENT 'file://component_validate_password';
卸载 validate_password 卸载
UNINSTALL COMPONENT 'file://component_validate_password';
UNINSTALL COMPONENT 'file://component_validate_password';
自用的话卸载 validate_password 插件
UNINSTALL COMPONENT 'file://component_validate_password';
然后就能设为空密码
ALTER USER root@localhost IDENTIFIED BY '';
或
SET PASSWORD='';
操作系统的root输入mysql就能直接登录
MySQL8 创建用户,设置修改密码,授权
创建一个名为remote的远程用户, remote
等效remote'@'%
### 创建一个名为remote的远程用户, remote等效'remote'@'%'
CREATE USER remote IDENTIFIED BY '';
创建一个可以用 Navicat11 登录的远程用户
### 创建一个名为remote的远程用户, remote等效'remote'@'%', 使用mysql5.7旧版密码插件,方便使用Navicat11等登录
CREATE USER remote IDENTIFIED WITH mysql_native_password BY '';
赋予remote所有权限和权力传递的权限,并将root角色授予remote
GRANT ALL ON *.* TO 'remote'@'%' WITH GRANT OPTION; GRANT root@'localhost' TO remote; SET DEFAULT ROLE root@'localhost' TO remote; FLUSH PRIVILEGES;
纯字母数字的用户名可以不加单引号,
@及右边省略效果与加上@'%'
的效果相同,
root
等效 root@'%'
等效 'root'@'%'
创建root@'%'
, 并将 root@'localhost'
的权限授予 root@'%'
,
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY '密码'; GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
创建 root@'%'
, 并让root@'%'
扮演root@'localhost'
的角色 , 并设置为默认角色
CREATE USER IF NOT EXISTS root IDENTIFIED BY '密码'; GRANT root@'localhost' TO 'root'@'%'; SET DEFAULT ROLE root@'localhost' TO 'root'@'%'; FLUSH PRIVILEGES;
权限和角色两者都加持
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY '密码'; GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION; GRANT root@'localhost' TO 'root'@'%'; SET DEFAULT ROLE root@'localhost' TO 'root'@'%'; FLUSH PRIVILEGES;
权限和角色两者都加持, 无密码
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY ''; GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION; GRANT root@'localhost' TO 'root'@'%'; SET DEFAULT ROLE root@'localhost' TO 'root'@'%'; FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON
等效 GRANT ALL ON
, 效果同上
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY ''; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; GRANT root@'localhost' TO 'root'@'%'; SET DEFAULT ROLE root@'localhost' TO 'root'@'%'; FLUSH PRIVILEGES;
'root'@'%'
可以写成root@'%'
可以写成root
, 效果同上
CREATE USER IF NOT EXISTS root IDENTIFIED BY ''; GRANT ALL ON *.* TO root WITH GRANT OPTION; GRANT root@'localhost' TO root; SET DEFAULT ROLE root@'localhost' TO root; FLUSH PRIVILEGES;
降低密码强度, 创建用户, 无密码 , 赋予最大权限和root角色, 设置root角色为默认角色, 刷新权限,
-------- 降低密码强度, 创建用户, 无密码 , 赋予最大权限和root角色, 设置root角色为默认角色, 刷新权限 --------
## 降低密码强度
---- 新旧密码不同度百分比要求,取值0-100, MySQL8.0.34才有
SET GLOBAL validate_password.changed_characters_percentage = 0;
#### 密码策略: 0或LOW是只检查长度 , 1或MEDIUM是检查长度数字字母特殊字符的个数 , 2或STRONG是比1多检查字典文件 ;
SET GLOBAL validate_password.policy=LOW;
#### 最少大小写字母数
SET GLOBAL validate_password.mixed_case_count=0;
#### 最少数字字符数
SET GLOBAL validate_password.number_count=0;
#### 最少特殊字符数
SET GLOBAL validate_password.special_char_count=0;
#### 是否允许密码包含正反用户名 , 取值ON/OFF
SET GLOBAL validate_password.check_user_name=OFF;
#### 密码最小长度, 要放到最后设置, 否则可能被其它值影响, 使其没法为0, 可能是4或者2
SET GLOBAL validate_password.length=0;
## 创建用户, 无密码 , 赋予最大权限和root角色, 设置root角色为默认角色
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY ''; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; GRANT root@'localhost' TO 'root'@'%'; SET DEFAULT ROLE root@'localhost' TO 'root'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
卸载 validate_password 组件, 创建用户, 无密码 , 赋予最大权限和root角色, 设置root角色为默认角色, 刷新权限,
-------- 降低密码强度, 创建用户, 无密码 , 赋予最大权限和root角色, 设置root角色为默认角色, 刷新权限 --------
## 卸载 validate_password 组件
UNINSTALL COMPONENT 'file://component_validate_password';
## 创建用户, 无密码 , 赋予最大权限和root角色, 设置root角色为默认角色
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY ''; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; GRANT root@'localhost' TO 'root'@'%'; SET DEFAULT ROLE root@'localhost' TO 'root'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
sudo firewall-cmd --zone=$(sudo firewall-cmd --get-default-zone) --add-port=3306/tcp --permanent ; sudo systemctl restart firewalld ;
DROP USER 'u'@'h'
DROP USER root;
只会删除'root'@'%'
, 不会删除 'root'@'localhost'
DROP USER root;
DROP USER root@'%';
DROP USER 'root'@'%';
DROP USER IF EXISTS root;
只会删除'root'@'%'
, 不会删除 'root'@'localhost'
DROP USER IF EXISTS root;
DROP USER IF EXISTS root@'%';
DROP USER IF EXISTS 'root'@'%';
#!/bin/bash
sudo rpm -ivh https://dev.mysql.com/get/mysql84-community-release-fc41-1.noarch.rpm
sudo yum install -y mysql-community-server.x86_64
sudo systemctl enable mysqld --now
MysqlInitialTemporaryPassword=`awk -F': ' '/A temporary password is generated for/{print $2}' /var/log/mysqld.log`
MysqlFirstLoginCodeCommand="mysql -uroot -p"$MysqlInitialTemporaryPassword
$MysqlFirstLoginCodeCommand
#!/bin/bash
sudo yum remove -y mariadb;
sudo yum install -y https://dev.mysql.com/get/mysql84-community-release-fc41-1.noarch.rpm
sudo yum install -y mysql-community-server.x86_64
sudo systemctl enable mysqld
sudo systemctl start mysqld
MysqlInitialTemporaryPassword=`sudo awk -F': ' '/A temporary password is generated for/{print $2}' /var/log/mysqld.log`
MysqlFirstLoginCodeCommand="mysql -uroot -p"$MysqlInitialTemporaryPassword
$MysqlFirstLoginCodeCommand
ALTER USER root@localhost IDENTIFIED BY 'ABCDEFGhijklmn1234567!!!';
### 密码策略: 0或LOW是只检查长度 , 1或MEDIUM是检查长度数字字母特殊字符的个数 , 2或STRONG是比1多检查字典文件 ;
SET GLOBAL validate_password.policy=LOW;
### 最少大小写字符数
SET GLOBAL validate_password.mixed_case_count=0;
### 最少数字字符数
SET GLOBAL validate_password.number_count=0;
### 最少特殊字符数
SET GLOBAL validate_password.special_char_count=0;
### 是否允许密码包含正反用户名 , 取值ON/OFF
SET GLOBAL validate_password.check_user_name=OFF;
### 密码最小长度, 要放到最后设置, 否则可能被其它值影响, 使其没法为0, 可能是4或者2
SET GLOBAL validate_password.length=0;
### 查看 validate_password 的相关MySQL系统变量
SHOW VARIABLES LIKE '%validate_password%';
SET PASSWORD='';
CREATE USER IF NOT EXISTS remote IDENTIFIED WITH mysql_native_password BY '';
GRANT ALL ON *.* TO 'remote'@'%' WITH GRANT OPTION; GRANT root@'localhost' TO remote; SET DEFAULT ROLE root@'localhost' TO remote; FLUSH PRIVILEGES;
exit
sudo firewall-cmd --zone=$(sudo firewall-cmd --get-default-zone) --add-port=3306/tcp --permanent ; sudo systemctl restart firewalld ;
mysql -uremote
MySQL8.4官方参考手册—密码验证组件—8.4.3 The Password Validation Component
8.4.3.2章节 密码验证选项变量 Password Validation Options and Variables
MySQL8.0官方参考手册—密码验证组件—8.4.3 The Password Validation Component
MySQL5.7官方参考手册—密码验证插件—6.4.3 The Password Validation Plugin
组件和插件
插件
组件
Ubuntu20.04下用apt安装的MySQL8.0默认没有使用validate_password 插件或组件
CentOS7下用MySQL官方yum仓库安装的MySQL8.0默认启用validate_password 组件
MySQL5.7的 validate_password 插件
在MySQL8.0中任然可以使用,但默认不使用,已过时,未来准备移除
MySQL8.0的 validate_password 组件 | MySQL5.7 validate_password 插件 | 功能 | 取值 |
---|---|---|---|
validate_password.check_user_name | validate_password_check_user_name | 检查密码与用户名是否相同或相反 | ON/OFF |
validate_password.dictionary_file | validate_password_dictionary_file | 检查密码与密码字典 | 字典文件路径 |
validate_password.length | validate_password_length | 检查密码长度 | 0至正整数 |
validate_password.mixed_case_count | validate_password_mixed_case_count | 检查密密码大小写字母总数 | 0至正整数 |
validate_password.number_count | validate_password_number_count | 检查密密码数字字符总数 | 0至正整数 |
validate_password.policy | validate_password_policy | 密码策略,检查密码复杂度 | 0、1、2 对应 LOW、MEDIUM、STRONG |
validate_password.special_char_count | validate_password_special_char_count | 检查密码特殊字符的个数 | 0至正整数 |
可看到插件变量validate_password之后是下划线_
, 组件变量validate_password之后是点.
插件的变量是相对独立的, 组件的变量被统一在validate_password之下
validate_password.policy
和 validate_password_policy
的取值
`validate_password.policy` 和 `validate_password_policy` 的取值效果 | |
---|---|
取值 | 效果 |
0 或者 LOW | 只检查密码长度 |
1 或者 MEDIUM | 检查长度; 数字、小写/大写和特殊字符 |
2 或者 STRONG | 长度; 数字、小写/大写和特殊字符;字典文件 |
取值 | 效果 |
---|---|
0 或者 LOW |
只检查密码长度 |
1 或者 MEDIUM |
检查长度; 数字、小写/大写和特殊字符 |
2 或者STRONG |
长度; 数字、小写/大写和特殊字符;字典文件 |
### 查看 validate_password 的相关MySQL系统变量
SHOW VARIABLES LIKE '%validate_password%';
安装 validate_password 组件
### 安装 validate_password 组件
INSTALL COMPONENT 'file://component_validate_password';
卸载 validate_password 组件
### 卸载 validate_password 组件
UNINSTALL COMPONENT 'file://component_validate_password';
安装 validate_password 插件
### 安装 validate_password 插件
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
卸载 validate_password 插件
### 卸载 validate_password 插件
UNINSTALL PLUGIN validate_password;
在组件和插件都没安装的情况下, 安装组件,查看相关变量, 安装插件,查看相关变量, 卸载组件, 查看相关变量
mysql> ### 查看 validate_password 的相关MySQL系统变量
mysql> SHOW VARIABLES LIKE '%validate_password%';
Empty set (0.03 sec)
mysql> ### 安装 validate_password 组件
mysql> INSTALL COMPONENT 'file://component_validate_password';
Query OK, 0 rows affected (0.08 sec)
mysql> ### 查看 validate_password 的相关MySQL系统变量
mysql> SHOW VARIABLES LIKE '%validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| 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 |
+--------------------------------------+--------+
7 rows in set (0.00 sec)
mysql> ### 安装 validate_password 插件
mysql> INSTALL PLUGIN validate_password SONAME 'validate_password.so';
Query OK, 0 rows affected, 1 warning (0.09 sec)
mysql> ### 查看 validate_password 的相关MySQL系统变量
mysql> SHOW VARIABLES LIKE '%validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| 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 |
| 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 |
+--------------------------------------+--------+
14 rows in set (0.00 sec)
mysql> ### 卸载 validate_password 组件
mysql> UNINSTALL COMPONENT 'file://component_validate_password';
Query OK, 0 rows affected (0.08 sec)
mysql> ### 查看 validate_password 的相关MySQL系统变量
mysql> SHOW VARIABLES LIKE '%validate_password%';
+--------------------------------------+--------+
| Variable_name | Value |
+--------------------------------------+--------+
| 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 |
+--------------------------------------+--------+
7 rows in set (0.00 sec)
MySQL validate_password
组件详解
validate_password
是 MySQL 内置的密码策略插件(MySQL 8.0+ 中为组件),用于强制用户设置符合安全要求的密码。以下是其核心功能与配置方法:
1. 核心功能
changed_characters_percentage
)。123456
、password
)。 2. 安装与启用
MySQL 8.0+(组件形式)
-- 安装组件
INSTALL COMPONENT 'file://component_validate_password';
-- 验证是否启用
SELECT * FROM mysql.component WHERE component_urn LIKE '%validate_password%';
MySQL 5.7(插件形式)
-- 安装插件
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
-- 验证是否启用
SHOW PLUGINS LIKE 'validate_password%';
3. 配置参数详解
通过以下系统变量控制密码策略:
参数名 | 默认值 | 说明 |
---|---|---|
validate_password.policy |
MEDIUM |
密码策略等级:LOW /MEDIUM /STRONG 。 |
validate_password.length |
8 |
密码最小长度(可覆盖策略等级的长度要求)。 |
validate_password.mixed_case_count |
1 |
密码中至少包含的大写和小写字母总数(MEDIUM 及以上策略生效)。 |
validate_password.number_count |
1 |
密码中至少包含的数字数量(MEDIUM 及以上策略生效)。 |
validate_password.special_char_count |
1 |
密码中至少包含的特殊字符数量(MEDIUM 及以上策略生效)。 |
validate_password.changed_characters_percentage |
0 |
mysql8.0.34新属性,修改密码时新旧密码字符差异的最小百分比(需手动启用)。 |
validate_password.dictionary_file |
空 |
自定义弱密码字典文件路径(STRONG 策略生效)。 |
validate_password.check_user_name |
ON |
禁止密码包含用户名。 |
4. 密码策略等级(validate_password.policy
)
等级 | 规则 |
---|---|
LOW | 仅检查密码长度。 |
MEDIUM | 检查长度、大小写字母、数字、特殊字符。 |
STRONG | 在 MEDIUM 基础上,额外检查是否包含字典文件中的弱密码。 |
5. 示例配置
场景:高安全环境
-- 设置密码策略为 STRONG
SET GLOBAL validate_password.policy = STRONG;
-- 密码最小长度 12
SET GLOBAL validate_password.length = 12;
-- 要求至少 2 个数字、2 个特殊字符
SET GLOBAL validate_password.number_count = 2;
SET GLOBAL validate_password.special_char_count = 2;
-- 启用新旧密码差异检查(至少 30% 不同)
SET GLOBAL validate_password.changed_characters_percentage = 30;
-- 加载自定义弱密码字典
SET GLOBAL validate_password.dictionary_file = '/path/to/dictionary.txt';
验证密码强度
-- 使用函数检查密码是否符合规则
SELECT VALIDATE_PASSWORD_STRENGTH('MyP@ssw0rd!2024');
-- 返回值:100(最高强度)
MySQL validate_password
组件属性详解
MySQL 的 validate_password
组件用于强制实施密码策略,确保用户设置的密码符合安全要求。以下是其核心属性及其配置说明:
**1. validate_password.policy
**
LOW
:仅检查密码长度。MEDIUM
(默认):检查长度、大小写字母、数字和特殊字符。STRONG
:在 MEDIUM
基础上,额外检查密码是否包含弱密码字典中的词汇。SET GLOBAL validate_password.policy = STRONG;
2. validate_password.length
8
。STRONG
默认要求更长密码)。SET GLOBAL validate_password.length = 12; -- 强制密码至少12位
3. validate_password.mixed_case_count
1
(如 Aa
或 aB
)。MEDIUM
或 STRONG
。SET GLOBAL validate_password.mixed_case_count = 2; -- 要求至少2个大小写混合字符
Abc123!
(A 和 b 视为混合)。ABC123!
(全大写,无小写)。 4. validate_password.number_count
1
。MEDIUM
或 STRONG
。SET GLOBAL validate_password.number_count = 2; -- 要求至少2个数字
Pass12word!
(包含 1
和 2
)。Passw0rd!
(仅1个数字)。 5. validate_password.special_char_count
!@#$%^&*
)。1
。MEDIUM
或 STRONG
。SET GLOBAL validate_password.special_char_count = 2; -- 要求至少2个特殊字符
P@ssw0rd!
(@
和 !
)。Passw0rd#
(仅1个特殊字符)。 6. validate_password.changed_characters_percentage
0
(未启用)。SET GLOBAL validate_password.changed_characters_percentage = 30; -- 至少30%不同
Abcd1234
(8字符)。Xbcd5678
(4个不同字符,占比 4/8=50%
,通过)。 7. validate_password.dictionary_file
STRONG
策略生效)。SET GLOBAL validate_password.dictionary_file = '/path/to/dictionary.txt';
password
,则密码 Password123!
会被拒绝。 8. validate_password.check_user_name
ON
)。admin
,则密码 Admin123!
会被拒绝。以下是 MySQL 8.4 的详细介绍,重点涵盖其核心特性、改进方向及适用场景:
1. 版本定位与支持周期
LTS(长期支持版本):
MySQL 8.4 是官方指定的 长期支持版本,支持周期至 2026 年,适合生产环境使用。
兼容性与升级限制:
2. 性能优化与存储引擎改进
InnoDB 增强
参数默认值调整:
innodb_io_capacity
默认值从 200 提升至 10,000,适配 SSD 高性能存储。innodb_log_buffer_size
从 32MB 翻倍至 64MB,提升大事务处理能力。innodb_adaptive_hash_index
和 innodb_change_buffering
,避免混合读写负载下的性能抖动。内存管理优化:
innodb_numa_interleave
,优化 NUMA 架构服务器的内存分配。 3. 安全与权限管理
认证与插件变更
弃用旧认证方式:
mysql_native_password
插件,推荐使用 caching_sha2_password
。--mysql-native-password=ON
)。新增权限:
FLUSH_PRIVILEGES
需独立权限(不再依赖 RELOAD
)。OPTIMIZE_LOCAL_TABLE
权限支持本地表优化操作。 4. 复制与高可用性
GTID 与复制增强
/*!80017 'audit_tag:payment' */
),便于追踪事务来源。MTS
(多线程复制)模式下支持 SQL_AFTER_GTIDS
,提升复制效率。克隆与集群改进
BEFORE_ON_PRIMARY_FAILOVER
,确保故障切换时数据强一致。 5. 运维与监控
内存与临时表管理
temptable_use_mmap=OFF
),减少对 tmpdir
的依赖。temptable_max_ram
根据系统内存动态调整(默认 3% 内存,上限 4GB)。监控与诊断
ANALYZE TABLE
自动更新列的统计直方图。6. 安装与配置建议
innodb_flush_method=O_DIRECT
(绕过文件系统缓存)。fsync
作为默认刷盘方式。mysqldump --output-as-version
导出旧版本兼容数据。升级注意事项
innodb_adaptive_hash_index
禁用后的负载性能。innodb_io_capacity=10000
的效果。mysql_native_password
,及时迁移认证方式。mysql-shell
工具检查升级兼容性(util.checkForServerUpgrade()
)。 总结
MySQL 8.4 作为 LTS 版本,聚焦 安全性、性能调优 和 运维简化,适合需要长期稳定支持的企业级场景。升级前需重点验证旧版本兼容性,并结合监控工具观察新参数对业务负载的影响。
MySQL 8.4 与 MySQL 8.0 对比分析
MySQL 8.4 是 MySQL 8.0 系列的 长期支持版本(LTS),继承了 8.0 的核心功能并引入多项改进。以下是关键差异的详细对比:
1. 版本支持与生命周期
特性 | MySQL 8.0 | MySQL 8.4 |
---|---|---|
支持类型 | 常规版本(非 LTS) | 长期支持版本(LTS) |
支持周期 | 官方支持已逐步结束 | 支持至 2026 年 |
升级兼容性 | 支持从 5.7 升级 | 不支持直接从 5.7 升级 |
版本策略 | 每季度发布功能更新 | 仅修复关键漏洞和性能问题 |
2. 性能优化
特性 | MySQL 8.0 | MySQL 8.4 |
---|---|---|
InnoDB 默认参数 | innodb_io_capacity=200 |
innodb_io_capacity=10000 (适配 SSD) |
NUMA 支持 | 需手动配置 innodb_numa_interleave |
默认启用 |
Doublewrite 文件 | 每个表空间独立文件 | 全局仅保留 2 个文件 |
临时表管理 | 默认使用内存映射文件(MMAP) | 默认使用 InnoDB 磁盘存储 |
3. 安全增强
特性 | MySQL 8.0 | MySQL 8.4 |
---|---|---|
默认认证插件 | caching_sha2_password |
caching_sha2_password (禁用 mysql_native_password ) |
权限管理 | RELOAD 权限控制 FLUSH |
新增独立权限 FLUSH_PRIVILEGES |
密码策略 | 支持 validate_password |
默认优化策略(如 changed_characters_percentage ) |
SSL/TLS | 支持 TLS 1.2 | 默认禁用 TLS 1.0/1.1 |
4. 复制与高可用性
特性 | MySQL 8.0 | MySQL 8.4 |
---|---|---|
Group Replication | 默认一致性级别 EVENTUAL |
默认 BEFORE_ON_PRIMARY_FAILOVER (强一致) |
GTID 管理 | 支持基础 GTID | 支持 GTID 标签化(标记事务来源) |
克隆插件 | 允许跨大版本克隆 | 仅允许同大版本克隆(如 8.4.x) |
5. 运维与监控
特性 | MySQL 8.0 | MySQL 8.4 |
---|---|---|
临时表内存分配 | 固定 temptable_max_ram=1GB |
动态分配(3% 系统内存,上限 4GB) |
直方图统计 | 需手动更新 | ANALYZE TABLE 自动更新 |
长事务回滚监控 | 无进度提示 | 记录回滚进度日志 |
6. 安装与平台适配
特性 | MySQL 8.0 | MySQL 8.4 |
---|---|---|
Linux 刷盘模式 | 默认 fsync |
默认 O_DIRECT (绕过缓存) |
Windows/macOS 兼容性 | 支持基础功能 | 优化 NUMA 和内存管理 |
升级注意事项
性能影响:
innodb_io_capacity=10000
可能对机械硬盘负载过高,需根据存储类型调整。innodb_adaptive_hash_index
可能影响高频查询性能,需测试验证。安全兼容性:
mysql_native_password
,需在 8.4 中手动启用(配置 --mysql-native-password=ON
)。复制集群升级:
配置迁移:
mysqldump --output-as-version=8.0
导出旧版本兼容数据。总结
升级前务必进行 性能压测 和 安全审计,并参考官方升级指南(MySQL 8.4 Release Notes)。
从 MySQL 8.0.34 版本开始引入的。
validate_password.changed_characters_percentage
是 MySQL 中 validate_password 插件的一个参数,用于控制密码强度策略,不过该参数是从 MySQL 8.0.34 版本开始引入的。
可参考官文 8.4.3.2章节 密码验证选项变量 Password Validation Options and Variables
1. 参数功能
2. 规则细节
计算方式
字符对比范围:
Abcd1234
(长度8)Xbcd5678
(长度8)A→X
)、第5-8位(1→5
, 2→6
, 3→7
, 4→8
),总计 4个不同字符,占比 4/8 = 50%
。公式:
[
\text{修改比例} = \frac{\text{新旧密码不同字符数}}{\text{旧密码长度}} \times 100%
]
阈值要求:
3. 配置方法
启用与设置
激活插件:
确保 validate_password
组件已启用:
INSTALL COMPONENT 'file://component_validate_password';
设置阈值:
SET GLOBAL validate_password.changed_characters_percentage = 30; -- 要求至少30%的字符不同
持久化配置(修改配置文件 my.cnf
):
[mysqld]
validate_password.changed_characters_percentage = 30
4. 示例验证
旧密码 | 新密码 | 对比长度 | 不同字符数 | 修改比例 | 是否通过(阈值30%) |
---|---|---|---|---|---|
P@ssw0rd |
P@ssw1rd |
8 | 1 | 12.5% | ❌ |
Hello2023 |
H3llo!2024 |
9 | 3(e→3 , ! , 4 ) |
33.3% | ✔️ |
Qwer1234 |
Qw#r5678 |
8 | 4(e→# , 1→5 , 2→6 , 3→7 , 4→8 ) |
50% | ✔️ |
Short1 |
Sh0rt1! |
6 | 2(o→0 , 新增! 不计入对比) |
33.3% | ✔️ |
5. 注意事项
边界情况
-- 旧密码:'Secur3'(6字符)
-- 新密码:'S3cur3!X'(7字符,仅对比前6位)
-- 不同字符数:1('e'→'3'),占比 16.6%
兼容性
validate_password
其他策略协同使用(如最小长度、特殊字符要求)。changed_characters_percentage
,建议同时设置 validate_password.length
防止用户通过缩短密码绕过规则。6. 安全建议
validate_password.policy=STRONG
)。password_reuse_interval
)。error.log
中记录密码策略违规)。通过配置 validate_password.changed_characters_percentage
,可显著提升密码更新的安全性,减少因简单修改导致的账户风险。