InnoDB undo log解析(一)

2023-11-07

InnoDB undo log解析(一)

2016-11-28 14:38 277人阅读 评论(0) 收藏 举报
在InnoDB存储引擎中,undo log用来完成事务的回滚以及MVCC的功能。但是InnoDB本身提供对于undo log的分析或者查询功能非常有限。用户仅能通过SHOW ENGINE INNODB STATUS中的History list length信息的值当前undo log在history列表中的数量。网上已经有些文章分析了undo log的存储结构,但很少对InnoDB的undo log进行解析。本博文将详细介绍InnoDB存储引擎中的undo log格式,使读者能更为深入了解其实现。

在InnoDB存储引擎中,undo log可分为以下两种类型:

  • insert undo log
  • update undo log

insert undo log是指在insert操作中产生的undo log。因为insert操作的记录,只对事务本身可见,对其他事务不可见(这是事务隔离性的要求),故该undo log可以在事务提交后直接删除。不需要进行purge操作。insert undo log的格式如左图所示(点击可看原图)


图中*表示对存储的字段进行了压缩。insert undo log开始的前两个字节next记录的是下一个undo log的位置,通过该next的字节可以知道一个undo log所站的空间字节数。类似地,尾部的两个字节记录的是undo log的开始位置。type_cmpl占用一个字节,记录的是undo地类型,对于insert undo log,该值总是为11。undo_no记录事务的ID,table_id记录undo log所对应的表对象。这两个值都是用于进行压缩的。接着的部分记录了所有主键的列和值。在进行rollback操作时,根据这些值可以定位到具体的记录,然后进行删除即可。


 

update undo log记录的是对delete和update操作产生的undo log。该undo log可能需要提供MVCC机制,因此不能在事务提交时就进行删除。提交时放入undo log链表,等待purge线程进行最后的删除。update undo log的结构如右图所示(点击可看原图)。


update undo log相对于之前介绍的insert undo log,记录的内容更多,所需占用的空间也更大。next、start、undo_no、table_id与之前介绍的insert undo log部分相同。这里的type_cmpl,由于update undo log本身还有分类,故其可能的值如下:

  • 12 (TRX_UNDO_UPD_EXIST_REC)
  • 13 (TRX_UNDO_UPD_DEL_REC)
  • 14 (TRX_UNDO_DEL_MARK_REC) 


undo log可以分为上述3种类型,其分别代表了更新non-delete-mark的记录,将delete的记录标记为not delete,将记录标记为delete。


紧接着的部分记录update_vector信息,update_vector表示update操作导致发生改变的列。每个修改的列信息都要记录的undo log中。对于不同的undo log类型,可能还需要记录对索引列所做的修改。


Oracle和Microsoft SQL Server数据库都由内部的数据字典来观察当前undo的信息,InnoDB存储引擎在这方面做得还是不够,DBA只能通过原理和经验来进行判断。InnoSQL对information_schema进行了扩展,添加了两张数据字典表,这样用户可以非常方便和快捷地查看undo的信息。


首先增加的数据字典表为INNODB_TRX_ROLLBACK_SEGMENT。顾名思义,这个数据字典表用来查看rollback segment(回滚段)。InnoDB 1.1版本开始,其一共有128个rollback segment,每个rollback segment支持1024个undo log段,因此一共支持128*1024个同时并发在线事务。而之前的版本仅有1个回滚段,故最大支持并发事务为1024。

例如,用户可以通过下面的命令来查看rollback segment所在的页(InnoDB 1.2版本之前,rollback segment都放在共享表空间内,故space值都为0。InnoDB 1.2版本开始支持独立的rollback segment表空间):

MySQL> SELECT segment_id,space,page_no FROM INNODB_TRX_ROLLBACK_SEGMENT;

+------------+-------+---------+

| segment_id | space | page_no |

+------------+-------+---------+

|          0 |     0 |       6 |

|          1 |     0 |      45 |

|          2 |     0 |      46 |

......

128 rows in set (0.00 sec)


另一张数据字典表为INNODB_TRX_UNDO,用来记录事务对应的undo log,方便DBA和开发人员详细了解每个事务产生的undo量。下面将演示如和使用INNODB_TRX_UNDO表,首先根据如下代码创建测试表t。

