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 相关文章推荐
MySQL 数据丢失排查案例
May 08 MySQL
Mysql 如何实现多张无关联表查询数据并分页
Jun 05 MySQL
MySQL系列之九 mysql查询缓存及索引
Jul 02 MySQL
MySQL面试题讲解之如何设置Hash索引
Nov 01 MySQL
MySQL表类型 存储引擎 的选择
Nov 11 MySQL
一文了解MySQL二级索引的查询过程
Feb 24 MySQL
一文搞懂MySQL索引页结构
Feb 28 MySQL
解决MySQL添加新用户-ERROR 1045 (28000)的问题
Mar 03 MySQL
Pycharm远程调试和MySQL数据库授权问题
Mar 18 MySQL
MySQL限制查询和数据排序介绍
Mar 25 MySQL
详解Mysql事务并发(脏读、不可重复读、幻读)
Apr 29 MySQL
MySQL生成千万测试数据以及遇到的问题
Aug 05 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 用数组降低程序的时间复杂度
2009/12/04 PHP
Drupal7中常用的数据库操作实例
2014/03/02 PHP
简单分析ucenter 会员同步登录通信原理
2014/08/25 PHP
基于PHP实现邮箱验证激活过程详解
2020/10/28 PHP
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
关于URL中的特殊符号使用介绍
2011/11/03 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
解析JSON对象与字符串之间的相互转换
2013/12/18 Javascript
js验证框架实现代码分享
2016/05/18 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
2016/07/12 Javascript
jQuery实现打开页面渐现效果示例
2016/07/27 Javascript
jQuery实现优雅的弹窗效果(6)
2017/02/08 Javascript
详解Vuejs2.0 如何利用proxyTable实现跨域请求
2017/08/03 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
Vue的事件响应式进度条组件实例详解
2018/02/04 Javascript
浅谈Node.js 沙箱环境
2018/05/15 Javascript
详解Vuex下Store的模块化拆分实践
2019/07/31 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
[01:15:12]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#4Newbee VS CDEC
2016/03/03 DOTA
实例讲解Python脚本成为Windows中运行的exe文件
2019/01/24 Python
django基础学习之send_mail功能
2019/08/07 Python
python清空命令行方式
2020/01/13 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
2021/02/20 Python
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
工作态度检讨书
2014/02/11 职场文书
运动会方阵口号
2014/06/07 职场文书
“三支一扶”支教教师思想汇报
2014/09/13 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
一年级班主任工作总结2014
2014/11/08 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
青年志愿者活动感想
2015/08/07 职场文书
如何使用Python实现一个简易的ORM模型
2021/05/12 Python
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers