翻出來了 老東西了 , oracle 資料庫解析 extent 資料結構解析

babyyellow發表於2015-09-01

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 /這裡記錄了 這個段(表)的extentmap(地圖?) 其實就是地址(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  [................] /* 161表示 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 232次冪)這個資料檔案或這個段的一個最大值。

   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    /* 161表示 full * /  

   4:FULL   5:FULL   6:FULL   7:FULL             /* 161表示 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 第一個可用的block00000008 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都是8block  這個extent128個 

#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 =308extent 

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 8block ,在前16extent基本是8個塊,超過16extent  就不一定了,基本是按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的,當一個extent8個塊的時候,我們就是把引數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 ,這裡是,因為沒有下一個了。

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 最多隻能裝下508extent 資料,  

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章