一、表空间的文件类型
表空间的文件类型其实就文件的具体类型,在前面谈到过表空间的上层逻辑分层,最下面一层是通过Page来实现的,也就是说,文件的底层就是通过链表来控制这个页数据。而这些页数据的具体保存到硬盘中,主要为为两类,即:
FSP_HDR/XDES Page和fseg inodes Page。
page的默认大小为16K,在InnoDB中extent是分配页的基本单位,每个extent包含64个Page。
二、表空间文件格式
表空间中一般是以Extent的形式来组织Page的,基本如下:
其可分为两种形式即XDES和FSEG,FSP_HDR/XEDS如下:
头部信息:
space id:
当前表空间的ID
size:
当前space最大可容纳的page数,文件扩大时才会改变这个值
limit:
当前space已经分配初始化的page数,包括空闲的和已经使用的
flag:
未起作用
frage used:
FSP_FREE_FRAG列表中已经被使用的page数
free list:
space中可用的extent对象列表,extent里面没有一个page被使用
frag free list :
有可用碎页page的extent列表,exntent里面有部分page被使用
frag full list :
页全部使用的extent列表
segment id:
下一个可利用的segment id
full inode list :
space全满segment inode页列表
free inode list :
space空闲segment inode页列表
XDE的细节:
File Segment ID:
extent所属segment的ID
XDES list:
磁盘双向链表的一个节点,前后各指向一个XDES entry的page位置
state:
extent的状态, 值包含XDES_FREE、XDES_FREE_FRAG、XDES_FULL_FRAG、XDES_FSEG。当为XDES_FSEG的时,表示此extent已归属一个Segment;XDES_FSEG表示extent初始创建状态。XDES_FREE表示extent在刚分配时状态.
bitmap:
extent中page的状态索引,一个page占用2 bit,第一个bit表示占用状态,第二个bit表示清空状态,暂时未用,默认为TRUE。
INODE PAGE整体信息:
FSEG 如下:
fseg id:
segment ID
not full used:
NOT_FULL列表中的page数
FREE:
inode中空闲的extent列表
NOT_FULL:
未完全使用的extent列表
FULL:
完全满的extent的列表
MAGIC_N:
校验魔数
FRAG ARRAY:
长度为32个的页索引存储数组,主要用来节省空间,一般用在不完整分配Extent时。
三、应用流程
在InnoDB的Sapce中,inode extent page三者的关系非常紧密。Page是最基本的分配单位,但页的分配是通过Extent来组织管理的,所以Extent叫做区。而Inode又可以管理多个Extent和32个Frag Page。Inode以Segment为管理 ,也就是上面的图中的FSEG。
Inode是从inode page的free list来申请控制,extent则有两种申请管理方式,一种是通过Fragment碎片方式管理分配,另外一种是在分配Fragpage时直接对Extent申请分配管理。在这个基础上,页的分配管理就清楚了,它可以通过 inode的方式来申请也可以通过Fragpage的方式来申请。
最主要的代码主要在fsp0fsp.cc这个文件中,有兴趣可以认真翻看一下代码,这里就不再分析,前面在分析相关代码时,也引用了不少这里的代码。
四、总结
其实有过存储开发经验的编程人员,做过安全方面开发的人员都知道,各种内存的数据不管多么复杂,最终都要存储到硬盘中落盘。数据千条线,落盘的方法却只有那几个API,即使后来增加了各种DMA甚至重写硬盘驱动,都只是加快速度而已。数据的存储和物品的存储基本一样,要想物品迅速安全的存储并在后期找到应用,就必须划定各种存储方案,其实反映到数据上,就是把数据的存储有一定的格式,复杂是格式而不是存储本身。
格式其实就是数据存储的规则,先写什么后写什么,有什么标志头、标志尾,有没有校验值,数据的大小长度等等。每一种实际的数据,可能需求不一样,可能规则就变化很大。但基本的原则是一致的,就是为了能够安全有效的快速落盘。学的多,看得多,总结的多了后,就明白了其中的关窍。