InnoDB undo log解析(二)

2023-10-26

上一篇中已经介绍了InnoDB undo log的组织结构,并通过一个示例并结合InnoSQL来分析insert undo log记录格式。本篇中介绍update undo log的记录格式。update undo log有以下三种类型:
 类型  十六进制值  说明
 TRX_UNDO_UPD_EXIST_REC  0x0c  更新一个not delete mark的记录
 TRX_UNDO_UPD_DEL_REC  0x0d  更新一个delete mark记录
 TRX_UNDO_DEL_MARK_REC  0x0e  将记录标记为delete mark
   
接着来看一个具体的例子,首先根据如下清单创建测试表t并导入测试数据:

CREATE TABLE t ( a INT, b VARCHAR(10), c INT, PRIMARY KEY(a), KEY(b));

INSERT INTO t SELECT 1,'1',1;

接着运行下面的事务,注意不要提交事务:
   
   
     
     
BEGIN ;
DELETE FROM t WHERE a = 1 ;
mysql >  SELECT * FROM information_schema . INNODB_TRX_UNDO\G ;
*************************** 1. row ***************************
       trx_id : 303
      rseg_id : 4
  undo_rec_no : 0
undo _rec_type : TRX_UNDO_DEL_MARK_REC
         size : 37
        space : 0
      page_no : 308
       offset : 272
1 row in set ( 0.00 sec )
 
打开共享表空间ibdata1并定位到page_no:308 offset:272的位置,得到如下的内容:
 
 
  
  
    
    
004d4110   01 35 0e 00 0d 00 00 00   00 03 02 e0 83 00 00 01   |. 5. .............|
004d4120   33 01 10 04 80 00 00 01   00 0b 00 04 80 00 00 01   | 3. ..............|
004d4130   03 01 31 01 10 00 00 00   00 00 00 00 00 00 00 00   |.. 1. ............|
整理后可得:
 十六进值  说明
 01 35  undo log结束位置
 0e  undo log类型,TRX_UNDO_DEL_MARK_REC
 00  记录的info bit信息
 0d  表的ID
 00 00 00 03 02 e0   记录的隐藏事务ID列
 83 00 00 01 33 01 10  记录的隐藏回滚指针列
 04  主键长度
 80 00 00 01  主键值(a=1)
 00 0b  之后部分的字节数
 00  列的ID(列a)
 04  列占用的字节数
 80 00 00 01  列的值(a=1)
 03   列的ID(列b)
 01  列占用的字节数
 31  列的值(b=‘1’)
 01 10  undo log开始位置(0x0135-0x0110=37)
回滚事务,接着运行下面的例子:
   
   
     
     
mysql > BEGIN ;
Query OK , 0 rows affected ( 0.00 sec )
mysql > UPDATE t SET c = 2 WHERE a = 1 ;
Query OK , 1 row affected ( 0.00 sec )
Rows matched : 1   Changed : 1   Warnings : 0
mysql > SELECT * FROM information_schema . INNODB_TRX_UNDO\G ;
*************************** 1. row ***************************
       trx_id : 308
      rseg_id : 7
  undo_rec_no : 0
undo _rec_type : TRX_UNDO_UPD_EXIST_REC
         size : 33
        space : 0
      page_no : 310
       offset : 272
1 row in set ( 0.00 sec )
按上述同样的方法整理undo log后可得:
十六进值  说明
 01 31  undo log结束位置
 1c  undo log类型,TRX_UNDO_UPD_EXIST_REC
 0d  表的ID
 00  记录的info bit信息
 00 00 00 03 02 e0   记录的隐藏事务ID列
 83 00 00 01 33 01 10  记录的隐藏回滚指针列
 04  主键长度
 80 00 00 01  主键值(a=1)
 01  update vector 的数量
 04  update vector保存的列ID(列c)
 04  列占用的字节数
 80 00 00 01  列的值(a=1)
 01 10   undo log开始位置(0x0135-0x0110=33)

这里undo log的类型为1c而不是0c这是因为这部分还保存了其他信息,这里1表示更新操作没有更新其他索引列。若更新辅助索引列b,如:
  
  
    
    
mysql > BEGIN ;
Query OK , 0 rows affected ( 0.00 sec )
mysql > UPDATE t SET b = '222' WHERE a = 1 ;
Query OK , 1 row affected ( 0.00 sec )
Rows matched : 1   Changed : 1   Warnings : 0
mysql > SELECT * FROM information_schema . INNODB_TRX_UNDO\G ;
*************************** 1. row ***************************
       trx_id : 30A
      rseg_id : 8
  undo_rec_no : 0
