翻出来了 老东西了 , oracle 数据库解析 extent 数据结构解析

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值