Fedora41安装MySQL8.4.4

Fedora41安装MySQL8.4.4

  • [Fedora41用yum仓库安装MySQL8.4.4 笔记250310](#Fedora41用yum仓库安装MySQL8.4.4 笔记250310)
      • 下载安装
      • 启动`mysqld`服务
      • [查看生成的初始密码 , 用初始密码登录](#查看生成的初始密码 , 用初始密码登录)
      • 登录后,必须修改初始密码才能执行其它操作
        • [可选设置降低密码强度要求, 使用简单密码](#可选设置降低密码强度要求, 使用简单密码)
          • [降低 validate_password 组件对密码强度的要求](#降低 validate_password 组件对密码强度的要求)
        • [用`SET GLOBAL`命令来设置](#用SET GLOBAL命令来设置)
        • [可选: 卸载 validate_password 组件, 可将密码设为空, 实现无密码登录](#可选: 卸载 validate_password 组件, 可将密码设为空, 实现无密码登录)
      • 创建远程用户
      • [开放 firewalld 防火墙的3306端口](#开放 firewalld 防火墙的3306端口)
      • [删除用户 `DROP USER 'u'@'h'`](#删除用户 DROP USER 'u'@'h')
      • 用脚本安装
        • Fedora41一步安装MySQL8.4.4并且第一次登录
        • [Fedora41一步安装MySQL8.4.4并且将root@localhost免密, 创建免密的remote用户, 开放3306端口](#Fedora41一步安装MySQL8.4.4并且将root@localhost免密, 创建免密的remote用户, 开放3306端口)
  • 补充
      • [validate_password插件 和 validate_password组件](#validate_password插件 和 validate_password组件)
        • [查看 validate_password 组件或插件的相关MySQL系统变量](#查看 validate_password 组件或插件的相关MySQL系统变量)
        • [安装卸载 validate_password 组件](#安装卸载 validate_password 组件)
        • [安装卸载 validate_password 插件](#安装卸载 validate_password 插件)
        • [对比 validate_password 插件和组件的系统变量, ""换成了"."](#对比 validate_password 插件和组件的系统变量, ""换成了".")
    • MySql8.4介绍
    • [Mysql8.4 与 Mysql8.0 对比](#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对应的链接是

sh 复制代码
https://dev.mysql.com/get/mysql84-community-release-fc41-1.noarch.rpm

可以下载 mysql84-community-release-fc41-1.noarch.rpm 后用 rpm -ivhyum install 安装仓库

也可以直接用 rpm -ivhyum install 从网络下载并安装

bash 复制代码
sudo rpm -ivh https://dev.mysql.com/get/mysql84-community-release-fc41-1.noarch.rpm
bash 复制代码
sudo yum install -y https://dev.mysql.com/get/mysql84-community-release-fc41-1.noarch.rpm

更新yum

bash 复制代码
sudo yum update

此时就能用 yum 安装 mysql-server 了, 自动包含 mysql-client

bash 复制代码
sudo yum install -y mysql-server

或者

bash 复制代码
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
bash 复制代码
sudo systemctl enable mysqld --now

或者

bash 复制代码
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 日志文件中

可能包含冒号,但不会包含冒号加空格, 所以可以用 : 冒号空格进行拆分

bash 复制代码
sudo awk -F': ' '/A temporary password is generated for/{print $2}' /var/log/mysqld.log

查看密码所在行

bash 复制代码
sudo grep 'temporary password' /var/log/mysqld.log;

本地登录不用开防火墙端口,

远程登陆开放端口3306:

bash 复制代码
sudo firewall-cmd --zone=$(sudo firewall-cmd --get-default-zone) --add-port=3306/tcp --permanent ;
sudo systemctl restart firewalld ;

用初始密码登录

手动输入密码

bash 复制代码
mysql -uroot -p

或者直接在-p后粘贴密码

用复制粘贴的话,因为有特殊字符,所以要加上单引号和双引号,最好用 单引号

并且-p单双引号之间不能有空格

bash 复制代码
mysql -uroot -p':id(.aZr<1Tt'

登录后,必须修改初始密码才能执行其它操作

必须先更改为另一个强密码, 可以不用记住它, 设好后, 降低密码强度, 或者卸载validate_password这个组件

设置密码方法1

sql 复制代码
ALTER USER root@localhost IDENTIFIED BY 'ABCDEFGhijklmn1234567!!!';

设置密码方法2

sql 复制代码
SET PASSWORD='ABCDEFGhijklmn1234567!!!';
可选设置降低密码强度要求, 使用简单密码

降低密码强度要求的方法有:

  • 设置validate_password的相关选项来降低密码强度要求
  • 卸载validate_password
降低 validate_password 组件对密码强度的要求

查看原始的 validate_password 各属性默认值

sql 复制代码
SHOW VARIABLES LIKE '%validate_password%';

结果

sql 复制代码
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)
    • LOW0: 仅检查密码长度。
    • MEDIUM1:(默认):检查长度、大小写字母、数字和特殊字符。
    • STRONG2: 在 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
sql 复制代码
### 密码策略: 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 的相关MySQL系统变量

sql 复制代码
SHOW VARIABLES LIKE '%validate_password%';
可选: 卸载 validate_password 组件, 可将密码设为空, 实现无密码登录

INSTALLUNINSTALL 命令

  • 安装 validate_password 组件
    INSTALL COMPONENT 'file://component_validate_password';

    sql 复制代码
    INSTALL COMPONENT 'file://component_validate_password';
  • 卸载 validate_password 卸载
    UNINSTALL COMPONENT 'file://component_validate_password';

    sql 复制代码
     UNINSTALL COMPONENT 'file://component_validate_password';

自用的话卸载 validate_password 插件

sql 复制代码
UNINSTALL COMPONENT 'file://component_validate_password';

然后就能设为空密码😄

sql 复制代码
ALTER USER root@localhost IDENTIFIED BY '';

sql 复制代码
SET PASSWORD='';

操作系统的root输入mysql就能直接登录

卸载 validate_password 插件后, 相关变量就没有了

sql 复制代码
mysql> SHOW VARIABLES LIKE '%validate_password%';
Empty set (0.00 sec)

创建远程用户

MySQL8 创建用户,设置修改密码,授权

创建一个名为remote的远程用户, remote等效remote'@'%

sql 复制代码
###  创建一个名为remote的远程用户, remote等效'remote'@'%'
CREATE USER remote IDENTIFIED BY '';

创建一个可以用 Navicat11 登录的远程用户

sql 复制代码
###   创建一个名为remote的远程用户, remote等效'remote'@'%', 使用mysql5.7旧版密码插件,方便使用Navicat11等登录
CREATE USER remote IDENTIFIED WITH mysql_native_password BY '';

赋予remote所有权限和权力传递的权限,并将root角色授予remote

sql 复制代码
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@'%' ,

sql 复制代码
CREATE USER IF NOT EXISTS 'root'@'%' IDENTIFIED BY '密码'; GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;

创建 root@'%', 并让root@'%'扮演root@'localhost' 的角色 , 并设置为默认角色

sql 复制代码
CREATE USER IF NOT EXISTS root IDENTIFIED BY '密码'; GRANT root@'localhost' TO 'root'@'%'; SET DEFAULT ROLE root@'localhost' TO 'root'@'%'; FLUSH PRIVILEGES;

权限和角色两者都加持

sql 复制代码
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;

权限和角色两者都加持, 无密码

sql 复制代码
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 , 效果同上👆

sql 复制代码
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 , 效果同上👆

sql 复制代码
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角色为默认角色, 刷新权限 (注释可以用一个井号#不用加空格,或者两减号加空格(3字符))

sql 复制代码
--  ------    两个--后必须有空格 sql注释可以用一个井号#不用加空格,或者两减号加空格(3字符)
#---------    降低密码强度,  创建用户, 无密码 , 赋予最大权限和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角色为默认角色, 刷新权限,

sql 复制代码
--  ------    两个--后必须有空格 sql注释可以用一个井号#不用加空格,或者两减号加空格(3字符)
#---------    降低密码强度,  创建用户, 无密码 , 赋予最大权限和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端口

bash 复制代码
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'

sql 复制代码
DROP USER root;
sql 复制代码
DROP USER root@'%';
sql 复制代码
DROP USER 'root'@'%';

DROP USER IF EXISTS root;只会删除'root'@'%' , 不会删除 'root'@'localhost'

sql 复制代码
DROP USER IF EXISTS root;
sql 复制代码
DROP USER IF EXISTS root@'%';
sql 复制代码
DROP USER IF EXISTS 'root'@'%';

用脚本安装

Fedora41一步安装MySQL8.4.4并且第一次登录
bash 复制代码
#!/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端口
bash 复制代码
#!/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.policyvalidate_password_policy 的取值

| `validate_password.policy` 和 `validate_password_policy` 的取值效果 ||

取值 效果
0 或者 LOW 只检查密码长度
1 或者 MEDIUM 检查长度; 数字、小写/大写和特殊字符
2 或者 STRONG 长度; 数字、小写/大写和特殊字符;字典文件
[`validate_password.policy` 和 `validate_password_policy` 的取值效果]
取值 效果
0 或者 LOW 只检查密码长度
1 或者 MEDIUM 检查长度; 数字、小写/大写和特殊字符
2 或者STRONG 长度; 数字、小写/大写和特殊字符;字典文件
查看 validate_password 组件或插件的相关MySQL系统变量
sql 复制代码
### 查看 validate_password 的相关MySQL系统变量
SHOW VARIABLES LIKE '%validate_password%';
安装卸载 validate_password 组件

安装 validate_password 组件

sql 复制代码
### 安装 validate_password 组件
INSTALL COMPONENT 'file://component_validate_password';

卸载 validate_password 组件

sql 复制代码
### 卸载 validate_password 组件
UNINSTALL COMPONENT 'file://component_validate_password';
安装卸载 validate_password 插件

安装 validate_password 插件

sql 复制代码
### 安装 validate_password  插件
INSTALL PLUGIN validate_password SONAME 'validate_password.so';

卸载 validate_password 插件

sql 复制代码
### 卸载 validate_password  插件
UNINSTALL PLUGIN validate_password;
对比 validate_password 插件和组件的系统变量, "_"换成了"."

在组件和插件都没安装的情况下, 安装组件,查看相关变量, 安装插件,查看相关变量, 卸载组件, 查看相关变量

sql 复制代码
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)。
  • 防止弱密码 :拒绝常见弱密码(如 123456password)。

2. 安装与启用
MySQL 8.0+(组件形式)

sql 复制代码
-- 安装组件
INSTALL COMPONENT 'file://component_validate_password';

-- 验证是否启用
SELECT * FROM mysql.component WHERE component_urn LIKE '%validate_password%';

MySQL 5.7(插件形式)

sql 复制代码
-- 安装插件
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. 示例配置
场景:高安全环境

sql 复制代码
-- 设置密码策略为 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';

验证密码强度

sql 复制代码
-- 使用函数检查密码是否符合规则
SELECT VALIDATE_PASSWORD_STRENGTH('MyP@ssw0rd!2024');
-- 返回值:100(最高强度)


MySQL validate_password 组件属性详解

MySQL 的 validate_password 组件用于强制实施密码策略,确保用户设置的密码符合安全要求。以下是其核心属性及其配置说明:


**1. validate_password.policy

**

  • 功能:定义密码策略的强度等级。

  • 可选值

    • LOW:仅检查密码长度。
    • MEDIUM(默认):检查长度、大小写字母、数字和特殊字符。
    • STRONG:在 MEDIUM 基础上,额外检查密码是否包含弱密码字典中的词汇。
  • 示例

    sql 复制代码
    SET GLOBAL validate_password.policy = STRONG;

2. validate_password.length

  • 功能:设置密码的最小长度。

  • 默认值8

  • 规则

    • 若显式设置此参数,会覆盖策略等级中的默认长度(如 STRONG 默认要求更长密码)。
  • 示例

    sql 复制代码
    SET GLOBAL validate_password.length = 12;  -- 强制密码至少12位

3. validate_password.mixed_case_count

  • 功能:密码中至少包含的大写和小写字母总数。

  • 默认值1(如 AaaB)。

  • 生效条件 :策略等级为 MEDIUMSTRONG

  • 示例

    sql 复制代码
    SET GLOBAL validate_password.mixed_case_count = 2;  -- 要求至少2个大小写混合字符
    • 有效密码:Abc123!(A 和 b 视为混合)。
    • 无效密码:ABC123!(全大写,无小写)。

4. validate_password.number_count

  • 功能:密码中至少包含的数字数量。

  • 默认值1

  • 生效条件 :策略等级为 MEDIUMSTRONG

  • 示例

    sql 复制代码
    SET GLOBAL validate_password.number_count = 2;  -- 要求至少2个数字
    • 有效密码:Pass12word!(包含 12)。
    • 无效密码:Passw0rd!(仅1个数字)。

5. validate_password.special_char_count

  • 功能 :密码中至少包含的特殊字符数量(如 !@#$%^&*)。

  • 默认值1

  • 生效条件 :策略等级为 MEDIUMSTRONG

  • 示例

    sql 复制代码
    SET GLOBAL validate_password.special_char_count = 2;  -- 要求至少2个特殊字符
    • 有效密码:P@ssw0rd!@!)。
    • 无效密码:Passw0rd#(仅1个特殊字符)。

6. validate_password.changed_characters_percentage

  • 功能:修改密码时,新旧密码必须不同的字符比例(基于旧密码长度)。

  • 默认值0(未启用)。

  • 配置

    sql 复制代码
    SET GLOBAL validate_password.changed_characters_percentage = 30;  -- 至少30%不同
  • 示例

    • 旧密码:Abcd1234(8字符)。
    • 新密码:Xbcd5678(4个不同字符,占比 4/8=50%,通过)。

7. validate_password.dictionary_file

  • 功能 :指定自定义弱密码字典文件路径(仅 STRONG 策略生效)。

  • 格式:文本文件,每行一个弱密码。

  • 配置

    sql 复制代码
    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_indexinnodb_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 作为默认刷盘方式。
  • 兼容性配置 :使用 mysqldump --output-as-version 导出旧版本兼容数据。

升级注意事项

  1. 性能验证
    • 测试 innodb_adaptive_hash_index 禁用后的负载性能。
    • 验证 SSD 环境下 innodb_io_capacity=10000 的效果。
  2. 安全审计
    • 检查是否依赖 mysql_native_password,及时迁移认证方式。
  3. 版本兼容性
    • 使用 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 和内存管理

升级注意事项

  1. 性能影响

    • 8.4 的 innodb_io_capacity=10000 可能对机械硬盘负载过高,需根据存储类型调整。
    • 禁用 innodb_adaptive_hash_index 可能影响高频查询性能,需测试验证。
  2. 安全兼容性

    • 若应用依赖 mysql_native_password,需在 8.4 中手动启用(配置 --mysql-native-password=ON)。
  3. 复制集群升级

    • Group Replication 集群需统一版本(8.4 允许混合小版本,如 8.4.0 和 8.4.2)。
  4. 配置迁移

    • 使用 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. 规则细节
计算方式

  1. 字符对比范围

    • 仅对比新旧密码的 重叠部分(取旧密码的长度为基准)。
    • 若新密码比旧密码长,超出的字符不参与对比;若更短,仅对比到新密码长度为止。
    • 示例
      • 旧密码:Abcd1234(长度8)
      • 新密码:Xbcd5678(长度8)
      • 对比所有8个字符,差异为第1位(A→X)、第5-8位(1→5, 2→6, 3→7, 4→8),总计 4个不同字符 ,占比 4/8 = 50%
  2. 公式

    [

    \text{修改比例} = \frac{\text{新旧密码不同字符数}}{\text{旧密码长度}} \times 100%

    ]

  3. 阈值要求

    • 若计算结果 设定阈值(如30%),允许修改;否则拒绝。
    • 默认值:MySQL 8.4 中 默认未启用此参数,需手动配置。

3. 配置方法
启用与设置

  1. 激活插件

    确保 validate_password 组件已启用:

    sql 复制代码
    INSTALL COMPONENT 'file://component_validate_password';
  2. 设置阈值

    sql 复制代码
    SET GLOBAL validate_password.changed_characters_percentage = 30; -- 要求至少30%的字符不同
  3. 持久化配置 (修改配置文件 my.cnf):

    ini 复制代码
    [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. 注意事项
边界情况

  • 旧密码为空:若用户首次设置密码(无旧密码),此策略不生效。

  • 密码长度差异 :新增字符不参与计算,仅对比旧密码长度内的部分。

    sql 复制代码
    -- 旧密码:'Secur3'(6字符)
    -- 新密码:'S3cur3!X'(7字符,仅对比前6位)
    -- 不同字符数:1('e'→'3'),占比 16.6%

兼容性

  • 需与 validate_password 其他策略协同使用(如最小长度、特殊字符要求)。
  • 若启用 changed_characters_percentage,建议同时设置 validate_password.length 防止用户通过缩短密码绕过规则。

6. 安全建议

  1. 合理阈值
    • 推荐值:30%~50%,过低易被绕过,过高可能导致用户频繁忘记密码。
  2. 组合策略
    • 启用复杂度检查(validate_password.policy=STRONG)。
    • 设置密码最短有效期(password_reuse_interval)。
  3. 监控日志
    • 审计失败修改事件(error.log 中记录密码策略违规)。

通过配置 validate_password.changed_characters_percentage,可显著提升密码更新的安全性,减少因简单修改导致的账户风险。




相关推荐
liuyunluoxiao几秒前
进程(下)【Linux操作系统】
linux
什么半岛铁盒7 分钟前
【Linux系统】进程优先级:进程间的权力游戏
linux·运维·游戏
Ares-Wang32 分钟前
Linux》》Ubuntu apt 常用命令汇总,Linux 文件目录结构 修改root 密码 查看系统版本
linux·运维·ubuntu
小慧102439 分钟前
Ubuntu开荒
linux·运维·ubuntu
hkNaruto1 小时前
【AI】单台10卡4090 openEuler服务器离线部署kasm workspace 提供简单的GPU云服务 虚拟化桌面
linux·运维·ai
yqcoder1 小时前
Linux 常用 20 条指令,解决大部分问题
linux·运维·服务器
被AI抢饭碗的人1 小时前
Linux:基本指令与内涵理解
linux·运维·服务器
NN&&HH2 小时前
Centos时间同步
linux·运维·centos
zeron12 小时前
MySQL词法语法解析
sql·mysql
pp-周子晗(努力赶上课程进度版)2 小时前
linux - ubuntu 使用时一些小问题整理 --- 持续更新
linux·运维·服务器