37 关于 undo 日志

前言

undo 和 redo 是在 mysql 中 事务, 或者 异常恢复 的场景下面 经常会看到的两个概念

这里 来看一下 undo, undo 主要是用于 事务回滚 的场景下面 

 

测试表结构如下

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

 

测试数据如下

5f02727c97d84e18b6b6bf8b4f48b9c9.png

 

 

记录更新 undo 业务记录

执行 sql 如下 “update tz_test set field1 = 'field13' where id = '2';”

首先是获取 undo 页的 free 记录的偏移, 然后 开始记录数据

c8860102227f4910910f9534edb3d476.png

 

记录操作类型, undo_no, table_id 等等 相关上下文信息

400cd75f36214bf5a142a226ce2015ef.png

 

记录 info_bits, trx_id, poll_ptr

72f500b26141421e8e9742c7e2ea316c.png 

记录标记当前记录的 字段信息, 这里是 ”where id = 2”

ecadd5ed3d874b2f85ad19c3167428a4.png 

记录更新的相关字段信息, 字段数量, 字段编号, 字段长度, 字段内容 

0755bec570114c66b9bb845895a85947.png 

记录当前 记录 的所有的字段信息, 字段编号, 字段长度, 字段内容 

f492e22829c84aba988833a7fcd0a2f9.png 

记录当前记录的头结点偏移, 下一个记录的偏移, free_ptr 的偏移 

在 mtr 中暂存当前 undo log 的 redo log

0925c658c2fc4287b6de0c05025b4107.png

 

记录当前这条 undo log 的 redo log, 实际上就是 保存了一下这条 undo log 的快照信息 

复制了一份数据到 mtr, mtr 表示 mysql 中的 Mini-Transaction

aa314b878d9c4c91b48a3594cb1b251b.png

 

undo 日志记录完成之后 更新相关元数据, 生成 roll_ptr

e8bfd22254c54a9180ad6154143c33f4.png

 

更新当前记录的 trx_id, roll_ptr

c3dbe674830746889ad1a7670f70c93e.png 

 

记录更新 undo 日志格式 

查看一下 待更新的记录信息, id 为 2, field1 为 ‘field12’

c656bedbf58345f5b2ffdd50b74cfc9d.png

 

undo 日志记录如下, 这里具体 拆分到每一个字节

a5529e52e51b498cabdf4841a6eaac07.png 

 

记录新增 undo 业务记录 

假设执行 sql 如下 “INSERT INTO `test`.`tz_test`(`field1`, `field2`) VALUES ('field11', '11');”  

从下图可以看到待插入记录的 id, field1, field2 的相关信息 

9d3560cfd67c4466bbbbd62bfa0d2bf7.png

 

记录带新增记录 当前的状态, 因为记录待新增 因此没有字段信息

这里仅仅记录 trx->undo_no, table_id, 主键信息, 当前记录偏移信息, 下一个记录偏移信息 

227d963e4543465ba8792ef848e90496.png

 

记录当前记录偏移信息, 下一个记录偏移信息, 记录当前 undo 记录的 redo 记录 

71cd8c6549264849a87a346e2873072f.png

 

 

记录新增 undo 日志格式 

 新增记录的 undo 日志信息如下, 记录相关的信息 主要是 id 

c65ca0804c9048d7a8495f92a5a1c06f.png

 

 

记录删除 undo 业务记录

执行 sql 如下 “delete from tz_test where id = 13;”

因为 mysql 这边先是做的逻辑删除, 因此 就是这边 undo 相关操作 和 记录更新一致, 这里不多赘述 

b33ec9e5f89a412dbabe0eeff5131337.png

 

 

记录新增 undo 的使用

执行 sql 如下 

“begin;

INSERT INTO `test`.`tz_test`(`id`, `field1`, `field2`) VALUES (1111, 'field11', '11');

rollback;

新增记录的 undo log, 的真实处理是 删除对应 主键 对应的记录

比如这里 查询条件为 ”id = 1111”

7596f3e2c10248d480b3928e1ef49841.png

 

具体的删除处理如下, 等价于 普通的 “delete from tz_test where id = 1111;”

3b20bd20164341568b14e4343ba31cd0.png

 

 

记录更新 undo 的使用 

执行 sql 如下 

“begin;

update tz_test set field1 = 'field33' where id = 2;

rollback;

 

如下这是 事务中的更新语句执行的上下文, field1 的字段由 ”field12” 更新为 ”field33”

