主要层次自下而上为
最小物理存储单元page ,多个page 组成逻辑存储单元extent,多个extent 组成物理存储单元chunk ,而多个chunk组成逻辑存储单元dbspace,多个dbspace 组成一个数据库实例
在数据库初始化阶段会生成一个rootdbs表空间,该表空间为逻辑存储,通常对应一个实际chunk文件,一般命名为rootdbs或者 rootchk
该表空间为数据库的根空间,主要存储数据库的一些系统元数据(系统表),以及数据库的保留页
保留页结构如下
0 数据库描述信息
1 数据库配置参数
2、3 检查点信息
4、5表空间信息
6、7chunk信息
8、9镜像(一般很少见)
a、b归档信息
oncheck -pr 可以dump存储信息
数据库描述信息
配置参数
检查点信息
表空间信息
chunk信息
镜像信息,默认不配置
归档信息
保留页之后的信息为数据库的元数据信息
使用oncheck -pe rootdbs 可以格式化列出rootdbs的扩展信息
从0 page开始前12 个页为保留页
第13 个页为chunk-freelist-page
该页的作用为
每个chunk 都需要一种机制来跟踪其自身的可用空间。在每个数据块的最后一个已分配(预留)页之后,是一个数据块空闲链表页(chunk free-list page)。该空闲链表页的数量可能因数据块内部的碎片化程度而有所不同(可能存在多个这样的页),它包含指向未使用区段(extents)的结构体。每个结构体(即空闲链表条目)包含两个元素:一个未分配区段的起始页,以及该空闲区段的长度(以页为单位)。
之后为表空间的TBLspace, 初始250个页面,后会自动扩展
系统中的每个表空间都有一个特殊页来描述,这种特殊类型的页称作分区页(TBLspace )。
结构如下
oncheck -pP 1 14
信息如下
slot1 的前四个字节(0x00100001) 可以理解为 表空间的 Partition Number (Partnum),整体为Partition 结构体
slot5为extent 信息,如下
0: 0 0 0 0 0 1 0 0 0 d 0 0 0 fa 0 1
16: 0 0 e4 ba 0 0 1 2c 0 1 0 0 e6 b9 0 0
32: 1 90 0 1 0 1 0 55 0 0 2 58 0 0 0 0
48: 0 0
前四个字节为该页逻辑起始位置 两字节为chunk编号,再四字节为 物理位置,循环可得出一个extent信息,转10进制如下
与oncheck -pe rootdbs| grep TBLSpace 输出一致,初始250个页面,后边的为自动扩展的
如何理解上述信息
该TBLspace 分为四个extent
第一个extent 从 13 page 开始,共250个page
第二个extent 从 58554 page 开始,共50个page
....
再之后就是每个系统表,索引以及自定义表索引等位置信息
如何使用该信息
例如 查询sysmaster库下的systables表,该如何定位该表的存储位置
select hex(partnum) from sysmaster:systables where tabname='systables';
结果为 0x00100004
partnum 分为两部分 ,一部分为0x001 一部分为 4
前部分指chunk编号后部分为逻辑偏移
逻辑偏移为4 时,相当于物理偏移为 13+4=17
刚好为我们要查找的sysmaster库下的systables TBLspace信息
如何 定位systables的数据,例如查询systables 表下 tabname列为syssynonyms 行数据
select rowid,ifx_row_id,tabname from systables where tabname='syssynonyms';
rowid 777
ifx_row_id 1048580:777
tabname syssynonyms
rowid是一个4字节编码,前3个字节是逻辑页号,第4个字节是slot号
ifx_row_id分为两部分 前一部分systables partnum 后边与rowid一样
1048580 转16进制 刚好为0x100004 与select hex(partnum) from sysmaster:systables where tabname='systables'; 查到的一致
777 转16进制为 0x309 逻辑页号为 3 9 为 slot
这时需要观察systables 表的TBLspace信息
按照之前的分析如下
0: 0 0 0 0 0 1 0 0 d7 f3 0 0 0 8 0 1
16: 0 0 da 8b 0 0 0 10 0 1 0 0 e1 20 0 0
32: 0 20 0 1 0 0 e6 45 0 0 0 40 0 0 0 0
48: 0 0
与 oncheck -pt sysmaster:systables 输出一致
逻辑页号为 3 9 为 slot
对应 物理位置为 55286 slot9 数据
oncheck -pP 1 55286
查看该页找到 slot9
刚好是查询的 tabname='syssynonyms'
其寻址大概逻辑为
先找到表空间的TBLspace 根据extent 以及 table 的partnum 信息找到 表的TBLspace,再根据rowid/ifx_fow_id定为到数据所在page 以及slot
不同page 大小对于寻址的计算稍有差异