【Oracle】undo 自动调优

  Oracle 10gr2的后续版本中添加了UNDO信息最短保留时间段自动调优的特性,不再仅仅依据参数UNDO_RETENTION的设定,其调优原则如下:

1 当UNDO TABLESPACE为 fixed- size,Oracle将根据表空间的大小和历史使用情况,自动调整undo信息保存时间,同时忽略 undo_retention的值除非 undo_retention的guarantee 特性被启用。

2 当UNDO TABLESPACE为AUM时,Oracle将动态调整撤销信息最短保留时间为该时段最长查询时间(MAXQUERYLEN)加上300秒或参数UNDO_RETENTION间的较大者,即MAX((MAXQUERYLEN+300),UNDO_RENTION);

   在自动调整启用的情况下,实际的撤销信息最短保留时间可以通过查询V$UNDOSTAT视图上的TUNED_UNDORETENTION列获得。往往最短保存时间远远大于设定的UNDO_RETENTION。在无法就UNDO TABLESPACE做相应修改的情况,可以通过修改隐式参数”_UNDO_AUTOTUNE”为FALSE关闭该自动调优特性。以上设定生效后,V$UNDOSTAT视图上TUNED_UNDORETENTION列不再更新,且撤销信息最短保留时间固定为参数UNDO_RETENTION的设定值。该参数可以不用重启数据库而动态设置生效。

下面做实验说明undo自动调整的功能以及其弊端:注:实验环境中无他事务。

进行一个dml 语句不提交,查看dba_undo_extents 关于回滚段的信息,

YANG@yangdb-rac3> show parameter undo

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

undo_management                      string      AUTO

undo_retention                       integer     60

undo_tablespace                      string      UNDOTBS1

YANG@yangdb-rac3> update bind set status='VALID' where wner='YANG';

5 rows updated.

YANG@yangdb-rac3> select segment_name ,tablespace_name,extent_id,status

  2      from dba_undo_extents

  3      where status='ACTIVE';

SEGMENT_NAME         TABLESPACE_NAME  EXTENT_ID STATUS

-------------------- --------------- ---------- ---------

_SYSSMU3_2097677531$ UNDOTBS1                 2 ACTIVE

YANG@yangdb-rac3> commit; 

Commit complete.

YANG@yangdb-rac3> --等待一分钟之后

YANG@yangdb-rac3> select segment_name ,tablespace_name,extent_id,status

  2     from dba_undo_extents

  3     where status='ACTIVE';

SEGMENT_NAME         TABLESPACE_NAME  EXTENT_ID STATUS

-------------------- --------------- ---------- ---------

_SYSSMU3_2097677531$ UNDOTBS1                 2 UNEXPIRED 

YANG@yangdb-rac3>  --等待一分钟之后

YANG@yangdb-rac3> select segment_name ,tablespace_name,extent_id,status

  2     from dba_undo_extents

  3     where status='ACTIVE';

SEGMENT_NAME         TABLESPACE_NAME  EXTENT_ID STATUS

-------------------- --------------- ---------- ---------

_SYSSMU3_2097677531$ UNDOTBS1                 2 UNEXPIRED 

可以看到提交一分钟之后,回滚段_SYSSMU3_2097677531$的状态依然为UNEXPIRED,尽管undo_retention 设置为60s。本应该释放的undo却未被及时释放。其实这也是为什么生产环境中undo表空间总是接近100%的原因。

由之前的介绍oracle提供的undo自动调优技术,只是将undo_retention做为一个参考值,而实际设置的undo_retention时间有v$undostat.tuned_undoretention 而定,查看其信息;  

YANG@yangdb-rac3> ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS' ;

Session altered.

YANG@yangdb-rac3> SELECT begin_time, end_time, tuned_undoretention FROM v$undostat;

BEGIN_TIME          END_TIME            TUNED_UNDORETENTION

------------------- ------------------- -------------------

2011/10/16 19:46:29 2011/10/16 19:56:29          1412 --进行查询时候的保留时间明显大于60s

2011/10/16 19:36:29 2011/10/16 19:46:29          2017 

2011/10/16 19:26:29 2011/10/16 19:36:29          1416

2011/10/16 19:16:29 2011/10/16 19:26:29          2018

2011/10/16 19:06:29 2011/10/16 19:16:29          1418

