MySQL InnoDB undo log数据结构分析

news2024/9/27 15:20:40

一、概念解析

1、undo log基本

undo log是InnoDB事务中特有的结构,它的作用有两个:一是进行事务回滚(原子性),旧数据先放到undo log中,等rollback时再将旧数据里的数据回滚回来;二是MVCC(隔离性),非阻塞读。

undo能够避免脏读:在操作数据之前,将数据备份到undo页中,然后在进行数据的修改,不能看到其他回话未提交的数据,当要读取被修改页数据行时,会指向备份在undo页中的数据,避免脏读。

undo回滚段头物理存储在ibdata1文件中第6个页位置。

undo log存放在数据库内部的一个特殊段中,这个段称为undo段。undo段位于共享表空间中。回滚段实际上是一种 undo 文件组织方式

在InnoDB存储引擎中有rollback segment,每个回滚段记录了1024个undo log segment(slot),每个undo log segment段中进行undo页的申请。

从1.1版本开始InnoDB支持最大128个rollback segment,所以理论上可以支持的最大的事务上限为128*1024。

在1.2版本开始,可以通过参数对rollback segment进行设置,参数有:

参数名称

含义

innodb_undo_directory

设置回滚段文件所在的路径

innodb_undo_logs

设置回滚段的个数

innodb_undo_tablespaces

设置构成回滚段文件的数量

也就是说:

回滚段可以存放在共享表空间以外的地方,即可以设置独立表空间,innodb_undo_directory的默认值为“.”,表示当前InnoDB存储引擎的目录。

回滚段的个数默认值为128。

设置回滚段文件的数量后,回滚段可以较为平均地分布在多个文件中,在路径下可以看到undo为前缀的文件,该文件代表回滚段文件。

可用show variables like “innodb_undo%”;查询:

重新初始化时指定innodb_undo_tablespaces=N来设置,设置好后会在data目录下生成undo独立表空间(大小10M):

2、事务系统头transaction system header

回滚段的管理,在InnoDB共享表空间中,用第6个页面(5号)来管理的,这个页面专门用来存储事务系统相关信息的,源代码位于trx0sys.h,它的格式如下:

这三个参数的含义分别为:

参数名称

含义

TRX_SYS_TRX_ID_STORE

存储事务号

TRX_SYS_FSEG_HEADER

存储事务段信息

TRX_SYS_RSEGS

数组,InnoDB有128个rollback segment

3、回滚段头rollback segment header

对于每一个回滚段,即上面TRX_SYS_RSEGS数组中的一个元素,也有其自己的存储格式,代码中的宏定义位于trx0rseg.h,格式如下:

这五个信息的含义如下:

参数名称

含义

TRX_RSEG_MAX_SIZE

所有undo段页面之和

TRX_RSEG_HISTORY_SIZE

需要purge的回滚段页面数

TRX_RSEG_HISTORY

存储history list的链表首地址

TRX_RSEG_FSEG_HEADER

存储回滚段的inode位置信息

TEX_RSEG_UNDO_SLOTS

数组,1024,每个元素是一个页面号

这五个信息存储了一个回滚段的信息,最后一个位置的数组,用来真正存储回滚段的位置。这五个信息是从页面偏移38的位置开始存储,在TRX_SYS宏定义中可以查看:

4、回滚页头undo log page header

定义在trx0undo.h,事务undo日志页面头偏移量:

其中各个参数的含义为:

参数名称

含义

TRX_UNDO_PAGE_TYPE

类型,TRX_UNDO_INSERT\UPDATE

TRX_UNDO_PAGE_START

开始存储undo日志的位置

TRX_UNDO_PAGE_FREE

结束标志

TRX_UNDO_PAGE_NODE

双向链表的指针

第一个页在undo log段的回滚日志段头:

其中各个参数的含义为:

参数名称

含义

TRX_UNDO_STATE

undo段五种状态,包括TRX_UNDO_ACTIVE\CACHED\TO_FREE\TO_PURGE\PREPARED

TRX_UNDO_LAST_LOG

最后一个undo日志的偏移位置

TRX_UNDO_FSEG_HEADER

undo段inode信息

TRX_UNDO_PAGE_LIST

段链表的首地址

其中undo log段的状态有五种:

5、回滚日志头undo log header

这是回滚日志的头,在第一页的update undo log中有几个undo log headers。同样定义在trx0undo.h中,它的宏定义如下:

整理并解释其中的含义:

参数名称

含义

