自动段存储管理ASSM的扩展实验
本实验通过对一个段中的连续分配的块块记录进行分析,关注段的内部组织结构:
SQL> create table scott.emp5 as select * from scott.emp;
表已创建。
SQL> alter table scott.emp5 allocate extent;
表已更改。
SQL> /
表已更改。
SQL> /
表已更改。
后来过了很长一段时间后,又
SQL> alter table scott.emp5 allocate extent;
表已更改。
上面空间不是一次性分配的,PAGETABLE SEGMENT HEADER也就不是唯一一个,SECOND LEVEL BITMAP BLOCK也就不是唯一一个,而是很多的,这里是五次分配空间。
一,选择段的当前块
SQL> select file_id,extent_id,block_id,blocks from dba_extents
2 where segment_name='EMP5';
FILE_ID EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
4 0 553 8
4 1 561 8
4 2 569 8
4 3 577 8
4 4 617 8
二.对块数据进行分析
跟踪信息:从553块开始一直到624块。但只需要注意的是每个区的前三个(不一定是前3个,也有可能是第1个,因为有的时候元数据只是第1位),因为前面的数据记录着这个区的结构信息。下面对这些重要信息进行摘录,进行比较:
|
块 |
内容 |
|
553,554,555 |
553是FIRST LEVEL BITMAP BLOCK,rdba: 0x01000229,parent dba: 0x0100022a。 DBA Ranges:0x01000229 Length: 8 Offset: 0 0x01000231 Length: 8 Offset: 8 16个block的信息。然后底下显示了16个block的状态:前3个为元数据,后13个为数据记录。 问:为什么一个extent中有8个block而这里记录了16个的信息呢? 554是SECOND LEVEL BITMAP BLOCK,rdba: 0x0100022a, pdba: 0x0100022b。 L1 Ranges : 0x01000229 Free: 5 Inst: 1 0x01000239 Free: 5 Inst: 1 0x01000269 Free: 5 Inst: 1
555是PAGETABLE SEGMENT HEADER ,rdba: 0x0100022b,没有pdba .
Extent Map 0x01000229 length: 8 0x01000231 length: 8 0x01000239 length: 8 0x01000241 length: 8 0x01000269 length: 8 Auxillary Map Extent 0 : L1 dba: 0x01000229 Data dba: 0x0100022c Extent 1 : L1 dba: 0x01000229 Data dba: 0x01000231 Extent 2 : L1 dba: 0x01000239 Data dba: 0x0100023a Extent 3 : L1 dba: 0x01000239 Data dba: 0x01000241 Extent 4 : L1 dba: 0x01000269 Data dba: 0x0100026a
Second Level Bitmap block DBAs DBA 1: 0x0100022a
|
|
561,562,563 |
561是FIRST LEVEL BITMAP BLOCK ,rdba: 0x01000231 , parent dba: 0x01000232 DBA Ranges : 0x01000231 Length: 8 Offset: 0 562是SECOND LEVEL BITMAP BLOCK ,rdba: 0x01000232, pdba: 0x01000233 L1 Ranges : 0x01000231 Free: 5 Inst: 1 563是PAGETABLE SEGMENT HEADER ,rdba: 0x01000233 , 没有pdba。
Extent Map 0x01000231 length: 8 Auxillary Map Extent 0 : L1 dba: 0x01000231 Data dba: 0x01000234 Second Level Bitmap block DBAs DBA 1: 0x01000232 |
|
569,570,571 |
569 FIRST LEVEL BITMAP BLOCK rdba: 0x01000239 parent dba: 0x0100022a DBA Ranges : 0x01000239 Length: 8 Offset: 0 0x01000241 Length: 8 Offset: 8 570 SECOND LEVEL BITMAP BLOCK rdba: 0x0100023a pdba: 0x0100023b L1 Ranges : 0x01000239 Free: 5 Inst: 1 571 PAGETABLE SEGMENT HEADER Extent Map 0x01000239 length: 8 Auxillary Map Extent 0 : L1 dba: 0x01000239 Data dba: 0x0100023c Second Level Bitmap block DBAs DBA 1: 0x0100023a |
|
577,578,579 |
577 FIRST LEVEL BITMAP BLOCK rdba: 0x01000241 parent dba: 0x01000242 total: 8 DBA Ranges : 0x01000241 Length: 8 Offset: 0 前3个为元数据 578 SECOND LEVEL BITMAP BLOCK rdba: 0x01000242 pdba: 0x01000243 L1 Ranges : 0x01000241 Free: 5 Inst: 1 579 PAGETABLE SEGMENT HEADER rdba: 0x01000243 无pdba. Extent Map 0x01000241 length: 8 Auxillary Map Extent 0 : L1 dba: 0x01000241 Data dba: 0x01000244 Second Level Bitmap block DBAs DBA 1: 0x01000242
|
|
617,618,619 |
617 FIRST LEVEL BITMAP BLOCK rdba: 0x01000269 parent dba: 0x0100022a
total: 8 0:Metadata DBA Ranges : 0x01000269 Length: 8 Offset: 0 618 rdba: 0x0100026a 无位图显示 无pdba
619 rdba: 0x0100026b |
这里可以看到前3个块(553,554,555)不仅是这个区的开始的3个块也是这个段EMP5开始的3个块,所以它们的记录有这个区的,也有这个段的。
先说555块,555是PAGETABLE SEGMENT HEADER,在这里可以理解为是THIRD LEVEL BITMAP BLOCK,是记录这个段的核心内容。(这里想想,以前说区的本地管理时也是第3个块记录位图信息,位图信息是本地管理记录的核心信息。是不是Oracle的管理偏爱第3个块呢?)555块记录的有什么呢?地址!什么地址?这个段的地址:
Extent Map
0x01000229 length: 8
0x01000231 length: 8
0x01000239 length: 8
0x01000241 length: 8
0x01000269 length: 8
Auxillary Map
Extent 0 : L1 dba: 0x01000229 Data dba: 0x0100022c
Extent 1 : L1 dba: 0x01000229 Data dba: 0x01000231
Extent 2 : L1 dba: 0x01000239 Data dba: 0x0100023a
Extent 3 : L1 dba: 0x01000239 Data dba: 0x01000241
Extent 4 : L1 dba: 0x01000269 Data dba: 0x0100026a
通过比较就会发现,记录的是段EMP5的5个区间的地址。Extent Map记录的是每个区间的开始地址和长度;Auxillary Map记录的是每个区间的FIRST LEVEL BITMAP的开始位置和数据的开始地址,可见FIRST LEVEL BITMAP不是一个区间一个的,而这里是二个区间一个的,即一个FIRST LEVEL BITMAP管理16个块。Extent 0,Extent 1是一个开始地址0x01000229,Extent 2 Extent 3是一个,开始地址0x01000239,Extent 4因为是只剩下一个,所以也自成一个,但后面会有实验证明它也是二个区间一个。Auxillary Map同时也记录着Data dba,数据开始的地址,数据前的是元数据,元数据记录的是块和段的信息,而不是段中真正存储的信息,这里举例:Extent 0 : L1 dba: 0x01000229 Data dba: 0x0100022c ,说明是从第4个块(556)开始记录信息的,前面的3个块是元数据。Extent 2 : L1 dba: 0x01000239 Data dba: 0x0100023a 是从第2块(570)记录数据的,第1个块是元数据,这些也可以在每个区间的第1个块的里面看到。Second Level Bitmap block DBAs DBA 1: 0x0100022a则是记录的是它的下一级位图Second Level Bitmap结构的地址:0x0100022a ,块554的地址。
554是SECOND LEVEL BITMAP BLOCK地址是0x0100022a,父地址是0x0100022b,一查看就知道是555块。554记录着FIRST LEVEL BITMAP BLOCK的开始地址,分别是0x01000229(553块),0x01000239(569块),0x01000269(617块)。
L1 Ranges :
0x01000229 Free: 5 Inst: 1
0x01000239 Free: 5 Inst: 1
0x01000269 Free: 5 Inst: 1
553是FIRST LEVEL BITMAP BLOCK,当前地址是0x01000229,父地址是0x0100022a一查看就知道是554块。553块记录着FIRST LEVEL BITMAP的地址范围:
DBA Ranges:0x01000229 Length: 8 Offset: 0
0x01000231 Length: 8 Offset: 8
其他区间的情况较段开始的3个块简单多了,这次实验的这几个块有如下规律:段是以16个块两个区管理的,所以当前五个段可分为3部分:553-568,569-584,617-624。每个部分的第一个区间的父地址指向的是554块,即第一个SECOND LEVEL BITMAP BLOCK。也就是说每个部分的第1个区间的FIRST LEVEL BITMAP指向本段的第一个SECOND LEVEL BITMAP BLOCK 554。而每部分的第2个区间则是内部本身指向,即FIRST LEVEL BITMAP,SECOND LEVEL BITMAP BLOCK,PAGETABLE SEGMENT HEADER这三个地址是挨着的,都是一个区间的。617-624由于是单独的区间,没有与其他区间联合组成16个块,所以它没有SECOND LEVEL BITMAP BLOCK,PAGETABLE SEGMENT HEADER。因为这里的FIRST LEVEL BITMAP要管理16个块,而617块当前只管理了8个块。
本实验的管理如下表简单描述:
|
PAGETABLE SEGMENT HEADER |
SECOND LEVEL BITMAP BLOCK |
FIRST LEVEL BITMAP |
|
555 |
554 |
553 (管理从553-568) 569 (管理从569-584) 617 (管理从617-624) |
|
563 |
562 |
561 (管理从561-568) |
|
571 |
570 |
569 (管理从569-584) |
|
579 |
578 |
577 (管理从577-584) |
需要说明的是:这里存在着这个结构:3-2-1,区间的第3个块管理着整个区间甚至整个段,它的管理通过区间的第2个块来实现,而第2个块通过第1个块实现,所以可以在第1,2个块中见到parent dba,而在第3个块中不曾发现。管理段或区间的块是元数据块,不是数据块。
前面的分析很复杂,有多个PAGETABLE SEGMENT HEADER,因为空间不是一次分配的,是多次分配的结果。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22528444/viewspace-683447/ ,如需转载,请注明出处,否则将追究法律责任。