MySQL8.0 Undo Tablespace管理详解


Posted in MySQL onJune 16, 2022

1. UNDO 基础概念

  • 默认至少初始化2个Undo表空间,最大支持127个Undo表空间,默认表空间名称为undo_001,undo_002
  • 8.0.14 之后UNDO表空间支持在线增加,及在线删除
  • CREATE UNDO TABLESPACE/DROP UNDO TABLESPACE
    • 不支持指定相对路径,只支持绝对路径,且必须是innodb_directories参数定义可识别的路径或默认的数据目录下
    • 动态创建的undo表空间必须以.ibu结尾
  • 8.0.23 之前Undo表空间初始大小依赖innodb_page_size的值配置,默认16K,初始文件大小为10M,8.0.23 之后Undo表空间初始大小为16M,默认扩展大小单位为16M

2. UNDO 相关参数

2.1 参数含义

show variables like '%undo%';
+--------------------------+------------+
| Variable_name            | Value      |
+--------------------------+------------+
| innodb_max_undo_log_size | 8589934592 |   
| innodb_undo_directory    | ./         |  
| innodb_undo_log_encrypt  | OFF        |
| innodb_undo_log_truncate | ON         |
| innodb_undo_tablespaces  | 2          |
+--------------------------+------------+

show variables like '%truncate%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| innodb_purge_rseg_truncate_frequency | 128   |
| innodb_undo_log_truncate             | ON    |
+--------------------------------------+-------+

show variables like '%segment%';
+-------------------------------+-----------+
| Variable_name                 | Value     |
+-------------------------------+-----------+
| innodb_rollback_segments      | 128       |
| innodb_segment_reserve_factor | 12.500000 |
+-------------------------------+-----------+

innodb_undo_log_truncate			-- 控制是否自动做UNDO的truncate收缩操作,默认为ON,只有为ON时,下面2个参数才生效
	innodb_max_undo_log_size		-- 控制UNDO做truncate收缩操作的阈值,当UNDO达到该值时才出发收缩操作
	innodb_purge_rseg_truncate_frequency 
		-- Batch UNDO清理的次数,默认最大值128,也就是128次后才会触发一次UNDO的truncate,而每次清理的undo page由innodb_purge_batch_size参数决定,innodb_purge_batch_size默认为300,也就是300*128个UNDO小批次清理后才会触发UNDO表空间的truncate(也就是UNDO表空间的收缩)操作

innodb_undo_tablespaces 		  -- 控制生成的UNDO表空间的数量,默认2个,在8.0对该参数做了废弃,但并未提供其他参数控制UNDO数量,当前依旧可以使用该参数做UNDO表空间数量配置,通常建议配置为3(手工收缩UNDO时需要至少3个UNDO表空间)

innodb_rollback_segments			-- UNDO表空间回滚段的数量,默认为最大值128

3. UNDO 表空间运维

3.1 查看UNDO的基本信息

-- 可以查看到undo的表空间名称/文件路径/初始大小/扩展大小/磁盘文件大小/可用空间及是否启用的状态等
SELECT T1.SPACE AS SPACE_ID,
       T1.NAME AS TABLESPACE_NAME,
       T2.FILE_NAME,
       ROUND(T2.INITIAL_SIZE / 1024 / 1024, 2) AS "INITIAL_SIZE(M)",
       ROUND(T2.AUTOEXTEND_SIZE / 1024 / 1024, 2) AS "AUTOEXTEND_SIZE(M)",
       ROUND(T1.FILE_SIZE / 1024 / 1024, 2) AS "FILE_SIZE_DISK(M)",
       ROUND(T2.DATA_FREE / 1024 / 1024, 2) AS "DATA_FREE(M)",
       T2.STATUS,
       T1.STATE
  FROM INFORMATION_SCHEMA.INNODB_TABLESPACES T1,
       INFORMATION_SCHEMA.FILES              T2
 WHERE T1.SPACE = T2.FILE_ID
   AND T1.ROW_FORMAT = 'Undo';

3.2 添加/active/inactive/删除UNDO表空间

CREATE UNDO TABLESPACE

  • 用来创建新的UNDO 表空间