TRX_UNDO_TRX_ID

存储当前undo日志对应事务的事务id

TRX_UNDO_TRX_NO

事务序列号

TRX_UNDO_DEL_MARKS

删除记录标记

TRX_UNDO_LOG_START

存储当前页面中第一个undo日志的开始位置

TRX_UNDO_XID_EXISTS

标记的当前日 志中有没有包含xid事务

TRX_UNDO_DICT_TRANS

标记当前事务是不是DDL,在回滚时判断如何操作

TRX_UNDO_TABLE_ID

表id

TRX_UNDO_NEXT_LOG

链接指向下一个undo日志

TRX_UNDO_PREV_LOG

指向上一个undo日志,构成双向链表

TRX_UNDO_HISTORY_NODE

存储history list中的双向链表,链表首地址

6、两种undo log格式

undo log格式有两种:

  • insert undo log
  • update undo log

其中,insert操作会产生insert undo log。因为隔离性的要求,insert操作只对事务本身可见,对其他事务不可见。并且undo log可以在事务提交后直接删除,不需要进行purge操作。

update和delete操作都会产生update undo log。对于update操作很简单,就是将旧版本的值修改为新版本的值,并且将旧版本的记录保存到undo log中;对于delete操作完后并不是真正的删除该行数据,而是将该行的数据存在undo log中,并且将标记位delete置为true,以备回滚时可以根据标记位进行逆操作,这样就能够找回之前的旧数据,起到回滚的作用。

在delete中又分为三种情况:

purge线程两个主要作用是:清理undo页和清除page里面带有delete_bit标识的数据行。在InnoDB中,事务中的delete操作实际上并不是真正的删除掉数据行,而是在记录上标识delete_bit,而不是真正删除记录,真正的删除工作需要后台purge线程去完成。

下面是两种undo log记录的具体的结构:

二、数据结构

与undo log相关的数据结构有trx_sys_t、trx_rsegs_t 、trx_t、trx_rseg_t、trx_undo_t、trx_undo_ptr_t等结构,其中比较重要的结构有两个:trx_rseg_t和trx_undo_t。trx_rseg_t保存回滚段的信息,trx_undo_t保存关于回滚日志的信息。

通过两种方式找到回滚日志:

结论:

1、从全局变量trx_sys中的回滚段数组rseg_array中的回滚链表update-undo_list中指针(trx_sys->rseg_array[N]->update_undo_list->start)以及当前事务trx中的回滚段指针rsegs中的slot槽区m_redo中的undo log(trx->rsegs->m_redo->update_undo)都可以找到相应的回滚段中的回滚日志

2、事务id、回滚段id、page_no递增。

1、trx_rseg_t

回滚段的内存对象的类型是一个叫trx_rseg_t的结构,它定义在trx0rseg.h文件中,它的各成员有:

成员变量

解释

ulint id;

回滚段id

RsegMutex mutex;

回滚段mutex,保护

ulint space;

回滚段头空间

ulint page_no;

回滚段页码

page_size_t page_size;

页面大小

ulint max_size;

允许的最大页大小

ulint curr_size;

当前页的大小

UT_LIST_BASE_NODE_T(trx_undo_t) update_undo_list;

update回滚日志链表

UT_LIST_BASE_NODE_T(trx_undo_t) update_undo_cached;

为快速重用而缓存的update回滚日志链表

UT_LIST_BASE_NODE_T(trx_undo_t) insert_undo_list;

insert回滚日志的字段

UT_LIST_BASE_NODE_T(trx_undo_t) insert_undo_cached;

为快速重用而缓存的insert undo log链表

ulint last_page_no;

最后一个尚未清除的日志页码

ulint last_offset;

最后一个尚未清除的日志头的字节偏移量

trx_id_t last_trx_no;

最后一个尚未清除的日志的事务号

ibool last_del_marks;

判断最后一个尚未清除的日志是否要清除

ulint trx_ref_count;

跟踪rseg分配事务的参考计数器

bool skip_allocation;

如果为真,则跳过分配此rseg

update\insert_undo_list 用于保存产生的回滚日志,update\insert_undo_cached用于快速重用而缓存的回滚日志链表。当确定回滚日志无用时,会将回滚日志从update\insert_undo_list中摘除,放到相应的cached链表中。

2、trx_undo_t

回滚日志的内存对象的类型是一个叫trx_undo_t的结构,它定义在trx0undo.h文件中,它的各成员有:

成员变量

解释

ulint     id;

