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 大小对于寻址的计算稍有差异

相关推荐
写bug写bug2 分钟前
为什么 LIMIT 0, 10 快,而 LIMIT 1000000, 10 慢?
数据库·后端·mysql
用户6279947182628 分钟前
1小时掌握南大通用GBase 8c Hint核心技巧!让SQL从10秒到1秒
数据库
世事如云有卷舒16 分钟前
《C++ Primer》学习笔记(四)
c++·笔记·学习
雷霆嘎子31 分钟前
UnityDots学习(四)
学习
李匠202434 分钟前
C++学习之游戏服务器开发十四QT登录器实现
c++·学习·游戏
viperrrrrrrrrr71 小时前
大数据学习(112)-Analytic函数集
学习
nenchoumi31191 小时前
LLM 论文精读(二)Training Compute-Optimal Large Language Models
论文阅读·人工智能·笔记·学习·语言模型·自然语言处理
再路上12161 小时前
direct_visual_lidar_calibration iridescence库问题
java·服务器·数据库
小王努力学编程2 小时前
美团2024年春招第一场笔试 C++
开发语言·数据结构·c++·学习·算法
卡皮巴拉爱吃小蛋糕2 小时前
MySQL的事务(Transaction)【学习笔记】
数据库·笔记·学习·mysql