DROP UNDO TABLESPACE

  • 用来删除UNDO 表空间

ALTER UNDO TABLESPACE xxxx SET ACTIVE

  • 用来激活UNDO的使用

ALTER UNDO TABLESPACE xxxx SET INACTIVE

  • 用来关闭UNDO的使用(关闭后的UNDO才可删除)
-- 创建一个新的UNDO表空间
CREATE UNDO TABLESPACE undo_004 ADD DATAFILE 'undo_004.ibu';

-- 可以用前面的命令查看创建后的状态

-- 可以将已有的UNDO表示为inactive(也可理解为UNDO表空间收缩)
-- PS:设置为INACTIVE的表空间的STATE为empty,表示这个表空间不包含任何事务回滚数据,且表空间也收缩为默认大小
ALTER UNDO TABLESPACE undo_003 SET INACTIVE;

-- 可以将inactive的UNDO转为active
ALTER UNDO TABLESPACE innodb_undo_001 SET ACTIVE;

-- 可以将inactive的UNDO表空间进行删除
-- PS:默认以innodb_开头初始化的undo表空间不可被删除
DROP UNDO TABLESPACE innodb_undo_001;
ERROR: 3119 (42000): InnoDB: Tablespace names starting with `innodb_` are reserved.

-- 非系统默认的UNDO在inactive后可被删除
ALTER UNDO TABLESPACE undo_003 SET ACTIVE;
Query OK, 0 rows affected (0.0030 sec)

3.3 影响UNDO inactive(truncate)性能的因素

  • UNDO 表空间的大小
  • UNDO 表空间的数量
  • UNDO LOGS的数量(实际INSERT/UPDATE/DELETE这类事务回滚段的数据量)
  • 磁盘IO的能力/当前系统的负载
  • 是否存在长事务在使用该UNDO表空间

PS:通常对表空间做收缩前最简单避免性能的方式是提前创建一个UNDO表空间,收缩完后再删除或一直保留均可

4. UNDO 的监控

4.1 UNDO的监控指标

-- 可以使用以下命令开启对UNDO的监控采集
SET GLOBAL innodb_monitor_enable=module_undo;
SET GLOBAL innodb_monitor_enable=module_purge;

-- 使用该命令查看UNDO truncate的次数及耗时等信息
SELECT NAME,SUBSYSTEM,COUNT,STATUS,COMMENT 
FROM INFORMATION_SCHEMA.INNODB_METRICS 
WHERE NAME LIKE '%truncate%';

4.2 UNDO的状态值

SHOW STATUS LIKE 'Innodb_undo_tablespaces%';
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| Innodb_undo_tablespaces_total    | 4     |  -- 总共的UNDO表空间数量
| Innodb_undo_tablespaces_implicit | 2     |  -- 这里implicit其实表示的初始化创建的默认UNDO表空间个数,这种UNDO不可被删除
| Innodb_undo_tablespaces_explicit | 2     |  -- 这里explicit其实表示手工显式创建的UNDO表空间的个数
| Innodb_undo_tablespaces_active   | 4     |	-- 表示处于active的UNDO表空间的个数,可以看到当前和total一样,说明都在使用
+----------------------------------+-------+

5. UNDO 大小对并发数的限制

5.1 UNDO 记录的类型及大小

UNDO LOGS包含的是事务最后一次修改的聚簇索引记录(MySQL是聚簇索引表,也就是包含了一行完整的记录)

  • 当innodb_page_size 为16KB默认值时,undo 的slot槽为1024个
    • 16KB*1024/16=1024个槽

UNDO一共有以下4中日志类型

  • INSERT 用户自定义的表
  • UPDATE and DELETE 用户自定义的表
  • INSERT 自定义的临时表
  • UPDATE and DELETE 自定义的临时表

5.2 UNDO各场景下支持的读写并发

5.2.1 场景1: 每个事务都执行一个INSERT or UPDATE(DELETE)

并发公式: (innodb_page_size / 16) * innodb_rollback_segments * number of undo tablespaces

select 16*1024/16*128*2;
+------------------+
| 16*1024/16*128*2 |
+------------------+
|      262144.0000 |
+------------------+