回滚段内的回滚日志槽号(slot)

ulint     type;

类型。TRX_UNDO_INSERT\UPDATE

ulint     state;

相应的回滚日志段的状态

ibool del_marks;

删除标记

trx_id_t     trx_id;

事务id

XID     xid;

open XA事务识别

ibool dict_operation;

是否是dict操作

table_id_t table_id;

设置表ID

trx_rseg_t* rseg;

回滚日志所属的rseg回滚段

ulint     space;

放置回滚日志的空间id

page_size_t page_size;

回滚日志中标题页的大小

ulint     hdr_page_no;

回滚日志中标题页的页码

ulint      hdr_offset;

页面上回滚日志的header偏移量

ulint     last_page_no;

登录日志中最后一页的页码

ulint     size;

当前页的大小

ulint     empty;

回滚日志记录堆栈当前是否为空

ulint     top_page_no;

链接最近撤消日志记录的页码

ulint     top_offset;

最新回滚记录的偏移量

undo_no_t top_undo_no;

最新的回滚记录的编号

buf_block_t* guess_block;

猜测可能位于首页的缓冲区

ulint     withdraw_clock;

存储guess_block时缓冲池的退出时钟值

UT_LIST_NODE_T(trx_undo_t) undo_list;

回滚段中的回滚日志对象链表

回滚段指针包括回滚段的id、日志所在的page no、以及page内偏移量。通过回滚段的指针就能够找到这个回滚段,通过回滚日志的槽号、页码、回滚记录编号和偏移量就能定位到这条回滚日志。undo_list用于将此类型的undo log链接到undo log list中。

UT_LIST_NODE_T(trx_undo_t) undo_list链表中有两个指针,分别为prev和next,用于将此undo log链接到undo log list中。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE5 Windows热更新解决方案思路(HotPatcher+Tomcat+RuntimeFilesDownloader)

以下个人学习笔记。其中必会存在一些问题,仅作参考。本人版本5.1。 参考视频: UE4热更新:HotPatcher插件使用教程_哔哩哔哩_bilibili 3.检查需要下载的版本_哔哩哔哩_bilibili 参考文章: UE 热更新:Questions &…

【js逆向学习】qqmusic(qq音乐)webpack智能导出

文章目录 逆向目标逆向分析逆向过程逆向总结 逆向目标 网址:https://y.qq.com/n/ryqq/album/3接口:https://u6.y.qq.com/cgi-bin/musics.fcg参数:sign 逆向分析 这里主要分析 新碟 类别下的接口,直接 Copy as cURL 转为 reques…

文件上传漏洞+CTF实例

解题思路 前端绕过 手动修改前端js代码进行绕过:右击-查看页面源代码-ctff进行位置定位-修改JavaScript函数 后端绕过 文件类型绕过(Content-Type) 常见MIME类型描述application/octet-stream 表示所有其他情况的默认值 text/plain表示文…

从HarmonyOS Next导出手机照片

1)打开DevEco Studio开发工具 2)插入USB数据线,连接手机 3)在DevEco Studio开发工具,通过View -> Tool Windows -> Device File Browser打开管理工具 4)选择storage -> cloud -> 100->fi…

在二维平面中,利用时差定位(TDOA)技术,结合N个锚点,通过三边法进行精确定位,采用MATLAB实现

文章目录 主程序程序代码运行结果 主程序 主程序代码如下: % TDOA测距定位,二维平面, 4个锚节点的情况 % author:Evand(VX:matlabfilter,除前期达成一致外,讲解需付费) % 2024年9月…

C语言扫盲

文章目录 C版本C语言特征GCCprintf数据类型函数指针内存管理void指针 Struct结构和Union结构typedef预处理器make工具cmake工具Projectintegral of sinc functionemulator embedded systeman event schedule 补充在线Linux终端参考 建议还是国外教材学习…人家的PPT比国内的好太…

RockTrack:A 3D Robust Multi-Camera-Ken Multi-Object Tracking Framework

RockTrack: A 3D Robust Multi-Camera-Ken Multi-Object Tracking Framework 基础信息 单位:哈尔滨理工大学论文:https://arxiv.org/pdf/2409.11749代码:https://github.com/lixiaoyu2000/Rock-Track (未全部放出)数据集:nuScen…

基于C++(FLTK)实现(CS界面)超市收银系统

超市收银系统 Supermarket POS system 本次大作业是利用 C语言,基于 FLTK 图形库来设计超市收银系统。首先介绍程序的设计思想: 这套程序完全是基于题目所给的要求逐条逐步设计的。我把程序实现大致分为数据层面和图形层面。 数据层面: 程…

