資料檔案internal分析

foreverlee發表於2005-04-07
[@more@]

――――――――――――――――――――――――――――――――――
  *** 2003-06-12 11:36:22.437
*** SESSION ID:(12.96) 2003-06-12 11:36:22.343
Start dump data blocks tsn: 8 file#: 11 minblk 2 maxblk 2
buffer tsn: 8 rdba: 0x02c00002 (11/2)
scn: 0x0000.001148eb seq: 0x01 flg: 0x00 tail: 0x48eb1001
frmt: 0x02 chkval: 0x0000 type: 0x10=DATA SEGMENT HEADER - UNLIMITED
  
   Extent Control Header
   -----------------------------------------------------------------
   Extent Header:: spare1: 0      space2: 0      #extents: 1      #blocks: 4     
                   last map  0x00000000  #maps: 0      offset: 4128  
       Highwater::  0x02c00004  ext#: 0      blk#: 1      ext size: 4     
   #blocks in seg. hdr's freelists: 1     
   #blocks below: 1     
   mapblk  0x00000000  offset: 0     
                    Unlocked
      Map Header:: next  0x00000000  #extents: 1    obj#: 25755  flag: 0x40000000
   Extent Map
   -----------------------------------------------------------------
    0x02c00003  length: 4     
   
   nfl = 1, nfb = 1 typ = 1 nxf = 0
   SEG LST:: flg: USED   lhd: 0x02c00003 ltl: 0x02c00003 
End dump data blocks tsn: 8 file#: 11 minblk 2 maxblk 2
――――――――――――――――――――――――――――――――――
這裡我們看到表空間號是tsn: 8,資料檔案號是file#: 11,相對資料塊地址是rdba: 0x02c00002 (11/2),SCN為scn: 0x0000.001148eb(SCN Base=0011,SCN Wrap=48eb),尾區版本號為tail: 0x48eb1001(tail=SCN Wrap: 48eb + type: 0x10+ seq: 0x01),由於這個塊是整個Segment的頭,所以它還包含整個Segment的一些儲存資訊,比如extent數,block數,高水位地址Highwater::  0x02c00004,自由列表資訊hdr's freelists: 1等等。如果才用本地管理表空間,則此塊的儲存資訊透過點陣圖方式管理。
真正的資料是儲存在下一個塊也就是0x02c00002+1=0x02c00003,我們來看看究竟。
――――――――――――――――――――――――――――――――――
*** 2003-06-12 12:00:41.781
Start dump data blocks tsn: 8 file#: 11 minblk 3 maxblk 3
buffer tsn: 8 rdba: 0x02c00003 (11/3)
scn: 0x0000.001148ee seq: 0x01 flg: 0x02 tail: 0x48ee0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
  
Block header dump:  0x02c00003
  Object id on Block? Y
  seg/obj: 0x649b  csc: 0x00.1148eb  itc: 1  flg: O  typ: 1 - DATA
      fsl: 0  fnx: 0x0 ver: 0x01
  
  Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   xid:  0x0006.03f.000000da    uba: 0x00800ad2.00ae.04  --U-    2  fsc 0x0000.001148ee
  
data_block_dump
===============
tsiz: 0x1fb8
hsiz: 0x16
pbl: 0x0ec77444
bdba: 0x02c00003
flag=-----------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x1fac
avsp=0x1f90
tosp=0x1f90
0xe:pti[0]  nrow=2  offs=0
0x12:pri[0]  offs=0x1fb2
0x14:pri[1]  offs=0x1fac
block_row_dump:
tab 0, row 0, @0x1fb2
tl: 6 fb: --H-FL-- lb: 0x1 cc: 1
col  0: [ 2]  c1 02
tab 0, row 1, @0x1fac
tl: 6 fb: --H-FL-- lb: 0x1 cc: 1
col  0: [ 2]  c1 03
end_of_block_dump
End dump data blocks tsn: 8 file#: 11 minblk 3 maxblk 3
――――――――――――――――――――――――――――――――――
謎團解開了,ITL,資料都呈現出來了,開始分析!
Block header dump:  0x02c00003
  Object id on Block? Y
  seg/obj: 0x649b  csc: 0x00.1148eb  itc: 1  flg: O  typ: 1 - DATA
      fsl: 0  fnx: 0x0 ver: 0x01
 
資料塊地址正是0x02c00002+1=0x02c00003
segment/object id為0x649b,轉成10進製為25755,可以由obj#表中得知
SQL> select obj# from sys.obj$ where name='TESTBLOCK';
 
       OBJ#
----------
      25755
 
