InnoDB 存储引擎<五>undo log, redo log,以及双写缓冲区

目录

撤销⽇志 - Undo Log

双写缓冲区 - Doublewrite Buffer

重做⽇志 - Redo Log 

本篇是继承自上篇InnoDB存储引擎的磁盘文件

上篇链接:InnoDB 存储引擎<四>磁盘文件一

撤销⽇志 - Undo Log

1.什么是撤销⽇志?

解答问题:

1.当事务对数据进⾏修改的时候,每个修改操作都会在磁盘上创建与之对应的Undo Log,当事务需要回滚时,会根据Undo Log逐⼀进⾏撤销操作,从⽽保证事务的原⼦性。也就是说撤销⽇志是为事务的回滚操作⽽诞⽣的机制,它是⼀个撤销操作记录的集合。
2.Undo⽇志保存在Undo⽇志段中,Undo⽇志段位于回滚段中,回滚段位于undo表空间和全局临时表空间中

 

衍⽣问题:
1. 撤销⽇志的写⼊时机?
在事务执⾏每个DML之前,会根据DML构建对应的撤销⽇志,并申请⼀个 undo log
segments (撤销⽇志段),把⽇志记录在申请到的撤销段中,再执⾏真正的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.撤销⽇志是如何组织在⼀起的?(通过撤销日志页)

分析过程:

撤销⽇志的组织⽰意图如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值