前言
undo 和 redo 是在 mysql 中 事务, 或者 异常恢复 的场景下面 经常会看到的两个概念
这里 来看一下 redo, redo 主要是用于 异常恢复 的场景下面
测试表结构如下
CREATE TABLE `tz_test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`field1` varchar(128) DEFAULT NULL,
`field2` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `field_1_2` (`field1`,`field2`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8
测试数据如下
![](https://file.jishuzhan.net/article/1728274819914403842/64ec8900d46720630f8bfd32c0122fdd.webp)
记录更新 re do 业务记录
执行 sql 如下
"begin;
update tz_test set field1 = 'field23' where id = 2;
rollback;
"
在 mtr 中分配 buff 来存放 redo log
存放 type, space_id, page_no, 字段数量, 唯一确定记录的字段索引, 各个字段的长度列表
![](https://file.jishuzhan.net/article/1728274819914403842/9058f8484205e945e3b765032144959c.webp)
存放 flags, trxId, pollPtr, 记录偏移
![](https://file.jishuzhan.net/article/1728274819914403842/577b0c34075e0dc72bb0fc886d638436.webp)
存放更新字段数量, 以及更新之后的 字段列表信息
![](https://file.jishuzhan.net/article/1728274819914403842/c734db01f7e50c03dddc61dc1744c9ea.webp)
记录更新 re do 日志格式
查看一下 待更新的记录信息, id 为 2, field1 为 'field23'
断点处是是记录 redo 的时候, 记录已经是更新之后的记录了
![](https://file.jishuzhan.net/article/1728274819914403842/b5dbd64fc0c82c3570c4ea37fea6445b.webp)
redo 日志记录如下, 这里具体 拆分到每一个字节
![](https://file.jishuzhan.net/article/1728274819914403842/2feb4b61ee9e6d1c9885d8410d7236ef.webp)
记录新增 redo 业务记录
执行 sql 如下
"begin;
insert into tz_test (field1, field2) values ('field11', '11');
rollback;
"
在 mtr 中分配 buff 来存放 redo log
存放 type, space_id, page_no, 字段数量, 唯一确定记录的字段索引, 各个字段的长度列表
![](https://file.jishuzhan.net/article/1728274819914403842/63c04415e5f5adccf8ea5d172f36b122.webp)
存放 记录的偏移, info_bits
![](https://file.jishuzhan.net/article/1728274819914403842/a0ba759318c0a3a634ee439eb2c67f5e.webp)
然后接下来是 拷贝当前记录的信息
![](https://file.jishuzhan.net/article/1728274819914403842/39353a13e606e4cb88d43b8e327a9169.webp)
记录新增 re do 日志格式
查看一下 待更新的记录信息, id 为 2, field1 为 'field11'
断点处是是记录 redo 的时候, 记录已经是更新之后的记录了
![](https://file.jishuzhan.net/article/1728274819914403842/8be9f9fb50688a7a1f3aaba302f33732.webp)
redo 日志记录如下, 这里具体 拆分到每一个字节
![](https://file.jishuzhan.net/article/1728274819914403842/b7beaa9087576d9ce25d3d5187dde7ba.webp)
记录 删除 redo 业务记录
执行 sql 如下
"begin;
delete from tz_test where id = 2;
rollback;
"
在 mtr 中分配 buff 来存放 redo log
存放 type, space_id, page_no, 字段数量, 唯一确定记录的字段索引, 各个字段的长度列表
存储 trxId, pollPtr
存储当前记录的 偏移
![](https://file.jishuzhan.net/article/1728274819914403842/9c2376fe24dd8299ad8960b020fc2a64.webp)
记录删除 re do 日志格式
查看一下 待更新的记录信息, id 为 2, field1 为 'field12'
断点处是是记录 redo 的时候, 记录已经是更新之后的记录了
![](https://file.jishuzhan.net/article/1728274819914403842/7e9a3279f53ba2c9dcbb2e506e749b43.webp)
redo 日志记录如下, 这里具体 拆分到每一个字节
![](https://file.jishuzhan.net/article/1728274819914403842/33cf1a8f5a83a6ae57d6d7c9022250c0.webp)
redo 的使用
主要是 在异常的时候 使用, 这里 构造情况 比较麻烦, 就不展示了
然后 和 undo 的相关处理差不多
对于 对应的 新增, 更新, 删除 操作, 重新 apply 对应的操作
完