Segment Header 占用几个block

      段空间手动管理的LMT下,Segment header被用来记录freelist的使用情况,extent的扩展分配情况以及记录HWM等重要信息。当table/index等object被建立的时候,被分配一个block用来记录segment header信息。随着object的数据量增大,导致 extent大量扩展,初始分配的这一个段头block必然不能维护容纳下当前的信息,Oracle将又继续分配一个/几个block用来存放(这些块,暂且称之为extent map block)。Oracle采用链表的方式,将这些块串联起来,用来维护整个segment。而这个/些block的逻辑存储位置,就是前一个segment header/extent map block块里记录中的最后一个extent 的下一个extent的首个块。做如下一个测试:

 

1.创建一个非ASSM管理的LMT表空间,设置uniform size 40K,使得在空间有限的情况下,extent尽量扩展

SQL>create tablespace test_mu datafile ‘E:\ORACLE\PRODUCT\10.2.0\ORADATA\DEMO\TEST_Mu.DBF’ size 500M segment space management manual uniform size 40K;

 

Tablespace created

2.创建表test_header

SQL> create table test_header tablespace test_mu as select * from dba_objects where 1=0;

 

Table created

 

3.dump该表segment header

SQL> select SEGMENT_NAME,HEADER_FILE,HEADER_BLOCK from dba_segments where segment_name=’TEST_HEADER’;

 

SEGMENT_NAME              HEADER_FILE          HEADER_BLOCK

————————————————————

TEST_HEADER                     7                                9

SQL> alter system dump datafile 7 block 9;

 

System altered

查看此segment header 信息

Start dump data blocks tsn: 7 file#: 7 minblk 9 maxblk 9

buffer tsn: 7 rdba: 0×01c00009 (7/9)

scn: 0×0000.0008853d seq: 0×02 flg: 0×00 tail: 0×853d1002

frmt: 0×02 chkval: 0×0000 type: 0×10=DATA SEGMENT HEADER - UNLIMITED

Hex dump of block: st=0, typ_found=1

Dump of memory from 0×07548400 to 0×0754A400

7548400 0000A210 01C00009 0008853D 00020000 [........=.......]

7548410 00000000 00000000 00000000 00000000 [................]

7548420 00000000 00000001 00000004 00001020 [............ ...]

………………………………………………………

754A3F0 00000000 00000000 00000000 853D1002 [..............=.]

Extent Control Header

—————————————————————–

Extent Header:: spare1: 0      spare2: 0      #extents: 1      #blocks: 4    

                  last map 0×00000000 #maps: 0      offset: 4128

      Highwater:: 0×01c0000a ext#: 0      blk#: 0      ext size: 4    

#blocks in seg. hdr’s freelists: 0    

#blocks below: 0    

mapblk 0×00000000 offset: 0    

                   Unlocked

     Map Header:: next 0×00000000 #extents: 1    obj#: 10573 flag: 0×40000000

―――此时,Map Header:: next 0×00000000 表明当前只有这一块block就足已维护整个segment的信息

    Extent Map

—————————————————————–

   0×01c0000a length: 4

nfl = 1, nfb = 1 typ = 1 nxf = 0 ccnt = 0

SEG LST:: flg: UNUSED lhd: 0×00000000 ltl: 0×00000000

End dump data blocks tsn: 7 file#: 7 minblk 9 maxblk 9

 

4.扩充table,使得扩展大量extent后,继续dump segment header

SQL> begin

2 for i in 1..10 loop

3 insert into test_header select * from dba_objects;

4 commit;

5 end loop;

6 end;

7 /

 

PL/SQL procedure successfully complete

 

SQL> select count(*) from dba_extents where segment_name=’TEST_HEADER’

2 ;

 

COUNT(*)

———-

      1666

 

SQL> alter system dump datafile 7 block 9;

 

System altered

 

 

Start dump data blocks tsn: 7 file#: 7 minblk 9 maxblk 9

buffer tsn: 7 rdba: 0×01c00009 (7/9)

scn: 0×0000.00089ab6 seq: 0×76 flg: 0×00 tail: 0×9ab61076

frmt: 0×02 chkval: 0×0000 type: 0×10=DATA SEGMENT HEADER - UNLIMITED

Hex dump of block: st=0, typ_found=1

Dump of memory from 0×07548400 to 0×0754A400

7548400 0000A210 01C00009 00089AB6 00760000 [..............v.]

………………………………………………..

754A3F0 00000000 00000000 00000000 9AB61076 [............v...]

Extent Control Header

—————————————————————–

Extent Header:: spare1: 0      spare2: 0      #extents: 1666   #blocks: 8327

                  last map 0×01c01dcd #maps: 2      offset: 4128

      Highwater:: 0×01c02093 ext#: 1665   blk#: 5      ext size: 5    

#blocks in seg. hdr’s freelists: 7148

#blocks below: 8327

mapblk 0×01c01dcd offset: 141  

                   Unlocked

     Map Header:: next 0×01c009e6 #extents: 505 obj#: 10573 flag: 0×40000000

――Map Header:: next 0×01c009e6 表明当前块只记录了前505个extent的信息,而需要格外的块来做后续记录,next 0×01c009e6便是这个块的链接,转换成10进制29362662

Extent Map

—————————————————————–

   0×01c0000a length: 4    

   0×01c0000e length: 5    

   0×01c00013 length: 5    

   0×01c00018 length: 5    

………………………………………………………

   0×01c009dc length: 5    

   0×01c009e1 length: 5    

 

nfl = 1, nfb = 1 typ = 1 nxf = 0 ccnt = 1669

SEG LST:: flg: USED   lhd: 0×01c004a5 ltl: 0×01c02092

End dump data blocks tsn: 7 file#: 7 minblk 9 maxblk 9

 

5.dump下一个EXTENT MAP BLOCK

SQL>selectdbms_utility.data_block_address_file(29362662) rfile_id#, dbms_utility.data_block_address_block(29362662) block_id# from dual;

 

RFILE_ID# BLOCK_ID#

———- ———-

         7       2534

 

SQL> alter system dump datafile 7 block 2534;

 

System altered

 

 

Start dump data blocks tsn: 7 file#: 7 minblk 2534 maxblk 2534

buffer tsn: 7 rdba: 0×01c009e6 (7/2534)

scn: 0×0000.000898be seq: 0×01 flg: 0×04 tail: 0×98be1201

frmt: 0×02 chkval: 0×9eb7 type: 0×12=EXTENT MAP BLOCK

Hex dump of block: st=0, typ_found=1

Dump of memory from 0×07548400 to 0×0754A400

7548400 0000A212 01C009E6 000898BE 04010000 [................]

7548410 00009EB7 000003FB 01C01DCD 0000294D [............M)..]

……………………………………….

754A3F0 00000005 01C01DC8 00000005 98BE1201 [................]

EMB Dump:

     Map Header:: next 0×01c01dcd #extents: 1019 obj#: 10573 flag: 0×10000000

          ――这一块记录到第506到1019个extent的情况,看到next后面值仍不为零,也就是还需要另外的块来记录后面的extent……

Extent Map

————————————

   0×01c009e7 length: 4    

   0×01c009eb length: 5    

………………………………………………

   0×01c01dc3 length: 5    

   0×01c01dc8 length: 5    

 

End dump data blocks tsn: 7 file#: 7 minblk 2534 maxblk 2534

bookmark

相关文章 随机文章

Leave a comment

Your comment