MySQL InnoDB undo log生成逻辑分析

引用《InnoDB存储引擎》中有一句话,特别重要:

用户通常对undo有这样的误解:undo用于将数据库物理地恢复到执行语句或事务之前的样子---但事实并非如此。

undo是逻辑日志,因此只是将数据库逻辑地恢复到原来的样子。所有的修改都被逻辑地取消了,但是数据库和页本身在回滚之后可能大不相同。

1、初始化回滚段

回滚段的初始化在InnoDB引擎启动时就已初始化好,它主要通过三个函数调用,最终在表空间初始化函数srv_undo_  tablespaces_init中,初始化了128个回滚段

2、分配回滚段

当开启一个事务后,需要给当前的事务分配一个回滚段,调用它的函数流程关系为:

trx_assign_rseg-> trx_assign_rseg_low-> get_next_noredo_rseg:对于只读事务,如果产生对临时表的写入,则需要为其分配回滚段,使用临时表回滚段(第1~32号回滚段)。

trx_set_rw_mode-> trx_assign_rseg_low-> get_next_redo_rseg:在MySQL5.7中事务默认以只读事务开启,当随后判定为读写事务时,则转换成读写模式,并为其分配事务ID和回滚段。

在源码中的具体代码为:

 

普通回滚段的分配方式如下:

  1. 采用round-robin的轮询方式来赋予回滚段给事务,如果回滚段被标记为skip_allocation,则跳到下一个;
  2. 选择一个回滚段给事务后,该回滚段的rseg->trx_ref_count会递增,这样该回滚段所在的undo tablespace文件就不可以被truncate掉;
  3. 临时表回滚段被赋予trx->rsegs->m_noredo,普通读写操作的回滚段被赋予trx->rsegs->m_redo;如果事务在只读阶段使用到临时表,随后转换成读写事务,那么会为该事务分配两个回滚段。

3、使用回滚段

使用undo log时也需要判断undo log的类型,记录下变更前的数据以维护多版本信息。insert 和 delete/update 分开记录undo log,因此需要从回滚段单独分配undo slot。

从下面源代码中可以看出,无论是TRX_UNDO_INSERT_OP还是TRX_UNDO_MODIFY_OP类型,都调用trx_undo_assign_undo函数。

函数trx_undo_assign_undo的流程如下:

4、写入undo log

将undo log写入到回滚段的总流程如下:

省略不重要的步骤,单看最重要的函数调用:

分析:

通过trx_undo_report_row_operation函数,首先会分配了一个undo slot,调用的函数为trx_undo_assign_undo。分配分配好slot同时初始化完可用的空闲区域后,就可以向其中写入undo记录了。写入的page no取自undo->last_page_no,初始情况下和hdr_page_no相同。然后根据undo log的类型来判断是分配insert undo log还是update undo log。

对于INSERT_UNDO,调用函数trx_undo_page_report_insert进行插入,对于UPDATE_UNDO,调用函数trx_undo_page_report_modify进行插入。

比如,对于较为复杂的update undo log来说,写入undo log的过程是通过一个指针ptr将各种信息写入到指针指向的区域,从源代码中trx_undo_page_report_modify函数可以看到具体的实现:

        后面会有循环在不断往ptr所指向的地址写各个字段的数据,

        …….

        然后,会将指针写入上一个和下一个回滚日志记录:

最后将UNDO日志中更改的信息写入REDO日志,这也证明了写undo log时也会写redo log。undo log也需要持久性的保护。

完成undo log写入后,构建新的回滚段指针并返回(trx_undo_build_roll_ptr),回滚段指针包括undo log所在的回滚段id、日志所在的page no、以及page内的偏移量,需要记录到聚集索引记录中。

下面是两次实测结果:

已知开启的事务已经执行完3次update操作,第一张图中,当前事务在第4次update时,top_page_no不变,仍在331号页,但是,top_offset偏移量从2192变为2228,并且top_undo_no由2变3;第二张图中,此事务在第5次update操作时,top_page_no不变,仍在331号页,但是,top_offset偏移量从2228变为2264,并且top_undo_no由3变4。

分析可知:写undo log记录时,在当前的undo页偏移位置开始写undo log记录,通过偏移量来记录undo log,并且top_undo_no每次记录顺序加1,这也证明了undo log顺序写。

下面两张图实测了update操作十万多次的结果:

可以看到:随着undo log写入的越多,top_page_no也在不断变大。

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

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

相关文章

通信工程学习:什么是NFV网络功能虚拟化

NFV:网络功能虚拟化 NFV(Network Function Virtualization),即网络功能虚拟化,是一种通过虚拟化技术实现网络功能的技术手段。它借鉴了x86服务器的架构,将传统的网络硬件设备如路由器、交换机、防火墙、负载…

neo4j:ubuntu环境下的安装与使用

一、neo4j安装 1. 下载安装包 进入网站:https://neo4j.com/deployment-center/#community 在上图中选择下载即可(社区版免费) 注意:neo4j的版本要和电脑安装的jdk版本对应,jdk版本使用java --version查看:…

华为认证HCIA篇--网络通信基础

大家好呀!我是reload。今天来带大家学习一下华为认证ia篇的网络通信基础部分,偏重一些基础的认识和概念性的东西。如果对网络通信熟悉的小伙伴可以选择跳过,如果是新手或小白的话建议还是看一看,先有个印象,好为后续的…

复制他人 CSDN 文章到自己的博客