CREATE TABLE t (

     a INT,

     b VARCHAR(32),

     PRIMARY KEY(a),

     KEY(b)

)ENGINE=InnoDB;


接着插入一条记录,并尝试通过INNODB_TRX_UNDO观察该事务的undo log的情况:

mysql> BEGIN;

Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO t SELECT 1,’1’;

Query OK, 1 row affected (0.00 sec)

Records: 1  Duplicates: 0  Warnings: 0


mysql> SELECT * FROM information_schema.INNODB_TRX_UNDO\G;

*************************** 1. row ***************************

       trx_id: 3001

      rseg_id: 2

  undo_rec_no: 0

undo_rec_type: TRX_UNDO_INSERT_REC

         size: 12

        space: 0

      page_no: 334

       offset: 272

1 row in set (0.00 sec)


通过数据字典表可以看到,事务ID为3001,rollback segment的ID为2,因为是该条事务的第一个操作,故undo_rec_no为0。之后可以看到插入的类型为TRX_UNDO_INSERT_REC,表示是insert undo log。size表示undo log的大小,占用12字节。最后的space、page_no、offset表示undo log开始的位置。打开文件ibdata1,定位到页(334,272),并读取12字节,可得到如下内容:

01 1c 0b 00 16 04 80 00 00 01 01 10


上述就是undo log实际的内容,之前对于insert undo log格式的介绍,可以整理得到:

01 1c       # 下一个undo log的位置 272+12=0x011c

0b          # undo log的类型,TRX_UNDO_INSERT_REC为11

00          # undo log的记录,等同于undo_rec_no

16          # 表的ID

04          # 主键的长度

80 00 00 01 # 主键的内容

01 10       # undo log开始的偏移量,272=0x0110


此外,由于知道该undo log所在的rollback segment的ID为2,用户还可以通过数据字典表INNODB_TRX_ROLLBACK_SEGMENT来查看当前rollback segment的信息,如:

mysql> SELECT segment_id,insert_undo_list,insert_undo_cached

     -> FROM information_schema.INNODB_TRX_ROLLBACK_SEGMENT

     -> WHERE segment_id=2\G;

*************************** 1. row ***************************

        segment_id: 2

  insert_undo_list: 1

insert_undo_cached: 0

1 row in set (0.00 sec)


可以看到insert_undo_list为1。若这时进行事务的COMMIT操作,再查看该数据字典表:

mysql> COMMIT;

Query OK, 0 rows affected (0.00 sec)

mysql> SELECT segment_id,insert_undo_list,insert_undo_cached

     -> FROM information_schema.INNODB_TRX_ROLLBACK_SEGMENT

     -> WHERE segment_id=2\G;

*************************** 1. row ***************************

        segment_id: 2

  insert_undo_list: 0

insert_undo_cached: 1

1 row in set (0.00 sec)

可以发现,insert_undo_list变为0,而insert_undo_cached增加为1。这就是undo页重用,即下次再有事务需要向该rollback segment申请undo页时,可以直接使用该页。


update undo log较之insert undo log要复杂的多,因此将在第二篇中进行分析。so,预知后事如何,待听下回分解InnoDB undo log解析(一) - insidemysql - Inside MySQL

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

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

