为了保证事务的回退和满足多用户的 CR , oracle 引入了 undo 机制, 由于 undo 是循环使用的,在一个事务完成过程中,它与 redo 相互配合,其中 undo 在一次事务中需要完成以下工作:
(1) Transaction 开始前 回滚段获取一个 ITL( 事务槽 ) ,分配空间, 记录事务信息
(2) Transaction 提交后, redo 完成记录,同时还清除回滚段的事务信息 包括行级锁, ITL 信息 (commit 标志, SCN 等 )
清除这些事务段的信息的过程就叫做 块清除, 在完成块清除时 , 我们本事务修改的数据块就会存在两种可能 (1) 所有的数据块还保存在 buffer cache 中, (2) 部分数据块或者是全部数据块由于 LRU 管理 已经被刷出了 buffer cache 。 oracle 为了考虑到块清除的成本,以及性能,会作以下两种方式的块清除处理:
(1) 快速块清除 (fast block cleanout ), 当事务修改的数据库 全部保存在 buffer cache 并且修改数据块的数据量没有超过 cache buffer 的 10% ,快速清除事务信息。
(2) 延迟块清除 (delayed block cleanout) 当修改的数据块的阀值超过 10% 或者本次事务相关的数据块已经被刷出了 buffer cache , oracle 会下次访问此 block 时再清除事务信息。
下面通过一个实验 测试,来熟悉一下 delayed block cleanout 的处理
SQL> select * from v$version ;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 – Production
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
SQL> conn japie/japie
Connected.
SQL> create table test_delayed as select * from user_objects;
Table created.
SQL> select count(1) from test_delayed;
COUNT(1)
----------
3
SQL> update test_delayed set object_id=1 where object_name='TEST_REDO';
1 row updated.
SQL> update test_delayed set object_id=2 where object_name='TEST_DELAYED';
1 row updated.
SQL> ----- 不提交
查询回滚段信息 :
SQL> col segment_name for a20;
select owner,segment_name,SEGMENT_ID,FILE_ID,BLOCK_ID,STATUS
SQL> tablespace_name from dba_rollback_segs;
2
OWNER SEGMENT_NAME SEGMENT_ID FILE_ID BLOCK_ID TABLESPACE_NAME
------ -------------------- ---------- ---------- ---------- ----------------
SYS SYSTEM 0 1 9 ONLINE
PUBLIC _SYSSMU1$ 1 2 9 ONLINE
PUBLIC _SYSSMU2$ 2 2 25 ONLINE
PUBLIC _SYSSMU3$ 3 2 41 ONLINE
PUBLIC _SYSSMU4$ 4 2 57 ONLINE
PUBLIC _SYSSMU5$ 5 2 73 ONLINE
PUBLIC _SYSSMU6$ 6 2 89 ONLINE
PUBLIC _SYSSMU7$ 7 2 105 ONLINE
PUBLIC _SYSSMU8$ 8 2 121 ONLINE
PUBLIC _SYSSMU9$ 9 2 137 ONLINE
PUBLIC _SYSSMU10$ 10 2 153 ONLINE
11 rows selected.
查询事务信息
SQL> select xidusn,xidslot,xidsqn,ubablk,ubafil,ubarec from v$transaction;
XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL UBAREC
---------- ---------- ---------- ---------- - --------- ----------
6 40 427 99 2 7
查询该活动事务所在的回滚段
SQL> select * from v$rollname where usn = &usn;
Enter value for usn: 6
old 1: select * from v$rollname where usn = &usn
new 1: select * from v$rollname where usn = 6
USN NAME
---------- ------------------------------
6_SYSSMU6$
查询 test_delayed 对象所在的 fileid 和 blockid 由于数据对象还存在 buffer
SQL> select b.segment_name,a.file#,a.dbarfil,a.dbablk,a.class,
2 a.state,decode(bitand(flag,1), 0, 'N', 'Y') DIRTY
3 from x$bh a,dba_extents b
4 where b.RELATIVE_FNO = a.dbarfil
5 and b.BLOCK_ID <= a.dbablk and b.block_id + b.blocks > a.dbablk
6 and b.owner='GABRIEL' and b.segment_name='TEST_DELAYED';
SEGMENT_NAME FILE# DBARFIL DBABLK CLASS STATE D
-------------------- ---------- ---------- ---------- ---------- ---------- -
TEST_DELAYED 8 8 28 1 1 N
TEST_DELAYED 8 8 28 1 3 N
TEST_DELAYED 8 8 28 1 3 N
TEST_DELAYED 8 8 27 4 1 N
TEST_DELAYED 8 8 27 4 3 N
由上可知: x$bh.class= 4 表示为 segment header x$bh.state =3 为前镜像块,因此 file#=8
Dbablk=28 为数据块
SQL> alter system dump datafile 8 block 28;
System altered.
SQL> alter system dump undo header '_SYSSMU6$';
System altered.
SQL> alter system dump datafile 2 block 99;
System altered.
SQL> @gettrname.sql
TRACE_FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/admin/gabriel/udump/gabriel_ora_4756.trc
以下为 trace 文件中的截图部分
Block header dump: 0x0200001c
Object id on Block? Y
seg/obj: 0xcf1a csc: 0x00.f4707 itc: 3 flg: E typ: 1 - DATA
brn: 0 bdba: 0x2000019 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.000f4707
0x02 0x0006.028.000001ab 0x00800063.0156.07 ---- 2 fsc 0x0004.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
--- 事务信息存在
tab 0, row 1, @0x1cf8
tl: 76 fb: --H-FL--lb: 0x2 cc: 12
col 0: [ 9] 54 45 53 54 5f 52 45 44 4f
col 1: *NULL*
col 2: [ 2] c1 02
col 3: [ 4] c3 06 1d 2d
col 4: [ 5] 54 41 42 4c 45
col 5: [ 7] 78 6f 06 17 0d 0c 23
col 6: [ 7] 78 6f 06 17 0d 0c 23
col 7: [19] 32 30 31 31 2d 30 36 2d 32 33 3a 31 32 3a 31 31 3a 33 34
col 8: [ 5] 56 41 4c 49 44
col 9: [ 1] 4e
col 10: [ 1] 4e
col 11: [ 1] 4e
tab 0, row 2, @0x1ca9
tl: 79 fb: --H-FL--lb: 0x2 cc: 12
col 0: [12] 54 45 53 54 5f 44 45 4c 41 59 45 44
col 1: *NULL*
col 2: [ 2] c1 03
col 3: [ 4] c3 06 1f 13
col 4: [ 5] 54 41 42 4c 45
col 5: [ 7] 78 6f 08 14 16 02 35
col 6: [ 7] 78 6f 08 14 16 02 35
col 7: [19] 32 30 31 31 2d 30 38 2d 32 30 3a 32 31 3a 30 31 3a 35 32
col 8: [ 5] 56 41 4c 49 44
col 9: [ 1] 4e
col 10: [ 1] 4e
col 11: [ 1] 4e
end_of_block_dump
End dump data blocks tsn: 9 file#: 8 minblk 28 maxblk 28
*** 2011-08-20 23:25:38.403
--- 锁信息也存在
再来仔细看看 undo segment header 信息:
TRN TBL::
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x28 10 0x80 0x01ab 0x0002 0x0000.000f59ac 0x00800063 0x0000.000.00000000 0x00000001 0x00000000 0
0x28 转化为十进制为 40 刚好为前面查询的事务槽, state 状态为 10 表示活动事务, dba 0x00800063 转化为 2 进制 0000 0000 1000 0000 0000 0000 0110 0011 根据 dba 的转换 2 号 文件的 64+32+2+1 =99
接下来我们看看 undo 段的转存信息 ( 限于篇幅, 只截取了部分关键信息 )
Start dump data blocks tsn: 1 file#: 2 minblk 99 maxblk 99
buffer tsn: 1 rdba: 0x00800063 (2/99)
scn: 0x0000.000f59c1 seq: 0x01 flg: 0x04 tail: 0x59c10201
frmt: 0x02 chkval: 0xa7ae type: 0x02=KTU UNDO BLOCK
Hex dump of block: st=0, typ_found=1
…….
UNDO BLK:
xid: 0x0006.028.000001ab seq: 0x156 cnt: 0x7 irb: 0x7 icl: 0x0 flg: 0x0000
Rec Offset Rec Offset Rec Offset Rec Offset Rec Offset
---------------------------------------------------------------------------
0x01 0x1ecc 0x02 0x1e00 0x03 0x1d1c 0x04 0x1c80 0x05 0x1c04
0x06 0x1ad0 0x07 0x19c4
*-----------------------------
* Rec #0x1 slt: 0x06 objn: 49948(0x0000c31c) objd: 49948 tblspc: 2(0x00000002)
* Layer: 11 (Row) opc: 1 rci 0x00
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00800062
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
op: C uba: 0x00800062.0156.1e
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x00c05be8 hdba: 0x00c05be3
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 7(0x7) flag: 0x2c lock: 0 ckix: 0
ncol: 12 nnew: 2 size: 0
col 9: [ 1] 80
col 10: [ 1] 80
*-----------------------------
* Rec #0x2 slt: 0x06 objn: 49871(0x0000c2cf) objd: 49871 tblspc: 2(0x00000002)
* Layer: 10 (Index) opc: 22 rci 0x01
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
index undo for leaf key operations
KTB Redo
op: 0x04 ver: 0x01
op: L itl: xid: 0x0003.02a.000001b9 uba: 0x008000d7.0174.23
………..
*-----------------------------
* Rec #0x6 slt: 0x28 objn: 53018(0x0000cf1a) objd: 53018 tblspc: 9(0x00000009)
* Layer: 11 (Row) opc: 1 rci 0x00
Undo type: Regular undo Begin trans Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
uba: 0x00800063.0156.04 ctl max scn: 0x0000.000f5354 prv tx scn: 0x0000.000f535c
txn start scn: scn: 0x0000.000f59ac logon user: 64
prev brb: 8388871 prev bcl: 0
KDO undo record:
KTB Redo
op: 0x03 ver: 0x01
op: Z
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x0200001c hdba: 0x0200001b
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 1(0x1) flag: 0x2c lock: 0 ckix: 183
ncol: 12 nnew: 1 size: 2
col 2: [ 4] c3 06 1d 2d
*-----------------------------
*Rec #0x7 slt: 0x28 objn: 53018(0x0000cf1a) objd: 53018 tblspc: 9(0x00000009)
* Layer: 11 (Row) opc: 1 rci 0x06
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
op: C uba: 0x00800063.0156.06
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x0200001c hdba: 0x0200001b
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 2(0x2) flag: 0x2c lock: 0 ckix: 0
ncol: 12 nnew: 1 size: 2
col 2: [ 4] c3 06 1f 13
End dump data blocks tsn: 1 file#: 2 minblk 99 maxblk 99
---irb: 0x7 最近未提交事务的起始 回滚点 ,回滚段信息偏移量的最后偏移地址 刚好相等
-- rci 0x06 代表 undo chain 下一偏移量地址
上面 dump 信息 是整个事务在没有 commit 的情况下产生, 下面我们 flush 一下 buffer_cache 将 buffer cache 中的前数据块写入 dbfile , 然后将事务 commit ,我们再认真比对 dump 信息,
SQL> alter system flush buffer_cache;
System altered.
------ 在事务窗体进行以下操作:
SQL> show user
USER is "GABRIEL"
SQL> commit;
Commit complete.
重复以上 dump 操作
…….
SQL> alter system dump datafile 2 block 99;
System altered.
SQL> @gettrname.sql
TRACE_FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/admin/gabriel/udump/japie_ora_4963.trc
先看看数据块的 dump 信息
Block header dump: 0x0200001c
Object id on Block? Y
seg/obj: 0xcf1a csc: 0x00.f4707 itc: 3 flg: E typ: 1 - DATA
brn: 0 bdba: 0x2000019 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.000f4707
0x02 0x0006.028.000001ab 0x00800063.0156.07 ---- 2 fsc 0x0004.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
tab 0, row 1, @0x1cf8
tl: 76 fb: --H-FL-- lb: 0x2 cc: 12
col 0: [ 9] 54 45 53 54 5f 52 45 44 4f
col 1: *NULL*
col 2: [ 2] c1 02
col 3: [ 4] c3 06 1d 2d
col 4: [ 5] 54 41 42 4c 45
col 5: [ 7] 78 6f 06 17 0d 0c 23
col 6: [ 7] 78 6f 06 17 0d 0c 23
col 7: [19] 32 30 31 31 2d 30 36 2d 32 33 3a 31 32 3a 31 31 3a 33 34
col 8: [ 5] 56 41 4c 49 44
col 9: [ 1] 4e
col 10: [ 1] 4e
col 11: [ 1] 4e
tab 0, row 2, @0x1ca9
tl: 79 fb: --H-FL-- lb: 0x2 cc: 12
col 0: [12] 54 45 53 54 5f 44 45 4c 41 59 45 44
col 1: *NULL*
col 2: [ 2] c1 03
col 3: [ 4] c3 06 1f 13
col 4: [ 5] 54 41 42 4c 45
col 5: [ 7] 78 6f 08 14 16 02 35
col 6: [ 7] 78 6f 08 14 16 02 35
col 7: [19] 32 30 31 31 2d 30 38 2d 32 30 3a 32 31 3a 30 31 3a 35 32
col 8: [ 5] 56 41 4c 49 44
col 9: [ 1] 4e
col 10: [ 1] 4e
col 11: [ 1] 4e
end_of_block_dump
End dump data blocks tsn: 9 file#: 8 minblk 28 maxblk 28
*** 2011-08-21 00:18:07.820
可以看出数据块的信息与 commit 之前的内容基本吻合
再来仔细看看 undo segment header 信息:
0x27 9 0x00 0x01ab 0x0015 0x0000.000f5655 0x00800062 0x0000.000.00000000 0x00000002 0x00000000 1313850640
0x28 9 0x00 0x01ab 0xffff 0x0000.000f6a64 0x00800063 0x0000.000.00000000 0x00000001 0x00000000 1313857062
0x29 9 0x00 0x01aa 0x000a 0x0000.000f54e4 0x00800108 0x0000.000.00000000 0x00000001 0x00000000 1313849990
----- 事务已经提交
接下来我们看看 undo 段的转存信息 ( 限于篇幅, 只截取了部分关键信息 )
*** 2011-08-21 00:18:20.252
Start dump data blocks tsn: 1 file#: 2 minblk 99 maxblk 99
buffer tsn: 1 rdba: 0x00800063 (2/99)
scn: 0x0000.000f59c1 seq: 0x01 flg: 0x04 tail: 0x59c10201
frmt: 0x02 chkval: 0xa7ae type: 0x02=KTU UNDO BLOCK
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x0D50A600 to 0x0D50C600
UNDO BLK:
xid: 0x0006.028.000001ab seq: 0x156 cnt: 0x7 irb: 0x7 icl: 0x0 flg: 0x0000
Rec Offset Rec Offset Rec Offset Rec Offset Rec Offset
---------------------------------------------------------------------------
0x01 0x1ecc 0x02 0x1e00 0x03 0x1d1c 0x04 0x1c80 0x05 0x1c04
0x06 0x1ad0 0x07 0x19c4
*-----------------------------
* Rec #0x1 slt: 0x06 objn: 49948(0x0000c31c) objd: 49948 tblspc: 2(0x00000002)
* Layer: 11 (Row) opc: 1 rci 0x00
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00800062
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
op: C uba: 0x00800062.0156.1e
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x00c05be8 hdba: 0x00c05be3
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 7(0x7) flag: 0x2c lock: 0 ckix: 0
ncol: 12 nnew: 2 size: 0
col 9: [ 1] 80
col 10: [ 1] 80
*-----------------------------
* Rec #0x2 slt: 0x06 objn: 49871(0x0000c2cf) objd: 49871 tblspc: 2(0x00000002)
* Layer: 10 (Index) opc: 22 rci 0x01
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
index undo for leaf key operations
KTB Redo
op: 0x04 ver: 0x01
op: L itl: xid: 0x0003.02a.000001b9 uba: 0x008000d7.0174.23
flg: C--- lkc: 0 scn: 0x0000.000f5659
Dump kdilk : itl=2, kdxlkflg=0xc1 sdc=0 indexid=0xc059ab block=0x00c059b0
*-----------------------------
* Rec #0x6 slt: 0x28 objn: 53018(0x0000cf1a) objd: 53018 tblspc: 9(0x00000009)
* Layer: 11 (Row) opc: 1 rci 0x00
Undo type: Regular undo Begin trans Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
uba: 0x00800063.0156.04 ctl max scn: 0x0000.000f5354 prv tx scn: 0x0000.000f535c
txn start scn: scn: 0x0000.000f59ac logon user: 64
prev brb: 8388871 prev bcl: 0
KDO undo record:
KTB Redo
op: 0x03 ver: 0x01
op: Z
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x0200001c hdba: 0x0200001b
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 1(0x1) flag: 0x2c lock: 0 ckix: 183
ncol: 12 nnew: 1 size: 2
col 2: [ 4] c3 06 1d 2d
*-----------------------------
* Rec #0x7 slt: 0x28 objn: 53018(0x0000cf1a) objd: 53018 tblspc: 9(0x00000009)
* Layer: 11 (Row) opc: 1 rci 0x06
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
op: C uba: 0x00800063.0156.06
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x0200001c hdba: 0x0200001b
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 2(0x2) flag: 0x2c lock: 0 ckix: 0
ncol: 12 nnew: 1 size: 2
col 2: [ 4] c3 06 1f 13
由两次的 dump 对比可以得出: 块延迟清除 只是更改了 undo segment header 的事务信息状态, 数据块 与 undo 块信息均保持不变
--
SQL> set echo off
SQL> set autotrace on
SQL> select * from gabriel.test_delayed; --- 将数据块再次缓存在 cache buffer
Note
-----
- dynamic sampling used for this statement
Statistics
----------------------------------------------------------
178 recursive calls
0 db block gets
27 consistent gets
7 physical reads
72 redo size
1364 bytes sent via SQL*Net to client
385 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
4 sorts (memory)
0 sorts (disk)
3 rows processed
再次转存 数据块信息
SQL> alter system dump datafile 8 block 28;
System altered.
SQL> @gettrname.sql
TRACE_FILE_NAME
--------------------------------------------------------------------------------
/u01/app/oracle/admin/gabriel/udump/gabriel_ora_5017.trc
再次观察数据块的 dump 信息
*** 2011-08-21 00:50:23.744
*** SERVICE NAME:(SYS$USERS) 2011-08-21 00:50:23.743
*** SESSION ID:(152.73) 2011-08-21 00:50:23.743
Start dump data blocks tsn: 9 file#: 8 minblk 28 maxblk 28
buffer tsn: 9 rdba: 0x0200001c (8/28)
Block header dump: 0x0200001c
Object id on Block? Y
seg/obj: 0xcf1a csc: 0x00.f6e54 itc: 3 flg: E typ: 1 - DATA
brn: 0 bdba: 0x2000019 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.000f4707
0x02 0x0006.028.000001ab 0x00800063.0156.07 C--- 0 scn 0x0000.000f6a64
0x03 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
--- 事务信息清除
block_row_dump:
tab 0, row 0, @0x1f1d
tl: 99 fb: --H-FL-- lb: 0x0 cc: 12
col 0: [30]
42 49 4e 24 70 6c 6f 37 43 4f 51 50 35 34 54 67 51 4b 6a 41 62 67 41 4d 4a
51 3d 3d 24 30
col 1: *NULL*
col 2: [ 4] c3 06 1d 19
col 3: [ 4] c3 06 1d 19
col 4: [ 5] 54 41 42 4c 45
col 5: [ 7] 78 6f 04 1a 05 1c 21
col 6: [ 7] 78 6f 06 17 0d 08 3c
col 7: [19] 32 30 31 31 2d 30 36 2d 32 33 3a 31 32 3a 30 37 3a 35 39
col 8: [ 5] 56 41 4c 49 44
col 9: [ 1] 4e
col 10: [ 1] 4e
col 11: [ 1] 4e
tab 0, row 1, @0x1cf8
tl: 76 fb: --H-FL--lb: 0x0 cc: 12
col 0: [ 9] 54 45 53 54 5f 52 45 44 4f
col 1: *NULL*
col 2: [ 2] c1 02
col 3: [ 4] c3 06 1d 2d
col 4: [ 5] 54 41 42 4c 45
col 5: [ 7] 78 6f 06 17 0d 0c 23
col 6: [ 7] 78 6f 06 17 0d 0c 23
col 7: [19] 32 30 31 31 2d 30 36 2d 32 33 3a 31 32 3a 31 31 3a 33 34
col 8: [ 5] 56 41 4c 49 44
col 9: [ 1] 4e
col 10: [ 1] 4e
col 11: [ 1] 4e
tab 0, row 2, @0x1ca9
tl: 79 fb: --H-FL--lb: 0x0 cc: 12
col 0: [12] 54 45 53 54 5f 44 45 4c 41 59 45 44
col 1: *NULL*
col 2: [ 2] c1 03
col 3: [ 4] c3 06 1f 13
col 4: [ 5] 54 41 42 4c 45
col 5: [ 7] 78 6f 08 14 16 02 35
col 6: [ 7] 78 6f 08 14 16 02 35
--- 锁信息已经清除
总结整个 block delaye cleanout 过程
(1) 本次事务相关的数据块已经被刷出了 buffer cache , 当本次事务提交后,事务相关的 data block ,undo block 上的事务信息,锁信息不会被清除。
(2) 当 data block 再次进入 buffer cache , oracle 在读取次数据块时 作 事务信息 锁信息的清除处理