熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

數據文件internal分析

2022-06-13   來源: Oracle 

  眾所周知Oracle的數據是儲存在數據文件中的那麼Oracle是以什麼格式來儲存數據的呢?相信大家都對其內部結構很感興趣這篇文章就幫大家來了解Oracle數據文件的內部結構
我們知道數據庫儲存的最小單位是數據塊其他如extentsegmenttablespace等都是由數據塊組成所以我們就從數據塊的結構來分析

  典型的數據塊由部分構成

  .      頭信息區  

  .          這個區包括數據塊的地址數據塊類型檢查點信息scn信息數據塊版本號等(以下是其大概的構造稍後會做解釋)

  ―――――――――――――――――――――――――――

  *** ::

  Start dump data blocks tsn: file#: minblk maxblk

  buffer tsn: rdba: xc (/)

  scn: xd seq: x flg: x tail: xd

  frmt: x chkval: x type: x=trans data

  Block header dump:  xc

  Object id on Block? Y

  seg/obj: x  csc: xd  itc:   flg: O  typ: – DATA

  fsl:   fnx: x ver: x

  ――――――――――――――――――――――――――――

  .  事務列表區


  事務列表去包括了在這個數據塊內的事務也就是我們知道的ITL(interested transaction list)從中我們可以知道XID(transaction id)UBA(undo block address)等信息(以下是其大概的構造稍後會做解釋)

  Itl           Xid                  Uba         Flag  Lck        Scn/Fsc


  x   xid:  x    uba: xc        fsc x

  .  數據區尾區

  數據區顧名思義是真正存儲數據的地方在這裡我們可以看到每一條記錄至於尾區這裡儲存著數據塊的版本號與數據頭信息區的版本號相對應可以用來確定數據塊前後是否一致

  (以下是其大概的構造稍後會做解釋)

  ―――――――――――――――――――――――――――

  data_block_dump

  ===============

  tsiz: xfb

  hsiz: x

  pbl: xff

  bdba: xc

  flag=

  ntab=

  nrow=

  frre=

  fsbo=x

  fseo=xfb

  avsp=xfb

  tosp=xfb

  xe:pti[]  nrow=  offs=

  x:pri[]  offs=xfb

  block_row_dump:

  tab row @xfb

  tl: fb: HFL lb: x cc:

  col  : [ ]  c (數據就在這裡)

  end_of_block_dump

  End dump data blocks tsn: file#: minblk maxblk

  ―――――――――――――――――――――――――――

  下面我們來做一個完整的實驗首先創建一個新的表空間

   

  SQL> create tablespace testblock datafile d:\oracle\oradata\test\testblockora

  size m;

  

  表空間已創建

  

  創建一個新用戶並指定默認表空間為testblock臨時表空間為temp
  

  SQL> create user testblock identified by testblock default tablespace testblock
temporary tablespace temp;

  

  用戶已創建

  SQL> grant create session to testblock;

  

  授權成功

  SQL> grant resource to testblock;

   

  授權成功

  SQL> connect testblock/testblock@test

  已連接

  SQL> create table testblock (a number);

  

  表已創建

  SQL> insert into testblock values();

  

  已創建

  

  SQL> insert into testblock values();

  

  已創建

  SQL> commit;

   

  提交完成

  SQL> connect internal/oracle@test

  已連接

  SQL> select header_fileheader_block from dba_segments where segment_name=TESTBLOCK;

  

  HEADER_FILE HEADER_BLOCK

  

    

  從這裡我們知道testblock表所在的數據文件號是數據頭塊號是下面我們dump出數據塊來看下

  ――――――――――――――――――――――――――――――――――
  *** ::

  *** SESSION ID:() ::

  Start dump data blocks tsn: file#: minblk maxblk

  buffer tsn: rdba: xc (/)

  scn: xeb seq: x flg: x tail: xeb

  frmt: x chkval: x type: x=DATA SEGMENT HEADER – UNLIMITED

  Extent Control Header

  

  Extent Header:: spare:       space:       #extents:       #blocks:       

  last map  x  #maps:       offset:   

  Highwater::  xc  ext#:       blk#:       ext size:       

  #blocks in seg hdrs freelists:       

  #blocks below:       

  mapblk  x  offset:       

  Unlocked

  Map Header:: next  x  #extents:     obj#:   flag: x

  Extent Map

  

  xc  length:       

  nfl = nfb = typ = nxf =

  SEG LST:: flg: USED   lhd: xc ltl: xc  

  End dump data blocks tsn: file#: minblk maxblk

  ――――――――――――――――――――――――――――――――――

  這裡我們看到表空間號是tsn: 數據文件號是file#: 相對數據塊地址是rdba: xc (/)SCN為scn: xeb(SCN Base=SCN Wrap=eb)尾區版本號為tail: xeb(tail=SCN Wrap: eb + type: x+ seq: x)由於這個塊是整個Segment的頭所以它還包含整個Segment的一些存儲信息比如extent數block數高水位地址 Highwater::  xc自由列表信息hdrs freelists: 等等如果才用本地管理表空間則此塊的存儲信息通過位圖方式管理

  真正的數據是儲存在下一個塊也就是xcxc我們來看看究竟

  ――――――――――――――――――――――――――――――――――

  *** ::

  Start dump data blocks tsn: file#: minblk maxblk

  buffer tsn: rdba: xc (/)

  scn: xee seq: x flg: x tail: xee

  frmt: x chkval: x type: x=trans data

  

  Block header dump:  xc

  Object id on Block? Y

  seg/obj: xb  csc: xeb  itc:   flg: O  typ: DATA
      fsl:   fnx: x ver: x

  
  Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

  x   xid:  xfda    uba: xadae  U      fsc xee

  data_block_dump

  ===============

  tsiz: xfb

  hsiz: x

  pbl: xec

  bdba: xc

  flag=

  ntab=

  nrow=

  frre=

  fsbo=x

  fseo=xfac

  avsp=xf

  tosp=xf

  xe:pti[]  nrow= offs=

  x:pri[]  offs=xfb

  x:pri[]  offs=xfac

  block_row_dump:

  tab row @xfb

  tl: fb: HFL lb: x cc:

  col  : [ ]  c

  tab row @xfac

  tl: fb: HFL lb: x cc:

  col  : [ ]  c

  end_of_block_dump

  End dump data blocks tsn: file#: minblk maxblk

  ――――――――――――――――――――――――――――――――――

  謎團解開了ITL數據都呈現出來了開始分析!

  Block header dump:  xc

  Object id on Block? Y

  seg/obj: xb  csc: xeb  itc:   flg: O  typ: DATA
      fsl:   fnx: x ver: x

  數據塊地址正是xcxc

  segment/object id為xb轉成進制為可以由obj#表中得知
