oracle mssm,探秘Oracle数据库底层存储 第4章 MSSM(手动段空间管理)

本文详细解析了Oracle数据库中的MSSM管理模式,涉及新建MSSM表空间、数据块管理与EXTENT结构,以及如何通过DUMP转储分析表头信息。通过实例演示了数据在MSSM表空间中的存储布局和查找方法。
摘要由CSDN通过智能技术生成

探秘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头块,找到该表的所有数据块的位置信息。

发表评论:

昵称

邮件地址 (选填)

个人主页 (选填)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值