源码版本5.7.22

此处简单记录一下DB_ROLL_PTR指针解析的方法,水平有限,如果有误请谅解。

一、引入

我们知道每一条记录在聚集索引上都有如下的分布:

  • rowid(主键)+DB_TRX_ID+DB_ROLL_PTR+其他字段
    这样格式其中DB_TRX_ID+DB_ROLL_PTR作为MVCC的关键信息存储下来,其中DB_TRX_ID在存储上占用6字节,DB_ROLL_PTR在存储上占用7字节。那么DB_ROLL_PTR是如何解析到undo上的呢,这也是一位朋友问的问题。

下面是trx0types.h中对这部分的定义

/** Row identifier (DB_ROW_ID, DATA_ROW_ID) */
typedef ib_id_t    row_id_t;
/** Transaction identifier (DB_TRX_ID, DATA_TRX_ID) */
typedef ib_id_t    trx_id_t;
/** Rollback pointer (DB_ROLL_PTR, DATA_ROLL_PTR) */
typedef ib_id_t    roll_ptr_t;

而ib_id_t实际上都是64位非负整数

typedef unsigned __int64 ib_uint64_t;

二、函数流程

我大概看了一下流程如下:

trx_undo_prev_version_build  //Build a previous version of a clustered index record->roll_ptr = row_get_rec_roll_ptr(rec, index, offsets); //获取rollback 指针->rec_trx_id = row_get_rec_trx_id(rec, index, offsets); //获取TRX_ID->trx_undo_get_undo_rec(roll_ptr, rec_trx_id, heap, is_redo_rseg,index->table->name, &undo_rec))//此处获取前版本,获取后放到undo_rec中->trx_undo_get_undo_rec_low(roll_ptr, heap, is_redo_rseg); //undo_rec作为传出参数。传出访问到的undo->trx_undo_decode_roll_ptr //做roll_ptr的解析工作获取segment id\page no\offset->开MTR获取latch准备拷贝->拷贝trx_undo_rec_copy->提交MTR

实际上解析工具由trx_undo_decode_roll_ptr 完成。

三、实际解析

其实解析挺简单,都是写死了的。

/***********************************************************************//**
Decodes a roll pointer. */ //从高位到低位依次是  第1位是否是insert //第2到8位是segmentid//第9到40位为page no //第41位到56位为OFFSET
UNIV_INLINE
void
trx_undo_decode_roll_ptr(
/*=====================*/roll_ptr_t    roll_ptr,    /*!< in: roll pointer */ibool*        is_insert,    /*!< out: TRUE if insert undo log */ulint*        rseg_id,    /*!< out: rollback segment id */ulint*        page_no,    /*!< out: page number */ulint*        offset)        /*!< out: offset of the undoentry within page */
{
#if DATA_ROLL_PTR_LEN != 7
# error "DATA_ROLL_PTR_LEN != 7"
#endif
#if TRUE != 1
# error "TRUE != 1"
#endifut_ad(roll_ptr < (1ULL << 56));*offset = (ulint) roll_ptr & 0xFFFF; //获取低16位 为OFFSETroll_ptr >>= 16; //右移16位*page_no = (ulint) roll_ptr & 0xFFFFFFFF;//获取32位为 page noroll_ptr >>= 32;//右移32位*rseg_id = (ulint) roll_ptr & 0x7F;//获取7位为segment idroll_ptr >>= 7;//右移7位*is_insert = (ibool) roll_ptr; /* TRUE==1 *///最后一位
}

参考注释。自行理解。

作者微信号码:gp_22389860

