oracle回滚机制深入研究
- 检查shared pool中是否存在同样的语句。假设存在。重用运行计划,运行扫描运算,假设不存在。运行硬解析生成运行计划
- 依据运行计划中的扫描运算,检查undotest表中的相关数据块是否存在buffer cache中,假设不存在则读取到内存中
- 检查数据块中符合object_type='PROCEDURE'条件的记录,假设没有符合条件的行记录,则结束语句。假设存在则进入下一步
- 以当前模式(current)获取符合object_type='PROCEDURE'条件的数据块,准备进行更新
- 在回滚表空间的对应回滚段头的事务表上分配事务槽,这个动作须要记录redo日志
- 从回滚段数据块上创建object_type='PROCEDURE'的前映像数据,这个动作也要记录redo日志
- 改动object_type='VIEW' ,这是DML操作的数据变更,而须要记录redo日志
- 用户提交时,在redo日志中记录提交信息,将回滚段头上的事务表和回滚段数据块标记为非活动,清除改动数据块上的事务信息(也可能延迟清除)。同一时候必须确保整个事务的redp日志写到磁盘上的日志文件
- INSERT操作,UNDO中仅仅须要保存插入记录的rowid,假设须要回退,通过保存的rowid进行删除就可以(后面有案例)
- UPDATE操作。UNDO中仅仅须要记录被更新字段的旧值,假设须要回退,仅仅须要通过旧值覆盖更新后的值就可以。
- DELETE操作。UNDO中必须记录整行的数据。假设须要回退,仅仅须要将这整行的数据又一次插入至表中就可以。
Table created.
);
--运行insert操作
row created.
SQL> select HEADER_FILE,HEADER_BLOCK from dba_segments a where segment_name='TT';
HEADER_FILE HEADER_BLOCK
----------- ------------
SQL> SELECT
dbms_rowid.rowid_object(rowid) object_id,
dbms_rowid.rowid_relative_fno(rowid) REL_FNO,
dbms_rowid.rowid_block_number(rowid) BLOCKNO,
dbms_rowid.rowid_row_number(rowid) ROWNO,rowid,object_name
FROM tt WHERE object_name='dddddd';
OBJECT_ID REL_FNO BLOCKNO ROWNO ROWID
---------- ---------- ---------- ---------- ------------------
OBJECT_NAME
--------------------------------------------------------------------------------
AAAR7WAAEAAAAR+AAA
dddddd
SQL> select xidusn,xidslot,xidsqn,ubablk,ubafil,ubarec,to_char(start_scnw,'xxxxxxxx')
start_scnw,
to_char(start_scnb,,)
start_scn
from v$transaction;
XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL UBAREC START_SCNW START_SCNB START_SCN
---------- ---------- ---------- ---------- ---------- ---------- -------------------- -------------------- ----------
f5520
依据上面查询获取的事务信息,dump insert事务undo 段头和undo 块
NAME
------------------------------
_SYSSMU5_1527469038$
SQL> oradebug setmypid;
Statement processed.
SQL> oradebug tracefile_name
/u01/oracle/diag/rdbms/test/test/trace/test_ora_604.trc
SQL> alter system dump undo header '_SYSSMU5_1527469038$';
System altered.
block ;
System altered.
UNDO BLK:
xid: 0x0005..000003c0 seq: 0x12c cnt: 0x7 irb: 0x7 icl: 0x0 flg: 0x0000
Rec Offset Rec Offset Rec Offset Rec Offset
Rec Offset
---------------------------------------------------------------------------
0x01 0x1fa4 0x02 0x1f48 0x03 0x1ecc 0x04 0x1e70 0x05 0x1df4
0x06 0x1d90 0x07 0x1d20
*-----------------------------
(0x00000004)
( rci 0x00
Undo type: Regular undo Begin trans Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000Ext idx:
flg2:
*-----------------------------
uba: 0x00c005b9.012c.2d ctl max scn: 0x0000.000f4ed4 prv tx scn: 0x0000.000f4ee0
txn
prev brb: prev bcl:
KDO undo record:
KTB Redo
op: 0x03 ver: 0x01
compat (post) padding:
op: Z
KDO Op code: DRP row dependencies Disabled --DRP操作完毕回滚
xtype: XA flags: 0x00000000 bdba: 0x0100047e hdba: 0x0100032a --bdba表示block address hdba 代表sgment header address
itli: ispac: maxfr:
tabn: slot: (0x0) ---------这个slot表示这一行数据在数据块中的行地址(行序列)
当中bdba表示file ,block ,hdba表示file 。block 与我们上面查询出来的地址相符。
- UBA: Undo block address
- RBA: Redo block address
- Dba: Data block address
- Rdba: Root dba
- Xid: Transaction ID
- ITL: Interested Transaction List 保存在数据块的头部(事务信息部分),包括XID,UBA,LCK。FLG等重要信息
- Undo segment number 即v$rollname中的usn
- Transaction table slot number 相应回滚段头中回滚事务表的第几条记录
- Sequence number or wrap#
- Data block address (DBA) of the block 前映像undo 块地址
- The sequence number of the block 序列号
- The record number within the block undo记录的開始地址(针对该块)
ID OBJECT_ID OBJECT_NAME OBJECT_TYPE
---------- ---------- -------------------- ---------------
SUBPTXT2 PROCEDURE
SUBPTXT PROCEDURE
,);
rows updated.
,);
ID OBJECT_ID OBJECT_NAME OBJECT_TYPE
---------- ---------- -------------------- ---------------
SUBPTXT2 VIEW
SUBPTXT VIEW
dbms_rowid.rowid_block_number(rowid) BLOCKNO,
dbms_rowid.rowid_row_number(rowid) ROWNO,rowid,id,object_name,object_type
,);
OBJECT_ID REL_FNO BLOCKNO ROWNO ROWID ID OBJECT_NAME OBJECT_TYPE
---------- ---------- ---------- ---------- ------------------ ---------- -------------------- ---------------
AAAR7QAAEAAAADDABG SUBPTXT2
VIEW
AAAR7QAAEAAAADDABH SUBPTXT
VIEW
SQL> select xidusn,xidslot,xidsqn,ubablk,ubafil,ubarec,to_char(start_scnw,'xxxxxxxx')
start_scnw,
to_char(start_scnb,,)
start_scn
from v$transaction;
XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL UBAREC START_SCNW START_SCNB START_SCN
---------- ---------- ---------- ---------- ---------- ---------- -------------------- -------------------- ----------
;
NAME
------------------------------
_SYSSMU19$
System altered.
SQL> oradebug
SQL> oradebug setmypid
Statement processed.
SQL> oradebug tracefile_name
/u01/oracle/diag/rdbms/test/test/trace/test_ora_902.trc
block ;
System altered.
SQL> alter system dump undo header '_SYSSMU19$';
System altered.
block ;
System altered.
Object id on Block? Y
seg flg: E typ: - DATA
brn: bdba: 0x10000b8 ver: 0x01 opc:
inc: exflg:
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0xffff.000.00000000 0x00000000.0000.00 scn 0x0000.000f2e95
0x02 0x0013.000. 0x01400102.. ----
fsc 0x000a.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 fsc 0x0000.00000000
uba中undo record參数为。即这个事务在这个数据块上的变更(改动)产生的undo记录(变更旧值记录)在相应的undo数据块中的開始地址(開始偏移量)
bdba: 0x010000c3
data_block_dump,data header at 0x2b0a86e2da7c
.....省略一部分..........
tab , , @0x45f
tl: fb: --H-FL-- lb:
0x2 cc: ---这一行数据被锁定,锁定该行数据的事务为ITL事务槽中的第二个事务。
col : [ ] c2
col : [ ] c2
col : [ ]
col : [ ]
tab , , @0x447
tl: fb: --H-FL-- lb:
0x2 cc: ---这一行数据被锁定,锁定该行数据的事务为ITL事务槽中的第二个事务。
col : [ ] c2
col : [ ] c2
col : [ ]
col : [ ]
.........省略trace 文件里后面的输出.............
Undo Segment: _SYSSMU19$ ()
********************************************************************************
Extent Control Header
-----------------------------------------------------------------
............省略中间一部分................
Retention Table
-----------------------------------------------------------
Extent
Extent
TRN CTL:: seq: 0x0001 chd: 0x0001 ctl: 0x0021 inc: 0x00000000 nfb: 0x0000
mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt: (0x7ffffffe)
uba: 0x01400102.. scn: 0x0000.000e61e6
Version: 0x01
FREE BLOCK POOL::
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
TRN TBL::
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x01 0x00 0x0003 0x0002 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000
0x02 0x00 0x0003 0x0003 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000
0x03 0x00 0x0003 0x0004 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000
............省略中间一部分................
0x1f 0x00 0x0003 0x0020 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000
0x20 0x00 0x0003 0x0021 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000
0x21 0x00 0x0003 0xffff 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000
xid: 0x0013.000. seq: 0x1 cnt: 0x2 irb: 0x2 icl: 0x0 flg: 0x0000
Rec Offset Rec Offset Rec Offset Rec Offset
Rec Offset --undo信息偏移量,在undo块中偏移
---------------------------------------------------------------------------
0x01 0x1f58 0x02 0x1ef4 --当前undo块中的最后一个偏移地址即Ox02 与irb一致
当中irb:0x2 表示未提交事务最新(最后运行的)变更相应的undo数据块中的UNDO record地址,假设開始rollback,这是回滚的起点。
*-----------------------------
(0x00011ed0) objd: tblspc: (0x00000004) --依据Rec
#0x2 中的rci记录找到#0x1
( rci 0x00 。表示这是事务回滚过程中的最后一条记录
Undo type: Regular undo Begin trans Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000Ext idx:
flg2:
*-----------------------------
uba: 0x00000000.0000.00 ctl max scn: 0x0000.000e61e6 prv tx scn: 0x0000.000e61e6
txn
prev brb: prev bcl:
KDO undo record:
KTB Redo
op: 0x03 ver: 0x01
compat (post) padding:
op: Z
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000c3 hdba: 0x010000aa
itli: ispac: maxfr:
tabn: slot: (0x46) flag: 0x2c ckix: --slot表示更新数据的行序列值(rowno),用于定位详细的数据。与我们查询的一致
ncol: nnew:
col : [ ] ---转换为字符为‘PROCEDURE’。与我们更新前数据一致
转换方法:
SELECT utl_raw.cast_to_varchar2(replace('50 52 4f 43 45 44 55 52 45',' ')) value FROM dual;
*-----------------------------
(0x00011ed0) objd: tblspc: (0x00000004)
( rci 0x01 --指向REC#
0x01。即上一个偏移量
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
compat (post) padding:
op: . --这个uba表示undo chain tx table。即同一update语句中的undo chain地址,这里为1,指向第一个偏移量。一个事务中的不同DML语句,无法通过该參数连接起来(形成undo
chain)。由于该參数,不能跨越DML语句。
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000c3 hdba: 0x010000aa
itli: ispac: maxfr:
tabn: slot: (0x47) flag: 0x2c ckix: --slot表示更新数据的行序列值(rowno),用于定位详细的数据,与我们查询的一致
ncol: nnew:
col : [ ] --与上面描写叙述的一样,转换为字符为‘PROCEDURE’,与我们更新前数据一致
Rec #0x2 这条undo record中还记录了一个rci參数,表示undo chain。同一个事务中的多次改动,依据这个chain连接起来。
当前rci參数值为0x01,即指向该undo块中的第一个undo record,找到Rec #0x01 undo record后,检查发现确实是我们这个UPDATE语句中的被更新的还有一条数据。
rows updated.
SQL> SELECT
dbms_rowid.rowid_object(rowid) object_id,
dbms_rowid.rowid_relative_fno(rowid) REL_FNO,
dbms_rowid.rowid_block_number(rowid) BLOCKNO,
dbms_rowid.rowid_row_number(rowid) ROWNO,rowid,id,object_name,object_type
,);
OBJECT_ID REL_FNO BLOCKNO ROWNO ROWID ID OBJECT_NAME OBJECT_TYPE
---------- ---------- ---------- ---------- ------------------ ---------- -------------------- ---------------
AAAR7QAAEAAAADsAAp DBMS_FEATURE_RMAN_BZ PROCEDURE
IP2
AAAR7QAAEAAAADsAAq DBMS_FEATURE_RMAN_BA PROCEDURE
SIC
SQL> select xidusn,xidslot,xidsqn,ubablk,ubafil,ubarec,to_char(start_scnw,'xxxxxxxx')
start_scnw,
to_char(start_scnb,,)
start_scn
from v$transaction;
XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL UBAREC START_SCNW START_SCNB START_SCN
---------- ---------- ---------- ---------- ---------- ---------- -------------------- -------------------- ----------
SQL> alter system flush buffer_cache;
System altered.
block ;
System altered.
block ;
System altered.
SQL> alter system dump undo header '_SYSSMU19$';
System altered.
block ;
System altered.
Block header dump: 0x010000c3
Object id on Block?
Y
seg flg: E typ: - DATA
brn: bdba: 0x10000b8 ver: 0x01 opc:
inc: exflg:
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0xffff.000.00000000 0x00000000.0000.00 scn 0x0000.000f2e95
0x02 0x0013.000. 0x01400102.. ----
fsc 0x000a.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 fsc 0x0000.00000000
bdba: 0x010000c3
data_block_dump,data header at 0x2b5f5d4e6a7c
.........省略trace 文件里后面的输出.............
事务中第二个update语句改动的数据块(4。236)上的事务信息与我们查询的一致,例如以下
Block header dump: 0x010000ec
Object id on Block?
Y
seg flg: E typ: - DATA
brn: bdba: 0x10000e8 ver: 0x01 opc:
inc: exflg:
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0xffff.000.00000000 0x00000000.0000.00 scn 0x0000.000f2e95
0x02 0x0013.000.00000004 0x01400102.0001.04 ---- 2 fsc 0x000a.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 fsc 0x0000.00000000
bdba: 0x010000ec
data_block_dump,data header at 0x2b5f5d4e6a7c
..........省略一部分..........
tab , , @0x38f
tl: fb: --H-FL-- lb:
0x2 cc:
col : [ ] c3
col : [ ] c3
col : []
col : [ ]
tab , , @0x365
tl: fb: --H-FL-- lb:
0x2 cc:
col : [ ] c3
col : [ ] c3
col : []
.........省略trace 文件里后面的输出.............
********************************************************************************
...............省略一部分..............
TRN CTL:: seq: 0x0001 chd: 0x0001 ctl: 0x0021 inc: 0x00000000 nfb: 0x0000
mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
uba: 0x01400102.0001.01 scn: 0x0000.000e61e6
Version: 0x01
FREE BLOCK POOL::
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
TRN TBL::
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x00 10 0x80 0x0004 0x0000 0x0000.00000000 0x01400102 0x0000.000.00000000 0x00000001 0x00000000 0
0x01 9 0x00 0x0003 0x0002 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 0
0x02 9 0x00 0x0003 0x0003 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 0
0x03 9 0x00 0x0003 0x0004 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 0
0x04 9 0x00 0x0003 0x0005 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 0
0x05 9 0x00 0x0003 0x0006 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 0
.........省略trace 文件里后面的输出.............
xid: 0x0013.000. seq: 0x1 cnt: 0x4 irb: 0x4 icl: 0x0 flg: 0x0000
Rec Offset Rec Offset Rec Offset Rec Offset
Rec Offset
---------------------------------------------------------------------------
0x01 0x1f58 0x02 0x1ef4 0x03 0x1e98 0x04 0x1e34
*-----------------------------
(0x00011ed0) objd: tblspc: (0x00000004)
( rci 0x00
Undo type: Regular undo Begin trans Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000Ext idx:
flg2:
*-----------------------------
uba: 0x00000000.0000.00 ctl max scn: 0x0000.000e61e6 prv tx scn: 0x0000.000e61e6
txn
prev brb: prev bcl:
KDO undo record:
KTB Redo
op: 0x03 ver: 0x01
compat (post) padding:
op: Z
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000c3 hdba: 0x010000aa
itli: ispac: maxfr:
tabn: slot: (0x46) flag: 0x2c ckix:
ncol: nnew:
col : [ ]
*-----------------------------
(0x00011ed0) objd: tblspc: (0x00000004)
( rci 0x01
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
compat (post) padding:
op: .
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000c3 hdba: 0x010000aa
itli: ispac: maxfr:
tabn: slot: (0x47) flag: 0x2c ckix:
ncol: nnew:
col : [ ]
*-----------------------------
(0x00011ed0) objd: tblspc: (0x00000004)
( rci 0x02
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x03 ver: 0x01
compat (post) padding:
op: Z
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000ec hdba: 0x010000aa --bdba:4,236。即我们update语句改动的数据块,与查询出来的信息一致
itli: ispac: maxfr:
tabn: slot: (0x29) flag: 0x2c ckix:
ncol: nnew:
col : [ ] ---转换为字符为‘PROCEDURE’,与我们更新前数据一致
*-----------------------------
(0x00011ed0) objd: tblspc: (0x00000004)
( rci 0x03
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
compat (post) padding:
op: .03
--新发起的update语句,uba參数值与第一条不同(Rec #0x2 undo record记录),事务中的每一个DML语句保存自己的uba,用于语句回滚
xtype: XA flags: 0x00000000 bdba: 0x010000ec hdba: 0x010000aa ,。即我们update语句改动的数据块,与查询出来的信息一致
itli: ispac: maxfr:
tabn: slot: (0x2a) flag: 0x2c ckix:
ncol: nnew:
col : [ ] ---转换为字符为‘PROCEDURE’,与我们更新前数据一致
file#: minblk maxblk
rows updated.
SQL> select xidusn,xidslot,xidsqn,ubablk,ubafil,ubarec,to_char(start_scnw,'xxxxxxxx')
start_scnw,
to_char(start_scnb,,)
start_scn
from v$transaction;
XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL UBAREC START_SCNW START_SCNB START_SCN
---------- ---------- ---------- ---------- ---------- ---------- -------------------- -------------------- ----------
UBABLK之前为258,如今查询出来为259,因此能够肯定眼下事务使用已经超过一个UNDO block。
System altered.
block ;
System altered.
SQL> alter system dump undo header '_SYSSMU19$';
System altered.
Undo Segment: _SYSSMU19$ ()
********************************************************************************
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: spare2: #extents: #blocks:
Highwater:: 0x01400103 ext#: blk#: ext
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
Unlocked
Map Header:: next 0x00000000 #extents: 2 obj#: 0 flag: 0x40000000
Extent Map
-----------------------------------------------------------------
0x01400101 length: 7
0x01400108 length: 8
Retention Table
-----------------------------------------------------------
Extent Number:0 Commit Time: 0
Extent Number:1 Commit Time: 0
TRN CTL:: seq: 0x0001 chd: 0x0001 ctl: 0x0021 inc: 0x00000000 nfb: 0x0000
mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
uba: 0x01400102.0001.01 scn: 0x0000.000e61e6
Version: 0x01
FREE BLOCK POOL::
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
TRN TBL::
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x00 10 0x80 0x0004 0x0000 0x0000.00000000 0x01400103 0x0000.000.00000000 0x00000002 0x00000000 0
0x01 9 0x00 0x0003 0x0002 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 0
0x02 9 0x00 0x0003 0x0003 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 0
0x03 9 0x00 0x0003 0x0004 0x0000.000e61e6 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 0
.........省略trace 文件里后面的输出.............
能够看到dba的地址已经发生改变。指向最新使用的undo block地址。即datafile 5,block 259
UNDO BLK:
xid: 0x0013.000. seq: 0x1 cnt: 0x14 irb: 0x14 icl: 0x0 flg: 0x0000
Rec Offset Rec Offset Rec Offset Rec Offset
Rec Offset
---------------------------------------------------------------------------
0x01 0x1f88 0x02 0x1f28 0x03 0x1ec8 0x04 0x1e68 0x05 0x1e08
0x06 0x1da8 0x07 0x1d48 0x08 0x1ce8 0x09 0x1c88 0x0a 0x1c28
0x0b 0x1bc8 0x0c 0x1b68 0x0d 0x1b08 0x0e 0x1aa8 0x0f 0x1a48
0x10 0x19e8 0x11 0x1988 0x12 0x1928 0x13 0x18c8 0x14 0x1868
*-----------------------------
(0x00011ed0) objd: tblspc: (0x00000004)
( rci 0x00
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x01400102
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
compat (post) padding:
op: . --当一个事务使用多个undo
block时,事务使用的undo块顺序,是依据这个參数串联起来,即undo chain
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000ab hdba: 0x010000aa
itli: ispac: maxfr:
tabn: slot: (0xc9) flag: 0x2c ckix:
ncol: nnew:
col : [ ]
*-----------------------------
(0x00011ed0) objd: tblspc: (0x00000004)
( rci 0x01
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
compat (post) padding:
op: .
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000ab hdba: 0x010000aa
itli: ispac: maxfr:
tabn: slot: (0xcd) flag: 0x2c ckix:
ncol: nnew:
col : [ ]
*-----------------------------
.................省略一部分................
*-----------------------------
(0x00011ed0) objd: tblspc: (0x00000004)
( rci 0x12
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
compat (post) padding:
op: .
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000ab hdba: 0x010000aa
itli: ispac: maxfr:
tabn: slot: (0xef) flag: 0x2c ckix:
ncol: nnew:
col : [ ]
*-----------------------------
(0x00011ed0) objd: tblspc: (0x00000004)
--这个相应irb參数:0x14,也相应ITL中的UBA第三个參数:undo record的開始地址。
( rci 0x13
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
compat (post) padding:
op: .
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000ab hdba: 0x010000aa
itli: ispac: maxfr:
tabn: slot: (0xf1) flag: 0x2c ckix:
ncol: nnew:
col : [ ] 4c 45
---转化为字符,能够发现与我们更新的旧值同样。符合我们的语气
file#: minblk maxblk
我们能够看到例如以下内容(省略无用信息),注意undo record中的uba參数
*-----------------------------
(0x00011ed0) objd: tblspc: (0x00000004)
( rci 0x03
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
compat (post) padding:
op: .
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000ec hdba: 0x010000aa
itli: ispac: maxfr:
tabn: slot: (0x2a) flag: 0x2c ckix:
ncol: nnew:
col : [ ]
*-----------------------------
(0x00011ed0) objd: tblspc: (0x00000004)
( rci 0x04
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x03 ver: 0x01
compat (post) padding:
op: Z
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000ab hdba: 0x010000aa
itli: ispac: maxfr:
tabn: slot: (0x0) flag: 0x2c ckix:
ncol: nnew:
col : [ ]
*-----------------------------
(0x00011ed0) objd: tblspc: (0x00000004)
( rci 0x05
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
compat (post) padding:
op: .05
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010000ab hdba: 0x010000aa
itli: ispac: maxfr:
tabn: slot: (0x2) flag: 0x2c ckix:
ncol: nnew:
col : [ ]
- UNDO段头中TRN CTL的uba參数:UNDO段头的事务表中最后(最新)一个事务的相应的undo
block上的第一个undo record,即当这个回滚段头存在多个事务时,这个uba表示最新的事务的uba地址,这个地址在整个事务的周期内不发生改变(除非这个回滚段头上又分配了一个新的事务表),因此。这个地址指向的是事务使用的第一个undo block; - UNDO BLOCK中undo record记录中的uba參数:假设事务中的一个DML语句须要使用多个undo record,则这个參数指向的是前一个undo record的记录。通过这个參数能够形成同一个DML语句的undo
chain tx table。可是一个事务中的不同DML语句,无法通过该參数连接起来(形成undo chain)。由于该參数,不能跨越DML语句。当一个事务使用多个undo
block时。事务使用的undo块顺序。是依据这个參数串联起来; - 数据块头的ITL中的uba參数:指向事务在这个数据块上的变更(改动)所使用的undo块中的最后一个undo
record偏移量地址,针对这个数据块改动,这个uba是回滚的起点。 - UNDO record中的bdba表示block address 。hdba表示 segment header address
- undo块中不会直接保存rowid信息,可是oracle全然能够undo record中几个信息(bdba,slot,objd),生成数据变更是的详细地址(rowid);
- 一个事务所使用的undo记录顺序是通过undo record中的uba參数、rci參数,undo块上的irb,itl中的uba共同起作用来串联变更的顺序,事务的回滚也是依据这个undo chain按顺序完毕。
当中最关键的两个參数:undo
record中的uba 形成单个dml语句的undo chain,rci參数能够跨越DML语句,能够指向事务中前一个dml语句使用的undo
record。
oracle回滚机制深入研究的更多相关文章
- Hadoop HDFS概念学习系列之HDFS升级和回滚机制(十二)
不多说,直接上干货! HDFS升级和回滚机制 作为一个大型的分布式系统,Hadoop内部实现了一套升级机制,当在一个集群上升级Hadoop时,像其他的软件升级一样,可能会有新的bug或一些会影响现有应 ...
- spring boot开启事务管理,使用事务的回滚机制,使两条插入语句一致
spring boot 事务管理,使用事务的回滚机制 1:配置事务管理 在springboot 启动类中添加 @EnableTransactionManagement //开启事务管理 @Enable ...
- Oracle 回滚段undo
Undo的作用 数据的回滚 一致性读 表的闪回(事务,查询的闪回..) 失败会话的恢复 回滚rollback操作 SQL> archive log list; ORA-01031: 权限不足 S ...
- Oracle 回滚(ROLLBACK)和撤销(UNDO)
一.回滚(ROLLBACK)和撤销(UNDO) 回滚和前滚是保证Oracle数据库中的数据处于一致性状态的重要手段. 在9i版本以前 Oracle使用数据库中的回滚段来实现未提交数据或因系统故障导致实 ...
- Oracle回滚段的概念,用法和规划及问题的解决
回滚段概述 回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值).回滚段的头部包含正在使用的该回滚段事务的信息.一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚段可以存放多个事务的回 ...
- sprint test 添加事务回滚机制
1.原因: 单元测试的时候频繁操作数据库需要修改很多数据,造成不必要的操作,添加事务之后就可以重复对一条数据进行操作,并且在返回结果后进行回滚. 2.解决: 原先继承的是 AbstractJUnit ...
- 关于MySQL回滚机制
在事务中,每个正确的原子操作都会被顺序执行,直到遇到错误的原子操作,此时事务会将之前的操作进行回滚.回滚的意思是如果之前是插入操作,那么会执行删 除插入的记录,如果之前是update操作,也会执行up ...
- java方法 throws exception 事务回滚机制
使用spring难免要用到spring的事务管理,要用事务管理又会很自然的选择声明式的事务管理,在spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检 ...
- MySQL InnoDB加锁超时回滚机制(转)
add by zhj: 看来我对MySQL的理解还有待深入,水还是挺深的啊,MySQL给记录加锁时,可以通过innodb_lock_wait_timeout参数设置超时时间, 如果加锁等待超过这个时间 ...
随机推荐
- HTML5中类jQuery选择器querySelector和querySelectorAll的使用
支持的浏览IE8+,Firefox3.5+,Safari3.1+ Chrome和Opera 10+ 1.querySelector()方法接收一个选择符,返回第一个匹配的第一个元素,如果没有返回nul ...
- 2018-10-31-C#-程序内的类数量对程序启动的影响
title author date CreateTime categories C# 程序内的类数量对程序启动的影响 lindexi 2018-10-31 14:7:6 +0800 2018-10-1 ...
- WPF 动画执行后属性无法修改
在做了一个类似QQ展开的动画时,设置了TopProperty,通过改变Window.Top属性来实现展开特效, 但是动画执行了之后,再去设置Window.Top的时候发现修改不了,代码调试后发现值设置 ...
- day18 17.c3p0连接池使用
连接池时间长不用空闲着,dbcp是不回收的,性能可能有些问题.c3p0是可以自动回收.实际开发中c3p的生产力比dbcp强,性能上更强. package cn.itcast.datasource; i ...
- linux实时系统监控工具mpstat
mpstat (RHEL5默认不安装) mpstat是MultiProcessor Statistics的缩写,是实时系统监控工具.其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件 ...
- Codevs1922 骑士共存问题
1922 骑士共存问题 题目描述 Description 在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入. 对于给定的n*n个方格的国 ...
- Djngo 请求的生命周期
1.Django请求的生命周期 路由系统 -> 试图函数(获取模板+数据=>渲染) -> 字符串返回给用户 2.路由系统 /index/ -> 函数或类.as_view() / ...
- ACdream 1007 (快速幂)
题目链接 a + b Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Problem D ...
- linux小介绍
常用命令
- AJAX之再升级版PJAX
前几天在一个大神群里提到ajax优化选项卡功能的方法上,有位低调的大神默默得打出:了解一下pjax,好奇心的驱使下,我具体查了一下pjax,不一般啊,ax结合pushState和ajax技术, 不需要 ...