Oracle extent 的扩展原理与内部结构解析
------------------------- LSLIANG PCONLINE.COM.CN
先建立测试环境 (sunos solaris sparc 10 , oracle 10.2.0.3 ,sun v890 )
LSLIANG at sunha5 > create tablespace lsl datafile '/oracle/oradata/sunha5/test.dbf' size 10m;
Tablespace created.
LSLIANG at sunha5 > alter user lsliang default tablespace lsl;
User altered.
LSLIANG at sunha5 > create table test(id number ,name varchar2(100) );
Table created.
LSLIANG at sunha5 > select * from dba_extents where owner='LSLIANG';
OWNER
------------------------------
SEGMENT_NAME
--------------------------------------------------------------------------------
PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------------ ------------------ ------------------------------
EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
---------- ---------- ---------- ---------- ---------- ------------
LSLIANG
TEST
TABLE LSL
0 46 9 65536 8 46
LSLIANG at sunha5 > alter system dump datafile 46 block 9 ;
System altered.
LSLIANG at sunha5 > alter system dump datafile 46 block 10 ;
System altered.
LSLIANG at sunha5 > alter system dump datafile 46 block 11 ;
System altered.
LSLIANG at sunha5 > alter system dump datafile 46 block 12 ;
System altered.
LSLIANG at sunha5 >
Trace file
Start dump data blocks tsn: 22 file#: 46 minblk 9 maxblk 9
buffer tsn: 22 rdba: 0x0b800009 (46/9)
scn: 0x0001.000ee871 seq: 0x01 flg: 0x00 tail: 0xe8712001 标准数据块头(20bytes)
frmt: 0x02 chkval: 0x0000 type: 0x20=FIRST LEVEL BITMAP BLOCK /* 块类型:一级位图块*/
Hex dump of block: st=0, typ_found=1
Dump of memory from 0xFFFFFFFF7A01FE00 to 0xFFFFFFFF7A021E00
FFFFFFFF7A01FE00 20A20000 0B800009 000EE871 00010100 [ ..........q....] /* standard block head 20bytes*/
FFFFFFFF7A01FE10 00000000 00000000 00000000 00000000 [................]
Repeat 2 times
FFFFFFFF7A01FE40 00000000 00000000 00000000 04000000 [................]
FFFFFFFF7A01FE50 FFFFFFFF 00000005 00000003 00000008 [................]
FFFFFFFF7A01FE60 01000001 00000000 00000000 00000000 [................]
FFFFFFFF7A01FE70 00000000 00000003 00000000 00000000 [................]
FFFFFFFF7A01FE80 00000000 00000000 00000000 00000000 [................]
FFFFFFFF7A01FE90 0B80000A 00000000 00000000 00000003 [................] / *dump 出这些数据块的结构的,因为还没有实际的数据,所以我们还不能
FFFFFFFF7A01FEA0 00000008 0B80000C 00000000 00000000 [................] 确定这些结构的内容和他们代表的意思 ,继续向下看 */
FFFFFFFF7A01FEB0 00000000 00000000 00000000 00000001 [................]
FFFFFFFF7A01FEC0 000102FF 00000000 00000000 0B800009 [................]
FFFFFFFF7A01FED0 00000008 00000000 00000000 00000000 [................]
FFFFFFFF7A01FEE0 00000000 00000000 00000000 00000000 [................]
Repeat 9 times
FFFFFFFF7A01FF80 00000000 00000000 00000000 11100000 [................]
FFFFFFFF7A01FF90 00000000 00000000 00000000 00000000 [................]
Repeat 485 times
FFFFFFFF7A021DF0 00000000 00000000 00000000 E8712001 [.............q .]
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 1 parent dba: 0x0b80000a poffset: 0
unformatted: 5 total: 8 first useful block: 3
owning instance : 1
instance ownership changed at
Last successful Search
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map Block Offset: 4294967295
First free datablock : 3
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Inc #: 0 Objd: 66303 /*object_id 对应于dba_object表的object_id */
HWM Flag: HWM Set /* 高水平线 hwm */
Highwater:: 0x0b80000c ext#: 0 blk#: 3 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x0b800009 Length: 8 Offset: 0
0:Metadata 1:Metadata 2:Metadata 3:unformatted
4:unformatted 5:unformatted 6:unformatted 7:unformatted
--------------------------------------------------------
End dump data blocks tsn: 22 file#: 46 minblk 9 maxblk 9
*** 2008-06-07 14:46:14.129
Start dump data blocks tsn: 22 file#: 46 minblk 10 maxblk 10
buffer tsn: 22 rdba: 0x0b80000a (46/10)
scn: 0x0001.000ee870 seq: 0x01 flg: 0x00 tail: 0xe8702101
frmt: 0x02 chkval: 0x0000 type: 0x21=SECOND LEVEL BITMAP BLOCK
Hex dump of block: st=0, typ_found=1
Dump of memory from 0xFFFFFFFF7A01FE00 to 0xFFFFFFFF7A021E00
FFFFFFFF7A01FE00 21A20000 0B80000A 000EE870 00010100 [!..........p....] /* 这里似乎也看不出什么东西出来。不用急,继续向下看 */
FFFFFFFF7A01FE10 00000000 00000000 00000000 00000000 [................]
Repeat 2 times
FFFFFFFF7A01FE40 00000000 00000000 00000000 0B80000B [................]
FFFFFFFF7A01FE50 00000001 00000001 00000000 00000000 [................]
FFFFFFFF7A01FE60 00000000 00000000 000102FF 00000001 [................] / * object_id */
FFFFFFFF7A01FE70 00000000 0B800009 05000001 00000000 [................]
FFFFFFFF7A01FE80 00000000 00000000 00000000 00000000 [................]
Repeat 502 times
FFFFFFFF7A021DF0 00000000 00000000 00000000 E8702101 [.............p!.]
Dump of Second Level Bitmap Block
number: 1 nfree: 1 ffree: 0 pdba: 0x0b80000b
Inc #: 0 Objd: 66303
opcode:0
xid:
L1 Ranges :
--------------------------------------------------------
0x0b800009 Free: 5 Inst: 1
--------------------------------------------------------
End dump data blocks tsn: 22 file#: 46 minblk 10 maxblk 10
*** 2008-06-07 14:46:30.471
Start dump data blocks tsn: 22 file#: 46 minblk 11 maxblk 11
buffer tsn: 22 rdba: 0x0b80000b (46/11)
scn: 0x0001.000ee871 seq: 0x01 flg: 0x00 tail: 0xe8712301 /* standard block head */
frmt: 0x02 chkval: 0x0000 type: 0x23=PAGETABLE SEGMENT HEADER /* 块类型: segment head (段头 或者说是表头)*/
Hex dump of block: st=0, typ_found=1
Dump of memory from 0xFFFFFFFF7A01FE00 to 0xFFFFFFFF7A021E00
FFFFFFFF7A01FE00 23A20000 0B80000B 000EE871 00010100 [#..........q....]
FFFFFFFF7A01FE10 00000000 00000000 00000000 00000000 [................]
FFFFFFFF7A01FE20 00000000 00000001 00000008 0A9C0000 [................]
FFFFFFFF7A01FE30 00000000 00000003 00000008 0B80000C [................]
FFFFFFFF7A01FE40 00000000 00000000 00000000 00000000 [................]
Repeat 1 times
FFFFFFFF7A01FE60 00000003 00000008 0B80000C 00000000 [................]
FFFFFFFF7A01FE70 00000000 00000000 00000000 0B800009 [................]
FFFFFFFF7A01FE80 0B800009 00000000 00000000 00000000 [................]
FFFFFFFF7A01FE90 00000000 00000000 00000000 00000000 [................]
Repeat 3 times
FFFFFFFF7A01FED0 00010000 00002000 00000000 00001434 [...... ........4]
FFFFFFFF7A01FEE0 00000000 0B80000A 00000001 0B800009 [................]
FFFFFFFF7A01FEF0 0B80000A 00000000 00000000 00000000 [................]
FFFFFFFF7A01FF00 00000000 00000000 00000001 00000000 [................]
FFFFFFFF7A01FF10 000102FF 10000000 0B800009 00000008 [................]
FFFFFFFF7A01FF20 00000000 00000000 00000000 00000000 [................]
Repeat 152 times
FFFFFFFF7A0208B0 0B800009 0B80000C 00000000 00000000 [................]
FFFFFFFF7A0208C0 00000000 00000000 00000000 00000000 [................]
Repeat 151 times
FFFFFFFF7A021240 00000000 00000000 0B80000A 00000000 [................]
FFFFFFFF7A021250 00000000 00000000 00000000 00000000 [................]
Repeat 185 times
FFFFFFFF7A021DF0 00000000 00000000 00000000 E8712301 [.............q#.]
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 1 #blocks: 8
last map 0x00000000 #maps: 0 offset: 2716
Highwater:: 0x0b80000c ext#: 0 blk#: 3 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
Unlocked
--------------------------------------------------------
Low HighWater Mark : / * 字面意思看起来是高水平线 继续向下看 * /
Highwater:: 0x0b80000c ext#: 0 blk#: 3 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
Level 1 BMB for High HWM block: 0x0b800009 /* 这里的hight 就是我们的高水平线了,
Level 1 BMB for Low HWM block: 0x0b800009 low 的意思什么? 我也不知道,向下继续看。 */
--------------------------------------------------------
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x0b80000a
Last Level 1 BMB: 0x0b800009
Last Level II BMB: 0x0b80000a /* 还有3级位图块 ??? 看起来象哦,至少目前中国大陆正在跑的oracle 数据库中还没有出现过这个类型的块
Last Level III BMB: 0x00000000 oracle 考虑的够远的,连未来都考虑到里面去了 ,厉害*/
Map Header:: next 0x00000000 #extents: 1 obj#: 66303 flag: 0x10000000
Inc # 0
Extent Map /这里记录了 这个段(表)的extent的map(地图?) 其实就是地址(RDBA) 了
-----------------------------------------------------------------也就是说,我只要知道了这个段头(表的第一个数据块,似乎也不对,就先这样了),我们就知道了这个表开始的地方了,
0x0b800009 length: 8 既然段是 有extent组成的,那么我们知道了这个地图,我们就知道了这个段的所有的extent了??(这个可以向下看稍候
再说) 里面记录了这个段,由一个extent组成,长度/大小是 8个数据块(block) */
Auxillary Map
--------------------------------------------------------
Auxillary Map
--------------------------------------------------------
Extent 0 : L1 dba: 0x0b800009 Data dba: 0x0b80000c
--------------------------------------------------------
Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1: 0x0b80000a
End dump data blocks tsn: 22 file#: 46 minblk 11 maxblk 11
*** 2008-06-07 14:46:40.860
Start dump data blocks tsn: 22 file#: 46 minblk 12 maxblk 12
buffer tsn: 22 rdba: 0x0000000c (0/12)
scn: 0x0000.00000000 seq: 0x01 flg: 0x05 tail: 0x00000001 /* standard block head */
frmt: 0x02 chkval: 0x01aa type: 0x00=unknown /块类型: unknow */
Hex dump of corrupt header 4 = CORRUPT
Dump of memory from 0xFFFFFFFF7A01FE00 to 0xFFFFFFFF7A01FE14 / * 这是因为我们还没有向表里写数据,所以这些块还没有使用
FFFFFFFF7A01FE00 00A20000 0000000C 00000000 00000105 [........... 自然也不知道将来会分给什么官给他做
FFFFFFFF7A01FE10 01AA0000 [....] 所以unknow 的意思应该是储备干部 */
Hex dump of block: st=4, typ_found=0
Dump of memory from 0xFFFFFFFF7A01FE00 to 0xFFFFFFFF7A021E00
FFFFFFFF7A01FE00 00A20000 0000000C 00000000 00000105 [................]
FFFFFFFF7A01FE10 01AA0000 00000000 00000000 00000000 [................]
FFFFFFFF7A01FE20 00000000 00000000 00000000 00000000 [................]
Repeat 508 times
现在数据文件中只建立一个表,还没有插入数据,所以 BLOCK 12 的TYPE=0X00=unknow .
所以我们还不能确认这些内容到底代表什么。
现在插入数据:
LSLIANG at sunha5 > insert into test (id ,name ) select object_id , owner from dba_objects ;
55056 rows created.
LSLIANG at sunha5 > commit;
Commit complete.
LSLIANG at sunha5 > alter system checkpoint;
System altered.
LSLIANG at sunha5 > alter system dump datafile 46 block 9 ;
System altered.
LSLIANG at sunha5 > alter system dump datafile 46 block 10 ;
System altered.
LSLIANG at sunha5 > alter system dump datafile 46 block 11 ;
System altered.
LSLIANG at sunha5 > alter system dump datafile 46 block 12 ;
System altered.
再来看看这几个块有什么变化:
Trace file ;
Start dump data blocks tsn: 22 file#: 46 minblk 9 maxblk 9
buffer tsn: 22 rdba: 0x0b800009 (46/9)
scn: 0x0001.000f2d01 seq: 0x02 flg: 0x04 tail: 0x2d012002 /* standard block head */
frmt: 0x02 chkval: 0x0645 type: 0x20=FIRST LEVEL BITMAP BLOCK /* 块类型: 一级位图块*/
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x0000000106768C00 to 0x000000010676AC00
106768C00 20A20000 0B800009 000F2D01 00010204 [ .........-.....] /* standard block head */
106768C10 06450000 00000000 00000000 00000000 [.E..............]
106768C20 00000000 00000000 00000000 00000000 [................]
Repeat 1 times
106768C40 00000000 00000000 00000000 04000000 [................] /*nbits =4*/
106768C50 FFFFFFFF 00000000 00000003 00000010 [................] /00000000:unformatted: 0=0x0 *03 first useful block 10 total 16=0x10
106768C60 02000001 00000000 00000000 00000000 [................] /*02 代表nranges: 2 ; 01 owning instance : 1
106768C70 00000000 00000010 484A37F4 484A37F4 [........HJ7.HJ7.] / 00000010 First free datablock : 16=ox10 ; 484A37F4 484A37F4 时间标记 */
106768C80 00000000 00000000 00000000 00000000 [................]/* 分别代表 Bitmap block lock opcode 0 Locker xid: : 0x0000.000.00000000 Inc #: 0 */
106768C90 0B80000A 00000000 00000000 00000000 [................] /*0B80000A parent dba: 0x0b80000a level 2 block */
106768CA0 00000000 00000000 00000000 00000000 [................]
Repeat 1 times
106768CC0 000102FF 00000000 00000000 0B800009 [................]/*000102FF Inc #: 0 Objd: 66303 =dba_object表的object_id*/
106768CD0 00000008 00000000 0B800011 00000008 [................]/ 这部分是代表这个extent的范围:起点=rdba blk数量,偏移量 */
106768CE0 00000008 00000000 00000000 00000000 [................]
106768CF0 00000000 00000000 00000000 00000000 [................]
Repeat 8 times
106768D80 00000000 00000000 00000000 11111111 [................] /* 16个1表示 full 5: 75-100%free , 4:50-75%free 3: 25-50%fred, 2:0-25%fredd 1:full ,* /
106768D90 11111111 00000000 00000000 00000000 [................]
106768DA0 00000000 00000000 00000000 00000000 [................]
Repeat 484 times
10676ABF0 00000000 00000000 00000000 2D012002 [............-. .]/*tail 每个块都有的一个版本验证结构如果我们在做dml的时候报错了,说是某个块损坏,基本就是这里验
Dump of First Level Bitmap Block 证出问题了,他的组成是是有block head 里的scn: 0x0001.000f2d01的后两位0x2d01 和块类型type=0x20
-------------------------------- 还有seq: 0x02 组成的。*/
nbits : 4 nranges: 2 parent dba: 0x0b80000a poffset: 0
unformatted: 0 total: 16 first useful block: 3
owning instance : 1
instance ownership changed at 06/07/2008 15:25:40
Last successful Search 06/07/2008 15:25:40
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
106768C60 02000001 00000000 00000000 00000000 [................] /*紫色部分 分别代表nf1 0 nf2 0 nf3 0 nf4 0 使用率的统计*/
106768C70 00000000 00000010 484A37F4 484A37F4 [........HJ7.HJ7.]
106768C60 01000001 00000000 00000001 00000000 [................] /*下面这两行是我从一个没有添满的extent中截取的数据分别代表
106768C70 0000001A 00000001 484DDFC1 484DDFC1 Freeness Status: nf1 0 nf2 1=0X01 nf3 0 nf4 26=0x1A*/
Extent Map Block Offset: 4294967295 == 2^32 (2的32次幂)这个数据文件或这个段的一个最大值。
First free datablock : 16
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Inc #: 0 Objd: 66303
--------------------------------------------------------
DBA Ranges : /* 这部分应该是我们最需要的,通过这个地方,我们可以知道我们想要的表的数据实际的存放空间。
-------------------------------------------------------- 这里记录了这个区(extent) 所管理的数据块的范围,一个extent内的数据块一定是连续的,
0x0b800009 Length: 8 Offset: 0 这个是有由oracl 内核来保证的。所以我们只要解析出来object_id ,和这个范围就可以进入数据块直接读出数据
0x0b800011 Length: 8 Offset: 8 而不用每个数据块都来扫描一边了。*/
0:Metadata 1:Metadata 2:Metadata 3:FULL /* 16个1表示 full * /
4:FULL 5:FULL 6:FULL 7:FULL /* 16个1表示 full 5: 75-100%free , 4:50-75%free 3: 25-50%fred, 2:0-25%fredd 1:full ,* /
8:FULL 9:FULL 10:FULL 11:FULL
12:FULL 13:FULL 14:FULL 15:FULL
--------------------------------------------------------
End dump data blocks tsn: 22 file#: 46 minblk 9 maxblk 9
*** 2008-06-07 15:26:32.771
Start dump data blocks tsn: 22 file#: 46 minblk 10 maxblk 10
buffer tsn: 22 rdba: 0x0b80000a (46/10)
scn: 0x0001.000f2d59 seq: 0x01 flg: 0x04 tail: 0x2d592101 /* standard block head */
frmt: 0x02 chkval: 0x0354 type: 0x21=SECOND LEVEL BITMAP BLOCK /*块类型:二级位图块*/
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x0000000106768C00 to 0x000000010676AC00
106768C00 21A20000 0B80000A 000F2D59 00010104 [!.........-Y....] /*standard block head 20bytes*/
106768C10 03540000 00000000 00000000 00000000 [.T..............]
106768C20 00000000 00000000 00000000 00000000 [................]
Repeat 1 times
106768C40 00000000 00000000 00000000 0B80000B [................]/*pdba: 0x0b80000b segment head */
106768C50 0000000A 00000002 00000008 00000000 [................]/*0000000A 一级位图数组的大小,00000002 nfree: 2 第一个可用的block,00000008 ffree: 8第一个具有空闲空间的extent */
106768C60 00000000 00000000 000102FF 00000001 [................] /*object id 表示这个二级位图块是位于这个段内的*/
106768C70 00000000 0B800009 01000001 0B800019 [................]
106768C80 01000001 0B800029 01000001 0B800039 [.......).......9]
106768C90 01000001 0B800049 01000001 0B800059 [.......I.......Y]
106768CA0 01000001 0B800069 01000001 0B800079 [.......i.......y]
106768CB0 01000001 0B800089 05000001 0B80008A [................]
106768CC0 05000001 00000000 00000000 00000000 [................]
106768CD0 00000000 00000000 00000000 00000000 [................]
Repeat 497 times
10676ABF0 00000000 00000000 00000000 2D592101 [............-Y!.]
Dump of Second Level Bitmap Block
number: 10 nfree: 2 ffree: 8 pdba: 0x0b80000b
Inc #: 0 Objd: 66303
opcode:0
xid: 0x0000.000.00000000
L1 Ranges : /这里需要解释下:level 2 bmb block 的作用, 上面说了 block 9 只管理了 9-25 共16个数据块,
-------------------------------------------------------- 那么第17块以后的那些块怎么半呢,这就是level 2bmb block 的作用了,2级位图块 记录了一级位图块的地址rdba 0x0b800009 Free: 1 Inst: 1 其实我们可以看看,或者猜测下,0x0b800009 是第9块,9+16=25 = 0x19 既0x0b800019
0x0b800019 Free: 1 Inst: 1 25 + 16 = 41=0x0b800029 第3个一级位图块。等等依次推下去,但是并不是所有的extent都只管理16个数据块,
0x0b800029 Free: 1 Inst: 1 当数据量增长到一定成都的时候,每个位图块管理的数据块也会增长,并且是以几何倍数增长的。
0x0b800039 Free: 1 Inst: 1 我们知道了第一个一级位图块和二级位图块,我门就可以知道所有的一级位图块的地址了,也就知道了这个段(对我们
0x0b800049 Free: 1 Inst: 1 来说主要是表) 的所有的保存实际数据的数据块的地址了,读出里面的数据还会有很远了么??!!!*/
0x0b800059 Free: 1 Inst: 1
0x0b800069 Free: 1 Inst: 1
0x0b800079 Free: 1 Inst: 1
0x0b800089 Free: 5 Inst: 1
0x0b80008a Free: 5 Inst: 1
--------------------------------------------------------
End dump data blocks tsn: 22 file#: 46 minblk 10 maxblk 10
*** 2008-06-07 15:26:44.223
Start dump data blocks tsn: 22 file#: 46 minblk 11 maxblk 11
buffer tsn: 22 rdba: 0x0b80000b (46/11)
scn: 0x0001.000f2d59 seq: 0x02 flg: 0x04 tail: 0x2d592302 /* standard block head */
frmt: 0x02 chkval: 0x2e8b type: 0x23=PAGETABLE SEGMENT HEADER /* 块类型 : segment head */
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x0000000106768C00 to 0x000000010676AC00
106768C00 23A20000 0B80000B 000F2D59 00010204 [#.........-Y....]
106768C10 2E8B0000 00000000 00000000 00000000 [................]
106768C20 00000000 00000011 00000100 0A9C0000 [........] /*#extents: 17=0x11 #blocks: 256=0x100 0A9Coffset: 2716=0X0A9C + 20 extent map的起始地址 Auxillary Map*/
106768C30 00000010 00000080 00000080 0B800109 [................]/*hight Highwater:: 0x0b800109 ext#: 16=0X10 blk#: 128=0X80 ext size: 128=0X80*/
106768C40 00000000 00000010 00000000 000000F4 [................] /* 00000000 00000010 mapblk 0x00000000 offset: 16=0x10 F4 #blocks below: 244=0xF4 */
106768C50 00000000 00000000 00000000 0000000F [................] /* low Highwater:: 0x0b800089 ext#: 15 blk#: 8 ext size: 8 */
106768C60 00000008 00000008 0B800089 00000000 [................] /* 00000000 0000000F mapblk 0x00000000 offset: 15=0x0f */
106768C70 0000000F 00000000 00000076 0B800079 [...........v...y]/* 76 #blocks below: 118=0x76在 low 高水平线下下面的数据块的数量 0B800079 low 高水平标志的块*/
106768C80 0B80008A 00000000 00000000 00000000 [................]/*0B80008A hight 高水平标志的数据块*/
106768C90 00000000 00000000 00000000 00000000 [................]
Repeat 3 times
106768CD0 00010000 00002000 00000000 00001434 [...... ........4]/* 00001434 二级位图extent 数组的起始地址 0x1434 + sizeof(blk_head)=20 = 起始地址*/
106768CE0 00000000 0B80000A 00000001 0B80008A [..........]
106768CF0 0B80000A 00000000 00000000 00000000 [................]
106768D00 00000000 00000000 00000011 00000000 [................]
106768D10 000102FF 10000000 0B800009 00000008 [................] /*000102FF object_id */
106768D20 0B800011 00000008 0B800019 00000008 [................]
106768D30 0B800021 00000008 0B800029 00000008 [...!.......)....]/*这部分就是extent map 拉 每个extent管理多少个 block 就在里面写了*/
106768D40 0B800031 00000008 0B800039 00000008 [...1.......9....]
106768D50 0B800041 00000008 0B800049 00000008 [...A.......I....]
106768D60 0B800051 00000008 0B800059 00000008 [...Q.......Y....]
106768D70 0B800061 00000008 0B800069 00000008 [...a.......i....]
106768D80 0B800071 00000008 0B800079 00000008 [...q.......y....]
106768D90 0B800081 00000008 0B800089 00000080 [................]
106768DA0 00000000 00000000 00000000 00000000 [................]
Repeat 144 times
1067696B0 0B800009 0B80000C 0B800009 0B800011 [................] /* Auxillary Map 每个结构是 8个字节 ,分别放置了level 1 bmb block
1067696C0 0B800019 0B80001A 0B800019 0B800021 [...............!] 和实际存放数据的数据块(type=0x06 trans data) 的数据块的开始地址)而每个level 1 块里都有记录
1067696D0 0B800029 0B80002A 0B800029 0B800031 [...)...*...)...1] 他所管理的数据块的数量和偏移量,知道了这个就知道数据放在那里了*/
1067696E0 0B800039 0B80003A 0B800039 0B800041 [...9...:...9...A]
1067696F0 0B800049 0B80004A 0B800049 0B800051 [...I...J...I...Q]
106769700 0B800059 0B80005A 0B800059 0B800061 [...Y...Z...Y...a]
106769710 0B800069 0B80006A 0B800069 0B800071 [...i...j...i...q]
106769720 0B800079 0B80007A 0B800079 0B800081 [...y...z...y....]
106769730 0B800089 0B80008B 00000000 00000000 [................]
106769740 00000000 00000000 00000000 00000000 [................]
Repeat 143 times
10676A040 00000000 00000000 0B80000A 00000000 [................]
10676A050 00000000 00000000 00000000 00000000 [................]
Repeat 185 times
10676ABF0 00000000 00000000 00000000 2D592302 [............-Y#.]
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 17 #blocks: 256
last map 0x00000000 #maps: 0 offset: 2716
Highwater:: 0x0b800109 ext#: 16 blk#: 128 ext size: 128 /* 我们之前分派的 extent都是8个block 这个extent是128个
#blocks in seg. hdr's freelists: 0 这个可以用select * from dba_extents where owner='lsliang'and segmetn_name='test' l来察看下*/
#blocks below: 244 /*hight 高水平线下有244个数据块(block )*/
mapblk 0x00000000 offset: 16
Unlocked
--------------------------------------------------------
Low HighWater Mark : /* low 高水平线的意思可以理解了吧, 就是extent被全部添满的地方的那个标记,*/
Highwater:: 0x0b800089 ext#: 15 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 118 /* 在 low 高水平线下下面的数据块的数量 */
mapblk 0x00000000 offset: 15
Level 1 BMB for High HWM block: 0x0b80008a / 高低水平线标记的块的地址,通过前面,我们基本可以理解高低水平线了,extent 被数据完全添满的的那个low 高水平线
Level 1 BMB for Low HWM block: 0x0b800079 高水平线就是这个段(表) 被分配的最大的那个extent的标记了,我们所说的高水平线造成的全表扫描浪费i/o 的那部分
就是hight , low 高水平线之间的那部分数据块了。意思就是这个意思了,我们用append 提示进行insert的时候,数据就不会写在hight ,low 高水平线之间了,而是直接写在hight 高水平线后面,当然了hight高水平线最终还是要在最后的了。意思就是
这个意思了。*/
-------------------------------------------------------- /*这部分说的是位图块的分布情况。因为某些字段没有实际填充数据,不太容易说明白。
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0 我从线上数据中抓了一个段数据说明情况 */
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x0b80000a
Last Level 1 BMB: 0x0b80008a
Last Level II BMB: 0x0b80000a
Last Level III BMB: 0x00000000
Map Header:: next 0x00000000 #extents: 17 obj#: 66303 flag: 0x10000000
Inc # 0
1068E74D0 00010000 00002000 00000000 00001434 [...... ........4] /*二级位图extent 数组的起始地址 0x1434 + sizeof(blk_head)=20 = 起始地址*/
1068E74E0 00000000 0257E011 00000003 025F4010 [......] /*00000000 第一个levl3 bimp blk 0257E011 第一个具有空闲空间的levl2 bitmap bkk
00000003 levl2 bitmap 的数量 025F4010 : 最后一个level 1 exetent RDBA */
1068E74F0 0257E011 00000000 00000000 00000000 [.W..............] /* 0257E011 最后一个 level 2 bitmap blk */
1068E7500 00000000 00000000 00000133 024F8011 [...........3.O..] /00000133 =#extents: 307 =第308个extent
024F8011 = Map Header:: next 0x024f8011 下一个段 extent map blk 的 rdba
上面的307=0x133 说的是 extent[307] 的rdba 放在这个 extent map blk 里。
这里又牵扯了一个新的数据块类型 0x24 0x24=PAGETABLE EXTENT MAP BLOCK* /
1068E7510 0000CB77 10000000 02400009 00000008 [...w.....@......]
1068E7520 02400011 00000008 02400019 00000008 [.@.......@......]
--------------------------------------------------------
Segment Type: 1 nl2: 3 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x0257e011
Last Level 1 BMB: 0x025f4010
Last Level II BMB: 0x0257e011
Last Level III BMB: 0x00000000
Map Header:: next 0x024f8011 #extents: 307 obj#: 52087 flag: 0x10000000
Inc # 0
Extent Map
----------------------------------------------------------------- /* 这会看这个exnten map有点象地图了吧,前面说的时候只有一个地址不太象,
0x0b800009 length: 8 现在象了吧,每个 extent的大小都标记了*/
0x0b800011 length: 8
0x0b800019 length: 8
0x0b800021 length: 8
0x0b800029 length: 8
0x0b800031 length: 8
0x0b800039 length: 8
0x0b800041 length: 8
0x0b800049 length: 8
0x0b800051 length: 8
0x0b800059 length: 8
0x0b800061 length: 8
0x0b800069 length: 8
0x0b800071 length: 8
0x0b800079 length: 8
0x0b800081 length: 8
0x0b800089 length: 128
Auxillary Map
-------------------------------------------------------- /* 这里就记录了每个一级位图块的地址他所管辖的实际记录数据的数据块开始的地址。*/
Extent 0 : L1 dba: 0x0b800009 Data dba: 0x0b80000c
Extent 1 : L1 dba: 0x0b800009 Data dba: 0x0b800011
Extent 2 : L1 dba: 0x0b800019 Data dba: 0x0b80001a
Extent 3 : L1 dba: 0x0b800019 Data dba: 0x0b800021
Extent 4 : L1 dba: 0x0b800029 Data dba: 0x0b80002a
Extent 5 : L1 dba: 0x0b800029 Data dba: 0x0b800031
Extent 6 : L1 dba: 0x0b800039 Data dba: 0x0b80003a
Extent 7 : L1 dba: 0x0b800039 Data dba: 0x0b800041
Extent 8 : L1 dba: 0x0b800049 Data dba: 0x0b80004a
Extent 9 : L1 dba: 0x0b800049 Data dba: 0x0b800051
Extent 10 : L1 dba: 0x0b800059 Data dba: 0x0b80005a
Extent 11 : L1 dba: 0x0b800059 Data dba: 0x0b800061
Extent 12 : L1 dba: 0x0b800069 Data dba: 0x0b80006a
Extent 13 : L1 dba: 0x0b800069 Data dba: 0x0b800071
Extent 14 : L1 dba: 0x0b800079 Data dba: 0x0b80007a
Extent 15 : L1 dba: 0x0b800079 Data dba: 0x0b800081
Extent 16 : L1 dba: 0x0b800089 Data dba: 0x0b80008b
--------------------------------------------------------
Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1: 0x0b80000a
End dump data blocks tsn: 22 file#: 46 minblk 11 maxblk 11
/* 好了,到这里关于extent 的内部结构的一个初步分析就到这里了,这个分析是基于本地管理的表空间的一个分析,对于字典管理的表空间的空间分配情况,因为这种方式已经过时了,我们就没有 必要去做了,通过这个分析,我们基本知道了oracle 数据块扩展的一般规则, 其中一些参数取决于建立表空间文件,和建表语句的存储部分的选项,9i / 10g 默认情况下 一个extent的初次分配是64k 既8个block ,在前16个extent基本是8个块,超过16个extent 就不一定了,基本是按64k,1m ,8m,256m 这样增长的。
每个level 1 bmb block 管理实际的数据块,level 2 bmb block 记录了 level 1 bmb block 的地址,当表空间或数据文件里有多个段(表)的时候,一个表的数据就不总是连续的了,这时候level 2 bmb block 就发挥作用了,但是oracle 内核保证一个extent内部的数据块是连续的,所以就引入了另外一个问题,oracle的一次物理i/o,是不能跨越extent的,当一个extent是8个块的时候,我们就是把参数db_BLOCK_READ_COUNT设为16也没有用,一次只能读8个块。
还有我们也看到了高水平线的问题了,我们平常说的高水平线,其实是hight HWM 还有一个low HWM 标记的是被完全写满的哪个extent,我们平常说的因为高水平线导致的全表扫描浪费i/0的那部分数据块基本是在low hwm 和 hight hwm 之间的这部分数据块。 如果一个新表,第一次插入数据的时候,如果高水平线所在的extent 没有被完全添满的话,hight , low 之间还是有一段空间的。 10g 如果开启了表的 row moveable 的话,是可以处理掉一部分的,但是就修改数据的rowid 如果表的列中涉及到rowid 就会有问题了。* /
搞明白了这个部分对我们分析数据文件就奠定了一个基本的入口了,至少我们知道了,一个表的数据可以通过怎么样一个方法去找了,避免了全文件扫描了,
关于 blk_type 0x24=PAGETABLE EXTENT MAP BLOCK 的说明
我们已经在段头块(segment head block BLK_TYPE=0X23) 中已经看到了extent map 数组的结构了,
一部分是expent map arrary 记录的是 一级位图块的 rdba 和这个位图所管理的datablock 的数量,
一部分是 Auxillary Map arrary 记录的 这个一级位图块 所管理的datablock 开始的位置。
例如:
Extent Map Auxillary Map
----------------------------------------------------------------- --------------------------------------------------------
0x02400009 length: 8 Extent 0 : L1 dba: 0x02400009 Data dba: 0x0240000c
0x02400011 length: 8 Extent 1 : L1 dba: 0x02400009 Data dba: 0x02400011
0x02400019 length: 8 Extent 2 : L1 dba: 0x02400019 Data dba: 0x0240001a
0x024f4009 length: 8192 Extent 3 : L1 dba: 0x02400019 Data dba: 0x02400021
0x024f6009 length: 8192 Extent 4 : L1 dba: 0x02400029 Data dba: 0x0240002a
下面的部分是一个 page table extent map block 的例子
Start dump data blocks tsn: 10 file#: 9 minblk 1015825 maxblk 1015825
buffer tsn: 10 rdba: 0x024f8011 (9/1015825)
scn: 0x0000.00271cdb seq: 0x01 flg: 0x04 tail: 0x1cdb2401
frmt: 0x02 chkval: 0x13bc type: 0x24=PAGETABLE EXTENT MAP BLOCK /* /* 段 extent map block */
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00000001068E7400 to 0x00000001068E9400
1068E7400 24A20000 024F8011 00271CDB 00000104 [$....O...'......] /* 标准的block head */
1068E7410 13BC0000 00000088 00000000 0000CB77 [...............w] /* 00000088数组的长度,本blk 中记录了多少个extent ,
00000000 下一个extent map blk 的地址rdba ,这里是0 ,因为没有下一个了。
0000CB77 object_id = obj#: 52087 */
1068E7420 10000000 024F8009 00002000 024FA009 [.....O.... ..O..] 10000000 = flag: 0x10000000*/
1068E7430 00002000 024FC009 00002000 024FE009 [.. ..O.... ..O..] 经过观察一个pagetable extent map block 最多只能装下508个extent 数据,
1068E7440 00002000 02500009 00002000 02502009 [.. ..P.... ..P .] Auxillary Map 的开始地址是 offset = 4100 =
1068E7450 00002000 02504009 00002000 02506009 [.. ..P@... ..P`.] sizeof(blk_Head)=20 + sizeof(ext dict) 16 + sizof (texten item ) 8 * 508 */
1068E7460 00002000 02508009 00002000 0250A009 [.. ..P.... ..P..] 024F8009 00002000 024FA009 extent map arrary 的开始地址 offset =36 = ;
1068E7470 00002000 0250C009 00002000 0250E009 [.. ..P.... ..P..] sizeof(blk_head) =20 + sizeof(exy dict) 16 = 36
1068E7480 00002000 02510009 00002000 02512009 [.. ..Q.... ..Q .]
1068E7490 00002000 02514009 00002000 02516009 [.. ..Q@... ..Q`.]
1068E74A0 00002000 02518009 00002000 0251A009 [.. ..Q.... ..Q..]
1068E74B0 00002000 0251C009 00002000 0251E009 [.. ..Q.... ..Q..]
**********************************************
****************
1068E7840 00002000 02600009 00002000 02602009 [.. ..`.... ..` .]
1068E7850 00002000 02604009 00002000 02606009 [.. ..`@... ..``.]
1068E7860 00002000 00000000 00000000 00000000 [.. .............]
1068E7870 00000000 00000000 00000000 00000000 [................]
Repeat 184 times
1068E8400 00000000 024F8009 024F8012 024FA009 [.....O...O...O..]
1068E8410 024FA011 024FC009 024FC011 024FE009 [.O...O...O...O..]
1068E8420 024FE011 02500009 02500011 02502009 [.O...P...P...P .]
1068E8430 02502011 02504009 02504011 02506009 [.P ..P@..P@..P`.]
1068E8440 02506011 02508009 02508011 0250A009 [.P`..P...P...P..]
1068E8450 0250A011 0250C009 0250C011 0250E009 [.P...P...P...P..]
1068E8460 0250E011 02510009 02510011 02512009 [.P...Q...Q...Q .]
1068E8470 02512011 02514009 02514011 02516009 [.Q ..Q@..Q@..Q`.]
1068E8480 02516011 02518009 02518011 0251A009 [.Q`..Q...Q...Q..]
1068E8490 0251A011 0251C009 0251C011 0251E009 [.Q...Q...Q...Q..]
*******************************
***************************
1068E93C0 70457863 65707469 6F6E3A20 C9E8B6A8 [pException: ....]
1068E93D0 B9ABCBBE B2FAC6B7 B1A8BCDB CEDED0A7 [................]
1068E93E0 CAB1B3F6 B4ED0778 6B090712 150FFFFF [.......xk.......]
1068E93F0 FF0AB2D9 D7F7CAA7 00000000 1CDB2401 [..............$.]
EMB Dump:
Map Header:: next 0x00000000 #extents: 136 obj#: 52087 flag: 0x10000000
Inc # 0
Extent Map
-----------------------------------------------------------------
0x024f8009 length: 8192
0x024fa009 length: 8192
0x024fc009 length: 8192
0x024fe009 length: 8192
******************
0x02600009 length: 8192
0x02602009 length: 8192
0x02604009 length: 8192
0x02606009 length: 8192
Auxillary Map
--------------------------------------------------------
Extent 0 : L1 dba: 0x024f8009 Data dba: 0x024f8012
Extent 1 : L1 dba: 0x024fa009 Data dba: 0x024fa011
Extent 2 : L1 dba: 0x024fc009 Data dba: 0x024fc011
Extent 3 : L1 dba: 0x024fe009 Data dba: 0x024fe011
Extent 4 : L1 dba: 0x02500009 Data dba: 0x02500011
Extent 5 : L1 dba: 0x02502009 Data dba: 0x02502011
Extent 6 : L1 dba: 0x02504009 Data dba: 0x02504011
Extent 7 : L1 dba: 0x02506009 Data dba: 0x02506011
***************************************
Extent 133 : L1 dba: 0x02602009 Data dba: 0x02602011
Extent 134 : L1 dba: 0x02604009 Data dba: 0x02604011
Extent 135 : L1 dba: 0x02606009 Data dba: 0x02606011
--------------------------------------------------------
End dump data blocks tsn: 10 file#: 9 minblk 1015825 maxblk 1015825
*** 2008-06-07 15:26:55.524
Start dump data blocks tsn: 22 file#: 46 minblk 12 maxblk 12 / * 现在12块已经有数据了,看看他被分了个什么官做 ??
buffer tsn: 22 rdba: 0x0b80000c (46/12)
scn: 0x0001.000f2e59 seq: 0x01 flg: 0x06 tail: 0x2e590601
frmt: 0x02 chkval: 0x2e3f type: 0x06=trans data /* 块类型: 数据块 */
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x0000000106768C00 to 0x000000010676AC00 /关于 0x06=trans data 类型的数据快的结构和分析我们以后再给出 */
106768C00 06A20000 0B80000C 000F2E59 00010106 [...........Y....]
106768C10 2E3F0000 01000000 000102FF 000EE87B [.?.............{]
106768C20 0001FFFF 00023200 0B800009 000E0005 [......2.........]
106768C30 0000298E 00800CB2 04102400 21F50000 [..).......$.!...]
************************************
*************************************
106768DF0 1F8D09E0 09EE09F9 0A070A12 0A200A2B [............. .+]
106768E00 0A390A44 0A520A5D 0A6B0A76 0A840A8F [.9.D.R.].k.v....]
106768E10 0A9D0AA8 0AB60AC1 0ACF0ADA 0AE80AF3 [................]
106768E20 0B010B0C 0B1A0B25 0B330B3E 0B4C0B57 [.......%.3.>.L.W]
106768E30 0B650B70 0B7E0B89 0B970BA2 0BB00BBB [.e.p.~..........]
106768E40 0BC90BD4 0BE20BED 0BFB0C06 0C140C1F [................]
106768E50 0C2D0C38 0C460C51 0C5F0C6A 0C780C83 [.-.8.F.Q._.j.x..]
106768E60 0C910C9C 0CAA0CB5 0CC30CCE 0CDC0CE7 [................]
****************************
********************************
10676ABC0 010203C2 131C0353 59532C01 0203C213 [.......SYS,.....]
10676ABD0 1D065055 424C4943 2C010203 C2131E03 [..PUBLIC,.......]
10676ABE0 5359532C 010203C2 131F0650 55424C49 [SYS,.......PUBLI]
10676ABF0 432C0102 03C21320 03535953 2E590601 [C,..... .SYS.Y..]
Block header dump: 0x0b80000c
Object id on Block? Y
seg/obj: 0x102ff csc: 0x01.ee87b itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0xb800009 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000e.005.0000298e 0x00800cb2.0410.24 --U- 501 fsc 0x0000.000f2e59
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0x106768c64
===============
tsiz: 0x1f98
hsiz: 0x3fc
pbl: 0x106768c64
bdba: 0x0b80000c
76543210
flag=--------
ntab=1
nrow=501
frre=-1
fsbo=0x3fc
fseo=0x725
avsp=0x329
tosp=0x329
0xe:pti[0] nrow=501 offs=0
0x12:pri[0] offs=0x1653
0x14:pri[1] offs=0x1661
0x16:pri[2] offs=0x166c
0x18:pri[3] offs=0x167a
0x1a:pri[4] offs=0x1685
0x1c:pri[5] offs=0x1693
0x1e:pri[6] offs=0x169e
****************
****************
0x3f4:pri[497] offs=0x9ae
0x3f6:pri[498] offs=0x9bc
0x3f8:pri[499] offs=0x9c7
0x3fa:pri[500] offs=0x9d5
block_row_dump:
tab 0, row 0, @0x1653
tl: 14 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 3] c2 11 2b
col 1: [ 6] 50 55 42 4c 49 43
tab 0, row 1, @0x1661
tl: 11 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 3] c2 11 2c
col 1: [ 3] 53 59 53
tab 0, row 2, @0x166c
tl: 14 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 3] c2 11 2d
col 1: [ 6] 50 55 42 4c 49 43
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/133735/viewspace-1788225/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/133735/viewspace-1788225/