这两天有空翻了翻大神写的《innodb存储引擎》,手痒亲身实践。由于此书出版了有段时日,没有用其推荐的python工具,通过点滴推敲,略微发现其中冰山一角的奥秘。对于今后对于一些问题查证或数据迁移可能会有帮助。话不多说,开码。

·大结构

innodb数据文件按照 :【segment,extent,page,row】层次来组合,中文解释就是【段、区、页、行】。

4大元素之间的关系:
Segment=N*[Extent];
Extent=64*Pages;
Page=16KB(Low-Level fs+Page Header+VarcharLength+Data);
Low-Level fs=38 Bytes;
Page-Header=78 Bytes;
Page-Header=【Page Header+虚拟记录mum】
Data=16*1024B-38B-78B-VcharLength

ibd文件由段组成,段有extent可以按需扩展,truncate能回收空间,但delete只做清零处理。
extent扩展inndo有自己的经验算法,这块代码还没找到,理论是1-4M,但实际有出现扩从512K突增到9M的情况。有64个PAGE组成。
Page大小16K,也就是16384个字节。按16进制,UltraEdit下步长起点如下:0000-4000-8000-C000
Page按代码由3部分组成,逻辑上PageHeader对infimum和supremum有拆分。也可以说是4部分组成。后面会讲。

·小结构

段和区都为固定功能且可以单调递增,暂不做解释。主要讲一下Page和Row。Row走最常见的compact格式,compact本质取消了一定规则内存对齐操作。
Page的构造如下:

这些结构体的文件系统底层定义在$MYSQL_SRC/storage/include/fil0fil.h中可以查到,主要这两个字段在分析中比较有用:

  • Offset :记录着Page的偏移,也就是我这页是第几个页。
  • Prev和Next:页的双向链表,实际存的不是指针,就是Offset的值。
  • Type:帮助你了解这个页是干什么的。0x45bf,代码中是17855十进制。该值为最典型的数据PAGE。
  • Space_id:这个表的ID,作为dict的唯一关联。
  • LSN:在备份和恢复时非常有用,有助于定位问题。

再往下看,就是PageHeader。它的定义在$MYSQL_SRC/storage/include/page0page.h中可以查看

从0xc0205的0×0046 space_id开始算起,如上图所示,是所有page_header的定义和长度。这些定义主要是围绕了记录数的起始、大小、长度、位置等做的一些统计信息。
注意图中的3条红色虚线,它们分别指出了具体记录的起点和结束位置。这个位置是相对ROW_ID为基础的。
PAGE_HEAP_TOP:记录整个记录导出到buf堆时最后的指针停留位置,像上图中就是c000+00ec=c0ec。
PAGE_LAST_INSERT:记录着这个PAGE中最后一条记录的起始位置,像上图中就是c000+00be=c0be。
INFIMUM虚拟行记录头:记录着第一条记录的起始位置,像上图中就是c063+0023=c083。
另外,PAGE_N_RECS:记录着这个页中包含着多少条记录等等。通过这样1头1尾定位了所有的记录框架。
上图就是与我们记录完全翻译的16进制解码,下图是原始记录。

对于Row的字段定义在$MYSQL/storage/rem/rem0rec.cc和row0row.cc中有明确解释。
第一条记录全字段都被填满了,所以varchar_length预留了3个字节分别表示了t2,t3,t4存储的字符长度。
空值判断预留了1位。这个比较有意思,该值是一个bitmap。这两段实现可以rem0rec.cc中查到。
1个字节可以展示8个字段空与非空。2个字节就能支持到16个字段,以此类推。空了填1,不空填0,从右往左为视觉字段顺序。
Row_ID:默认行记录key表示。再跟交易trx_ID和回滚指针。
再往后就是varchar的变长真实数据和char的预留数据,char的预留数据为0×20空格,不是0。这个比较奇怪。
图中红、黄、绿分别代表了3条不同的记录,与其自身下图select对应。

至此,我们就可以对整个IBD文件进行了初步解析。

