16 Managing Undo

从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 ParameterDescription

UNDO_MANAGEMENT如果是auto或空,则使用自动undo管理,如果等于MANUAL,

则为手工undo管理,默认为AUTO.

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 列包含了guarantee,noguarantee,not apply,not apply用于非undo表空间。

Undo保留期调优和报警阈值

对于固定大小的undo表空间来说,数据库依据数据库状态和undo表空间大小来评估最佳的保留期。对于最佳的undo管理,Oralce调整undo保留期不是基于100%的表空间大小,而是基于85%的undo表空间大小,或者基于表空间使用百分比的报警阈值(默认报警阈值是85%,可以调整),看哪个值较低。然而如果设置的undo表空间报警阈值低于85%,可能会减小undo保留期的大小。更多信息请查看"Managing Tablespace Alerts".

跟踪调整undo保留期

可以通过查询V$UNDOSTAT视图TUNED_UNDORETENTION列来确定当前undo保留期。这个视图包含了最近4天每10分钟一行的数据。(超出4天的,数据存储在DBA_HIST_UNDOSTAT视图。)TUNED_UNDORETENTION单位是s.

可以通过查询V$UNDOSTAT视图TUNED_UNDORETENTION列来确定当前undo保留期。这个视图包含了最近4天每10分钟一行的数据。(超出4天的,数据存储在DBAHISTUNDOSTAT视图。)UNDORETENTION单位是s.

select to_char(begin_time, 'DD-MON-RR HH24:MI') begin_time,

复制代码to_char(end_time, 'DD-MON-RR HH24:MI') end_time, tuned_undoretention

复制代码from v$undostat order by end_time;

复制代码

复制代码BEGIN_TIME END_TIME TUNED_UNDORETENTION

复制代码--------------- --------------- -------------------

复制代码04-FEB-05 00:01 04-FEB-05 00:11 12100

复制代码...

复制代码07-FEB-05 23:21 07-FEB-05 23:31 86700

复制代码07-FEB-05 23:31 07-FEB-05 23:41 86700

复制代码07-FEB-05 23:41 07-FEB-05 23:51 86700

复制代码07-FEB-05 23:51 07-FEB-05 23:52 86700

复制代码

复制代码576 rows selected.

复制代码

.查看Oracle Database Reference 获取更多V$UNDOSTAT 信息.

设定最小Undo保留期

通过初始化参数UNDORETENTION设定最小的undo保留期。就像"About the Undo Retention Period"中说的,当前的undo保留期可能会被调整的大于UNDORETENTION,或者,除非设定了retention guarantee,否则当undo表空间较小时会小于UNDO_RETENTION。

设定最小undo保留期:

执行如下任一项:

在初始化参数中设定UNDO_RENTENTION

UNDO_RETENTION = 1800

复制代码

在任何适合通过ALTER SYSTEM 语句修改UNDO_RETENTION :

ALTER SYSTEM SET UNDO_RETENTION = 2400;

复制代码

UNDO_RETENTION参数的修改是即时的,但是只有当有足够undo表空间时才能生效。

设定固定大小Undo表空间

自动undo保留期的调整一般会达到一个最合适的固定的大小的undo表空间。如果你决定使用固定大小的undo表空间,Undo Advisor可以帮助你评估所需要的容量。你可以通过EM来使用Undo Advisor或者通过DBMS_ADVISOR PL/SQL包。EM作为优先推荐的方式,了解更多通过EM使用Undo Advisor的方法,请查看Oracle Database 2 Day DBA.

Undo Advisor依赖于对AWR中收集的数据的分析。所以这需要AWR有足够的负载数据才能保证Undo Advisor提供精确的建议。对于新创建的数据库,统计信息可能还不够合适。在这种情况下,使用默认的自动扩展的undo表空间直到至少完成了一个负载循环。

对收集周期和AWR状态的保留期的调整会影响到建议的精度和类型。请查看Oracle Database Performance Tuning Guide。

使用Undo Advisor,你首先需要评估一下如下两个值:

你预期的长查询的时长 在数据库完成一个负载周期后,你可以在Automatic Undo Managementy页面的System Activity子页面看到最长的查询。

你将执行Flashback闪回的最长时间。 例如:如过你希望可以闪回查询过去48小时的数据,那么你的闪回需求就是48小时。

然后你取他们的中的最大值作为Undo Advisor的输入。

运行Undo Advisor不会修改Undo表空间的大小,它只是提供一个建议值。你必须使用alter database 语句修改Undo表空间数据文件为固定大小。

下面的例子假设你的undo表空间有一个自动扩展的数据文件叫undotbs.dbf,如下方式修改该表空间为固定大小300M.

ALTER DATABASE DATAFILE '/oracle/dbs/undotbs.dbf' RESIZE 300M;

复制代码ALTER DATABASE DATAFILE '/oracle/dbs/undotbs.dbf' AUTOEXTEND OFF;

复制代码

Note:

设定固定大小的Undo表空间,Oralce建议在数据库创建后让它自己跑足够的时间一遍获得更全面的负载信息。这样Undo表空间就能增长到满足数据库负载需求最小值,然后如你所愿,你可以使用Undo Advisor来决定Undo表空间设置多大来满足长查询和闪回操作。

