gbase8s存储学习一 rootdbs存储结构以及寻址分析

主要层次自下而上为

最小物理存储单元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 大小对于寻址的计算稍有差异

相关推荐
合作小小程序员小小店10 分钟前
桌面开发,超市管理系统开发,基于C#,winform,sql server数据库
开发语言·数据库·sql·microsoft·sqlserver·c#
quweiie17 分钟前
thinkphp8.0链接SQL SERVER2022数据库
数据库·sqlserver·thinkphp
Databend1 小时前
如何打造AI时代的数据基石 | Databend Meetup 上海站
数据库
老华带你飞1 小时前
海产品销售系统|海鲜商城购物|基于SprinBoot+vue的海鲜商城系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·海鲜商城购物系统
今天你TLE了吗2 小时前
Stream流学习总结
java·学习
合作小小程序员小小店2 小时前
桌面开发,在线%超市销售管理%系统,基于vs2022,c#,winform,sql server数据
开发语言·数据库·microsoft·c#
SelectDB2 小时前
字节跳动:Apache Doris + AI 一站式融合数据引擎的探索与实践
数据库·apache
IvorySQL2 小时前
PostgreSQL 18 - 时间约束 (Temporal Constraints)
数据库·postgresql·开源
q***61412 小时前
从MySQL迁移到PostgreSQL的完整指南
数据库·mysql·postgresql
N***73853 小时前
SQL锁机制
java·数据库·sql