Oracle 數據塊


 以emp表為例

SYS@ prod>select * from scott.emp;

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
      7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30
      7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30

 得到文件號和塊號

SYS@ prod>select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from scott.emp where rownum= 1; 

DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------------------------ ------------------------------------
                                   4                                  151

  轉儲塊

SYS@ prod>alter system dump datafile 4 block 151;

System altered.

  trace文件

SYS@ prod>oradebug setmypid
Statement processed.
SYS@ prod>oradebug tracefile_name
/u01/diag/rdbms/prod/prod/trace/prod_ora_3890.trc

 分析塊

Block dump from disk:
buffer tsn: 4 rdba: 0x01000097 (4/151)
scn: 0x0000.00104463 seq: 0x01 flg: 0x04 tail: 0x44630601
frmt: 0x02 chkval: 0x47ea type: 0x06=trans data
Hex dump of block: st=0, typ_found=1 
  • buffer tsn:tablespace number,表空間號,可通過select TS#,name from v$tablespace;驗證。
  • rdba(relative database block address ):用4個字節32位來表示,前10位為相對數據文件號,后22位為塊號。01400010=0000 0001 0100 0000 0000 0000 0001 0000(二進制)我們看到前10位轉換成十進制就是5,后22位轉換成十進制就是16。rdba在數據塊中的offset是4,即rdba存在於數據塊中的第5-9字節中(offset從0開始算),數據塊中的每個部分在數據塊中的偏移量后邊會通過BBED展示,這里可以先不關心。
  • scn:數據塊頭部SCN,總共占用6個字節,前2個字節表示SCN Wrap,后4個字節表示SCN Base。如果SCN Base達到了4個字節表示的最大值,SCN Wrap+1,SCN Base清0。在數據塊中的offset是8。
  • seq: 在同一個SCN中,對一個塊的每次更改都會增加一個序列號。如果序列號換行,則必須分配新的SCN。保留值0xFF。如果存在,則表明該塊已被Oracle標記為損壞。在數據塊中的offset是14。
  • flg:1位標志值的組合。在數據塊中的offset是15。1=原始區塊 2=最后一次修改塊是為了進行清理操作 4=設置校驗和值 8=臨時數據
  • tail:即tail check,存放於數據塊的最后4個字節,用於數據塊一致性檢查。tail check的組成:SCN Base的低2個字節+type+seq。即tail: 0x32d30601=32d3+06+01
  • frmt:oracle8之后一直都是0x02
  • chkval:塊內容的可選校驗和。寫入塊時,校驗和將被清除或設置,具體取決於db_block_checksum參數的設置。讀取塊時,如果存在校驗和且參數設置為真,則驗證校驗和。系統表空間中的塊總是計算並檢查校驗和。校驗和是塊中所有其他2字節對的XOR。因此,當檢查帶有校驗和的塊時,塊中所有2字節字的XOR應為0。
  • type:塊類型,比如06是表索引等的數據塊

數據塊頭

Block header dump:  0x01000097
 Object id on Block? Y
 seg/obj: 0x11ddd  csc: 0x00.f587b  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1000090 ver: 0x01 opc: 0
     inc: 0  exflg: 0
  • object id on block:object_id是否保存在塊中,oracle 6之后一直都是Y
  • seg/obj:object_id,對應user_objects中的object_id.
  • csc:SCN at last Block CleanOut,表示最后一次塊清除(Block CleanOut)時候的SCN
  • itc:itl事務槽的個數。
  • flag:該塊是否在freelist上的標志位,若為0標示在freelist上,-表示不再freelist上,E標示使用的ASSM。
  • typ: 1 為 table ; 2 為 index。oracle進行查詢的時候是根據 obj$表中的情況來判斷對象的類型的,不是根據這個typ。也就是說如果有一個表但改變表中block的這個標志位,一樣可以查詢出數據來,但dump block 時會出錯。
  • brn:
  • bdba:
  • ver:
  • opc:
  • inc:
  • exflg:

事物槽

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0001.010.00000198  0x00c15ab0.0061.12  C---    0  scn 0x0000.000b6f31
0x02   0x000b.019.0000000a  0x0180000c.0003.23  ----    4  fsc 0x0000.00000000 
  • itl:ITL事務槽編號。
  • xid:transac[X]tion identified
  • uba:undo block address
  • flag: ---- 表示transaction is active, or committed pending cleanout;C---表示事務已經提交並且持有的鎖已經清除;-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塊清除的SCN被記錄時,該事務仍然是活動的,塊上如果有已經提交的事務,那么在clean ount的時候,塊會被進行清除,但是這個塊里面的事務不會被清除。
  • lck:表示這個事務所影響的行數。我們看到01號事務槽Lck為0,因為該事務槽中的事務Flag為C,證明該事務已經提交,鎖也被清楚掉了,該事務槽可以被重用了。02號事務槽Lck為4,說明有4行做了一個更新,並且沒有提交,Flag為----說明該事務是活動的。
  • scn/fsc:Commit SCN或者快速提交(Fast Commit Fsc)的SCN