2011/10/16 18:56:29 2011/10/16 19:06:29          2022

2011/10/16 18:46:29 2011/10/16 18:56:29          1421

2011/10/16 18:36:29 2011/10/16 18:46:29          2026

2011/10/16 18:26:29 2011/10/16 18:36:29          1425

2011/10/16 18:16:29 2011/10/16 18:26:29          2028

464 rows selected.

every coin has two sides,UNDO自动优化功能能够最大限度的使用undo表空间,满足大部分的sql执行,但是也带来一个问题:很多事务执行完毕之后,发现UNDO表空间会在很长时间都一直保持着使用率是接近100%的状态,active 状态的很少。

这种接近状态还无法手工的收缩,甚至于重启数据库实例也无法缓解,而此时常常会收到undo表空间的监控报警。

可以通过修改隐式参数” _UNDO_AUTOTUNE”为FALSE关闭该自动调优特性。以上设定生效后,V$UNDOSTAT视图上TUNED_UNDORETENTION列不再更新,且撤销信息最短保留时间固定为参数UNDO_RETENTION的设定值。该参数可以不用重启数据库而动态设置生效。

禁用UNDO自动优化之后,Oracle不再的每十分钟记录一次当前UNDO使用情况了,在动态视图V$UNDOSTAT中也只保留禁止undo自动调优之前的数据:

YANG@yangdb-rac3> conn /as sysdba

Connected.

SYS@yangdb-rac3> alter system set "_undo_autotune"=false;

System altered.

YANG@yangdb-rac3>conn yang/yang

Connected.

YANG@yangdb-rac3>--10分钟之后

YANG@yangdb-rac3>SELECT count(1) FROM v$undostat;

  COUNT(1)

----------

       464 --还是之前的个数

YANG@yangdb-rac3>SELECT begin_time, end_time, tuned_undoretention FROM v$undostat where rownum =1;

BEGIN_TIME          END_TIME            TUNED_UNDORETENTION

------------------- ------------------- -------------------

2011/10/16 19:56:29 2011/10/16 20:08:11                1592 

---

YANG@yangdb-rac3> SELECT begin_time, end_time, tuned_undoretention FROM v$undostat where rownum<2;

BEGIN_TIME          END_TIME            TUNED_UNDORETENTION

------------------- ------------------- -------------------

2011/10/16 19:56:29 2011/10/16 21:08:53                1592

上面两个是在不同时间进行的查询, v$undostat的记录不足每十分钟进行一次统计。

再次做一个实验:这次事务提交一分钟之后,undo段的状态变为EXPIRED

YANG@yangdb-rac3> UPDATE bind set status ='INVALID' where status='VALID';

72747 rows updated.

YANG@yangdb-rac3> ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS' ;

Session altered.

YANG@yangdb-rac3> select sysdate from dual;

SYSDATE

-------------------

2011/10/16 20:13:41

YANG@yangdb-rac3> commit;

Commit complete.

--提交时立即做查询:

YANG@yangdb-rac3> select segment_name ,tablespace_name,extent_id,status

  2     from dba_undo_extents

  3     where segment_name='_SYSSMU3_2097677531$' or status='ACTIVE';

SEGMENT_NAME         TABLESPACE_NAME  EXTENT_ID STATUS

-------------------- --------------- ---------- ---------

_SYSSMU9_1424341975$ UNDOTBS1                 0 ACTIVE  --活动状态

_SYSSMU9_1424341975$ UNDOTBS1                 1 ACTIVE

_SYSSMU9_1424341975$ UNDOTBS1                 2 ACTIVE

_SYSSMU9_1424341975$ UNDOTBS1                 3 ACTIVE

_SYSSMU9_1424341975$ UNDOTBS1                 4 ACTIVE

_SYSSMU9_1424341975$ UNDOTBS1                 5 ACTIVE

_SYSSMU9_1424341975$ UNDOTBS1                 6 ACTIVE

_SYSSMU9_1424341975$ UNDOTBS1                 7 ACTIVE

_SYSSMU9_1424341975$ UNDOTBS1                 8 ACTIVE

_SYSSMU9_1424341975$ UNDOTBS1                 9 ACTIVE

_SYSSMU9_1424341975$ UNDOTBS1                10 ACTIVE

_SYSSMU9_1424341975$ UNDOTBS1                11 ACTIVE

16 rows selected