See Also:

Oracle Database 2 Day DBA 介绍了如何通过Undo Advisor计算undo表空间最小值。

The Undo Advisor PL/SQL Interface

如下示例创建了一个undo advisor任务来评估undo表空间大小。任务名‘Undo Advisor',分析是基于AWR快照的,所以你必须设定参数 STARTSNAPSHOT 和 ENDSNAPSHOT 。实例中STARTSNAPSHOT 是1,ENDSNAPSHOT 是2.

DECLARE

复制代码tid NUMBER;

复制代码tname VARCHAR2(30);

复制代码oid NUMBER;

复制代码BEGIN

复制代码DBMS_ADVISOR.CREATE_TASK('Undo Advisor', tid, tname, 'Undo Advisor Task');

复制代码DBMS_ADVISOR.CREATE_OBJECT(tname, 'UNDO_TBS', null, null, null, 'null', oid);

复制代码DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'TARGET_OBJECTS', oid);

复制代码DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'START_SNAPSHOT', 1);

复制代码DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'END_SNAPSHOT', 2);

复制代码DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'INSTANCE', 1);

复制代码DBMS_ADVISOR.execute_task(tname);

复制代码END;

复制代码/

复制代码

在你创建Advisor任务结束后,你可以在EM中的ADDM中查看输出结果和建议,也可以通过DBA_ADVISOR_*数据字典视图查看(DBA_ADVISOR_TASKS, DBA_ADVISOR_OBJECTS, DBA_ADVISOR_FINDINGS, DBA_ADVISOR_RECOMMENDATIONS 等等).

See Also:

"Using the Segment Advisor" 创建一个不同任务名的Advisor任务。

Oracle Database Reference 查看更多关于 DBA_ADVISOR_* 数据字典视图的信息。

管理Undo表空间

该部分包含了管理表空间的各种操作,主要是如下部分:

Creating an Undo Tablespace 创建Undo表空间

Altering an Undo Tablespace 修改Undo表空间

Dropping an Tablespace 删除表空间

Switching Tablespaces 切换表空间

Establishing User Quotas for Space 设定用户使用额度

Space Data Dictionary Views 空间数据字典视图

创建表空间

两种方式创建表空间,一种是建库时发生的管理模式为auto(_MANAGEMENT = AUTO). 另一种是在已经存在的数据库中,通过CREATE TABLESAPCE语句创建。 不能在表空间中创建数据库对象,它是为系统管理数据保留的.(创建会报错ORA-30022)

Oracle 允许你创建single-file 表空间。Single-file,bigfile,tablespaces 在"Bigfile Tablespaces"中讨论。

使用Create Database创建表空间

如下:

CREATE DATABASE rbdb1

复制代码CONTROLFILE REUSE

复制代码.

复制代码.

复制代码.

复制代码TABLESPACE tbs_01 DATAFILE '/u01/oracle/rbdb1/0101.dbf';

复制代码

如果创建数据库时创建表空间失败,则整个创建数据库操作失败,你必须清理数据文件,修正错误然后重新执行。

创建数据库语句也允许你创建数据库时创建single-file 表空间。参考"Supporting Bigfile Tablespaces During Database Creation".

See Also:

Oracle Database SQL Language Reference 创建数据库时创建表空间的语法。

使用CREATE TABLESPACE 创建表空间

语法示例:

CREATE TABLESPACE tbs_02 DATAFILE '/u01/oracle/rbdb1/0201.dbf' SIZE 2M REUSE AUTOEXTEND ON;

复制代码

可以创建多个表空间,但每次每个实例只有一个生效

See Also:

Oracle Database SQL Language Reference 使用Create Tablespace的语法。

修改表空间

修改表空间使用alter tablesapce 语句,因为大部分属性都是系统管理的,所以你需要关心的有如下几点:

添加数据文件

重命名数据文件

使数据文件联机或脱机

开始或结束对一个数据文件的备份

使 Retention Guarantee生效或失效

这些才是你被允许修改的属性。

如下示例添加一个数据文件:

ALTER TABLESPACE tbs_01 ADD DATAFILE '/u01/oracle/rbdb1/0102.dbf' AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED;

复制代码

可以使用alter database...datafile...语句resize或extend数据文件。

See Also:

"Changing Data File Size"

Oracle Database SQL Language Reference Alter tablespace语法。

删除表空间

语法示例:

DROP TABLESPACE tbs_01;

复制代码

表空间仅在不被任何实例当前使用时才能被删除。如果表空间中包含未完成的事务(例如,一个事务died但尚未被覆盖),Drop Tablespace语句失败。但是因为Drop Tablespace会删除包含未过期信息的表空间,所以需要留意如果某些查询需要这部分信息,请勿删除。

Drop tablespace 对于表空间就像Drop Tablespace ...Including Contents. 所有的数据都会被删除。

See Also:

Oracle Database SQL Language ReferenceDROP TABLESPACE语法

切换 表空间

你可以切换 Tablespace到另一个。因为_TABLESPACE是一个动态参数,所以ALTER SYSTEM SET 语句可以用来指定新的表空间。

