目录
本篇是继承自上篇InnoDB存储引擎的磁盘文件
上篇链接:InnoDB 存储引擎<四>磁盘文件一
撤销⽇志 - Undo Log
1.什么是撤销⽇志?
解答问题:
1.当事务对数据进⾏修改的时候,每个修改操作都会在磁盘上创建与之对应的Undo Log,当事务需要回滚时,会根据Undo Log逐⼀进⾏撤销操作,从⽽保证事务的原⼦性。也就是说撤销⽇志是为事务的回滚操作⽽诞⽣的机制,它是⼀个撤销操作记录的集合。2.Undo⽇志保存在Undo⽇志段中,Undo⽇志段位于回滚段中,回滚段位于undo表空间和全局临时表空间中
衍⽣问题:1. 撤销⽇志的写⼊时机?在事务执⾏每个DML之前,会根据DML构建对应的撤销⽇志,并申请⼀个 undo logsegments (撤销⽇志段),把⽇志记录在申请到的撤销段中,再执⾏真正的DML操作,执⾏过程如下所⽰:
2.撤销⽇志在撤销表空间中的组织形式是怎样的?
前置知识:.Undo⽇志保存在Undo⽇志段中,Undo⽇志段位于回滚段中,回滚段位于undo表空间和全局临时表空间中分析过程:撤销⽇志在撤销表空间中的组织结构图,如下图所示
1.Undo log segments (撤销⽇志段)也称为撤销段,⼀个撤销⽇志段可以保存多个事务的回滚⽇志,但在同⼀时间只能被⼀个活跃事务使⽤,对应的空间在事务提交或回滚后才可以被重⽤。2.rollback segments (回滚段)中包含撤销⽇志段,通常位于undo表空间和全局临时表空间中,使⽤系统变量 Innodb_rollback_segments 可以定义分配给每个undo表空间和全局临时表空间的回滚段的数量,默认值为128,取值范围是[1, 128];3.⼀个回滚段⽀持的事务数取决于回滚段中的undo slots(槽数)和每个事务所需的undo⽇志数,⼀个回滚段中的undo槽数可以根据InnoDB⻚⾯⼤⼩进⾏计算,公式是(InnoDB Page Size / 16),⽐如默认情况下 InnoDB Page Size ⼤⼩为 16KB ,那么⼀个回滚段就可以包含 1024 个 undo slot ⽤来存储事务的撤销⽇志。4.回滚段中还记录了 History List 的头节点 History List Base Node ,以及回滚段的⼤小5.通过系统变量 innodb_rollback_segments 可以设置Undo表空间中的回滚段数量,最⼤值和默认值都是128
# 查看Undo表空间中的回滚段数量
mysql> show variables like 'innodb_rollback_segments';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_rollback_segments | 128 |
+--------------------------+-------+
1 row in set, 1 warning (0.01 sec)
# 设置Undo表空间中的回滚段数量
mysql> SET GLOBAL innodb_rollback_segments = 128;
Query OK, 0 rows affected (0.00 sec)
解答问题:撤销表空间中包含 rollback segments (回滚段),每个回滚段中包含若⼲undo slots(槽数),每个槽对应⼀个 Undo log segments (撤销⽇志段),撤销⽇志段中包含具体的撤销⽇志
3.撤销⽇志的格式是怎样的?(撤销日志的结构)
分析过程:撤销⽇志格式⽰意图如下:与数据行的格式进行比较
解答问题:一 条记录在Undo Log⻚中的Undo Log⽇志⼤体包含两部分:分别是记录了Undo类型、表ID、上 ⼀条、下⼀条⽇志的偏移地址等在内的"基本信息",以及记录了不同操作和数据的"操作信息"衍⽣问题1. 在事务中不同的DML操作对应的撤销⽇志是否不同?(不同的DML操作对应不同的撤销日志)在执⾏DML语句操作数据库时,不同SQL语句对应的撤销操作不同,不同的撤销操作对应的Undo Log存储格式也不相同,按照增、删、改等不同的DML操作,⽣成对应的撤销⽇志2.不同操作对应的撤销⽇志如何区分?(1)Undo类型有很多种,最常⻅的就是增、删、改,分别⽤ TRX_UNDO_INSERT_REC 、TRX_UNDO_DEL_MARK_REC 和 TRX_UNDO_UPD_EXIST_REC 表⽰,示意图如下所⽰
(2)新增( TRX_UNDO_INSERT_REC )时的Undo Log操作信息相对简单,只记录了主键值,主键⻓度等主键信息;
(3)删除( TRX_UNDO_DEL_MARK_REC )时除了记录主键信息之外,还记录了旧的事务ID,旧的ROLL_POINTER信息,⽤来构建有序的Undo版本链,还会记录⼀些被索引字段的信息;(4)更新( TRX_UNDO_UPD_EXIST_REC )时较为复杂,如果不更新主键则和删除时类似,会记录主键信息、旧的事务ID、旧的ROLL_POINTER信息、被索引字段的信息和被更新的信息;如果更新了主键,则会记录两条Undo Log ,⼀条删除的和⼀条新增的;对于更新主键的操作,本质上都是删除旧的数据行,新增一个新数据行
4.撤销⽇志是如何组织在⼀起的?(通过撤销日志页)
分析过程:
撤销⽇志的组织⽰意图如下: