当前位置:首页 » 《随便一记》 » 正文

升级你的MySQL吧,感受下8.0.30 or Higher新特性

18 人参与  2022年11月14日 09:29  分类 : 《随便一记》  评论

点击全文阅读


??????
哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA工作经验
一位上进心十足的【大数据领域博主】!???
中国DBA联盟(ACDU)成员,目前从事DBA及程序编程
擅长主流数据Oracle、MySQL、PG 运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。
✨ 如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】???
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️

文章目录

前言? 1.安装MySQL 8.0.31? 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.rpmRetrieving https://repo.mysql.com//mysql80-community-release-el8.rpmwarning: /var/tmp/rpm-tmp.SiEZMj: Header V4 RSA/SHA256 Signature, key ID 3a79bd29: NOKEYVerifying...                          ################################# [100%]Preparing...                          ################################# [100%]Updating / installing...   1:mysql80-community-release-el8-4  ################################# [100%]

? 1.2 查询yum里的MySQL版本

[root@jeames ~]# yum repolist all | grep mysqlFailed to set locale, defaulting to C.UTF-8mysql-cluster-8.0-community           MySQL Cluster 8.0 Community       disabledmysql-cluster-8.0-community-debuginfo MySQL Cluster 8.0 Community - Deb disabledmysql-cluster-8.0-community-source    MySQL Cluster 8.0 Community - Sou disabledmysql-connectors-community            MySQL Connectors Community        enabledmysql-connectors-community-debuginfo  MySQL Connectors Community - Debu disabledmysql-connectors-community-source     MySQL Connectors Community - Sour disabledmysql-tools-community                 MySQL Tools Community             enabledmysql-tools-community-debuginfo       MySQL Tools Community - Debuginfo disabledmysql-tools-community-source          MySQL Tools Community - Source    disabledmysql-tools-preview                   MySQL Tools Preview               disabledmysql-tools-preview-source            MySQL Tools Preview - Source      disabledmysql80-community                     MySQL 8.0 Community Server        enabledmysql80-community-debuginfo           MySQL 8.0 Community Server - Debu disabledmysql80-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 mysqlmysql-connectors-community MySQL Connectors Communitymysql-tools-community      MySQL Tools Communitymysql80-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 -pmysql> 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 jeamesmysql> 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_n1Create Table: CREATE TABLE `auto_n1` (  `c1` varchar(50) DEFAULT NULL,  `c2` int DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci1 row in set (0.00 sec)mysql> SHOW CREATE TABLE auto_n2\G*************************** 1. row ***************************       Table: auto_n2Create 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_ci1 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_KEYFROM INFORMATION_SCHEMA.COLUMNSWHERE 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 值更改为更高的值。

在这里插入图片描述
在这里插入图片描述


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/48281.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1