undo _rec_type : TRX_UNDO_UPD_EXIST_REC
         size : 41
        space : 0
      page_no : 311
       offset : 272
1 row in set ( 0.00 sec )
可以看到这时undo log的类型还是 TRX_UNDO_UPD_EXIST_REC,但可以发现这时undo type的值为0c而非1c。此外,由于更新了列b,update vector会保存更新时记录列b的值,因此两次操作产生的undo log的量也不同。
何时会产生 TRX_UNDO_UPD_DEL_REC的undo log呢?这个类型表明是在delete mark的记录上进行更新,但是若事务已经提交则delete mark的记录是不允许更改的,其会等待purge线程进行删除。因此产生该类型的undo log发生应发生在同一事务中,如下面的情况:
   
   
     
     
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> DELETE FROM t where a=1;
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO t SELECT 1,'2',2;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0
mysql>  SELECT * FROM information_schema.INNODB_TRX_UNDO ORDER BY undo_rec_no\G;
*************************** 1. row ***************************
       trx_id: 30E
      rseg_id: 10
  undo_rec_no: 0
undo_rec_type: TRX_UNDO_DEL_MARK_REC
         size: 37
        space: 0
      page_no: 314
       offset: 272
*************************** 2. row ***************************
       trx_id: 30E
      rseg_id: 10
  undo_rec_no: 1
undo_rec_type: TRX_UNDO_UPD_DEL_REC
         size: 46
        space: 0
      page_no: 314
       offset: 309
2 rows in set (0.00 sec)
可以看到事务的第二条SQL语句再次插入了主键值为1的记录,并且记录的大小没有发生变化,这意味着可以重用之前已经删除的部分,仅需对其他列的部分进行更新即可,而这就会产生 TRX_UNDO_UPD_DEL_REC的undo log。整理该undo log,最后可得:
十六进值  说明
 01 63  undo log结束位置
 0d  undo log类型,TRX_UNDO_UPD_EXIST_REC
 01  记录的info bit信息(1表示记录已经被delete mark)
 0d  表的ID 
 00 00 00 03 0e ca   记录的隐藏事务ID列
 00 00 01 33 01 10  记录的隐藏回滚指针列
 04  主键长度
 80 00 00 01  主键值(a=1)
 02  update vector 的数量
 03  update vector保存的列ID(列b)
 01  列占用的字节数
 31  列的值(b='1')
 04   update vector保存的列ID(列c)
 04  列占用的字节数
 80 00 00 01  列的值(c=1)
 00 0b  之后部分的字节数
 00  列的ID
 04   列占用的字节数
 80 00 00 01  列的值(a=1)
 03  列的ID
 01  列占用的字节数
 31  列的值(c=‘1’)
 01 35  开始位置
可以看到在某些情况下即便用过数据结构update vector记录发生变化的列,但还是需要记录发生更改的索引列的信息。源码中给出了明确的答案:
   
   
     
     
/* In the case of a delete marking, and also in the case of an update
where any ordering field of any index changes, store the values of all
columns which occur as ordering fields in any index. This info is used
in the purge of old versions where we use it to build and search the
delete marked index records, to look if we can remove them from the
index tree. */
 
呼~~~ update undo log分析完了。可以尝试从源码文件trx0rec.c中的函数trx_undo_page_report_modify得到更为直接的答案。若希望自己分析undo log的内容,可以下载InnoSQL并进行尝试。下载地址:https://david-mysql-tools.googlecode.com/files/mysql-5.5.30-v1a-linux-x86_64.tar.gz
 

                
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

