ASSM管理的Oracle段头块结构

访问www.tomcoding.com网站,学习Oracle内部数据结构,详细文档说明,下载Oracle的exp/imp,DUL,logminer,ASM工具的源代码,学习高技术含量的内容。

上一篇文章我们介绍了,MSSM管理的Oracle段头块结构,其缺点就是会在高并发时造成段头块挣用,影响访问效率,为此Oracle引入了ASSM管理段内数据块的分配机制。ASSM是Automatic Segment Space Management的缩写,是高版本的Oracle默认的管理方式,使得空间管理更简单,也提高了效率。ASSM的管理使用了三级位图结构,三级位图管理二级位图,二级位图又管理一级位图,这样以级联的方式就能管理很多数据块。下面我们来看一下这种段头块中的各部分层级结构。

1. 块头(Block Header)

每个块都有一个块头结构,定义了块的地址(RDBA),块的系统改变号(SCN),块类型和块的校验和等信息。块头的dump信息如下。

buffer tsn: 9 rdba: 0x02000082 (8/130) 
scn: 0x0000.003f2480 seq: 0x01 flg: 0x04 tail: 0x24802301
frmt: 0x02 chkval: 0x9838 type: 0x23=PAGETABLE SEGMENT HEADER
 

块头的类型为0x23=PAGETABLE SEGMENT HEADER,表示ASSM管理的段头块。

2. Extent控制头(Extent Control Header)

紧接着块头的结构叫做Extent控制头,包含了段中所有extent map的控制信息。我们看一下dump信息。

  Extent Control Header
  -----------------------------------------------------------------
  Extent Header:: spare1: 0      spare2: 0      #extents: 1      #blocks: 8
                  last map  0x00000000  #maps: 0      offset: 2716  
      Highwater::  0x02000088  ext#: 0      blk#: 8      ext size: 8
  #blocks in seg. hdr's freelists: 0
  #blocks below: 5     
  mapblk  0x00000000  offset: 0
                   Unlocked
在这里解释一下extent控制头中的主要字段。#extents字段表示整个段中包含的extent个数。#blocks字段表示整个段中包含的块个数。last map字段表示最后一个extent map块的地址,有多个extent map的段中会看到这个值不再为0。#maps字段表示段中包含了多少个extent map块。offset字段表示extent map结束的偏移量。Highwater字段表示段中的高水位块的地址。

3. Low Highwater Mark

这是一个特殊的结构,在这里说明一下Low Highwater Mark与Highwater Mark的区别,在ASSM管理的段中,一次分配的extent会有很多个块,分配后的块并不是马上使用,所以Oracle对这些块并没有处理,这部分块叫做未格式化的块。格式化的块是Oracle已经把段的data object id记录到块头并把数据清除了的块。一般来说Low Highwater Mark和Highwater Mark是一致的,但是如果在这个段上做过truncate,move或其他修改Highwater Mark的操作时,可能造成这两个水位线不一样,这时Low Highwater Mark代表格式化块的高水位线,Highwater Mark代表所有块的高水位线。我们来看一下Low Highwater Mark结构的dump信息。

Low HighWater Mark : 
      Highwater::  0x02000088  ext#: 0      blk#: 8      ext size: 8
  #blocks in seg. hdr's freelists: 0
  #blocks below: 5     
  mapblk  0x00000000  offset: 0     
  Level 1 BMB for High HWM block: 0x02000080
  Level 1 BMB for Low HWM block: 0x02000080
 

4. Extent Map Header

下面的一个结构叫做extent map header,包含了段头块中extent map的信息。我们看一下它的dump信息。

     Map Header:: next  0x00000000  #extents: 1    obj#: 78733  flag: 0x10000000
  Inc # 0
其中next字段表示下一个extent map块的地址,有多个extent map时,这个字段就不再是0了。#extents表示在这个extent map中包含了多少个extent。obj#表示对象在段内的object id。

5. Extent Map

  Extent Map
  -----------------------------------------------------------------
   0x02000080  length: 8
这是一个结构数组,结构中包含了两个字段rdba和nblk,rdba表示这个段的第一个块的地址,nblk表示这个段包含的块个数。数组元素的个数就是extent map中包含的extent的个数,在上面的结构extent map header中,字段#extents就代表这个数值。

6. Auxillary Map

接下来一个结构叫做Auxillary Map,是一个辅助位图,这个是干什么用的呢?由于ASSM是逐级管理的,段头块管理extent map,一级BMB管理了extent中的块使用情况。一级位图管理的extent并不多,在数据量大的时候,一级位图块会连接(chained)起来管理数据块,如果要查找一个extent归哪个一级BMB管理,就要像查找链表项一样从头查起,一级BMB很多的时候,影响效率。因此就在这里设计了一个辅助图,指明这个extent map中的Extent归哪个一级BMB管理,数据是从哪个块开始的。我们看一下辅助位图的dump信息。

  Auxillary Map
  --------------------------------------------------------
   Extent 0     :  L1 dba:  0x01400580 Data dba:  0x01400583
   Extent 1     :  L1 dba:  0x01400580 Data dba:  0x01400588
   Extent 2     :  L1 dba:  0x01400590 Data dba:  0x01400591
   Extent 3     :  L1 dba:  0x01400590 Data dba:  0x01400598
   Extent 4     :  L1 dba:  0x014005a0 Data dba:  0x014005a1
   Extent 5     :  L1 dba:  0x014005a0 Data dba:  0x014005a8
   Extent 6     :  L1 dba:  0x014005b0 Data dba:  0x014005b1
   Extent 7     :  L1 dba:  0x014005b0 Data dba:  0x014005b8
 

在上例中我们看到,Extent 0由BMB1 0x01400580管理,数据从第四个块开始,这是段的第一个extent,所以管理占用了三个块。Extent 1也由0x01400580管理,数据从0x01400588开始,在Extent map我们看到extent 0和extent 1各有8个块,所以一个一级位图共管理了16个块。再往下extent 2就不一样了,它由一个新块0x01400590来管理了,数据从0x01400591开始,这第0个块是又一个一级BMB,他也管理了两个Extent,依次类推。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值