YANG@yangdb-rac3> SELECT count(1) FROM v$undostat;

  COUNT(1)

----------

       464

--过1分钟多一些时间,再次查看undo回滚段的状态:

YANG@yangdb-rac3> SELECT begin_time, end_time, tuned_undoretention FROM v$undostat where rownum =1;

BEGIN_TIME          END_TIME            TUNED_UNDORETENTION

------------------- ------------------- -------------------

2011/10/16 19:56:29 2011/10/16 20:14:50                1592

YANG@yangdb-rac3> select segment_name ,tablespace_name,extent_id,status

  2     from dba_undo_extents

  3     where segment_name='_SYSSMU9_1424341975$' or status='ACTIVE';

SEGMENT_NAME         TABLESPACE_NAME  EXTENT_ID STATUS

-------------------- --------------- ---------- ---------

_SYSSMU9_1424341975$ UNDOTBS1                 0 EXPIRED

_SYSSMU9_1424341975$ UNDOTBS1                 1 EXPIRED

_SYSSMU9_1424341975$ UNDOTBS1                 2 EXPIRED

_SYSSMU9_1424341975$ UNDOTBS1                 3 EXPIRED

_SYSSMU9_1424341975$ UNDOTBS1                 4 EXPIRED

_SYSSMU9_1424341975$ UNDOTBS1                 5 EXPIRED

_SYSSMU9_1424341975$ UNDOTBS1                 6 EXPIRED

_SYSSMU9_1424341975$ UNDOTBS1                 7 EXPIRED

_SYSSMU9_1424341975$ UNDOTBS1                 8 EXPIRED

_SYSSMU9_1424341975$ UNDOTBS1                 9 EXPIRED

_SYSSMU9_1424341975$ UNDOTBS1                10 UNEXPIRED

_SYSSMU9_1424341975$ UNDOTBS1                11 EXPIRED

12 rows selected.

可见,修改隐式参数” _UNDO_AUTOTUNE”为FALSE关闭该自动调优特性,可以解决表空间的使用率总是100%的问题。

附上DBA_UNDO_EXTENTS,STATUS的值及其意义:

ACTIVE    活动状态,说明当前这个数据区被某个正在进行的事务使用。

EXPIRED   已过期,说明已分配的数据区已经完成了它的使命,随时可以被分配给其它新的事务使用。

UNEXPIRED 未过期,说明分配的数据区已经不属于任何的活动事务,但是由于UNDO RETENTION设置的需要,一般情况下不会被回收重用。

相关文章:

FAQ – Automatic Undo Management (AUM) / System Managed Undo (SMU) [ID 461480.1]

Ora-30036 On Undo Tablespace After Upgrade To 10.2.0.4 [ID 856344.1]

时间: 2024-09-23 19:04:10

【Oracle】undo 自动调优的相关文章

通过机器学习来自动调优数据库

本文是卡耐基梅隆大学的 Dana Van Aken.Andy Pavlo 和 Geoff Gordon 所写.这个项目展示了学术研究人员如何利用 AWS Cloud Credits for Research Program 来助力他们的科技突破的. 数据库管理系统(DBMS)是任何数据密集应用的关键部分.它们可以处理大量数据和复杂的工作负载,但同时也难以管理,因为有成百上千个"旋钮"(即配置变量)控制着各种要素,比如要使用多少内存做缓存和写入磁盘的频率.组织机构经常要雇佣专家来做调优,

oracle数据库性能调优技术:深入理解散列连接执行计划

一.概述 这篇文章是数据库性能调优技术系列的第四篇.上一篇文章讲解了深入理解嵌套循环连接执行计划. 上一篇文章中提到两张表的连接有三种执行方式:1)嵌套循环连接:2)散列连接:3)归并连接.散列连接是很重要的连接方式,包含比较多的内容,这篇文章中讲解为什么需要散列连接?如何理解散列连接? 和前三篇文章一样,本文讲解的是些比较抽象的内容,不拘泥于具体的数据.所以本文中使用的代价评估模型也是抽象的,假设了数据库缓冲区大小只有一个页,新页的读取必然导致旧页的释放.读完本文之后应该能够读懂达梦数据库.o

oracle数据库性能调优技术:深入理解单表执行计划

