Fedora41安装MySQL8.4.4
- Fedora41用yum仓库安装MySQL8.4.4 笔记250310
- 下载安装
- 启动`mysqld`服务
- 查看生成的初始密码 , 用初始密码登录
- 登录后,必须修改初始密码才能执行其它操作
- 可选设置降低密码强度要求, 使用简单密码
- 降低 validate_password 组件对密码强度的要求
- 用`SET GLOBAL`命令来设置
- 可选: 卸载 validate_password 组件, 可将密码设为空, 实现无密码登录
- 创建远程用户
- 创建远程用户
- 创建远程root的语句模板
- 开放 firewalld 防火墙的3306端口
- 删除用户 `DROP USER 'u'@'h'`
- 用脚本安装
- Fedora41一步安装MySQL8.4.4并且第一次登录
- Fedora41一步安装MySQL8.4.4并且将root@localhost免密, 创建免密的remote用户, 开放3306端口
- 补充
- validate_password插件 和 validate_password组件
- 查看 validate_password 组件或插件的相关MySQL系统变量
- 安装卸载 validate_password 组件
- 安装卸载 validate_password 插件
- 对比 validate_password 插件和组件的系统变量, "_"换成了"."
- MySql8.4介绍
- Mysql8.4 与 Mysql8.0 对比
- validate_password.changed_characters_percentage
Fedora41用yum仓库安装MySQL8.4.4 笔记250310
下载安装
下载页面
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
- 启动CentOS7的MySQL8.0用的是
systemctl start mysqld
- 启动Ubuntu20.04的MySQL8.0用的是
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 组件对密码强度的要求
查看原始的 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%';
可选: 卸载 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@'%'
, 并将 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;
开放 firewalld 防火墙的3306端口
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'@'%';
用脚本安装
Fedora41一步安装MySQL8.4.4并且第一次登录
#!/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
Fedora41一步安装MySQL8.4.4并且将root@localhost免密, 创建免密的remote用户, 开放3306端口
#!/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
补充
validate_password插件 和 validate_password组件
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
组件和插件
- MySQL5.7, 用的是 validate_password
插件
- MySQL8.0, 用的是 validate_password
组件
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系统变量
### 查看 validate_password 的相关MySQL系统变量
SHOW VARIABLES LIKE '%validate_password%';
安装卸载 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 插件
### 安装 validate_password 插件
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
卸载 validate_password 插件
### 卸载 validate_password 插件
UNINSTALL PLUGIN validate_password;
对比 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!
会被拒绝。
MySql8.4介绍
以下是 MySQL 8.4 的详细介绍,重点涵盖其核心特性、改进方向及适用场景:
1. 版本定位与支持周期
-
LTS(长期支持版本):
MySQL 8.4 是官方指定的 长期支持版本,支持周期至 2026 年,适合生产环境使用。- 支持策略:仅 LTS 版本(如 8.4、9.7)提供长期维护,非 LTS 版本(如 8.0)仅短期支持。
-
兼容性与升级限制:
- 不支持从 MySQL 5.7 直接升级到 8.4,需先迁移至 8.0。
- 允许通过复制(Replication)跨 LTS 版本同步数据(如 8.4 → 9.7),但禁止降级(如 9.7 → 8.4)。
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 架构服务器的内存分配。 - 简化 Doublewrite 文件结构,全局仅保留 2 个文件,降低管理复杂度。
- 默认启用
3. 安全与权限管理
认证与插件变更
-
弃用旧认证方式:
- 默认禁用
mysql_native_password
插件,推荐使用caching_sha2_password
。 - 需手动启用旧插件(配置
--mysql-native-password=ON
)。
- 默认禁用
-
新增权限:
FLUSH_PRIVILEGES
需独立权限(不再依赖RELOAD
)。OPTIMIZE_LOCAL_TABLE
权限支持本地表优化操作。
4. 复制与高可用性
GTID 与复制增强
- GTID 标签化:支持为事务附加自定义标签(如
/*!80017 'audit_tag:payment' */
),便于追踪事务来源。 - 并行复制优化:在
MTS
(多线程复制)模式下支持SQL_AFTER_GTIDS
,提升复制效率。
克隆与集群改进
- 克隆插件灵活性:允许同大版本内克隆(如 8.4.0 → 8.4.14),简化数据迁移。
- Group Replication (MGR):
- 默认一致性级别调整为
BEFORE_ON_PRIMARY_FAILOVER
,确保故障切换时数据强一致。 - 支持节点运行不同小版本(如 8.4.0 与 8.4.2 共存)。
- 默认一致性级别调整为
5. 运维与监控
内存与临时表管理
- 临时表默认存储:使用 InnoDB 引擎(
temptable_use_mmap=OFF
),减少对tmpdir
的依赖。 - 动态内存分配:
temptable_max_ram
根据系统内存动态调整(默认 3% 内存,上限 4GB)。
监控与诊断
- 自动直方图更新:
ANALYZE TABLE
自动更新列的统计直方图。 - 长事务回滚进度:记录 InnoDB 事务回滚进度,避免运维盲区。
6. 安装与配置建议
- 平台差异:
- Linux:默认
innodb_flush_method=O_DIRECT
(绕过文件系统缓存)。 - Windows/macOS:仍使用
fsync
作为默认刷盘方式。
- Linux:默认
- 兼容性配置:使用
mysqldump --output-as-version
导出旧版本兼容数据。
升级注意事项
- 性能验证:
- 测试
innodb_adaptive_hash_index
禁用后的负载性能。 - 验证 SSD 环境下
innodb_io_capacity=10000
的效果。
- 测试
- 安全审计:
- 检查是否依赖
mysql_native_password
,及时迁移认证方式。
- 检查是否依赖
- 版本兼容性:
- 使用
mysql-shell
工具检查升级兼容性(util.checkForServerUpgrade()
)。
- 使用
总结
MySQL 8.4 作为 LTS 版本,聚焦 安全性、性能调优 和 运维简化,适合需要长期稳定支持的企业级场景。升级前需重点验证旧版本兼容性,并结合监控工具观察新参数对业务负载的影响。
Mysql8.4 与 Mysql8.0 对比
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 和内存管理 |
升级注意事项
-
性能影响:
- 8.4 的
innodb_io_capacity=10000
可能对机械硬盘负载过高,需根据存储类型调整。 - 禁用
innodb_adaptive_hash_index
可能影响高频查询性能,需测试验证。
- 8.4 的
-
安全兼容性:
- 若应用依赖
mysql_native_password
,需在 8.4 中手动启用(配置--mysql-native-password=ON
)。
- 若应用依赖
-
复制集群升级:
- Group Replication 集群需统一版本(8.4 允许混合小版本,如 8.4.0 和 8.4.2)。
-
配置迁移:
- 使用
mysqldump --output-as-version=8.0
导出旧版本兼容数据。
- 使用
总结
- 选择 MySQL 8.4:
适合需要 长期稳定支持 的生产环境,尤其是对安全性、复制一致性和现代硬件适配要求高的场景。 - 保留 MySQL 8.0:
适用于短期项目或已深度定制且不愿立即调整配置的旧系统。
升级前务必进行 性能压测 和 安全审计,并参考官方升级指南(MySQL 8.4 Release Notes)。
validate_password.changed_characters_percentage
从 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) - 对比所有8个字符,差异为第1位(
A→X
)、第5-8位(1→5
,2→6
,3→7
,4→8
),总计 4个不同字符,占比4/8 = 50%
。
- 旧密码:
-
公式:
[
\text{修改比例} = \frac{\text{新旧密码不同字符数}}{\text{旧密码长度}} \times 100%
] -
阈值要求:
- 若计算结果 ≥ 设定阈值(如30%),允许修改;否则拒绝。
- 默认值:MySQL 8.4 中 默认未启用此参数,需手动配置。
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. 安全建议
- 合理阈值:
- 推荐值:30%~50%,过低易被绕过,过高可能导致用户频繁忘记密码。
- 组合策略:
- 启用复杂度检查(
validate_password.policy=STRONG
)。 - 设置密码最短有效期(
password_reuse_interval
)。
- 启用复杂度检查(
- 监控日志:
- 审计失败修改事件(
error.log
中记录密码策略违规)。
- 审计失败修改事件(
通过配置 validate_password.changed_characters_percentage
,可显著提升密码更新的安全性,减少因简单修改导致的账户风险。