这两天有空翻了翻大神写的《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. 认识input输入框的placeholder属性

    我们来认识下input输入框的placeholder属性. placeholder 属性提供可描述输入字段预期值的提示信息.(placeholder 属性适用于以下的 <input> 类型 ...

  2. Chapter 1 Securing Your Server and Network(8):停止未使用的服务

    原文:Chapter 1 Securing Your Server and Network(8):停止未使用的服务 原文出处:http://blog.csdn.net/dba_huangzj/arti ...

  3. ajaxFileUpload+struts2多文件上传(动态添加文件上传框)

    上一篇文章http://blog.csdn.net/itmyhome1990/article/details/36396291介绍了ajaxfileupload实现多文件上传, 但仅仅是固定的文件个数 ...

  4. JTextAreaDemo

    问题:java swing 图形界面程序,拖了一个JTextArea出来,程序中有很多地方调用JTextArea中的append这个方法不断往文本域结尾处追加数据,但是程序每次运行,总是在程序运行完成 ...

  5. android tips—NumberPicker,DataPicker,TimePicker样式改动

    在使用NumberPicker.DataPicker,TimePicker这几个控件时,非常easy出现例如以下这个界面 可是我们想要的却是以下图示的结果 改动Application.activity ...

  6. 基于Hadoop2.2.0版本号分布式云盘的设计与实现

    基于Hadoop2.2.0版本号分布式云盘的设计与实现 一.前言 在学习了hadoop2.2一个月以来,我重点是在学习hadoop2.2的HDFS.即是hadoop的分布式系统,看了非常久的源代码看的 ...

  7. SQL Server系统数据库备份最佳实践

    原文:SQL Server系统数据库备份最佳实践 首先了解主要的系统数据库: 系统数据库 master 包含登录信息和其他数据库的核心信息 msdb 存储作业.操作员.警报.备份还原历史.数据库邮件信 ...

  8. spring多数据源的配置(转)

    C3P0和DBCP的区别 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等.   d ...

  9. nodejs的安装和使用

    一 下载 下载地址: https://nodejs.org/download/ 二 安装 1 win7系统直接双击,就能够执行了: 2 win8须要使用管理员权限执行,否则会报错Error 2502, ...

  10. IDEA14中安装go语言插件

    在IntelliJ IDEA14中安装go语言插件 go语言的集成开发环境仍不成熟,试用了liteide,感觉很不适应,弹出菜单对程序员的干扰太大.所以就试大牌的IntelliJ IDEA,这工具本来 ...