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
