访问www.tomcoding.com网站,学习Oracle内部数据结构,详细文档说明,下载Oracle的exp/imp,DUL,logminer,ASM工具的源代码,学习高技术含量的内容。
MSSM是Manual Segment Space Management的首字母缩写,是Oracle最初实现的一种段空间管理技术。MSSM在对象的段头设置一个空闲列表(Freelist)来管理空闲块。在创建对象时有两个跟存储相关的参数叫做PCTFREE和PCTUSED,是一个百分比的值,默认PCTFREE为20,PCTUSED为40,表示在一个块的空闲空间减小到20%时就不再插入数据,这个块也从空闲列表中删除,当一个块的空闲空间随着删除数据等操作增大到40%时,这个块会重新添加到空闲列表中,可以插入新的数据。当许多用户对同一个对象频繁的进行插入、删除或更新操作时,就会同时对空闲列表访问,造成竞争,影响性能,这也是后来引入自动段管理的原因。
手工管理的段头块分为下面的几个部分,我们一一来介绍。
1. 块头(Block Header)
Oracle数据文件中的每个块都有一个统一结构的块头,存储了块的地址(RDBA),块的系统改变号(SCN),块的类型,块的校验和等内容。我们看一下它的dump信息。
buffer tsn: 0 rdba: 0x004000f0 (1/240) <-buffer header
scn: 0x0000.0040c7e7 seq: 0x01 flg: 0x04 tail: 0xc7e71001
frmt: 0x02 chkval: 0x25f8 type: 0x10=DATA SEGMENT HEADER - UNLIMITED
从上面看到这个块的类型为0x10=DATA SEGMENT HEADER - UNLIMITED,表示手工管理的段头块。
2. Extent控制头(Extent Control Header)
这个结构是整个段内extent的控制结构,我们先来看一下它的dump信息,然后解释一下主要字段的含义。控制头结构的dump信息如下。
Extent Control Header
Extent Header:: spare1: 0 spare2: 0 #extents: 23 #blocks: 1023
last map 0x00000000 #maps: 0 offset: 4128
Highwater:: 0x00414d8f ext#: 22 blk#: 15 ext size: 128
#blocks in seg. hdr's freelists: 6
#blocks below: 910
mapblk 0x00000000 offset: 22
Unlocked
其中#extents字段表示段中包含的extent的总个数。#blocks字段表示段中包含的块的总个数。last map字段表示最后一个extent map块的地址,如果是0,表示没有下一个extent map块。#maps字段表示extent map块的个数,不包含段头块中的extent map。offset字段表示段头块中extent map结束的偏移量。Highwater字段表示高水位块地址,这个地址是段内最后一个包含数据的块地址,如果进行全部扫描,到这个块段内的数据就结束了。ext#和blk#字段表示高水位块所在的extent号和块号。ext size字段表示高水位块所在的extent包含了多少个数据块。
3. Extent Map Header
下面的结构叫做extent map header,包含了这个extent map的控制信息,我们先看一下dump信息。
Map Header:: next 0x00000000 #extents: 23 obj#: 18 flag: 0x40000000
这个结构比较小,只包含了16个字节,我们来看看它的字段结构。next字段表示下一个extent map块的地址,如果为0,表示没有下一个extent map。#extents字段表示当前的extent map包含了多少个extent。obj#字段表示这个对象在段内的object id,就是对象的dataobj#。
4. Extent Table
接下来就是Extent Map的结构数组了,这个结构叫做Extent Table。每个结构元素占用8字节,包含两个字段,分别是rdba和nblk,表示一个extent第一个块的地址和extent包含的块个数,一个extent中包含的块是连续的,所以就能确定一个extent内的所有块地址。这个数组每个元素都定义了一个extent,记录了从哪个块开始和块的个数,数组的长度就是Extent Map Header中extent的个数。
5. 其他结构
Extent map后面还有一些控制Free List的结构,主要用于分配和回收段内的空闲块。