Undo一个重要用途就是在对数据进行修改时候,能将数据块中被修改前的数据(注意
不是数据块,一般被称为before image)保存到回滚段中。回滚时就可以取出还原。
UNDO还有其他用途,如一致性读、闪回功能(Flashback Database及flashback drop
[recyclebin]除外)等。
-- UNDO的几种状态:
active - 活动状态的回滚段,不能够被覆盖或者是离线(offline)
inactive - 当事务提交或者是回滚之后,对应的回滚区则标记为非活动(Inactive)状态
处于非活动状态的回滚区不再为数据回滚或是数据库恢复等功能所用,但是UNDO的其它
如一致性读和闪回等功能却还是有可能用到这些回滚段。因此处于Inactive的回滚区也
并不意味着就可以马上被覆盖,这个需要取决于UNDO的RETENTION的设置(undo_retention)。
--UNDDO_RETENTION
在事务提交或回滚之后,因为flashback或一致读的需求,还需要将对应的UNDO数据
保存在UNDO表空间中一段时间,这个时间就是由undo_retention来设置的。
根据UNDDO_RETENTION可以继续将UNDO的inactive状态划分为EXPIRED,UNEXPIRED两类,
undo中超过undo_retention时间之外的inactive undo回滚区称为expired, 还处于
unod_retention时间之内的inactive undo回滚区称为unexpired .
--RETENTION GUARANTEE
UNDO_RETENTION不是说必须达到这个时间后才能被覆盖,而只是一个期望值,比如UNDO
表空间文件设置为非自动扩展,当一个大事务需要将undo中未使用的区域及过期的undo
区域都使用完了,而UNDO空间不能自动扩展,这时保证事务顺利运行优先级比较高,UNDO
中没有过期的回滚区也会被覆盖使用(从其中使用时间越早的开始),也就是说retention
设置的时间段内的UNDO非过期数据是没有保证的。10g开始提供参数RETENTION GUARANTEE
设置在tablespace的属性中,那么未过期的UNDO数据就不会再被覆盖掉了。但是设置属性
RETENTION GUARANTEE,UNDO空间不足时很可能造成事务失败,所以一般不会设置。
_UNDO_AUTOTUNE
从10g开始,Oracle提供了UNDO自动优化功能,就是在UNDO表空间非自动增长的情况下,
Oracle会根据UNDO表空间的大小来调整UNDO RETENTION的大小,自动调整RETENTION就是
最大限度的利用当前UNDO表空间的可用空间,尽可能的保留最多的UNDO数据,以最大化的
减少类似ORA-01555 等错误发生。在这种情况下的UNDO RETENTION就基本没有用处了。
默认情况下 _UNDO_AUTOTUNE =TRUE, 开启UNDO自动优化功能。经过优化的UNDO RETENTION
可以在V$UNDOSTAT的 TUNED_UNDORETENTION 中看到, 一般oracle每10分钟写一条unod表
空间使用情况记录到V$UNDOSTAT, 包括 TUNED_UNDORETENTION 。