InnoDB undo log解析(二) 的相关文章

  • esp32 作 MCU 端 使用 AT 命令对 esp8266 进行 OTA demo

    AT CUSTOTA total len current packet len offset checksum OK MCU 收到 gt 之后发送 data 当前数据写入到 FLASH 之后 打印 RECV OK 当接收到 total le
  • 解决Python OpenCV 读取IP摄像头(RTSP等)出现error while decoding的问题

    先来看一个简单的读取RTSP的示例程序 import cv2 cap cv2 VideoCapture rtsp admin admin 123 172 0 0 0 ret frame cap read while ret ret fram
  • 测试两个容器是否连通

    进入容器查看ip root f2b5cdfdc5ed private geth ip addr 1 lo
  • 如何打开Fedora 15命令行窗口CLI

    如何打开Fedora 15命令行窗口CLI 在DesktopFolder以外的桌面区域 右击可以看到Konsole 点击该快捷键 即可启动命令行窗口CLI 第一步 右击桌面 第二步 点击Konsole
  • python day03

    一 使用字符串 str helllo len str 用len函数求字符串长度 str upper 把字符串中的小写变成大写 str find 查找子串所在位置 str index 与find类似但找不到子串时会报错 str 2 从字符串中
  • c++ string函数详细返回值及用法!

    通过在网站上的资料搜集 得到了很多关于string类用法的文档 通过对这些资料的整理和加入一些自己的代码 就得出了一份比较完整的关于string类函数有哪些和怎样用的文档了 下面先罗列出string类的函数有哪一些 然后再罗列出函数的原型
  • 学习 Python 之 Pygame 开发魂斗罗(一)

    学习 Python 之 Pygame 开发魂斗罗 一 Pygame 回忆Pygame 1 使用pygame创建窗口 2 设置窗口背景颜色 3 获取窗口中的事件 4 在窗口中展示图片 1 pygame中的直角坐标系 2 展示图片 3 给部分区
  • 在中国,把区块链玩得转的公司有这几家

    时下最火的Fintech 金融科技 非区块链莫属 区块链正在成为国家层面规划的重点领域之一 区块链可以简单理解为一个由所有参与者公共维护的账本 账本信息的公开使得所有参与者可以一起来校验记账的正确性 使得区块链成为所有参与者可以信任的载体
  • ubuntu编译和安装opencv-3.4.13

    1 安装相关软件包 打开ubuntu 安装以下工具 sudo apt install build essential sudo apt install cmake git libgtk2 0 dev pkg config libavcode
  • 芯片验证从零开始系列(一)——芯片验证概论

    芯片验证从零开始系列 一 芯片验证概论 芯片开发流程 动态验证技术 静态验证技术 Emulation和FPGA原型开发 测试平台框架 检查设计 回归测试 声明 未经作者允许 禁止转载 推荐一个IC FPGA新手入门的好网站 快 点 击 进
  • STL源码剖析-Allocator

    一 第一级配置器 顾名思义 Allocator是用来做内存分配的 第一级配置器指的是当需要128bytes以上的内存时直接使用malloc和realloc进行内存分配 代码如下 第一级配置器 2023 04 07 template
  • 解决M1处理器款mac安装PR闪退问题 Premier 2020 Mac(已适配M1芯片,支持最新款M1芯片Mac)可稳定运行

    苹果公司最新发布的基于M1芯片的Mac笔记本电脑应该很多小伙伴都入手了 但是最新的Mac由于采用的是基于ARM架构的核心 对很多基于Intel 英特尔 处理器的老款mac的软件应用兼容不太好 导致很多现有软件安装好后无法运行 或者报错和闪退