文章目录 0.前言步骤 0.前言 在复制别人文章发布时,记得表明转载哦 步骤 在需要复制的csdn 文章页面,打开浏览器开发者工具(F12)Ctrl F 查找"article_content"标签头 右键“Copy”->“Copy element”新建一个 tx…

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

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

速记篇 |TCP/IP五层模型怎么背,OSI七层模型怎么背?

背景 记忆TCP/IP五层模型和OSI七层模型可以通过理解每一层的功能、作用以及它们之间的逻辑关系来进行。下面分别给出这两个模型的记忆方法和要点: TCP/IP五层模型 TCP/IP五层模型是一个简化的模型,从下到上依次为: 1.物理层(Physi…

计算机毕业设计之:云中e百货微信小程序设计与实现(源码+文档+定制)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

微信小程序转化为uni-app项目

前言: 之前自己做一个uni-app的项目的时候前端需要实现一个比较复杂的动态tab和swiper切换的功能,但是由于自己前端抠脚的原因没有写出来,然后自己在网上搜索的时候发现了有个微信小程序里面的页面及极其的符合我的需求。那么问题来了我该如何…

『功能项目』QFrameWork拾取道具UGUI【69】

本章项目成果展示 我们打开上一篇68QFrameWork扔到地上UGUI的项目, 本章要做的事情是实现当物品在地上时,点击物品将对应物品转移到道具栏中 制作一个提示UI界面 添加Button组件设置为点击即将父物体隐藏 拖拽到文件夹中在场景中删除 创建脚本&#xf…

springboot实战学习(9)(配置mybatis“驼峰命名“和“下划线命名“自动转换)(postman接口测试统一添加请求头)(获取用户详细信息接口)

接着学习。之前的博客的进度:完成用户模块的注册接口的开发以及注册时的参数合法性校验、也基本完成用户模块的登录接口的主逻辑的基础上、JWT令牌"的组成与使用以及完成了"登录认证"(生成与验证JWT令牌)具体往回看了解的链接…

python虚拟环境创建使用

环境变量中配置 vi /etc/profile 注意安装完python环境之后要添加以下代码,配置虚拟环境的命令才能正确使用: PATH$PATH:/usr/local/python3 PATH$PATH:/usr/local/python3/bin 创建:virtualenv venv 激活虚拟环境:source ./v…

从预测性维护到智能物流:ARM边缘计算控制器的工业实践

工业4.0时代的到来,边缘计算技术成为连接物理世界与数字世界的桥梁。ARM架构的边缘计算控制器凭借其低功耗、高能效和灵活性等特点,在工业自动化领域展现出巨大潜力。本文将通过几个实际应用案例来探讨ARM边缘计算控制器是如何提升生产线效率和安全性的&…

【数据结构之线性表】有序表的合并(链表篇)

链表有序表的合并 思路图 将链表L1和L2按照顺序合并到L3中(注:三个链表都是带头结点的) A、要实现有序合并,必须先比较L1,L2两表中结点的大小,这里我们暂时先不讨论,直接根据图中来进行思路整理&#xff…

plt常用函数介绍二

目录 fig.add_subplot()ax.set()plt.legend()plt.subplots_adjust()plt.suptitle()plt.grid() fig.add_subplot() fig.add_subplot() 是 Matplotlib 中 Figure 对象的方法,用于在图形中添加子图(subplot)。 其语法为: subplot(…

linux网络编程8

24.9.25学习目录 一.原始套接字(续)1.sendto发送数据原始套接字1.ARP 二.Web编程1.概述2.HTML 一.原始套接字(续) 混杂模式: 指一台机器的网卡能够接受所有经过它的数据包,不论其目的地址是否是它&#xf…

程序人生:软件测试 非技术性面试题【建议每个测试人观看】

1、自我介绍:三分钟左右 2、为什么从郑州/太原离职? 3、你的职业规划是什么样的? 4、对下一家公司有什么自己的想法吗? 5、你觉得作为一名测试工程师,应该具备什么样的素养? 6、你觉得管理层&#xff…

echart实现渐变色-vue2

let selectData5 [{name: "有功电量",type: "bar",data: data.data.historyKwhList,unit: "MW",itemStyle: {// 使用渐变色color: {type: "linear",x: 0,y: 0,x2: 0,y2: 1,colorStops: [{offset: 0,color: "#04C886",},{of…

市面第一款 C++ 版本的U盘装机软件(即将上线)

市面大部分U盘装机软件,都是采用Au3脚本开发,而且有各种捆绑,闲来无聊,采用Qt C制作一款CU盘装机软件,从此告别Au3脚本,各种炫酷界面随便换,敬请期待 另外两个界面暂时不公布,防止Au…

C/C++语言基础--C++类数据、静态与非静态、常成员、友员、成员变量与函数指针等相关知识点

本专栏目的 更新C/C的基础语法,包括C的一些新特性 前言 通过前面几节,我们介绍了C的类与对象、构造与析构函数、拷贝等相关知识,这一篇将详细介绍了C的成员变量相关的知识点与扩展C语言后面也会继续更新知识点,如内联汇编&#…

Python | Leetcode Python题解之第423题从英文中重建数字

题目: 题解: class Solution:def originalDigits(self, s: str) -> str:c Counter(s)cnt [0] * 10cnt[0] c["z"]cnt[2] c["w"]cnt[4] c["u"]cnt[6] c["x"]cnt[8] c["g"]cnt[3] c["h…