16 Managing Undo
官网:http://docs.oracle.com/cd/E11882_01/server.112/e25494/undo.htm#ADMIN013
从Oracle11g开始,在默认安装中oracle会自动管理undo, 典型安装中不需要DBA介入配置,然而,如果选择了flash back特性,你就需要进行一些undo管理任务,来保证flashback特性的成功执行。 本章包含如下内容:
- 什么是undo
- 自动undo管理介绍
- 设置最小undo保留时间
- 设置固定大小的undo表空间
- 管理undo表空间
- 迁 移到自动undo段管理
- undo空间数据字典视图
See Also:
Chapter 17, "Using Oracle Managed Files"查看如何创建由Oracle数据库创建并管理数据文件的undo表空间
什么是UNDO?
Oracle创建并管理用于回滚,撤销,更改到数据库的信息,此类信息主要包括事务的操作的记录,主要是在他们被提交前,这些记录被统称为undo。
undo记录的作用主要包括:
- 在发出ROLLBACK命令是进行事物回滚
- 恢复数据库
- 实现读一致性
- 使用falshback query来查询较早时间点的数据
- 使用flashback特性恢复逻辑损坏
当ROLLBACK命令被提交时,undo记录被用来撤销未提交的事务对数据库做的变更。在数据库恢复时,undo记录用来撤销未被提交的redo log对数据文件做的变更。undo记录通过记录之前的数据映像的方式实现一个用户访问正在由另一个用户修改的数据时的读一致性。
自动undo管理介绍
这个章节介绍自动undo管理的概念,并讨论如下主题:
- 自动undo管理概览
- 关于undo保留期
自动undo管理概览
用于管理撤消信息和空间,Oracle 提供了一个完全自动化的机制,称为自动撤消管理。使用自动撤消管理,数据库在undo表空间中管理undo段。从Oracle11g开始,自动undo管理是新创建数据库的默认模式。在使用DBCA 创建数据库时会自动创建一个自动扩展的undo表空间UNDOTBS1 。
undo表空间也可以被手工创建,创建方法参考"Creating an Undo Tablespace".
当实例启动时,数据库自动选择第一个可用的undo表空间。如果没有可用的undo表空间,实例就以没有undo表空间的方式启动,并存储undo记录在system表空间。这是不被推荐的,并且会在alert日志中记录警告'the system is running without an undo tablespace'.
如果在数据库中存在多个undo表空间,你可以选择指定其中一个作为undo表空间。这可以通过初始化参数 UNDO_TABLESPACE 设定。例:
UNDO_TABLESPACE = undotbs_01
如果指定的undo表空间不存在,则startup命令会失败。在Oracle RAC 环境中可为每个实例单独指定undo表空间。
数据库也可运行在手工undo管理模式,在此模式下,undo空间通过回滚段管理,并且不使用undo表空间。
Note:
回滚段的空间管理相当复杂,Oracle 强烈建议将数据库置于自动Undo管理模式.
如下是undo管理初始化参数的总结:
Initialization Parameter |
Description |
UNDO_MANAGEMENT |
如果是auto或空,则使用自动undo管理,如果等于MANUAL, |
UNDO_TABLESPACE |
可选,只在自动undo管理模式下生效,指定了undo表空间名。只当数据库有多个undo表空间时并且在你需要指定实例访问特定的undo表空间时使用。 |
如果使用了自动undo管理模式,那么初始化参数中关于手工管理undo的参数将失效。
Note:
在早期的版本中,oracle默认是手工管理模式。如果要使用自动undo管理,你需要首先创建一个undo表空间,然后修改 UNDO_MANAGEMENT 初始化参数为 AUTO. 如果你的数据库是9i或之后的版本,并且你想修改为自动undo管理,请查看Oracle Database Upgrade Guide .
空的UNDO_MANAGEMENT在11g之后默认为自动undo管理,但是在之前默认为手工管理.所以在升级到11g的时候需要小心该参数. Oracle Database Upgrade Guide 描述了迁移到自动undo管理的正确方式,包含了如何设定undo表空间大小的信息。
关于undo保留期
在事务被提交以后,undo数据就不再被事务回滚和事务恢复需要。然而对于读一致性的目的来说,长查询(long-running queries)可能会需要这部分早期的undo信息来提供数据块更早的映像信息。而且Oracle Flashback 特性也依赖于早期的undo信息的可用性。出于这些原因,undo信息保留的越久越好。
当使用了自动undo管理,就会有一个当前的undo retention period, 它指定了在Undo信息被覆盖前会被oracle保留的最短时间。那些比当前的undo retention period老的(被提交)的undo信息被称为过期的(expired),并且它们的空间是可以被当前事务覆盖的。那些还未超出现在的undo retention period的undo信息被称为未过期的(unexpired),会为一致性读和Oracle Flashback操作保留。
Oracle 会依据undo表空间大小和系统的活动自动调整undo保留期,你也可以通过修改 UNDO_RETENTION 初始化参数*设定最小的undo保留期。它的直接影响是:
- 对于固定大小的undo表空间来说,该参数不生效。数据库总是会根据undo表空间大小和数据库活动来调整该参数为最合适的可用的保留期 "Automatic Tuning of Undo Retention"
- 对于自动扩展的undo表空间来说,Oracle会尝试提供由 UNDO_RETENTION 指定的最短的undo保留期, 当表空间不足时,表空间会选择自动扩展而不是覆盖未过期数据。如果指定了undo表空间的MAXSIZE ,当达到该值时,数据库可能会开始覆盖未过期undo信息。被DBCA自动创建的UNDOTBS1表空间是自动扩展的。
自动undo保留期调优
oracle依据undo表空间的配置自动调整undo保留期。
- 如果undo表空间被配置为AUTOEXTEND, 数据库自动调整undo保留期到一个比系统中最长的一个活动查询还要长的时间点。但是,这个保留期对于Oralce Flashback操作来说可能是不足的。如果Oralce Flashback操作提示snapshot too old错误,这预示着你必须手工干预来保证有足够的undo data提供给闪回操作。为了更好的支持Oralce Flashback特性,你可以设置UNDO RETENTION 参数等于一个最长的期望闪回操作时间,同时也要修改undo tablespace到一个合适的固定大小。
- 如果undo表空间是固定大小的。数据库根据表空间大小和当前系统负载自动调整undo保留期到一个最合适的保留期。一般来说这个保留期会大大超过最长的活动查询的时间。
如果你准备修改undo表空间为固定大小,你必须指定它足够大,如果空间太小,会报 如下两个错误:
- DML 操作因为没有足够的undo提供给新的transactions而失败。
- 长查询操作报snapshot too old错误,这表明没有足够的undo数据来保证读一致性。
See "Sizing a Fixed-Size Undo Tablespace" for more information
Note:
自动调整undo保留期不支持LOB类型.这是因为LOB类型的undo信息保留在他自己的LOB段而不是undo段。对于LOB,数据库尝试使用UNDO_RETENTION设定的最小的undo保留期。然后如果空间变低,未过期的LOB undo信息可能会被覆盖。
See Also:
"Setting the Minimum Undo Retention Period"
保留期保证
为了保证数据库满足最长的查询或或者闪回操作,你可以使用retention guarantee. 如果retention guarantee被使用,指定的最小的undo保留期就被保证了; 数据库永远不覆盖未过期undo数据,即使事务因为undo表空间不足而失败。如果没使用retention guarantee ,数据库会在undo空间较低时覆盖未过期数据,这样就降低了系统的undo保留期。该选项(retention guarantee)默认被禁用
WARNING:
使用retention guarantee 会导致并行DML操作失败. 小心使用.
使用retention guarantee可通过在创建数据库或创建undo表空间时指定retention guarante子句来设定。或者,稍候你可以在alter tablespace语句中添加该子句。禁用该特性通过retention noguarantee子句。
可以通过查看 DBA_TABLESPACES 视图查看retention guarantee设置,retention