直读Innodb datafile的更多相关文章

  1. 以芯片直读方式得到的全盘镜像解析及ext4日志区域解析

    之前在centos中分析了/dev/sda1下的结构,但当对象是一块以芯片直读方式作出来的全盘镜像呢? 这次以安卓手机的全盘镜像为对象,尝试按照ext4文件系统结构手动解析,加强对ext4文件系统.E ...

  2. 内存直读技术DMA

    DMA(Direct Memory Access) DMA(Direct Memory Access)即直接存储器存取,是一种快速传送数据的机制. 工作原理 DMA是指外部设备不通过CPU而直接与系统 ...

  3. InnoDB的锁机制浅析(三)—幻读

    文章总共分为五个部分: InnoDB的锁机制浅析(一)-基本概念/兼容矩阵 InnoDB的锁机制浅析(二)-探索InnoDB中的锁(Record锁/Gap锁/Next-key锁/插入意向锁) Inno ...

  4. 关于mysql中storage_engine中 MYISAM 和 INNODB 的选择

    简单点说 读操作多用myisam 写操作多用innodb 不过现在大家好像基本都用innodb,本人小白一个就直接用InnoDB. MySQL自20多年前成立以来一直支持可插拔存储引擎,但在一段相当长 ...

  5. 14.4.3.1 The InnoDB Buffer Pool

    14.4.3.1 The InnoDB Buffer Pool 14.4.3.2 Configuring Multiple Buffer Pool Instances 14.4.3.3 Making ...

  6. 几种事务的隔离级别,InnoDB如何实现?

    事务ACID特性,其中I代表隔离性(Isolation). 什么是事务的隔离性? 隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离 ...

  7. innoDB锁小结

    innodb的锁分两类:lock和latch. 其中latch主要是保证并发线程操作临界资源的正确性,要求时间非常短,所以没有死锁检测机制.latch包括mutex(互斥量)和rwlock(读写锁). ...

  8. InnoDB中锁的模式,锁的查看,算法

    InnoDB中锁的模式   Ⅰ.总览 S行级共享锁lock in share mode X行级排它锁增删改 IS意向共享锁 IX意向排他锁 AI自增锁 Ⅱ.锁之间的兼容性 兼 X IX S IS X ...

  9. 4种事务的隔离级别,InnoDB怎样巧妙实现?

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/z50L2O08e2u4afToR9A/article/details/82186189 事务ACID ...

随机推荐

  1. 分布式服务框架 dubbo/dubbox 入门示例(转)

    dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm ...

  2. Oracle FGA审计记录的清理步骤

    注意:本文为原创文章,转载请注明出处: http://blog.csdn.net/msdnchina/article/details/38435999 一.确认有哪些fga审计策略, 从select ...

  3. Machine Learning—Linear Regression

    Evernote的同步分享:Machine Learning-Linear Regression 版权声明:本文博客原创文章.博客,未经同意,不得转载.

  4. poj3281-Dining ,最大流量,内置图

    id=3281">点击打开链接 分析: 求最大流 建图: 拆点 牛拆成左边与食物相连的左牛 和 右边与饮料相连的右牛 1.s->食物 连边 2.食物->左牛 3.左牛-&g ...

  5. 使用CASE表达式替代SQL Server中的动态SQL

    原文:使用CASE表达式替代SQL Server中的动态SQL 翻译自: http://www.mssqltips.com/sqlservertip/1455/using-the-case-expre ...

  6. Windows PHone 8 获取硬件信息

    /// <summary> /// 获取系统信息 /// </summary> private string GetDeviceInfo() { StringBuilder s ...

  7. Java它配备了一个很好的工具2

    Jconsole 本机java自带的系统monitor具,它也可以连接到的本地远程连接java process,联系java process申请后可查看CPU,内存,主题.GC事件,能帮忙看看系统是否 ...

  8. Cytoscape画图初探

    Cytoscape是一个做网络图的js插件.用起来非常方便,并且非常强大.这是它的站点:点击打开链接 使用它须要导入两个文件,一个是js文件,一个是css文件.官网上下载. 这里实现了一个功能.即从后 ...

  9. Cocos2d-x游戏开发Lua

    1.加入参考库 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2lzZG9tNjA1NzY4Mjky/font/5a6L5L2T/fontsize/400 ...

  10. Robot Framework自动化测试(一)---第一个脚本(转)

    最近工具中用Robot Framework框架来做自动化,所以,花时间学习了一下. =======所需环境=================== Python: https://www.python. ...