csc(SCN at last Block CleanOut): 0x00.1148eb表示最後一次塊清除(Block CleanOut)時候的SCN,關於塊清除的概念可以查閱Thomas Kyte 著的”expert one by one Oracle”。
 
itc: 1 表示Number of itl slots
 
flg: O 表示此塊被放置在自由列表(freelist)中
 
typ: 1 – DATA,型別1表示資料,型別2表示索引
 
fsl: 0 ITL TX FREELIST SLOT
 
fnx: 0x0 自由列表中下一塊的地址

――――――――――――――――――――――――――――――――――
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   xid:  0x0006.03f.000000da    uba: 0x00800ad2.00ae.04  --U-    2  fsc 0x0000.001148ee
這個事務列表中當前有一個事務,裡面記載著slot號,事務id,undo block address,受影響的行數,事務遞交時的scn等
Itl slot =0x01 
 
事務id= xid:  0x0006.03f.000000da
由於xid由3部分組成,xid= Undo Segment Number +Transaction Table Slot Number+ Wrap ,得到
0x0006 – Undo Segment Number  03f – Transaction Table Slot Number 000000da– Wrap 
 
回滾塊地址=uba: 0x00800ad2.00ae.04
由於uba由3部分組成,uba= Address of the last undo block used+ Sequence+ Last Entry in UNDO record map得到
0x00800ad2– Address of the last undo block used  00ae– Sequence 04– Last Entry in UNDO record map 
 
flag標誌我引用的一段解釋,這裡的--U-表示已經遞交
---- = transaction is active, or committed pending cleanout
C--- = transaction has been committed and locks cleaned out
-B-- = this undo record contains the undo for this ITL entry
--U- = transaction committed (maybe long ago); SCN is an upper bound
---T = transaction was still active at block cleanout SCN
Lck(number of rows affected by this transaction)表示這個事務所影響的行數,這裡是2行,正好對應2次insert
 
Scn/Fsc 標誌我引用的一段解釋
If the transaction has been cleaned out, this is the commit SCN or an upper bound thereof. Otherwise the leading two bytes contain the free space credit for the transaction - that is, the number of bytes freed in the block by the transaction

―――――――――――――――――――――――――――――――――――――――
data_block_dump
===============
tsiz: 0x1fb8
hsiz: 0x16
pbl: 0x0ec77444
bdba: 0x02c00003
flag=-----------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x1fac
avsp=0x1f90
tosp=0x1f90
0xe:pti[0]  nrow=2  offs=0
0x12:pri[0]  offs=0x1fb2
0x14:pri[1]  offs=0x1fac
―――――――――――――――――――――――――――――――――――――――――
這一部分記載著一些儲存引數,簡單得分析一些,給出各個標誌的解釋
tsiz:Total Data Area Size(資料塊的大小)
hsiz:Data Header Size(資料塊頭大小)
pbl: ptr to buffer holding the block(指向這個資料塊在記憶體中映象的指標)
bdba: block dba / rdba(資料塊地址)
flag: n=pctfree hit (clusters),f=dont put on freelist k=flushable cluster keys
ntab: number of tables (>1 is a cluster)
nrow: number of rows
frre: first free row index entry, -1=you have to add one(沒有建立索引)
fsbo: free space begin offset(從hsiz開始)
fseo: free space end offset()
avsp: available space in the block(可用空間)
tosp: total available space when all txs commit
0xe:pti[0]  nrow=2  offs=0本塊儲存2條記錄
0x12:pri[0]  offs=0x1fb2---- 記錄的起始物理位置

―――――――――――――――――――――――――――――――――――――――――
終於見到到資料了,這個部分就儲存著對應的記錄,繼續分析
block_row_dump:
tab 0, row 0, @0x1fb2 
tl: 6 fb: --H-FL-- lb: 0x1 cc: 1 
col  0: [ 2]  c1 02
tab 0, row 1, @0x1fac
tl: 6 fb: --H-FL-- lb: 0x1 cc: 1
col  0: [ 2]  c1 03
end_of_block_dump
End dump data blocks tsn: 8 file#: 11 minblk 3 maxblk 3
―――――――――――――――――――――――――――――――――――――――
tl表示Row Size(number of bytes plus data)
fb:Flag Byte
    H-head of row piece
    F-first data piece 
    L-last data piece 
Lb表示lock byte,表示這個事務在itl的入口
Cc表示number of columns in this Row piece,表示這一行只有1列
col  0: [ 2]  c1 02 第一列,[2]表示長度,c1 02是資料(經過一套複雜的過程可以轉換成10進位制資料)
到此為止,資料塊的結構我們已經都把它展開並進行了分析,期待大家的繼續!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/76065/viewspace-795290/,如需轉載,請註明出處,否則將追究法律責任。

相關文章