UNDO信息收集

UNDO数据是用来维护事物操作的记录。记录修改前的数据映像。
用途:
回滚活动的事务
恢复中断的事务
提供一致读
执行逻辑闪回操作
UNDO数据保存在块中,和数据块一样,会产生redo日志。
和数据块一样,UNDO有表空间,段(SEGMENT),区域(EXTENT),块(BLOCK)
Undo段头包含:
空闲的undo区域(EXTENTS)池
UNDO槽号(SLOT)集合
Version: 0x01
FREE BLOCK POOL::
uba: 0x00000000.20c0.11 ext: 0x2 spc: 0x1848
uba: 0x00000000.20c0.02 ext: 0x2 spc: 0x1ef6
uba: 0x00000000.20be.26 ext: 0x0 spc: 0xa2a
uba: 0x00000000.1f16.02 ext: 0x4 spc: 0x1f1e
uba: 0x00000000.1f16.0b ext: 0x4 spc: 0x1b0c
TRN TBL::

index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x00 9 0x00 0x9ea1 0x0003 0x0418.14952377 0x46800318 0x0000.000.00000000 0x00000001 0x00000000 1312888300
......
0x0c 10 0x80 0x9e77 0x0002 0x0418.14952662 0x46800319 0x0000.000.00000000 0x00000001 0x00000000 0
......
每个槽号(SLOT)分配给一个事务
每个槽号(SLOT)包含UNDO区域(EXTENTS)的列表
区域(EXTENTS)可以从一个UNDO段移植到另一个段
UNDO槽号(SLOT)可以循环使用,并尽量长地保留在段头中,减少出现ORA-01555的机会。
TRANSACTION ID
可以从data block中获取transaction id
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0035.01a.0000a9e6 0x468000ed.2fb1.26 C--- 0 scn 0x0418.14952662
0x02 0x0033.00c.00009e77 0x46800319.20c0.12 ---- 1 fsc 0x0000.00000000
如果事务是活动的,那么可以从视图v$transaction中获取transaction id
XIDUSN 段号
XIDSLOT 槽号(SLOT)
XIDSQN 序列号(INDEX
Undo区域(EXTENTS):
包含连续的undo block集合
多个事务可以同时写同样的段和区域(EXTENT)。
当前的区域满,第一个事务检查下一个区域(EXTENT)。如果下一个区域(EXTENT)没有包含活动事务的数据,
那么下一个区域(EXTENT)就成为当前的区域。如果下一个区域(EXTENT)包含活动事务的数据,数据库尝试
分配一个新的区域(EXTENT)。
UNDO块(block)
一个UNDO块只能分配给一个事务
UNDO块包含块头,UNDO记录
UNDO块头包含:
事务ID(XID):当前或上一个使用这个块的事务
UNDO块的序列号
UNDO块中的记录数,当前事务不需要这个。
uba: 0x46800319.20c0.10 ctl max scn: 0x0418.149521cd prv tx scn: 0x0418.149521f0
txn start scn: scn: 0x0418.149523e8 logon user: 569
prev brb: 1182794519 prev bcl: 0
KDO undo record:
KTB Redo
op: 0x03 ver: 0x01
op: Z
Array Update of 1 rows:
tabn: 0 slot: 1(0x1) flag: 0x2c lock: 0 ckix: 0
ncol: 1 nnew: 1 size: 0
KDO Op code: 21 row dependencies Disabled
xtype: XAxtype KDO_KDOM2 flags: 0x00000080 bdba: 0x012afa9c hdba: 0x012afa9b
itli: 2 ispac: 0 maxfr: 4858
vect = 0
col 0: [ 2] c1 03
UNDO记录串联在一起,这样允许事务被回滚
UNDO记录可以被循环利用,并尽量久地保持在块中,减少ORA-01555的错误
UBA-UNDO字节地址,指UNDO记录的地址。包含UNDO块的DBA,UNDO块的序列号,UNDO块中的记录
0x468000ed.2fb1.26
在视图中V$TRANSACTION也可以看到
UBAFIL, UBABLK - 文件和块号
UBASQN - 序列号
UBAREC - 记录号
UNDO的初始化参数
UNDO_RETENTION:在覆盖undo信息前,Oracle数据库尝试保留undo信息的最小时间。在undo
retetion之前的旧undo信息被成为expired,并且空间可以被新事务覆盖。在undo retention
之后的undo信息被成为unexpired,并被保留来提供一致读和闪回操作。
UNDO_RETENTION可以参考v$undostat.maxquerylen
UNDO表空间的大小:
undo的大小 = 最大的v$undostat.undoblks*undo_retention*block_size
然后再增加20%

UNDO相关视图信息:
v$undostat
undoblks - 在一段时间内产生的undo blocks。
unxpstealcnt - unexpired blocks的数目;其他的事务因为没有足够的空间开始使用这些块。
maxquerylen - 最长的运行事务
nospacerrcnt - 记录当数据库开始写undo事务块的时候,空间不可用的错误的次数
请使用浏览器的分享功能分享到微信等