📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称,10余年DBA工作经验
一位上进心十足的【大数据领域博主】!😜😜😜
中国DBA联盟(ACDU)成员,目前从事DBA及程序编程
擅长主流数据Oracle、MySQL、PG 运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。
✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】💞💞💞
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
文章目录
- 📢 1.1 repo下载
- 📢 1.2 查询yum里的MySQL版本
- 📢 1.3 配置安装的MySQL的版本
- 📢 1.4 安装 MySQL
- 📢 1.5 登陆MySQL
- 📣 2.8.0.30 or Higher新特性
- 📢 2.1 Redo Log
- 📢 2.2 GIPK
- 📢 2.3 多级别的 ORDER BY or LIMIT
- 📢 2.4 innodb_doublewrite
- 📢 2.5 mysqldump
前言
MySQL 8.0.30 or Higher发布后,总结的一些新特性分享给大家
📣 1.安装MySQL 8.0.31
本次采用yum在线安装部署
📢 1.1 repo下载
[root@jeames ~]# rpm -Uvh https://repo.mysql.com//mysql80-community-release-el8.rpm
Retrieving https://repo.mysql.com//mysql80-community-release-el8.rpm
warning: /var/tmp/rpm-tmp.SiEZMj: Header V4 RSA/SHA256 Signature, key ID 3a79bd29: NOKEY
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...
1:mysql80-community-release-el8-4 ################################# [100%]
📢 1.2 查询yum里的MySQL版本
[root@jeames ~]# yum repolist all | grep mysql
Failed to set locale, defaulting to C.UTF-8
mysql-cluster-8.0-community MySQL Cluster 8.0 Community disabled
mysql-cluster-8.0-community-debuginfo MySQL Cluster 8.0 Community - Deb disabled
mysql-cluster-8.0-community-source MySQL Cluster 8.0 Community - Sou disabled
mysql-connectors-community MySQL Connectors Community enabled
mysql-connectors-community-debuginfo MySQL Connectors Community - Debu disabled
mysql-connectors-community-source MySQL Connectors Community - Sour disabled
mysql-tools-community MySQL Tools Community enabled
mysql-tools-community-debuginfo MySQL Tools Community - Debuginfo disabled
mysql-tools-community-source MySQL Tools Community - Source disabled
mysql-tools-preview MySQL Tools Preview disabled
mysql-tools-preview-source MySQL Tools Preview - Source disabled
mysql80-community MySQL 8.0 Community Server enabled
mysql80-community-debuginfo MySQL 8.0 Community Server - Debu disabled
mysql80-community-source MySQL 8.0 Community Server - Sour disabled
📢 1.3 配置安装的MySQL的版本
[root@jeames ~]# yum -y install yum-utils
[root@jeames ~]# yum-config-manager --enable mysql80-community
#查询安装的MySQL的版本
[root@jeames ~]# yum repolist enabled | grep mysql
mysql-connectors-community MySQL Connectors Community
mysql-tools-community MySQL Tools Community
mysql80-community MySQL 8.0 Community Server
📢 1.4 安装 MySQL
先执行:yum module disable mysql
再执行:yum -y install mysql-community-server
#初始化MySQL
[root@jeames ~]# systemctl start mysqld
#查看MySQL状态
[root@jeames ~]# systemctl status mysqld
📢 1.5 登陆MySQL
#查看临时密码
[root@jeames ~]# grep 'temporary password' /var/log/mysqld.log
#登陆MySQL后修改密码,记得一定要用identified with mysql_native_password
[root@jeames ~]# mysql -uroot -p
mysql> ALTER USER root@'localhost' identified with mysql_native_password BY '********';
mysql> ALTER USER root@'%' identified with mysql_native_password BY '********';
mysql> grant all on *.* to root@'%' with grant option;
mysql> flush privileges;
mysql> status
📣 2.8.0.30 or Higher新特性
📢 2.1 Redo Log
✨✨ innodb_redo_log_capacity参数
在MySQL 8.0.30中,innodb_redo_log_capacity系统变量控制重做日志文件占用的磁盘空间量。
可以在启动或运行时使用set GLOBAL语句在选项文件中设置此变量;
例如,以下语句将重做日志容量设置为8GB:
SET GLOBAL innodb_redo_log_capacity = 8589934592;
说明:
innodb_redo_log_capacity变量取代了已弃用的innodb_ log_files_in_group和innodb _log_file_size变量。
定义innodb_redo_log_capacity设置时,将忽略innodb _log_files_in_group和innodb_ log_file_size设置,
否则,这些设置将用于计算innodb_redo_log_capacity设置
innodb.log_files_in_group*innodblog_file_size=innodb_do_log_capacity
如果没有设置这些变量,则重做日志容量将设置为innodb_redo_log_capacity默认值,即104857600字节(100MB)。
最大重做日志容量为128GB
✨✨ 重做日志文件
在MySQL 8.0.30之前,InnoDB默认在数据目录中创建两个重做日志文件,
分别名为ib_logfile0和ib_logfile1,并以循环方式写入这些文件。
重做日志文件使用#ib_redoN命名约定,其中N是重做日志的文件号。备用重做日志文件由_tmp后缀表示。
下面的示例显示了#innodb_redo目录中的重做日志文件,其中有1个活动重做日志和31个备用重做日志,按顺序编号。
除非innodb_log_group_home_dir变量指定了不同的目录,否则重做日志文件位于数据目录的#innodb_ Redo目录中。
如果定义了innodb_log_group_home_dir,则重做日志文件位于该目录中的#innodb_ redo目录中。
有两种类型的重做日志文件,普通和备用。普通的重做日志文件就是正在使用的那些文件。
备用重做日志文件是那些等待使用的文件。
InnoDB尝试维护总共32个重做日志文件,每个文件的大小等于1/32*InnoDB_redo_log_capacity;
mysql> select @@innodb_log_group_home_dir;
+-----------------------------+
| @@innodb_log_group_home_dir |
+-----------------------------+
| ./ |
+-----------------------------+
1 row in set (0.00 sec)
mysql> SELECT FILE_NAME, START_LSN, END_LSN FROM performance_schema.innodb_redo_log_files;
+--------------------------+-----------+----------+
| FILE_NAME | START_LSN | END_LSN |
+--------------------------+-----------+----------+
| ./#innodb_redo/#ib_redo6 | 19656704 | 22931456 |
+--------------------------+-----------+----------+
说明:
1.每个普通重做日志文件都与特定范围的LSN值相关联,以上查询显示了列出的活动重做日志文件的START_LSN和END_LSN值
2.执行检查点时,InnoDB将检查点LSN存储在包含该LSN的文件的头中,
在恢复期间,将检查所有重做日志文件,并从最新的检查点LSN开始恢复。
📢 2.2 GIPK
从MySQL 8.0.30开始,MySQL支持在GIPK模式下运行时生成的不可见主键。
在这种模式下运行时,对于任何没有显式主键创建的InnoDB表,MySQL服务器会自动向表中添加生成的不可见主键(GIPK)
新版本为我们提供了一个令人惊喜的特性 -(Generated Invisible Primary Keys)简称GIPK 。
一句概况就是: 当开启GIPK模式后,MySQL 会在没有显示定义主键的InnoDB表上自动生成不可见的主键。
如果没有主键,遇到load data,大事务,ddl 等有大量表数据行扫描的行为时,
会带来严重的主从延迟,给数据库稳定性和数据一致性带来隐患,那么GIPK解决了这个问题。
mysql> SELECT @@sql_generate_invisible_primary_key;
+--------------------------------------+
| @@sql_generate_invisible_primary_key |
+--------------------------------------+
| 0 |
+--------------------------------------+
说明:
GIPK模式由sql_generate_invisible_primary_key服务器系统变量控制。
默认情况下,该变量的值为OFF,这意味着禁用了GIPK模式;要启用GIPK模式,请将变量设置为ON
接下来就演示下GIPK的特性
##GIPK模式默认关闭
mysql> SELECT @@sql_generate_invisible_primary_key;
+--------------------------------------+
| @@sql_generate_invisible_primary_key |
+--------------------------------------+
| 0 |
+--------------------------------------+
1 row in set (0.00 sec)
mysql> use jeames
mysql> CREATE TABLE auto_n1 (c1 VARCHAR(50), c2 INT);
##开启GIPK模式
mysql> SET sql_generate_invisible_primary_key=ON;
mysql> SELECT @@sql_generate_invisible_primary_key;
+--------------------------------------+
| @@sql_generate_invisible_primary_key |
+--------------------------------------+
| 1 |
+--------------------------------------+
mysql> CREATE TABLE auto_n2 (c1 VARCHAR(50), c2 INT);
## 使用SHOW CREATE TABLE查看表实际创建方式的差异
mysql> SHOW CREATE TABLE auto_n1\G
*************************** 1. row ***************************
Table: auto_n1
Create Table: CREATE TABLE `auto_n1` (
`c1` varchar(50) DEFAULT NULL,
`c2` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
mysql> SHOW CREATE TABLE auto_n2\G
*************************** 1. row ***************************
Table: auto_n2
Create Table: CREATE TABLE `auto_n2` (
`my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */,
`c1` varchar(50) DEFAULT NULL,
`c2` int DEFAULT NULL,
PRIMARY KEY (`my_row_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)
说明:
1.由于auto_n2没有用于创建它的CREATE TABLE语句指定的主键,因此GIPK模式使MySQL将不可见的列my_row_id和该列上的主键添加到此表中。
由于在创建auto_n1时禁用了GIPK模式,因此未在该表上执行此类添加。
2.当服务器以GIPK模式将主键添加到表中时,列和键名称始终为my_row_id。
因此,当启用GIPK模式时,除非表创建语句还指定了显式主键,否则不能创建具有名为my_row_id的列的表。
(在这种情况下,不需要为列或键命名my_row_id。)
## VISIBLE和INVISIBLE之间切换
当GIPK模式生效时,生成的主键不能更改,只能在VISIBLE和INVISIBLE之间切换。
要使auto_n2上生成的不可见主键可见,请执行以下ALTER TABLE语句:
mysql> ALTER TABLE auto_n2 ALTER COLUMN my_row_id SET VISIBLE;
mysql> SELECT COLUMN_NAME, ORDINAL_POSITION, DATA_TYPE, COLUMN_KEY
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = "auto_n2";
要使生成的主键再次不可见,请执行
ALTER TABLE auto_1 ALTER COLUMN my_row_id SET invisible。
创建或导入使用GIPK模式的安装备份时,可以排除生成的不可见PK列和值。
mysqldump的–skip生成的不可见主键选项会导致GIPK信息被排除在程序的输出中。
如果要导入包含GIPK键和值的转储文件,还可以使用mysqlpump中的–skip生成的不可见主键来抑制这些键和值(从而不导入)。
小伙伴们是不是感觉这个特新很棒
📢 2.3 多级别的 ORDER BY or LIMIT
在 MySQL 8.0.31 之前,带括号的查询表达式不允许多个级别的 ORDER BY or LIMIT 操作,查询会被拒绝。
在 MySQL 8.0.31 及更高版本中,取消了此限制,并允许嵌套的带括号的查询表达式。
支持的最大嵌套级别为 63;这是在解析器执行任何简化或合并之后。
以下是示例:
mysql> (SELECT 'a' UNION SELECT 'b' LIMIT 2) LIMIT 3;
(
(SELECT a, b, c FROM t ORDER BY a LIMIT 3) ORDER BY b LIMIT 2
) ORDER BY c LIMIT 1;
📢 2.4 innodb_doublewrite
系统变量支持 DETECT_ONLY 和 DETECT_AND_RECOVER 设置。
使用该 DETECT_ONLY设置,数据库页面内容不会写入双写缓冲区,并且恢复不会使用双写缓冲区来修复不完整的页面写入。
此轻量级设置仅用于检测不完整的页面写入。
该 DETECT_AND_RECOVER 设置等同于现有ON 设置。
📢 2.5 mysqldump
mysqldump 执行全表扫描,这意味着它的查询通常会超过 long_query_time
对常规查询有用的设置。从 MySQL 8.0.30 开始,如果要从慢查询日志中排除大部分或全部 mysqldump 产生的慢查询,
可以设置 mysqldump 的 --mysqld-long-query-time
命令行选项,将系统变量的 session 值更改为更高的值。