探秘Oracle数据库底层存储 第4章 MSSM(手动段空间管理)
上一章介绍的LMT(本地管理表空间),通过在数据文件头的位图,管理的是指区(EXTENT)信息。本章将要介绍的MSSM(Manual Segment Space Management),管理的是数据块(BLOCK)信息
MSSM(Manual Segment Space Management)
MSSM段空间管理,使用SEGMENT HEADER上的FREE LIST 管理段的存储空间。根据数据块的PCTFREE,PCTUSED参数,控制数据块何时放入FREE LIST或者从FREE LIST 取出。
下面我们着重看一下数据是如何存储在MSSM表空间中的。
新建MSSM表空间,SEGMENT SPACE MANAGEMENT MANUAL表示为MSSM。
SQL> CREATE TABLESPACE MSSM_TEST DATAFILE '/u01/app/oracle/oradata/DB11G/mssm_test.dbf' SIZE 5M AUTOEXTEND ON SEGMENT SPACE MANAGEMENT MANUAL;
Tablespace created.
SQL> SELECT TABLESPACE_NAME,SEGMENT_SPACE_MANAGEMENT FROM DBA_TABLESPACES WHERE TABLESPACE_NAME='MSSM_TEST';
TABLESPACE_NAME SEGMEN
------------------------------ ------
MSSM_TEST MANUAL
在MSSM表空间里新建一张表,并写入一些数据。
SQL> CREATE TABLE MSSM_TABLE TABLESPACE MSSM_TEST AS SELECT * FROM SYS.OBJ$;
Table created.
找到表的SEGMENT HEADER块。
SQL> SELECT HEADER_FILE,HEADER_BLOCK FROM DBA_SEGMENTS WHERE SEGMENT_NAME='MSSM_TABLE';
HEADER_FILE HEADER_BLOCK
----------- ------------
18 128
SQL> ALTER SYSTEM CHECKPOINT;
System altered.
DUMP转储段头块
SQL> ALTER SYSTEM DUMP DATAFILE 18 BLOCK 128;
System altered.
以下为段头数据块DUMP转储片段
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 23 #blocks: 1023
last map 0x00000000 #maps: 0 offset: 4128
Highwater:: 0x04800416 ext#: 22 blk#: 22 ext size: 128
#blocks in seg. hdr's freelists: 0
#blocks below: 917
mapblk 0x00000000 offset: 22
Unlocked
Map Header:: next 0x00000000 #extents: 23 obj#: 76904 flag: 0x40000000
Extent Map
-----------------------------------------------------------------
0x04800081 length: 7
0x04800088 length: 8
0x04800090 length: 8
0x04800098 length: 8
0x048000a0 length: 8
0x048000a8 length: 8
0x048000b0 length: 8
0x048000b8 length: 8
0x048000c0 length: 8
0x048000c8 length: 8
0x048000d0 length: 8
0x048000d8 length: 8
0x048000e0 length: 8
0x048000e8 length: 8
0x048000f0 length: 8
0x048000f8 length: 8
0x04800100 length: 128
0x04800180 length: 128
0x04800200 length: 128
0x04800280 length: 128
0x04800300 length: 128
0x04800380 length: 128
0x04800400 length: 128
obj#: 76904 段的对象号。
#extents: 23表示有23个区(EXTENT)信息。
0x04800081表示数据块的地址,转换方法为
十六进制
二进制
文件号(前10位)
数据块号(后22位)
0x04800081
0000 0100 1000 0000 0000 0000 1000 0001
0000 0100 10等于十进制18
00 0000 0000 0000 1000 0001等于十进制129
用同样的方法可以把所有的数据块分布计算出来。
18号文件129号数据块开始的连续7个数据块。
18号文件136号数据块开始的连续8个数据块。
..........
在这里我们注意到Map Header:: next 0x00000000。表示段只有一个管理数据块的HEADER BLOCK。
如果是一张非常大的表,第一个HEADER BLOCK数据块管理信息装不下,会指向下一个HEADER BLOCK。
Ok,上面只是一些DUMP转存信息,我们在深入一点,具体查看这些字节信息在文件中怎么存储的。
用HEXDUMP命令显示18号文件128数据块(128*8192=1048576)的前320字节十六进制信息。
[root@bogon DB11G]# hexdump -C -s 1048576 -n 320 ./mssm_test.dbf
00100000 10 a2 00 00 80 00 80 04 f9 72 42 00 00 00 01 04 |.........rB.....|
00100010 fe ce 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00100020 00 00 00 00 17 00 00 00 ff 03 00 00 20 10 00 00 |............ ...|
00100030 16 00 00 00 16 00 00 00 80 00 00 00 16 04 80 04 |................|
00100040 00 00 00 00 16 00 00 00 00 00 00 00 95 03 00 00 |................|
00100050 00 00 00 00 00 00 00 00 00 00 00 00 17 00 00 00 |................|
00100060 00 00 00 00 68 2c 01 00 00 00 00 40 81 00 80 04 |....h,.....@....|
00100070 07 00 00 00 88 00 80 04 08 00 00 00 90 00 80 04 |................|
00100080 08 00 00 00 98 00 80 04 08 00 00 00 a0 00 80 04 |................|
00100090 08 00 00 00 a8 00 80 04 08 00 00 00 b0 00 80 04 |................|
001000a0 08 00 00 00 b8 00 80 04 08 00 00 00 c0 00 80 04 |................|
001000b0 08 00 00 00 c8 00 80 04 08 00 00 00 d0 00 80 04 |................|
001000c0 08 00 00 00 d8 00 80 04 08 00 00 00 e0 00 80 04 |................|
001000d0 08 00 00 00 e8 00 80 04 08 00 00 00 f0 00 80 04 |................|
001000e0 08 00 00 00 f8 00 80 04 08 00 00 00 00 01 80 04 |................|
001000f0 80 00 00 00 80 01 80 04 80 00 00 00 00 02 80 04 |................|
00100100 80 00 00 00 80 02 80 04 80 00 00 00 00 03 80 04 |................|
00100110 80 00 00 00 80 03 80 04 80 00 00 00 00 04 80 04 |................|
00100120 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00100130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
偏移位
字节数
十六进制
注释
92
4
17 00 00 00
因为字节序是LE。反转后为十六进制00 00 00 17。
对于十进制23。也就是EXTENT的个数。
96
4
00 00 00 00
next 0x00000000
段只有一个管理数据块的HEADER BLOCK。
100
4
68 2c 01 00
因为字节序是LE。反转后为十六进制00 01 2c 68。
对于十进制76904。也就是obj#: 76904 段的对象号。
108
23×8=184
07 00 00 00 88 00 80 04 08 00 00 00 90 00 80 04
08 00 00 00 98 00 80 04 08 00 00 00 a0 00 80 04
08 00 00 00 a8 00 80 04 08 00 00 00 b0 00 80 04
08 00 00 00 b8 00 80 04 08 00 00 00 c0 00 80 04
08 00 00 00 c8 00 80 04 08 00 00 00 d0 00 80 04
08 00 00 00 d8 00 80 04 08 00 00 00 e0 00 80 04
08 00 00 00 e8 00 80 04 08 00 00 00 f0 00 80 04
08 00 00 00 f8 00 80 04 08 00 00 00 00 01 80 04
80 00 00 00 80 01 80 04 80 00 00 00 00 02 80 04
80 00 00 00 80 02 80 04 80 00 00 00 00 03 80 04
80 00 00 00 80 03 80 04 80 00 00 00 00 04 80 04
80 00 00 00 00 00 00 00
每个EXTENT占用8字节信息。
前面4字节信息表示文件号和数据块号。
后面4字节信息表示连续数据块的个数。
比如第一个EXTENT
07 00 00 00 88 00 80 04
反转后为十六进制04 80 00 88 00 00 00 07
表示18号文件129号数据块开始的连续7个数据块。
第二个EXTENT
08 00 00 00 90 00 80 04
反转后为十六进制04 80 00 90 00 00 00 08
表示18号文件136号数据块开始的连续8个数据块。
好了,相信看到这里,大家可以用自己熟悉的程序语言,分析MSSM表空间中表的HEADER BLOCK头块,找到该表的所有数据块的位置信息。
发表评论:
昵称
邮件地址 (选填)
个人主页 (选填)