语法示例:

ALTER SYSTEM SET _TABLESPACE = tbs_02;

复制代码

如果存在如下情况,则切换失败:

表空间不存在

表空间不是表空间

表空间已经被其他实例使用(Oralce Rac环境)

数据库在线状态下执行该操作,该操作不影响用户事务的进行,当切换结束,之后的事务都会使用新的表空间。

表空间可以处在PENDING OFFLINE状态,即使在switch操作完成后。该状态的表空间不能被另外一个实例使用,也不能被删除。最终在所有事务都提交后,表空间自动转换为OFFLINE状态,此时才可以被另一个实例使用(Oralce RAC环境)。

如果 TABLESPACE参数设置为''(双单引号,无内容),则表空间会切换出当前表空间,然后切换到下一个可用的表空间。小心使用该语句,因为可能没有可用的表空间,不建议使用。报错类似(

ERROR at line 1:

ORA-01552: cannot use system rollback segment for non-system tablespace 'USERS')

设定用户使用限额(EM)

Oracle Database Resource Manager可以用来设定用户使用的空间限额,它通过_POOL 来限定一组用户的空间使用额度(resource consumer group资源消费群)。

你可以为每个资源消费群设定一个 pool,一个 pool控制了一个资源消费群产生的所有量。如果一个资源消费群产生的数据超出了该限额,当前正在产生的UPDATE事务会被终止。该消费群的其他组员也不能再执行更新操作直到空间被从资源池中释放。

See Also:

Chapter 27, "Managing Resources with Oracle Database Resource Manager"

管理表空间的空间使用率报警(EM)

"Managing Tablespace Alerts" 查看关于配置表空间使用率报警配置的信息。

除了提供使用率预警,如果有长查询引起了SNAPSHOT TOO OLD错误,数据库也提供报警。为了防止产生太多警告,长查询告警24小时一次。如果产生了该告警,你可以检查EM中的 Advisor Page获得更多关于表空间的信息。

迁移到自动管理

如果你当前正使用回滚段管理空间,Oralce强烈建议迁移你的数据库到自动管理。

Oracle Database Upgrade Guide. 查看更多信息。

空间数据字典视图

这一部分列出了在自动管理模式下有助于查看空间信息的视图并提供了一些示例。另外,你也可以查看"Data Files Data Dictionary Views"获得关于表空间和数据文件的视图信息。

以下动态性能视图列出了对于获得表空间信息有用的视图

ViewDescription

V$STAT包含了监控和调优空间的统计信息。使用这个视图来估算当前负载下的空间需求。数据库也使用这些信息调整系统中的使用。该视图尽在自动管理模式下有用

V$ROLLSTAT在自动管理模式下,该视图反映了表空间中段的活动。

V$TRANSACTION包含了段信息

DBA__EXTENTS显示了表空间中每个extent的状态和大小

DBA_HIST_STATContains statistical snapshots of V$STATinformation. See Oracle Database 2 Day DBA for more information.

See Also:

Oracle Database Reference查看自动管理模式下这些视图的完整信息。

V$STAT 视图有助于监控当前实例下事务执行对于空间的影响。统计信息包含了实例中空间占用,事务并发,保留调优,以及长查询的长度和SQL_ID等。

视图中的数据每10分钟统计一行,以BeginTime倒序排列。每行的数据来自BEGINTIME和END_TIME之间。每一列都反映的那个时间段的特定信息。视图总共包含了576行,4天一循环的数据。

示例:

SELECT TO_CHAR (BEGIN_TIME, 'MM/DD/YYYY HH24:MI:SS') BEGIN_TIME,

复制代码TO_CHAR (END_TIME, 'MM/DD/YYYY HH24:MI:SS') END_TIME,

复制代码TSN,

复制代码BLKS,

复制代码TXNCOUNT,

复制代码MAXCONCURRENCY AS "MAXCON"

复制代码FROM v$STAT

复制代码WHERE ROWNUM <= 144;

复制代码

复制代码

复制代码BEGIN_TIME END_TIME TUNED_RETENTION

复制代码-------------------- -------------------- -------------------

复制代码18-9月 -16 10:15 18-9月 -16 10:25 915

复制代码18-9月 -16 10:25 18-9月 -16 10:35 1763

复制代码18-9月 -16 10:35 18-9月 -16 10:45 1279

复制代码18-9月 -16 10:45 18-9月 -16 10:55 1613

复制代码18-9月 -16 10:55 18-9月 -16 11:05 1953

复制代码18-9月 -16 11:05 18-9月 -16 11:15 2311

复制代码18-9月 -16 11:15 18-9月 -16 11:25 2687

复制代码18-9月 -16 11:25 18-9月 -16 11:35 3060

复制代码18-9月 -16 11:35 18-9月 -16 11:45 3433

复制代码…

复制代码17-9月 -16 10:25 17-9月 -16 10:35 713

复制代码

复制代码144 rows selected.

复制代码

以上示例显示了最近24小时的使用信息。开始时间09/17/2016 10:25。

(编辑:雷林鹏 来源:网络)

05-07 15:11