以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