每條記錄中的行級鎖對應Itl條目lb,對應於Itl列表中的序號,即那個事務在該記錄上產生的鎖。對於Oracle來說,對於一個事務,可以是快速提交、也可以是延遲提交,目的都是為了提高提交的速度。提交以后,oracle需要對ITL事務槽、每一行的鎖定標記進行清除。如果是快速提交,那么在提交的時候,會將事務表和每一個數據塊的ITL槽進行清除。但是鎖定標記可能沒有清除,等下次用到的時候再進行清除。如果是延遲提交,那么在提交的時候,只是將事務表進行清除,並沒有對ITL事務槽進行清除,每一行的鎖定標記也沒有清除。因此C和U的情況特別多。塊清除的過程並不包括每個行的鎖定標記的清除,主要指的是ITL的清除。

注意: 
1、事務槽中首先記錄的是Xid和Uba,只有在提交以后,當對這個數據塊進行cleanout的時候,才會更新Flag和Scn。因此Oracle總是以事務表中對這個數據塊的Scn以及Flag為准。 
2、一個事務開始以后,在一個數據塊上得到一個事務槽,那么在這個事務提交以前,這個事務槽會一直占用,直到這個事務提交釋放這個事務槽。 
3、只有在已經提交以后,這個itl事務槽中的scn才會有數值。 
4、事務是否已經提交、事務對應的SCN,這些信息都是以回滾段事務表中的為主,事務槽中的不准確 
5、事務槽中的事務id和uba地址是准確的 
6、事務槽1中的事務id和回滾段中的事務id肯定不是一樣的,不同回滾段中的事務id也一定不一樣。 
 

尾區儲存着數據塊的描述信息

bdba: 0x01000097
data_block_dump,data header at 0x4d0664
===============
tsiz: 0x1f98
hsiz: 0x2e
pbl: 0x004d0664
     76543210
flag=--------
ntab=1
nrow=14
frre=-1
fsbo=0x2e
fseo=0x1aa7
avsp=0x1d32
tosp=0x1d32
  • bdba:
  • tsiz:top of size 數據塊區的總大小
  • hsiz:Data header size 數據頭大小
  • pbl:
  • flag:
  • ntab:表示這個塊的數據在一個表(如果是聚簇表就有可能是2或2以上)
  • nrow:塊中存儲了幾行數據
  • frre:first free row index entry, -1=you have to add one(沒有創建索引
  • fsbo:Free space begin offset可以存放數據空間的起始位置
  • fseo:Free space end offset可以存放數據空間的結束位置
  • avsp:Available space for new entries可用空間的大小
  • toap:Total space總剩余空間的大小
0xe:pti[0]      nrow=14 offs=0    --該塊有3條記錄
0x12:pri[0]     offs=0x1b2a      --第1條記錄在偏移量為0x1b2a的地方,下邊以此類推。
0x14:pri[1]     offs=0x1aa7
0x16:pri[2]     offs=0x1b7b
0x18:pri[3]     offs=0x1ba6
0x1a:pri[4]     offs=0x1bcf
0x1c:pri[5]     offs=0x1bfc
0x1e:pri[6]     offs=0x1c25
0x20:pri[7]     offs=0x1c4e
0x22:pri[8]     offs=0x1c76
0x24:pri[9]     offs=0x1c9c
0x26:pri[10]    offs=0x1cc7
0x28:pri[11]    offs=0x1ced
0x2a:pri[12]    offs=0x1d13
0x2c:pri[13]    offs=0x1d3a
block_row_dump:
tab 0, row 0, @0x1b2a
tl: 38 fb: --H-FL-- lb: 0x2  cc: 8  --lb: 0x2說明事物在該數據行上的鎖還沒清除,並且該鎖指向02號事物槽。(此前對改行進行了更新,並且未提交)
col  0: [ 3]  c2 4a 46
col  1: [ 5]  53 4d 49 54 48
col  2: [ 5]  43 4c 45 52 4b
col  3: [ 3]  c2 50 03
col  4: [ 7]  77 b4 0c 11 01 01 01
col  5: [ 2]  c2 15
col  6: *NULL*
col  7: [ 2]  c1 15
tab 0, row 4, @0x1bcf
tl: 45 fb: --H-FL-- lb: 0x0  cc: 8     --lb: 0x0說明事物在該數據行上的鎖已經被清除。(此前對該行進行了更新,並且已經提交)
col  0: [ 3]  c2 4d 37
col  1: [ 6]  4d 41 52 54 49 4e
col  2: [ 8]  53 41 4c 45 53 4d 41 4e
col  3: [ 3]  c2 4d 63
col  4: [ 7]  77 b5 09 1c 01 01 01
col  5: [ 3]  c2 0d 33
col  6: [ 2]  c2 0f
col  7: [ 2]  c1 1f 

tl   --表示Row Size(number of bytes plus data) 
fb  --標志位
    K- Cluster key 
    H- head of row piece 
    D- Deleted row 
    F- first data piece   
    L- last data piece   
    P- First column cintinues from previous row 
    N- Last column cintinues in next piece 

當我們delete一行數據的時候,數據並不是物理的被刪除,而是把該行標記為刪除,這個時候fb應該是--HDFL-- 而不是原來的--H-FL-- 。

Lb  --表示lock byte,表示鎖定該行的這個事務在itl的入口 
Cc  --表示number of columns in this Row piece。

驗證數據

SYS@ prod>select dump(7369,16) from dual;

DUMP(7369,16)
---------------------
Typ=2 Len=3: c2,4a,46

SYS@ prod>select dump('SMITH',16) from dual;

DUMP('SMITH',16)
----------------------------
Typ=96 Len=5: 53,4d,49,54,48

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM