直读Innodb datafile
这两天有空翻了翻大神写的《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的更多相关文章
- 以芯片直读方式得到的全盘镜像解析及ext4日志区域解析
之前在centos中分析了/dev/sda1下的结构,但当对象是一块以芯片直读方式作出来的全盘镜像呢? 这次以安卓手机的全盘镜像为对象,尝试按照ext4文件系统结构手动解析,加强对ext4文件系统.E ...
- 内存直读技术DMA
DMA(Direct Memory Access) DMA(Direct Memory Access)即直接存储器存取,是一种快速传送数据的机制. 工作原理 DMA是指外部设备不通过CPU而直接与系统 ...
- InnoDB的锁机制浅析(三)—幻读
文章总共分为五个部分: InnoDB的锁机制浅析(一)-基本概念/兼容矩阵 InnoDB的锁机制浅析(二)-探索InnoDB中的锁(Record锁/Gap锁/Next-key锁/插入意向锁) Inno ...
- 关于mysql中storage_engine中 MYISAM 和 INNODB 的选择
简单点说 读操作多用myisam 写操作多用innodb 不过现在大家好像基本都用innodb,本人小白一个就直接用InnoDB. MySQL自20多年前成立以来一直支持可插拔存储引擎,但在一段相当长 ...
- 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 ...
- 几种事务的隔离级别,InnoDB如何实现?
事务ACID特性,其中I代表隔离性(Isolation). 什么是事务的隔离性? 隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离 ...
- innoDB锁小结
innodb的锁分两类:lock和latch. 其中latch主要是保证并发线程操作临界资源的正确性,要求时间非常短,所以没有死锁检测机制.latch包括mutex(互斥量)和rwlock(读写锁). ...
- InnoDB中锁的模式,锁的查看,算法
InnoDB中锁的模式 Ⅰ.总览 S行级共享锁lock in share mode X行级排它锁增删改 IS意向共享锁 IX意向排他锁 AI自增锁 Ⅱ.锁之间的兼容性 兼 X IX S IS X ...
- 4种事务的隔离级别,InnoDB怎样巧妙实现?
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/z50L2O08e2u4afToR9A/article/details/82186189 事务ACID ...
随机推荐
- 认识input输入框的placeholder属性
我们来认识下input输入框的placeholder属性. placeholder 属性提供可描述输入字段预期值的提示信息.(placeholder 属性适用于以下的 <input> 类型 ...
- Chapter 1 Securing Your Server and Network(8):停止未使用的服务
原文:Chapter 1 Securing Your Server and Network(8):停止未使用的服务 原文出处:http://blog.csdn.net/dba_huangzj/arti ...
- ajaxFileUpload+struts2多文件上传(动态添加文件上传框)
上一篇文章http://blog.csdn.net/itmyhome1990/article/details/36396291介绍了ajaxfileupload实现多文件上传, 但仅仅是固定的文件个数 ...
- JTextAreaDemo
问题:java swing 图形界面程序,拖了一个JTextArea出来,程序中有很多地方调用JTextArea中的append这个方法不断往文本域结尾处追加数据,但是程序每次运行,总是在程序运行完成 ...
- android tips—NumberPicker,DataPicker,TimePicker样式改动
在使用NumberPicker.DataPicker,TimePicker这几个控件时,非常easy出现例如以下这个界面 可是我们想要的却是以下图示的结果 改动Application.activity ...
- 基于Hadoop2.2.0版本号分布式云盘的设计与实现
基于Hadoop2.2.0版本号分布式云盘的设计与实现 一.前言 在学习了hadoop2.2一个月以来,我重点是在学习hadoop2.2的HDFS.即是hadoop的分布式系统,看了非常久的源代码看的 ...
- SQL Server系统数据库备份最佳实践
原文:SQL Server系统数据库备份最佳实践 首先了解主要的系统数据库: 系统数据库 master 包含登录信息和其他数据库的核心信息 msdb 存储作业.操作员.警报.备份还原历史.数据库邮件信 ...
- spring多数据源的配置(转)
C3P0和DBCP的区别 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. d ...
- nodejs的安装和使用
一 下载 下载地址: https://nodejs.org/download/ 二 安装 1 win7系统直接双击,就能够执行了: 2 win8须要使用管理员权限执行,否则会报错Error 2502, ...
- IDEA14中安装go语言插件
在IntelliJ IDEA14中安装go语言插件 go语言的集成开发环境仍不成熟,试用了liteide,感觉很不适应,弹出菜单对程序员的干扰太大.所以就试大牌的IntelliJ IDEA,这工具本来 ...