5.2.2 场景2: 每个事务都执行一个INSERT and UPDATE(DELETE)

并发公式:(innodb_page_size / 16 / 2) * innodb_rollback_segments * number of undo tablespaces

select 16*1024/16/2*128*2;
+--------------------+
| 16*1024/16/2*128*2 |
+--------------------+
|    131072.00000000 |
+--------------------+

5.2.3 场景3: 每个事务都执行一个INSERT or UPDATE(DELETE) 到临时表

并发公式: (innodb_page_size / 16) * innodb_rollback_segments

select 16*1024/16*128;
+----------------+
| 16*1024/16*128 |
+----------------+
|    131072.0000 |
+----------------+

5.2.4 场景4: 每个事务都执行一个INSERT and UPDATE(DELETE) 到临时表

并发公式:(innodb_page_size / 16 / 2) * innodb_rollback_segments

select 16*1024/16/2*128;
+------------------+
| 16*1024/16/2*128 |
+------------------+
|   65536.00000000 |
+------------------+

6. 参考链接

到此这篇关于MySQL8.0 Undo Tablespace管理详解的文章就介绍到这了,更多相关MySQL8.0 Undo Tablespace内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

MySQL 相关文章推荐
Windows10下安装MySQL8
Apr 06 MySQL
mysql批量新增和存储的方法实例
Apr 07 MySQL
Mysql实现主从配置和多主多从配置
Jun 02 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
MySQL配置主从服务器(一主多从)
Aug 07 MySQL
MySQL限制查询和数据排序介绍
Mar 25 MySQL
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
Apr 18 MySQL
mysql 排序失效
May 20 MySQL
MySQL导致索引失效的几种情况
Jun 25 MySQL
MySQL索引失效场景及解决方案
Jul 23 MySQL
分享很少见很有用的SQL功能CORRESPONDING
Aug 05 MySQL
MySQL 原理与优化之Update 优化
Aug 14 MySQL
MySQL串行化隔离级别(间隙锁实现)
Jun 16 #MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 #MySQL
MySQL慢查询中的commit慢和binlog中慢事务的区别
Jun 16 #MySQL
MySQL聚簇索引和非聚簇索引的区别详情
关于mysql中string和number的转换问题
Jun 14 #MySQL
mysql实现将字符串字段转为数字排序或比大小
Jun 14 #MySQL
手把手带你彻底卸载MySQL数据库
You might like
php简单提示框alert封装函数
2010/08/08 PHP
php防止sql注入代码实例
2013/12/18 PHP
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
JavaScript中split() 使用方法汇总
2015/04/17 Javascript
在localStorage中存储对象数组并读取的方法
2016/09/24 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
easyui tree带checkbox实现单选的简单实例
2016/11/07 Javascript
使用ionic切换页面卡顿的解决方法
2016/12/16 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
vue底部加载更多的实例代码
2018/06/29 Javascript
小白教程|一小时上手最流行的前端框架vue(推荐)
2019/04/10 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
Python通过poll实现异步IO的方法
2015/06/04 Python
Python base64编码解码实例
2015/06/21 Python
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
python装饰器深入学习
2018/04/06 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
Python实现将Excel转换成为image的方法
2018/10/23 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
解析Python的缩进规则的使用
2019/01/16 Python
python调用虹软2.0第三版的具体使用
2019/02/22 Python
python+pyqt5编写md5生成器
2019/03/18 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
python将字符串list写入excel和txt的实例
2019/07/20 Python
python创建子类的方法分析
2019/11/28 Python
Django ModelForm操作及验证方式
2020/03/30 Python
Django中Q查询及Q()对象 F查询及F()对象用法
2020/07/09 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
护理专业的自荐信
2013/10/22 职场文书
大学生职业生涯规划范文
2014/01/08 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
2014年重阳节老干部座谈会局领导发言稿
2014/09/25 职场文书
副乡长民主生活会个人对照检查材料思想汇报
2014/10/01 职场文书
项目转让协议书
2014/10/27 职场文书
个人欠款协议书范本2014
2014/11/02 职场文书
压缩Redis里的字符串大对象操作
2021/06/23 Redis