随机推荐

  • elasticsearch query related

    public abstract class EsBaseDaoImpl
  • 汽车电子_EMC测试_RE试验整改

    测试设备DUT状态 DUT带壳 未安装导电泡棉 辐射抗扰度试验 辐射抗扰度试验 270MHz频段出现画面卡死 试验暂停未继续 BCI试验 CBCI出现故障 RE试验 30 200M H方向 Frequency MHz MaxPeak dB
  • Maven高级:多环境配置与应用

    Maven高级 Maven高级 分模块开发 Maven高级 依赖管理 Maven高级 聚合和继承 Maven高级 根据需求完成生成 开发 测试环境 并在各个环境间切换运行 一 多环境配置与应用 这一节中 我们会讲两个内容 分别是多环境开发和
  • vue3 antd 表格点击和点击背景色

    页面
  • win7在64位系统下编译openssl

    以前在笔记本上配置过openssl 0 9 8g版本 今天在公司的台式机上配置死活没配置成功 机器的系统是win7 64位 编译openssl 1 0 1e出现各种莫名的错误 最后无意中编译了1 0 0 a版本编译成功了 如果出现ml找不到
  • Selenium-Server-Standalone搭建

    一 概述 先说说背景吧 Selenium是一个优秀的自动化测试框架 可以模拟浏览器的各种操作来代替人工操作 不同的浏览器有 不同的driver来驱动 之前项目中使用的firefoxDriver chromeDriver有一个缺点 就是浏览器
  • VSCode配置MSVC+VSCode使用easyx库,2021.5.13日配置~~

    VSCode配置MSVC VSCode使用easyx库 2021 5 13日配置 想必很多人和我一样 想用vscode编程c easyx库不支持MinGW 一般人都是直接使用vs2019安装easyx库用来GUI编程 那么爱折腾的VSCod
  • 使用PHP简单操作Memcached

    记得一定要先启动Memcached哦 root localhost usr bin memcached d l 127 0 0 1 p 11211 m 150 u root 使用ps命令查看一下运行状态 root localhost ps
  • 结构体内存对齐详解

    目录 一 结构体的对齐规则 二 修改默认对齐数 三 位段 四 枚举 五 联合 共用体 一 结构体的对齐规则 1 第一个成员在与结构体变量偏移量为0的地址处 2 其他成员变量要对齐到某个数字 对齐数 的整数倍的地址处 对齐数 编译器默认的一个
  • Ubuntu16.04 64位下安装VMware Tools过程

    因为在虚拟机下安装Ubuntu16 04 64位时无法进入全屏模式 采用另外一种方法解决了 但是还是想安装一下VMware Tools 防止以后出现相关问题 好啦 下面进入正题 1 在虚拟机下会看到安装 VMware Tools 单击安装
  • C# 各种符号用法

    参考 C 的7种用法 c 软泡芙的博客 CSDN博客 C 问号操作符详解 知乎 的7种用法 可空类型修饰符 int i num null 表示可空的整型 DateTime time dateTime null 表示可空的时间 三元 运算符
  • join(long millis)意思?join()作用

    join 作用 class JoinThread implements Runnable public void run for int i 0 i lt 100 i System out println Thread currentThr
  • FT2232作为JTAG烧录器的使用步骤详解

    FT2232作为JTAG烧录器的使用步骤详解 FT2232作为JTAG烧录器的使用步骤详解 配置OpenOCD环境 已经配置好的可以跳过 步骤 1 安装 FT2232HL 芯片的驱动 安装文件为 CDM21228 Setup exe 步骤
  • unity AR3D物体识别

    上篇讲到了各种AR插件的一些对比 因为上个项目需求用到3D物体追踪 所以使用了EasyAR和Vuforia两种进行了测试对比 因为如果需要AR识别 都需要有识别点 大致都是基于物体材质纹理来进行识别 1 先讲一下EasyAR的3D物体识别
  • 【百问网】物联网项目学习总结

    初步实现项目 项目程序流程图 TCP连接流程 模式1 站点模式 写代码去实现了这个TCP的连接流程 我们的思路就是 首先直接操作ESP8266 进行功能验证 ST Link Debugger 点击Settings 勾选Reset and R
  • 远程访问数据库出错的解决办法

    案例 在aws服务器中的项目访问在华为云中的测试服务器的数据库 报错 Access denied for user root ec2 XXX XXX XXX XXX cn north 1 compute amazonaws com cn u
  • Linux指令系统文件复制到U盘

    Linux指令系统文件复制到U盘 文章目录 Linux指令系统文件复制到U盘 1 建立U盘挂载点 2 查看U盘所在分区 3 查看U盘类型 4 挂载U盘 5 复制文件 6 移除U盘 1 建立U盘挂载点 在挂载点处建立文件夹 mkdir 路径
  • 【Java面试题汇总】设计模式篇(2023版)

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 设计模式 牛客面试题 目录 谈谈你对设计模式的理解 谈谈你对单例模式的理解 手写一
  • [17]AWK记录、字段、模式、跨平台移植及正则表达式

    一 记录与字段 1 记录分隔符 默认行输入和输出的分隔符都是回车 保存在RS和ORS内部变量中 变量 0 awk每次一行取得整条记录 0随之改变 同时内部变量NF 字段的总数 也随之变化 变量NR 每条记录的行号 处理完一行将会加1 所以全
  • InnoDB undo log解析(二)

    在 上一篇中已经介绍了InnoDB undo log的组织结构 并通过一个示例并结合InnoSQL来分析insert undo log记录格式 本篇中介绍update undo log的记录格式 update undo log有以下三种类型