55f611b202cf421ab0dba91181a50d37.png

 

如下 这是回滚的时候 更新记录的 undo 的处理 

37620d5af6664b8fbcf7106f028d62ae.png

 

这个 更新的回滚操作如下, 将 field1 字段从 “field33” 更新回 “field12”

e9aba54e56764f9cb598a906bcba5d51.png 

 

完 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/189661.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YB4019是一款完整的单电池锂离子恒流/恒压线性充电器电池

YB4019 耐压18V 1A线性双节8.4V 锂电充电芯片 概述: YB4019是一款完整的单电池锂离子恒流/恒压线性充电器电池。底部采用热增强ESOP8封装,外部组件数量低使YB4019成为便携式应用的理想选择。此外,YB4019设计用于在USB电源规格范围内工作。Y…

Docker Swarm: 容器编排的力量和优势深度解析

文章目录 Docker Swarm的核心概念1. 节点(Node)2. 服务(Service)3. 栈(Stack) 使用Docker Swarm1. 初始化Swarm2. 加入节点3. 创建服务4. 扩展和缩减服务5. 管理栈6. 管理服务更新 Docker Swarm的优势深度解…

vivado产生报告阅读分析7-时序报告3

1、“ Timing Summary Report ”详情 “ Timing Summary Report ” ( 时序汇总报告 ) 包含下列部分 : • “ General Information ”部分 • “ Timer Settings ”部分 • “ Design Timing Summary ”部分 • “ Clock Summary ”部…

C语言每日一题(32)环形链表

力扣网 141.环形链表 题目描述 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾…

Hangfire.Pro 3.0 Crack

Hangfire.Pro 有限的存储支持 Hangfire Pro 是一组扩展包,允许使用批处理创建复杂的后台作业工作流程,并提供对超快速Redis作为作业存储的支持 请注意,仅在使用Hangfire.SqlServer、Hangfire.Pro.Redis或Hangfire.InMemory包作为作业存储时才…

Android并发编程与多线程

一、Android线程基础 1.线程和进程 一个进程最少一个线程,进程可以包含多个线程进程在执行过程中拥有独立的内存空间,而线程运行在进程内 2.线程的创建方式 new Thread: 缺点:缺乏统一管理,可能无限制创建线程&…

excel怎么能锁住行 和/或 列的自增长,保证粘贴公式的时候不自增长或者只有部分自增长

例如在C4单元格中输入了公式: 现在如果把C4拷贝到C5,D3会自增长为D4: 现在如果想拷贝的时候不自增长,可以先把光标放到C4单元格,然后按F4键,行和列的前面加上了$符号,锁定了: …

单稳态中间继电器\UEG/A-2H/220V 8A导轨安装 JOSEF约瑟

UEG系列中间继电器 UEG/A-2H2D中间继电器UEG/A-4H4D中间继电器UEG/A-2D中间继电器 UEG/A-2H中间继电器UEG/A-4H中间继电器UEG/A-4D中间继电器 UEG/A-6H中间继电器UEG/A-6D中间继电器UEG/A-8H中间继电器 UEG/A-10D中间继电器UEG/A-10H中间继电器UEG/A-2DPDT中间继电器 UEG/A-4DP…

C++多态原理揭秘

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻强烈推荐优质专栏: 🍔🍟🌯C的世界(持续更新中) 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔…

值得你一生收藏的BMW宝马汽车底盘代号各个版本说明,方便今后查阅使用!

很少有汽车品牌像宝马一样,本属于内部交流使用的底盘代号(Development Code),最终延伸为粉丝群体用以精准定位某一年代某一款车型的通用语。随着宝马加速推出新产品,每一年的底盘代号都在更新。你挚爱的强哥现将宝马所…

贝加莱MQTT功能

贝加莱实现MQTT Client端的功能库和例程 导入库和例程,AS Logical View中分别通过Add Object—Library,Add—Program插入MQTT库和例程。 将例程Sample放置于CPU循环周期中 定义证书存放路径,在AS Physical View 中,右击PLC—Con…

贝茄莱BR AS实时数据采集功能

实时数据采集功能在PLC系统调试过程中,有助于调试人员对变量变化进行监测,通过波形对比,反应不同变量间的相互作用。该测试目的在于验证贝加莱系统组态软件的实时数据采集功能。 贝加莱系统组态软件提供Trace功能,连接PLC&#x…