一.概述 这篇文章是数据库性能调优技术的第二篇.上一篇讲解的索引调优是数据库性能调优技术的基础.这篇讲解的深入理解单表执行计划,是数据库性能调优的有力工具. 查询语句可以有多种可选执行计划,如何选择效率最高的执行计划?达梦数据库.oracle数据库.sql server数据库都是采用基于成本的查询优化,对备选执行计划进行打分,选择大家最小的执行计划进行执行.这些内容,我会在后续的几篇文章中进行详细的描述.在此之前,我们首先需要掌握如何理解数据库执行计划.这篇文章讲解只涉及单表操作的执行计划. 达

oracle数据库性能调优技术:索引调优

一.概述 随着数据库在各个领域的使用不断增长,越来越多的应用提出了高性能的要求.数据库性能调优是知识密集型的学科,需要综合考虑各种复杂的因素:数据库缓冲区的大小.索引的创建.语句改写等等.总之,数据库性能调优的目的在于使系统运行得更快. 调优需要有广泛的知识,这使得它既简单又复杂. 说调优简单,是因为调优者不必纠缠于复杂的公式和规则.许多学术界和业界的研究者都在尝试将调优和查询处理建立在数学基础之上. 称调优复杂,是因为如果要完全理解常识所依赖的原理,还需要对应用.数据库管理系统.操作系统以及硬

oracle数据库性能调优技术:深入理解嵌套循环执行计划

一.概述 这篇文章是数据库性能调优技术的第三篇.上一篇文章讲解了深入了解单表执行计划,单表执行计划是理解多表执行计划的基础. 两张表的连接有三种执行方式:1)嵌套循环连接:2)散列连接:3)归并连接.两张表连接时选择这三种中的哪一种呢?这取决于索引.以及连接的代价.在该系列的第三篇(本文)文章中讲解嵌套循环连接,第四篇文章中讲解散列连接,第五篇文章中讲解归并连接.在第六篇以后会分析IN子查询以及EXISTS子查询. 达梦数据库.oracle数据库.sql server数据库在数据库执行计划方面并

详解Oracle的性能调优方法

本文将介绍几种Oracle调优的方法,包括调整内存分配.调整Library Cache.调整数据字典高速缓存等多种方法. Oracle是一个高性能数据库软件.用户可以通过参数的调整,达到性能的优化.性能优化主要分为两部分: 一是数据库管理员通过对系统参数的调整达到优化的目的: 二是开发人员通过对应用程序的优化达到调整的目的. 在此,仅就系统参数的调整进行探讨,而不涉及应用程序的优化.对系统参数的调整,可以分为以下几个部分: 1.调整内存分配 系统全局区(SGA)是一个分配给Oracle 包含Or

oracle 内存分配调优

linux环境安装oracle时候,CentOS 5.8 64bit安装oracle10g 64bit.那么shmmax/shmall和sga_max_size/sga_target这4个参数到底应该设置多大呢?因为每个数据库需求和压力都不尽相同,这里只能给出一些相对值供大家参考. 1.两个参考参考值1:OLTP服务器8Gkernel.shmall = 2097152kernel.shmmax = 8589934592sga_max_size big integer 4Gsga_target b

Oracle调优(入门及提高篇)

    在过去的十年中, Oracle 已经成为世界上最专业的数据库之一.对于 IT 专家来说,就是要确保利用 Oracle 的强大特性来提高他们公司的生产力.最有效的方法之一是通过 Oracle 调优.它有大量的调整参数和技术来改进你的 Oracle 数据库的性能.    Oracle 调优是一个复杂的主题.关于调优可以写整整一本书,不过,为了改善 Oracle 数据库的性能,有一些基本的概念是每个 Oracle DBA 都应该遵从的.    在这篇简介中,我们将简要地介绍以下的 Oracle

Oracle专家调优秘密

oracle Oracle专家调优秘密 前言 在过去的十年中, Oracle 已经成为世界上最专业的数据库之一.对于 IT 专家来说,就是要确保利用 Oracle 的强大特性来提高他们公司的生产力.最有效的方法之一是通过 Oracle 调优.它有大量的调整参数和技术来改进你的 Oracle 数据库的性能. Oracle 调优是一个复杂的主题.关于调优可以写整整一本书,不过,为了改善 Oracle 数据库的性能,有一些基本的概念是每个 Oracle DBA 都应该遵从的. 在这篇简介中,我们将简要