1. 执行的sql语句和目的
- 执行的sql语句
select rowid,* from test1 where id=1;
- 目的:查找到test1表中id=1这个值在硬盘中的真实位置并取出
2. 寻址的过程-确定表的数据空间和逻辑页的信息
- 根据表名查看这张表的数据空间位置和逻辑页号
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ dbaccess test -
Your evaluation license will expire on 2025-05-26 00:00:00
Database selected.
> select hex(partnum) from systables where tabname ='test1';
(expression)
0x00400049
1 row(s) retrieved.
- 每个表都有一个唯一的partnum,可以成为分片标识号,其记录了这张表在磁盘中的信息,其转为16进制后,前3位为数据空间号,后5位为逻辑页的地址
- 0x004表示这张表位于标识为4的chunk中
- 0x00049记录了这张表在这个chunk中逻辑页的位置,16进制的49转为10进制为73
- 则16进制的partnum表示test1表位于第4个chunk的第73个逻辑页
3. 根据逻辑页找到表区段位置的过渡知识
- 寻址中所需对象的概念
- 操作系统的页和数据库中的逻辑页:操作系统中页默认是2kb,本次查询的数据库页大小设计为16k,所以逻辑页进行计算并确认物理页位置的时候需要用逻辑页*16kb/2kb,这是逻辑页和物理页在计算中的映射,下面会用到
- extent:数据存放在页中,但是一张表扩展时不会只扩展一页,而是多个连续的页进行扩展,而这些连续的页,我们称之为区段extent
- tblspace:由extent可知,一个表是由多个extent组成的,而一张表所有的extent的总和,我们称之为一张表的tblspace,即这张表的表空间
- tblspace tblspace:由于每张表都有多个extent组成,为了快速定位表的每个extent,所以在chunk的头部空间内,有部分页,就是为了保存这部分信息的,每个页都记录了一张表所有extent的起始位置信息,而这些页的组合我们称之为tblspace tblspace
- 既然每个tblspace都有一个空间用来记录extent的起始位置信息,而tblspace tblspace这一组表空间我们也看成一张表,而这张表也有自己的空间信息,且位置就在这个表的前两页(类似与前两行),即page 0和page 1,page 1就记录了这个空间关于表位置的信息
- 所以如果寻找表的位置,可以从tblspace tblspace的page 1中进行查询
- page 0是位图页,左右可从其他文章中查找,本文不进行叙述,但是会在下文展示
4. 根据partnum的tblspace tblspace的page 1查找test1表的区段信息
- oncheck -pp可以打印某个表空间的逻辑页
- tblspace tblspace在数据中是一个chunk的第一个表空间
- 由test1的partnum可知test1在第四个chunk中,则记录test1的区段信息的tblspace tblspace的逻辑空间为0x400001,则oncheck -pp 0x400001 1即可计算出test1的物理页位置
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ oncheck -pp 0x400001 0
Your evaluation license will expire on 2025-05-26 00:00:00
addr stamp chksum nslots flag type frptr frcnt next prev
4:24 2420340 ee4c 0 804 FREE 24 16356 0 0
0:8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
32:8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8
64:8 8 8 8 8 8 8 8 8 8 8 8 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
96:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
128:8 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
160:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
192:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 查看记录表区段的页
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ oncheck -pp 0x400001 1
Your evaluation license will expire on 2025-05-26 00:00:00
addr stamp chksum nslots flag type frptr frcnt next prev
4:32 2420408 eeb8 5 802 PARTN 228 16132 0 0
slot ptr len flg
1 24 136 0
2 160 28 0
3 188 0 0
4 188 0 0
5 188 40 0
slot 1:
0: 1 0 40 0 1 28 0 0 88 0 0 0 0 0 0 0 ..@..(..........
16: 3 0 0 40 ca 6d 59 66 1 0 0 0 90 1 0 0 ...@JmYf........
32: 40 6 0 0 c8 0 0 0 97 0 0 0 0 0 0 0 @...H...........
48: ff ff ff ff 1 0 40 0 1 0 0 0 0 0 0 0 ......@.........
64: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ................
80: 0 0 0 0 0 0 0 0 4e 0 0 0 1 0 0 0 ........N.......
96: 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 ................
112: 1 0 0 0 5 0 0 0 d0 b0 44 0 0 0 0 0 ........P0D.....
128: 0 0 0 0 0 0 0 0 ................
slot 2:
0: 64 61 74 61 64 62 73 31 0 67 62 61 73 65 64 62 datadbs1.gbasedb
16: 74 0 54 42 4c 53 70 61 63 65 0 0 t.TBLSpace......
slot 3:
slot 4:
slot 5:
0: 0 0 0 0 0 4 0 0 0 18 0 0 0 32 0 4 .............2..
16: 0 0 8 48 0 0 0 64 0 4 0 0 16 b8 0 0 ...H...d.....8..
32: 0 c8 0 0 0 0 0 0 .H..............
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$
由oncheck -pp 0x400001 1可知物理地址和逻辑地址如下
- slot 1记录了表的基本信息,字段数量、索引数量等
- slot 2记录了数据库数据库名,表的所有者、表名和方言等信息
- slot 3记录了特殊字段的信息
- slot 4:记录索引的相关键值信息
- slot 5记录了区段列表的信息
- 解析slot 5:
- 0:表示从0个字节开始:0 0 0 0代表逻辑页0,0 4代表chunk 4,0 0 0 18,16进制的18代表24页
- 由前10位可以得出第一个区段的起始逻辑页为0 ,而逻辑页0的物理位置为chunk4的第24页
- 16:表示从第16个字节开始,0 0 0 32,16进制32为50,代表起始页为50,0 4代表chunk 4,0 0 8 48,16进制848为2120
- 由第二个10位可以得出第二个区段的起始逻辑页号为50,逻辑页50对应的物理位置为chunk4的2120页
- 32:表示从第32个字节开始,0 0 0 64,16进制64代表100,代表逻辑页100,0 4 0 0 16 b8,代表chunk4 5816页
- 由第三个10位可以得出第三个区段起始页是100,而逻辑页100对应的物理位置为chunk4的5816页
- 第四个10发现后6位全为0,表示第四个chunk还没有申请,表示所有的数据tblspace的信息都被记录在了前三个chunk中
- 0:表示从0个字节开始:0 0 0 0代表逻辑页0,0 4代表chunk 4,0 0 0 18,16进制的18代表24页
5. 针对test1的partnum和tblspace tblspace关于表信息区段进行计算
- 已知test1的partnum为0x00400049,转为16进制后分析为chunk4的第73个逻辑页
- 根据tblspace tblspace中的解析可知
- 有三个区段,起始位置为0页,50页,100页
- 而test1的逻辑页为73页,所以其信息位于第二个区段内,又因为区段里的页是连续的,所以73页可以根据50页的位置进行计算得出来
- 计算:
- 由于逻辑页50对应的物理页数为2120页,则逻辑页73需要在逻辑页50上加上23逻辑页,即在2120页上加上相应的物理页
- 因为是16kb的数据空间,2kb的操作系统空间,所以逻辑页的1页为操作系统物理页的8页,所以逻辑页73和逻辑页50页相差(73-50)*8=184页
- 即逻辑73对应chunk4上的物理页2120+184=2304页
- 所以可以从chunk 4上的2304页查出表test1数据的区段信息
6. 通过oncheck -pP根据chunk 4的2304页查看表test1的区段信息
- oncheck -pP chunk page:可以根据这个参数写法查看出某个chunk的某个物理页上的信息
- 执行命令oncheck -pP 4 2304
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ oncheck -pP 4 2304
Your evaluation license will expire on 2025-05-26 00:00:00
addr stamp chksum nslots flag type frptr frcnt next prev
4:2304 847006 e596 5 802 PARTN 212 16148 0 0
slot ptr len flg
1 24 136 0
2 160 32 0
3 192 0 0
4 192 0 0
5 192 20 0
slot 1:
0: 49 0 40 0 1 8 0 0 4 0 0 0 0 0 0 0 I.@.............
16: 1 0 0 40 29 60 5d 66 1 0 0 0 20 0 0 0 ...@)`]f.... ...
32: 20 0 0 0 4 0 0 0 2 0 0 0 1 0 0 0 ...............
48: ff ff ff ff 49 0 40 0 1 0 0 0 0 0 0 0 ....I.@.........
64: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ................
80: 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 ................
96: 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 ................
112: 1 0 0 0 f 0 0 0 80 90 c0 8 0 0 0 0 ..........@.....
128: 0 0 0 0 0 0 0 0 ................
slot 2:
0: 74 65 73 74 0 67 62 61 73 65 64 62 74 0 74 65 test.gbasedbt.te
16: 73 74 31 0 7a 68 5f 43 4e 2e 35 37 33 37 32 0 st1.zh_CN.57372.
slot 3:
slot 4:
slot 5:
0: 0 0 0 0 0 4 0 0 12 f8 0 0 0 4 0 0 .........x......
16: 0 0 0 0 ................
- slot5依然记录了区段信息,这个slot 5记录了test1表数据的区段信息
- 数据区段起始页的计算:
- 0 0 0 0:代表test1表数据存放的逻辑起始页为0
- 0 4:代表test1表的数据存放在了chunk 4上
- 0 0 12 f8:这是16进制的数字,转为10进制为4856,表示test1数据存放的逻辑页号0对应的chunk 4上的物理页号是第4856页
- 再往后的0 0 0 4:表示第二个区段的逻辑页起始页为4,后面为0,表示第一个区段没有填充满,还没有使用第二个区段,即所有的数据都在第一个区段内
7. 根据区段信息进行下一步分析的理论信息
- extent由上述可知是一组连续页的集合,而这组连续页的集合extent的第一个页也是一个位图页,位图页中的每个字节都是一个页的标识,每个标识的不同值是用来记录区段中的页是否被填充满,所以需要查找信息需要查看之后的页
- 由上述信息可知,逻辑页每加一页物理页会加8页,则区段的起始页为chunk 4的4856页,extent的第二页为4864页
- 本文执行的sql语句为select * from test1 where id=1
- 本文已知test1的数据都在第一个extent中,也定位到了extent的其实物理位置
- 接下来需要定位id=1的位置
8. 根据rowid定位id=1的位置
- rowid转为16进制代表的是共4个字节8位,前6位记录的extent的逻辑页号,后两位记录的是slot号
- slot:每个页gbase8s最多存储255行数据,即slot是行号,也最多是255,因为两位16进制最多是16*16-1=255
- 对id=1的rowid进行16进制转换
--查看id=1的rowid
> select hex(rowid),rowid,id from test1 where id=1;
(expression) rowid id
0x00000101 257 1
1 row(s) retrieved.
Elapsed time: 0.001 sec
- 由上可知id=1的数据在extent的逻辑页为1的第一行
- 已知extent的起始物理页地址为chunk 4的4856页,由于extent的第一页是位图页,则数据的第一页为4856+8=4864页
- 则id=1的物理地址为chunk4的第4864页第一行
9. 使用dd命令导出
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ touch test1.page
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ dd if=/home/gbasedbt/gbase/node1_dbs/datadbs1 of=test1.page skip=608 count=1 bs=16k
1+0 records in
1+0 records out
16384 bytes (16 kB, 16 KiB) copied, 0.00012976 s, 126 MB/s
--查看导出来的数据
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$ od -x test1.page
0000000 1300 0000 0004 f8ba 3801 0801 001c 3fdc
0000020 0000 0000 0000 0000 0000 0100 0000 0000
0000040 0000 0000 0000 0000 0000 0000 0000 0000
*
0037760 0000 0000 0000 0000 0018 0004 ebb2 000c
0040000
[gbasedbt@iZ2ze5s78e4tanwe5q2znxZ ~]$
- dd命令参数解析
- if:源文件,chunk 4的文件为/home/gbasedbt/gbase/node1_dbs/datadbs1,所以此参数的值为chunk 4的文件/home/gbasedbt/gbase/node1_dbs/datadbs1
- of:是输出的目标端文件,本次是手动创建了一个文件test1.page
- skip:跳过页数,也是起始页,由于id=1在物理位置的4864页,由于物理页大小为2kb,chunk文件的页大小为16k,所以物理4864/8=608,则物理的4864页在chunk 4上的608页
- count:导出的页数量,由于id=1在逻辑页1上,则只导出1页即可
- bs:表示文件的大小,chunk4为16KB
- od进行查看:
- 页内容涉及到了表上页表头信息等