神经网络(五):U2Net模型

文章目录 一、网络结构1.1第一种block结构1.2第二种block结构1.3特征图融合1.4损失函数1.5总体网络架构1.6代码汇总1.7普通残差块与RSU对比 二、代码复现 参考论文:U2-Net: Going deeper with nested U-structure for salient object detection   这篇文章基于显著…

钢管加工长度检测系统源码分享

钢管加工长度检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

笔试编程-百战成神——Day01

1.数字统计 题目来源:数字统计——牛客网 测试用例 算法原理 根据题目我们知道,首先要输出两个数字确定一个区间,寻找这个区间内数字中所有包含2的个数,比如12包含一个2,22包含两个2,以此类推,所以我们的…

问题记录:end value has mixed support, consider using flex-end instead

一、问题记录 二、解决问题 根据提示改为flex-end 三、理解问题 ‌这个警告信息表明,在Flex布局中使用“end”属性时存在兼容性问题,建议使用“flex-end”代替。 当在Flex布局中使用“justify-content: end;”时,浏览器可能对“end”值的支…

嵌入式C语言的自我修养:内存泄漏与防范

内存泄漏与防范 一个内存泄漏的例子 如果我们使用malloc()申请的内存在使用结束后没有及时被释放&#xff0c;则C标准库中的内存分配器ptmalloc和内核中的内存管理子系统都失去了对这块内存的追踪和管理。 #include <stdlib.h> int main(void){ char *p; p(char *)mal…

plt常用函数介绍一

目录 前言plt.figure()plt.subplot()plt.subplots()plt.xticks()plt.xlim() 前言 Matplotlib是Python中的一个库&#xff0c;它是数字的-NumPy库的数学扩展。 Pyplot是Matplotlib模块的基于状态的接口。在Pyplot中可以使用各种图&#xff0c;例如线图&#xff0c;轮廓图&#…

C++独立开发开源大数计算库 CBigNum

项目简介&项目地址 CBigNum 是本人独立开发开源的一款大数计算库&#xff0c;支持任意位数整数带任意位数小数的浮点运算。您可以通过本库执行非常大的数据运算或非常高精度的除法运算(您可以随意指定除法的小数保留到第几位)以及各种科学计算(详见1.3)。 项目地址&#…

数字电路基础(锁存器+触发器)+Proteus仿真

1.锁存器 1.1.基本概念 1.1.1基本双稳态电路 下面电路中&#xff0c;具有0、1两种逻辑状态&#xff0c;一旦进入其中一种状态&#xff0c;就能长期保持不变的单元电路称为双稳态存储电路&#xff0c;简称双稳态电路。 锁存器和触发器都属于双稳态电路 该双稳态电路没有输入…

【Godot4自学手册】第四十八节创建雨粒子效果

今天我们要利用GPU粒子节点玩雨粒子效果&#xff0c;下雨天。 一、添加GPU粒子系统 添加GPUParticles2D节点。选择根节点&#xff0c;单击添加按钮&#xff0c;选择GPUParticles2D&#xff0c;完成添加。 二、修改属性 1.设置粒子数量。 在GPUParticles2D检查器中将Amount设…

智慧城市主要运营模式分析

(一)运营模式演变 作为新一代信息化技术落地应用的新事物,智慧城市在建设模式方面借鉴了大量工程建设的经验,如平行发包(DBB,Design-Bid-Build)、EPC工程总承包、PPP等模式等,这些模式在不同的发展阶段和条件下发挥了重要作用。 在智慧城市发展模式从政府主导、以建为主、…

求一个数的因子数(c语言)

1.计算并输出给定整数n的所有因子&#xff08;不包括1与n自身&#xff09;之和。规定n的值不大于1000。&#xff08;因子是能整除n的数 即n%i0&#xff09; // 例如&#xff0c;在主函数中从键盘给n输入的值为856&#xff0c;则输出为: sum763。 2.第一步我们先输入n的数&…

C++深入学习string类成员函数(1):默认与迭代

引言 在 C 编程中&#xff0c;std::string 类是处理字符串的核心工具之一。作为一个动态管理字符数组的类&#xff0c;它不仅提供了丰富的功能&#xff0c;还通过高效的内存管理和操作接口&#xff0c;极大地方便了字符串操作。通过深入探讨 std::string 的各类成员函数&#…