随机推荐

  • 全新iPhone首发,结果“华为发布会”冲上热搜第一

    就离谱 苹果发iPhone 15 结果发着发着 华为发布会 冲上了热搜第一 哪怕是iPhone 15全系告别11年闪电接口改用USB C 经典静音键从Pro系列消失 这些库克 违背祖宗的决定 都没抢到更多热度 网友们第一时间倒是吐槽吐出了花
  • 提示“Web打印服务CLodop未安装启动”的各种原因和解决方法

    旧版提示 CLodop云打印服务 localhost本地 未安装启动 新版提示 Web打印服务CLodop未安装启动 点击这里下载执行安装 若此前已安装过 可点这里直接再次启动 成功后请刷新本页面 可能原因及现象及解决方法 原因1 没安装
  • 解决Moment格式化时间出现时区差的问题

    Moment格式化时间默认格式为当地时区的时间 如果格式化的结果与当地时间有差值 一般原因是 要格式化的时间带有时间标志 如 UTC GMT等 经过Moment格式化后 会变成时间标志所表示的时区的时间 此时 只需要改变时间偏移量即可 使用
  • iOS音视频—FFmepg应用-Android平台使用(NDK项目)

    iOS音视频 目录 新建NDK项目 1 编译 so动态库 2 新建在Android平台下的NDK项目 Android本身不支持C C 开发 NDK底层开发 需要我们进行配置 NDK 在Android平台下Google提供的支持C C 开发的
  • 测试学Python白话版(一)

    前言 测试人员转开发 Python是一个特别好的入门级编程语言 Python学起来相对容易 能做的事情也比较多 有了一定的基础之后 再学习其他语言也更加轻松 网上关于Python的教程很对 如果有时间完全可以自学 因为好多测试人员的基础较差
  • CCF-CSP 26次 第三题【角色授权】

    计算机软件能力认证考试系统 20分 include
  • 深度学习6-高级强化学习库

    高级强化学习库 使用高级库的动机 不要从头开始重新实现一切 PTAN库以及最重要的部分 将通过代码示例进行说明 针对CartPole上的DQN 使用PTAN库来实现 可以考虑的其他RL库 为什么使用强化学习库 RL十分灵活 并且很多现实生活
  • 如何实现侧边栏高亮?

    大家好 我是IT修真院深圳分院第九期的学员徐炜 一枚正直纯洁善良的前端程序员 今天给大家带来的是如何实现侧边栏高亮 一 背景介绍 侧边栏高亮是指选择侧边栏菜单时有一个样式效果 当刷新页面的时候 这个效果还在 侧边栏高亮有很多种实现方法 根据
  • 有趣的数据结构算法7——双向循环链表的实例应用

    有趣的数据结构算法7 双向循环链表的实例应用 问题复述 解题思路 实现代码 GITHUB下载连接 问题复述 要求实现用户输入一个数字改变26个字母的排列顺序 正常情况下26个字母的排列顺序是A B C D E F G H I J K L M
  • python随机生成十个数

    import random a range 3 100 2 b random sample a 10 print b x 0 for i in b x 1 print 整数的个数为 0f format x
  • 怎么查看文件的MD5码

    windows下查看MD5 步骤一 首先使用WIN R快捷键 进入CMD命令行模式 步骤二 然后在cmd命令行中切换到指定目录 或者直接使用绝对路径 certutil hashfile D file txt MD5 certutil has
  • Spring集成XxlJob核心初始化类,对应版本:2.4.1-SNAPSHOT

    XxlJobSpringExecutor 继承了XxlJobExecutor父类 实现了ApplicationContextAware SmartInitializingSingleton DisposableBean接口 在Spring容
  • Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 当使用桌面应用程序的时候 有没有那么一瞬间 想学习一下桌面应用程序开发 行业内专业的桌面应用程序开发一般是C C 来做 Java开发的也有 但是比较少 本节课会介绍Pyth
  • Android NDK Win10安装及环境变量配置(图文详细教程)

    首先需要安装 Android Studio Android Studio 的安装比较简单 这里不赘述 如果没有安装请先自行安装 1 使用Andorid Studio 进行安装 在顶部菜单中 选择 Tools gt SDK Manager 如
  • css怎么隐藏滚动条

    法一 使用伪类隐藏滚动条 仅限Chrome与Safari scrollbar width none 仅限firefox ms overflow style none 仅限IE 10 隐藏滚动条 element width 100 heigh
  • 可继承多线程单例模式

    template
  • 【1day】sqli-labs靶场,第一关基础个人详解

    目录 SQL注入基本步骤 一 Less 1 1 注入点测试 2 查询字段数 3 判断回显位 4 查询数据库基本信息 5 爆表名 6 爆字段名 7 获取数据 总结 SQL注入基本步骤 第一步 注入点测试 第二步 查询字段数 第三步 判断回显位
  • ThinkPHP5.1 工厂模式集成多个短信平台

    app index controller Sms
  • python脚本-连接手机调试操作微信等软件

    不说明 注释都有 coding utf 8 import time from appium import webdriver 小米ROOT手机 微信 class xiaomi desired caps desired caps platfo
  • InnoDB undo log解析(一)

    InnoDB undo log解析 一 2016 11 28 14 38 277人阅读 评论 0 收藏 举报 在InnoDB存储引擎中 undo log用来完成事务的回滚以及MVCC的功能 但是InnoDB本身提供对于undo log的分析