【ORACLE】事務與一致性(TRN TBL 和ITL基礎),trnitl
4 事務與一致性4.1 undo segment header 事務表及事務控製表(TRN TBL and TRN ctl)
--undo header 包含事務表TRN TBL用於標示最近事務的簡單列表,
TRN TBL::
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x00 9 0x00 0x0146 0x002e 0x0000.000c4261 0x008000e8 0x0000.000.00000000 0x00000001 0x00000000 1422514868
0x01 9 0x00 0x0146 0x0007 0x0000.000c43f4 0x008000e8 0x0000.000.00000000 0x00000001 0x00000000 1422515883
0x02 9 0x00 0x0146 0x002c 0x0000.000c43d3 0x008000e8 0x0000.000.00000000 0x00000001 0x00000000 1422515883
0x03 9 0x00 0x0146 0x0008 0x0000.000c440a 0x008000e8 0x0000.000.00000000 0x00000001 0x00000000 1422515883
--undo header包含事務控制區TRN CTL詳細描述事務表的狀態
TRN CTL:: seq: 0x00cc chd: 0x0009 ctl: 0x002f inc: 0x00000000 nfb: 0x0002
mgc: 0x8201 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
uba: 0x008000b9.00cc.06 scn: 0x0000.000c3c00
Version: 0x01
FREE BLOCK POOL::
uba: 0x008000b9.00cc.08 ext: 0x7 spc: 0x1c7e
uba: 0x008000e6.00cb.13 ext: 0x6 spc: 0x1024
uba: 0x00000000.00c9.2f ext: 0x4 spc: 0xc7c
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
--commit指令
Commit指令也會生產一個改變向量,因為修改undo的事務表的兩個欄位state,scn;
--事務ID:xid
事務ID有undo段編號(1,10),事務表的index值(ox00開始)加warp#構成了事務ID。
4.2 查看事務xid
--查看xid事務號
SQL> update scott.stu set stu_id=4 where stu_id=5;
已更新 1 行
SQL> select xidusn,xidslot,xidsqn,ubablk,ubafil,ubarec from v$transaction;
XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL UBAREC
---------- ---------- ---------- ---------- ---------- ----------
2 43 313 31 2 52
--xidusn:undo segment number
--xidslot:slot number
--xidsqn:sequence number(wrap#)
--ubablk:undo記錄所在對的undo檔案的block號。uba block number
--UBAFILE: undo記錄所在的undo檔案號。
//資料檔案2,block 31
SQL> select trunc(id1/65536) usn,mod(id1,65536) slot,id2 wrap,lmode from v$lock where type='TX';
USN SLOT WRAP LMODE
---------- ---------- ---------- ----------
2 43 313 6
//lmod 為6 獨佔模式。Slot 43轉換為16進位,0x2b:
--擷取undo欄位2 header中事務表 的slot ox2b資訊。
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
0x2b 10 0x80 0x0139 0x0000 0x0000.000c44bc 0x0080001f 0x0000.000.00000000 0x00000001 0x00000000 0
//state為10,活動狀態
//cflags為0x80表示活動事務,ox00表示無事務,0x10表示死事務。
//uel為ox0000 記錄下一個可用的事務槽為資訊
//dba,事務寫undo時候,最後一個undo塊數
//nub為1,當前事務使用一個undo資料區塊。
//block 31
4.3 通過事務號XID事務的undo記錄
--dump事務對應的undo記錄的資訊。
ALTER SYSTEM DUMP UNDO BLOCK '_SYSSMU2$' XID 2 43 313
--查看undo記錄dump資訊
Undo Segment: _SYSSMU2$ (2)
xid: 0x0002.02b.00000139
UNDO BLK: Extent: 0 Block: 5 dba (file#, block#): 2,0x0000001f(10進位31)
KDO undo record:
KTB Redo
op: 0x03 ver: 0x01
op: Z
KDO Op code: URP row dependencies Disabled
xtype: XAxtype KDO_KDOM2 flags: 0x00000080 bdba: 0x010000cc hdba: 0x010000cb
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 0(0x0) flag: 0x2c lock: 0 ckix: 161
ncol: 4 nnew: 1 size: 0
Vector content:
col 0: [ 2] c1 06
4.4 通過x$ktuxe表可以同時擷取事務xid資訊(段號,slot號)及事務所在地址(資料檔案號,及block號)
--x$ktuxe的使用
SQL> select indx,ktuxesqn wrap#,ktuxerdbf dba_file,ktuxerdbb dba_block from x$ktuxe
2 where ktuxesta='ACTIVE';
INDX WRAP# DBA_FILE DBA_BLOCK
---------- ---------- ---------- ----------
189 313 2 31
4.5 並發動作的測試
1. 查看測試table head所在地址。
(1)Create table t1 (id number, n1 number)
(2)
select HEADER_FILE, HEADER_BLOCK,BYTES,BLOCKS,INITIAL_EXTENT,EXTENTS,NEXT_EXTENT
from dba_segments where segment_type='TABLE' and owner='SCOTT' and segment_name='T1';
HEADER_FILE HEADER_BLOCK BYTES BLOCKS INITIAL_EXTENT EXTENTS NEXT_EXTENT
----------- ------------ ---------- ---------- -------------- ---------- -----------
4 251 65536 8 65536 1
2. 三個進程update t1 3條記錄。
3. table t1 dump檔案:
SQL> alter system dump datafile 4 block min 251 block max 258;
4. 讀取 table dump檔案:
(1)t1表頭(segment_header):
buffer tsn: 4 rdba: 0x010000fb (4/251)
scn: 0x0000.000c6195 seq: 0x02 flg: 0x04 tail: 0x61952302
(4) buffer tsn: 4 rdba: 0x010000fe (4/254)
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0001.00b.00000147 0x0080000d.00ce.1b ---- 1 fsc 0x0000.00000000
0x02 0x0005.025.0000013b 0x00800a05.010f.14 ---- 1 fsc 0x0000.00000000
0x03 0x0009.01e.00000150 0x0080015f.00a8.33 ---- 1 fsc 0x0000.00000000
block_row_dump:
tab 0, row 0, @0x1f76
tl: 10 fb: --H-FL-- lb: 0x2 cc: 2
col 0: [ 2] c1 02
col 1: [ 3] c2 02 02
tab 0, row 1, @0x1f6c
tl: 10 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 03
col 1: [ 3] c2 03 02
tab 0, row 2, @0x1f62
tl: 10 fb: --H-FL-- lb: 0x3 cc: 2
col 0: [ 2] c1 04
col 1: [ 3] c2 04 02
end_of_block_dump
5. 讀取undo header記錄:
查看undo的TRN tab事務
SQL> select xidusn,xidslot,xidsqn,ubablk,ubafil,ubarec from v$transaction;
XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL UBAREC
---------- ---------- ---------- ---------- ---------- ----------
1 11 327 13 2 27
9 30 336 351 2 51
5 37 315 2565 2 20
//三個事務的undo記錄,在三個undo欄位中,表頭中slot記錄事務列表資訊。資料檔案2中一些資料區塊儲存了undo的記錄。
SQL> select trunc(id1/65536) usn,mod(id1,65536) slot,id2 wrap,lmode from v$lock where type='TX';
USN SLOT WRAP LMODE
---------- ---------- ---------- ----------
1 11 327 6
9 30 336 6
5 37 315 6
通過xid擷取相應事務對於undo段的undo header資訊
alter system dump undo header '_SYSSMU9$';
alter system dump undo header '_SYSSMU1$';
alter system dump undo header '_SYSSMU5$';
Undo Segment: _SYSSMU9$ (9)
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x1e 10 0x80 0x0150 0x0002 0x0000.000c6202 0x0080015f 0x0000.000.00000000 0x00000001 0x00000000 0
Undo Segment: _SYSSMU1$ (1)
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x0b 10 0x80 0x0147 0x0000 0x0000.000c61c3 0x0080000d 0x0000.000.00000000 0x00000001 0x00000000 0
Undo Segment: _SYSSMU5$ (5)
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x25 10 0x80 0x013b 0x0002 0x0000.000c61b8 0x00800a05 0x0000.000.00000000 0x00000001 0x00000000 0
4.5.1 資料區塊地址
1. DBA
DBA(Data Block Address)一般指絕對資料區塊地址
如Undo資料區塊地址:
dba (file#, block#): 2,0x0000001f(10進位31)
如ITL表中XID對應undo資料區塊地址
v$transaction表中ubablk=351
TRN table中相應事務ID對應dba(0x0080015f)換算為10進位:351;
2. rdba
Rdba(Tablespace relative database block address)是相對資料區塊地址,
如rdba: 0x010000fb (4/251) fb換算為10進位為251
如果資料檔案超過>=1024即2的10次方的話,僅用絕對dba在內部沒辦法表示的,內部一般是用rdba來表示,它限定了某個資料檔案。