设为首页 加入收藏

TOP

【翻译自mos文章】使用aum(AutomaticUndoManagement)时遇到ORA-01555错误---原因和解决方案。(一)
2014-11-24 00:40:56 来源: 作者: 【 】 浏览:24
Tags:翻译 mos 文章 使用 aum AutomaticUndoManagement 遇到 ORA-01555 错误 --- 原因 解决方案

使用aum( Automatic Undo Management) 时遇到 ORA-01555错误--- 原因和解决方案。

参考原文:
ORA-01555 Using Automatic Undo Management - Causes and Solutions (Doc ID 269814.1)

适用于:
Oracle Database - Enterprise Edition - Version 9.0.1.0 and later
Information in this document applies to any platform.

目的:
本文讨论了当使用Automatic Undo Management 时(以下简称AUM)特性时,
一个查询返回ora-01555 "snapshot too old (rollback segment too small)" 错误的各种场景以及对该错误的各种解决方案

范围:
本文让用户体会下列错误:
ORA-1555: snapshot too old (rollback segment too small)

细节:
Checked for relevance on 26-Mar-2012

对于ora-01555错误,有很多原因。
当使用诸如 在oracle 8i或者更低版本中的 老rollback segments 管理方法时,其原因和解决方法在 Document 1005107.6 and Document 45895.1中。

这些原因和解决方法依然适用于oracle 9i及其更高版本,当解决ora-01555错误时,这些方法应该被考虑。
本文档的焦点在于oracle 9i或者更高版本情况下,当使用AUM特性时的ora-01555错误。


UNDO_RETENTION

若是UNDO_RETENTION参数设置的不合适,会导致ora-01555错误。Retention 是以秒为单位指定的。这个参数决定了undo retention的 低阈值(threshold )。
oracle 会尽力保留undo ,至少保留到该参数指定的时间。 The UNDO_RETENTION 参数只有在当前 undo表空间足够的情况下才会被使用(is only honoured )。
如果一个active的事务需要undo 空间,并且undo表空间没有空闲的空间,然后oracle启动 回收 unexpired undo space 的工作。这会导致一些查询失败,并报错ora-01555错误。

当需求产生时,一个新的extent 将会从undo tablespace中被分配,但是我们会尽量的将这种分配行为推迟。

在10.2.x及其更高版本中,使用extent的顺序如下:

1. 当undo 数据正在被写入到一个undo segment时,如果undo 数据已经到达当前extent的末尾,并且下一个extent包括 expired 的undo,
那么新的undo 数据(由当前事务产生的undo数据)将会 使用(wrap into)expired 的undo,而不是从 the undo tablespace free extent pool 中抓取 free的 extent。
新的extent空间不会被分配。


2.需要扩展undo segment的话,我们首先会查找undo tablespace内的空闲空间,而不是去扩展datafile,不论datafile的AUTOEXTEND 属性是否设置。
注意:本步骤在有些情况下被违反(broken),该bug在 9205 或者更高版本中被修复。

3. 如果我们暗示(hint)去收缩任何的undo segment以释放空间,然后我们去做了,然后看一下释放的空间是否满足我们的需要。

4.下一步,我们首先查找offline的segment 作为能reuse的 expired extents ,如果我们知道所有的offline的segment 都没有空间,那么我们会跳过本步。

5.我们是否能从其他online 的segment 中偷取 任何的 expired 的extent

6.如果表空间中有任何一个自动扩展的datafile,那么我们会在表空间中扩展数据文件以 分配空间。如果表空间中没有自动扩展的datafile,则跳过本步

7.如果retention 被保证,我们不能自动调优undo,然后我们会抛出一个错误。

8. 我们尝试使用一个低的UNDO_RETENTION 值,来确认 :
我们能否在不必违反任何retention guarantee的情况下(通过doing any hinted shrinking of segments) 释放一些空间

9.如果我们依然没有空间,并且正在保证 retention(are guaranteeing retention ),那么一个错误被抛出。

10.我们使用的是自动调优(auto tuned)并且不能保证(guaranteed)。我们开始此尝试从offline 的segment中偷取 UNEXPIRED extents

11.尝试把 从undo segment 分配的UNEXPIRED space 分配给当前 事务(transaction)

12.尝试从其他的online的segment中偷取 UNEXPIRED space。
注意:在一个特定并且罕见情况下,oracle可能不会重用(reuse) unexpired extents ,然后会报 ORA-30036 error


解决方案:

1. undo tablespace 太小,增大undo 表空间的大小。undo 表空间应该足够大,以满足存储 活动事务所产生的undo data 和 保持 honor the undo retention setting.

2.优化 UNDO_RETENTION 参数值。这对于系统中运行大的查询 十分重要。此参数值应该至少等于最长运行的那个查询的时间长度。
只要数据已经运行了一段时间,这个参数值可以通过查询V$UNDOSTAT视图来确定:

SQL> select max(maxquerylen) from v$undostat;

V$UNDOSTAT 视图以10分钟为间隔保留 udno 统计信息,
这个视图按照instance 展示统计数据,例如 begin time, end time,对于每一个实例来说,统计值是一个唯一的间隔

该视图包括如下列:

Column name Meaning
BEGIN_TIME 区间检查的开始时间
END_TIME 区间检查的结束时间
UNDOTSN undo 表空间号
UNDOBLKS 在间隔期间内使用的undo block的总数
TXNCOUNT 在间隔期间内的事务总数
MAXQUERYLEN 在间隔期间内的一个查询最大的持续时间(以秒为单位)
MAXCONCURRENCY 在间隔期间内,最高的事务数
UNXPSTEALCNT -----当 unexpired blocks 从其他 undo segments 中被偷取以满足空间需求的尝试次数。
UNXPBLKRELCNT 从undo segment 中remove掉用于其他事务的 unexpired blocks 数量。
UNXPBLKREUCNT 被事务重用(reuse)的unexpired undo blocks的 数量
EXPSTEALCNT 当expired extents 从其他 undo segments 中被偷取以满足空间需求的尝试次数。
EXPBLKRELCNT exp
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇大数据分页解决方案 下一篇面试不是意味着给解决方案,有时..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: