在以前的应用中,ASSM表空间已经被广泛的使用,但是,我从来没有真正发现过三级位图块。借这次的存储测试,在测试表装载的时候,随便弄了一个超大的表(873G),但是,遗憾的是,还是没有发现三级位图块。
- SQL> select bytes/1024/1024/1024 "SIZE(G)" from user_segments where segment_name='TEST';
- SIZE(G)
- ----------
- 873.25
- SQL> select file_id,block_id from dba_extents where segment_name='TEST' and extent_id=0;
- FILE_ID BLOCK_ID
- ---------- ----------
- 74 9
- SQL>alter system dump datafile 74 block 74;
打开跟踪文件,可以看到
......
type: 0x23=PAGETABLE SEGMENT HEADER
......
Last Level 1 BMB: 0x251f200c
Last Level II BMB: 0x251d700d
Last Level III BMB: 0x00000000
......
Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1: 0x12800049
DBA 2: 0x1c00c00d
DBA 3: 0x1c02100d
......
DBA 109: 0x2cdad00d
DBA 110: 0x2cdc200d
DBA 111: 0x2cdd700d
DBA 112: 0x2cdec00d
从以上的信息可以看到,在一个叫PAGETABLE SEGMENT HEADER的块中,已经出现了112个二级位图块,但是,还是没有一个三级位图块。
以上的信息中,可能有人比较疑惑的是,怎么定位这个叫 PAGETABLE SEGMENT HEADER的块。大致方法可以为:
1、从dba_extents中获得的extent_id=0的信息,可以得到file_id=74,block_id=9,这个表示这个段的开始块。
2、dump datafile 74 block 9,可以看到这个是一个FIRST LEVEL BITMAP BLOCK,里面保存了它所管理的block,其中大致为:
......
type: 0x20=FIRST LEVEL BITMAP BLOCK
......
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x12800009 Length: 64 Offset: 0
0:Metadata 1:Metadata 2:Metadata 3:Metadata
4:Metadata 5:Metadata 6:Metadata 7:Metadata
8:Metadata 9:Metadata 10:Metadata 11:Metadata
......
可以看到,这里有很多类型为Metadata的块,这些都是oracle的管理块,要么是位图块,要么是段头,选择这里面的最后一个Metadata的块,一般就是PAGETABLE SEGMENT HEADER,如我上面的例子,block=74(74=8+Metadata前面的Id)。
3、再dump datafile 74 block 74即可。
我个人猜想位图管理的大致结构应当如下,但是我从来没有证明过,要是有谁发现了三级位图块,或者是有这方面的资料,可以反馈给我,谢谢。
感谢eygle的测试,L3已经找到了,ASSM正确的结构图应当如下:
上一篇: « 最近被aix 5305给折腾死了
- 发表评论