MySQL:Innodb DB_ROLL_PTR指针解析相关推荐

  1. 【数据库篇】MySQL InnoDB ibd 文件格式解析

    mysql innodb的表由.frm .ibd 组成,frm:存了每个表的元数据,包括表结构的定义等:ibd:存了每个表的元数据,包括表结构的定义等: 1.0 ibd文件基本结构 ibd文件由Tab ...

  2. mysql innodb monitor_MySQL innodb_table_monitor 解析

    背景: 用innodb_table_monitor来查看表内部的存储信息和索引结构是一个好的办法.再之前的MySQL 字符串主键和整型主键分析中提到了一些内容,但没有细讲,现在来好好的分析下. 使用方 ...

  3. mysql innodb flus_MySQL参数解析innodb_flush_neighbors

    取值范围:0,1,2 默认值:5.7版本为1, 8.0版本为0 含义: 设置为0时,表示刷脏页时不刷其附近的脏页. 设置为1时,表示刷脏页时连带其附近毗连的脏页一起刷掉. 设置为2时,表示刷脏页时连带 ...

  4. 100道MySQL数据库面试题解析

    1. MySQL索引使用有哪些注意事项呢? 可以从三个维度回答这个问题:索引哪些情况会失效,索引不适合哪些场景,索引规则 索引哪些情况会失效 查询条件包含or,可能导致索引失效如何字段类型是字符串,w ...

  5. mysql innodb体系结构--初级

    MySQL innodb体系结构 <!--more--&gt 2015年9月20日星期日 20:00-20:40,我观看了博森瑞的关于mysql体系结构网络公开课,这次课程简单介绍了in ...

  6. MySQL innoDB底层基础原理总结

    MySQL innoDB底层基础原理 前言:由于正在准备之后的实习面试,故总结了一部分MYSQL innoDB基础的问题,回答全为自己组织的语言,若有错各位大佬可及时指出,大家共同进步,谢谢. 1.i ...

  7. 从一个死锁看mysql innodb的锁机制

    2019独角兽企业重金招聘Python工程师标准>>> 背景及现象 线上生产环境在某些时候经常性的出现数据库操作死锁,导致业务人员无法进行操作.经过DBA的分析,是某一张表的inse ...

  8. Mysql+innodb数据存储逻辑

    Mysql+innodb数据存储逻辑. 表空间由段,区,页组成 ibdata1:共享表空间.即所有的数据都存放在这个表空间内.如果用户启用了innodb_file_per_table,则每张表内的数据 ...

  9. MySQL Innodb存储引擎使用B+树做索引的优点

    对于数据库来说,索引和表数据都是存放在磁盘上的,一般使用B+树作为索引 MySQL Innodb存储引擎使用了B+树作为索引的优点,主要有以下原因: 1.索引和表数据都是存放在磁盘上的,如果磁盘上的数 ...

最新文章

  1. 数字滤波器的幅频响应
  2. html语言技术基础,第2章Web编程基础HTML语言技术方案.ppt
  3. linux 安装系统划分lvm分区
  4. python能和wincc一起用_python通过ado连接wincc数据库
  5. Flexbox 最简单的表单
  6. C语言 文件读写 ferror 函数 - C语言零基础入门教程
  7. ping通网关 ping不通dns
  8. linux找回删除的文件6,在Centos6/RHEL6上恢复ext4文件系统下误删除的文件
  9. python vimrc的安装,并用pep8检测python代码
  10. 3640 交换机实验的一些摘要【待进一步更新】
  11. Oracle P6培训系列:15定义资源库
  12. java毕业设计小区停车场管理系统mybatis+源码+调试部署+系统+数据库+lw
  13. 三.VirtualBox中安装Centos7.5.1804
  14. 关于民族的数据库表设计
  15. 再谈Hibernate the owing session was closed
  16. 【设计模式】建造者模式
  17. wps怎么把边框加粗_wps怎么把边框线加粗
  18. linux_时区修改
  19. 【2022年】软件测试前景和发展方向,软件测试行业出路?
  20. python 虚拟mac地址_随机生成MAC地址的N种方法

热门文章

  1. 048_String对象
  2. 081_html5地理定位
  3. 002_html发展史
  4. php base64_decode 图片,PHP保存Base64图片base64_decode的问题整理
  5. python实现冒泡排序视频_Python实现冒泡排序算法的完整实例
  6. Android安全加密:消息摘要Message Digest
  7. 如何将zipoutputstream返回_性能问题|如何正确使用“缓存”?
  8. xctf php2,XCTF PHP2
  9. centos 7 mysql 默认_centos7 mysql 5.6.30 默认配置文件
  10. Python基础之数据类型(一)