代码改变世界

对UNDO表空间中两个概念的理解

2016-06-23 21:55  magnes  阅读(960)  评论(0编辑  收藏  举报

一、Undo Retention Period(撤销数据保存期)

当事务提交后,该事务的撤销数据不会再用于事务的回滚和恢复。然而对数据的读一致性来说,一个耗时较长的查询可能还会需要这个旧的撤销数据。此外,Oracle的闪回查询功能也将依赖于这些旧的撤销数据。基于这些原因,应该尽可能长时间的保留这些旧的撤销信息。

当使用自动撤销管理时,才会存在Undo Retention Period的概念,它被用于说明在旧的撤销信息被覆盖之前,数据库试图保存这些撤销信息的最小时间。已提交的撤销信息相对于当前撤销保存期内的撤销信息来说是过期的,它可以被新的事务所覆盖,而当前撤销保存期内的撤销信息是未过期的,它们将被保存用于数据库的读一致性和闪回查询。

Oracle数据库基于撤销表空间的大小和系统负载来自动调整Undo Retention Period,通过指定undo_retention初始化参数设定最小的撤销数据保存期。针对不同的情形,undo_retention的用如下:

  1. 对于固定大小的撤销表空间来说,数据库将忽略undo_retention参数的设置。
  2. 对于自动扩展的撤销表空间来说,数据库将根据undo_retention的设定保留撤销数据。撤销表空间不足时,表空间会自动扩展,而不会覆盖未过期的撤销数据;当表空间已达到所能扩展的最大尺寸,将覆盖未过期的数据。

如果撤销表空间使用了自动扩展,数据库动态的调整Undo Retention Period的时间比数据库中执行的最长的查询时间稍微长一些。然而这个时间可能并不适应闪回查询的需要,在做闪回查询时可能会出现“快照过旧”的错误,为了适应数据库的闪回查询功能,undo_retention最好设置为期望的闪回查询时间,或者将表空间改为固定大小,如果撤销表空间为固定大小,数据库将根据表空间的大小和系统负载动态调整Undo Retention Period。

二、Retention Guarantee(撤销保证)

为了保证耗时较长的查询或闪回查询的成功执行,可以启用retention guarantee选项。如果启用了retention guarantee选项,指定的最小撤销保存期将被保证,数据库不会覆盖未过期的撤销数据,即使由于撤销表空间不足而导致新的事务执行失败;如果未启动retention guarantee选项,当撤销空间不足时,未过期的撤销数据将会被覆盖,这将会减少撤销数据保留时间。

在使用create database、create undo tablespace、alter tablespace语句时,可以使用retention guarantee子句启动retention guarantee选项;或者通过alter tablespace ... retention noguarantee禁用retention guarantee 选项。通过dba_tablespaces视图的retention列可以获知撤销表空间是否启用了Retention Guarantee选项

三、对上述概念的理解

综合以上两点所述,针对undo_retention这个参数,个人的理解如下:

  1. undo_retention只是一个预期结果,数据库会尽量达到的这个目标,但实际的结果可能优于预期(撤销空间足够充足),也可能低于预期(撤销空间不足);
  2. 当撤销表空间空间充足时,所有的撤销数据都被保留在撤销空间内。已提交的撤销数据只会被标记为“过期”(并不删除)。在空间不足时,它们才可以被新事务的撤销数据所覆盖,未提交的事务被标记为“未过期”;
  3. 当撤销表空间空间不足时,首先去覆盖标记为“过期”的撤销数据,如果此时还是空间不足,新的事务还是会覆盖未过期的撤销数据的,毕竟新事务不可能一直等待旧事务的提交或回滚完成后才发生;
  4. 如果在撤销表空间上指定了retention guarantee,在撤销空间不足且旧的事务的撤销数据未过期时,将会由于无法分配撤销空间而导致新的事务的执行失败;