SQL> select obj# from sysobj$ where name=TESTBLOCK;
       OBJ#

  

  

  csc(SCN at last Block CleanOut): xeb表示最後一次塊清除(Block CleanOut)時候的SCN關於塊清除的概念可以查閱Thomas Kyte 著的expert one by one Oracle

  itc: 表示Number of itl slots

  flg: O 表示此塊被放置在自由列表(freelist)中

  typ: – DATA類型表示數據類型表示索引

  fsl: ITL TX FREELIST SLOT
  fnx: x 自由列表中下一塊的地址

  ――――――――――――――――――――――――――――――――――

  Itl           Xid                  Uba         Flag  Lck        Scn/Fsc

  x   xid:  xfda    uba: xadae  U      fsc xee

  這個事務列表中當前有一個事務裡面記載著slot號事務idundo block address受影響的行數事務遞交時的scn等

  Itl slot =x  

  事務id= xid:  xfda

  由於xid由部分組成xid= Undo Segment Number +Transaction Table Slot Number+ Wrap 得到

  x – Undo Segment Number  f – Transaction Table Slot Number da– Wrap  

  回滾塊地址=uba: xadae

  由於uba由部分組成uba= Address of the last undo block used+ Sequence+ Last Entry in UNDO record map得到

  xad– Address of the last undo block used  ae– Sequence – Last Entry in UNDO record map  

  

  flag標志我引用au的一段解釋這裡的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)表示這個事務所影響的行數這裡是正好對應次insert

  

  Scn/Fsc 標志我引用au的一段解釋
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: xfb

  hsiz: x

  pbl: xec

  bdba: xc

  flag=

  ntab=

  nrow=

  frre=

  fsbo=x

  fseo=xfac

  avsp=xf

  tosp=xf

  xe:pti[]  nrow=  offs=

  x:pri[]  offs=xfb

  x:pri[]  offs=xfac

  ―――――――――――――――――――――――――――――――――――――――――

  這一部分記載著一些儲存參數簡單得分析一些給出各個標志的解釋

  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 (> is a cluster)

  nrow: number of rows

  frre: first free row index entry =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

  xe:pti[]  nrow=  offs=本塊儲存條記錄

  x:pri[]  offs=xfb 記錄的起始物理位置

   

  ―――――――――――――――――――――――――――――――――――――――――

  終於見到到數據了這個部分就存儲著對應的記錄繼續分析

  block_row_dump:

  tab row @xfb  

  tl: fb: HFL lb: x cc:   

  ol  : [ ]  c

  tab row @xfac

  tl: fb: HFL lb: x cc:

  col  : [ ]  c

  end_of_block_dump

  End dump data blocks tsn: file#: minblk maxblk

  ―――――――――――――――――――――――――――――――――――――――

  tl表示Row Size(number of bytes plus data)

  fb:Flag Byte

  Hhead of row piece

  Ffirst data piece  

  Llast data piece  

  Lb表示lock byte表示這個事務在itl的入口

  Cc表示number of columns in this Row piece表示這一行只有

  col  : [ ]  c 第一列[]表示長度c 是數據(經過一套復雜的過程可以轉換成進制數據)

  到此為止數據塊的結構我們已經都把它展開並進行了分析期待大家的繼續!


From:http://tw.wingwit.com/Article/program/Oracle/201311/18775.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.