(转)oracle 10g undo表空间使用率居高不下bug


对于UNDO表空间大小的定义需要考虑UNDO_RETNETION参数、产生的UNDO BLOCKS/秒、UNDO BLOCK的大小。
undo_retention:
1、对于UNDO表空间的数据文件属性为autoextensible,则undo_retenion参数必须设置,UNDO信息将至少保留至undo_retention参数设定的值内,但UNDO表空间将会自动扩展。
2、对于固定UNDO表空间,将会通过表空间的剩余空间来最大限度保留UNDO信息。如果FIXED UNDO表空间没有对保留时间作GUARANTEE(alter tablespace xxx retention guarantee;),则undo_retention参数将不会起作用。(警告:如果设置UNDO表空间为retention guarantee,则未过期的数据不会被复写,如果表空间不够则会导致DML操作失败或者transation挂起)

   Oracle10g有自动Automatic Undo Retention Tuning这个特性。设置的undo_retention参数只是一个指导值,,Oracle会自动调整Undo (会跨过undo_retention设定的时间)来保证不会出现Ora-1555错误.。通过查询V$UNDOSTAT(该视图记录4天以内的UNDO表空间使用情况,超过4天可以查询DBA_HIST_UNDOSTAT视图) 的tuned_undoretention(该字段在10G版本才有,9I是没有的)字段可以得到Oracle根据事务量(如果是文件不可扩展,则会考虑剩余空间)采样后的自动计算出最佳的retenton时间.。这样对于一个事务量分布不均匀的数据库来说,,就会引发潜在的问题--在批处理的时候可能Undo会用光, 而且这个状态将一直持续, 不会释放。

如何取消10g的auto UNDO Retention Tuning,有如下三种方法:

from metalink 420525.1:Automatic Tuning of Undo_retention Causes Space Problems

1.) Set the autoextend and maxsize attribute of each datafile in the undo ts so it is autoextensible and its maxsize is equal to its current size so the undo tablespace now has the autoextend attribute but does not autoend:
SQL> alter database datafile ''
autoextend on maxsize ;

With this setting, v$undostat.tuned_undoretention is not calculated based on a percentage of the undo tablespace size, instead v$undostat.tuned_undoretention is set to the maximum of (maxquerylen secs + 300) undo_retention specified in init.ora file.

select tuned_undoretention, maxquerylen, maxqueryid from v$undostat;



2.) Set the following hidden parameter in init.ora file:
_smu_debug_mode=33554432

or

SQL> Alter system set "_smu_debug_mode" = 33554432;

With this setting, v$undostat.tuned_undoretention is not calculated based on a percentage of the fixed size undo tablespace, instead v$undostat.tuned_undoretention is set to the maximum of (maxquerylen secs + 300) undo_retention specified in init.ora file.

3.) Set the following hidden parameter in init.ora:
_undo_autotune = false

or

SQL> Alter system set "_undo_autotune" = false; 可动态调整

关于网友的一个案例:

---另一个

但奇怪的地方在于当时该数据库并不是特别繁忙,并不是在波峰时段。当查看stats$undostat时,一个参数吸引了我的注意力:UNXPSTEALCNT

我们来看看UNXPSTEALCNT的解释:

UNXPBLKREUCNT: Number of unexpired undo blocks reused by transactions

一般来说该参数都应该等于0,但是这个参数在那段时间是大于0的。因为只有当undo tablespace不够存放undo_retention时间段内的数据的时候,才会发生unexpired undo extents stealing。再去查看stats$rollstat,发现但是RSSIZE和undo tablespace大小是一样的,这就说明当时undo tablespace确实不够用了。

那么为什么在系统不是很繁忙的时候会出现undo不够用的情况呢,如果说不够用,那在波峰时段应该问题更加严重才对。

查看stats$undostat.tuned_undoretention参数发现了问题所在。从10.2版本开始,oracle默认采用自动调整undo retention的方法,根据你undo tablespace的大小以及系统的繁忙程度(v$undostat中信息)自动调整undo_retention参数,所以在10g的数据库上你会经常发现undo tablespace永远是满的,因为当你undo tablespace有空闲空间时,系统自动调大undo_retention来保留更多的undo blocks。这一方法有利于时间长的查询,但是对于典型的OLTP系统来说不太适用,因为OLTP上不太可能跑如此长时间的查询,而且在很繁忙的OLTP上还会导致上面所遇到的问题。oracle真是吃力不讨好。

出问题前一天,数据库做维护被重启过,因为刚起来数据库很空闲,所以v$undostat.tuned_autoretention很大,undo tablespace被撑满,虽然tuned_autoretention一直在降,但是还是没有赶上系统warm up的速度,导致数据库出现了问题。

该功能可以通过_undo_autotune参数被disable,disable后v$undostat不在更新。

_undo_autotune : enable auto tuning of undo_retention

该参数可以在线修改:

alter system set “_undo_autotune” = false;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7353848/viewspace-696158/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7353848/viewspace-696158/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要释放Oracle 11g中的undo表空间,可以按照以下步骤操作: 1. 首先,确认当前undo表空间的使用情况,可以使用以下命令查询: SELECT tablespace_name, sum(bytes)/1024/1024 "Size (MB)", sum(maxbytes)/1024/1024 "Max Size (MB)" FROM dba_data_files WHERE tablespace_name = 'UNDOTBS1' GROUP BY tablespace_name; 其中,'UNDOTBS1'为当前使用的undo表空间名称。 2. 确认当前没有任何事务在进行中,可以使用以下命令查询: SELECT COUNT(*) FROM v$transaction; 如果返回结果为0,则表示当前没有事务在进行中。 3. 执行以下命令释放undo表空间: ALTER SYSTEM CHECKPOINT; ALTER SYSTEM SET UNDO_RETENTION=0; ALTER TABLESPACE UNDOTBS1 OFFLINE IMMEDIATE; DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS AND DATAFILES; 其中,'UNDOTBS1'为当前使用的undo表空间名称。 4. 最后,确认undo表空间已经释放,可以使用以下命令查询: SELECT tablespace_name, status FROM dba_tablespaces WHERE tablespace_name = 'UNDOTBS1'; 如果返回结果为'PENDING OFFLINE',则表示undo表空间已经成功释放。 注意:释放undo表空间可能会导致数据丢失,请谨慎操作。建议在备份数据后再进行操作。 ### 回答2: 当Oracle数据库中的Undo表空间(也称为回滚段)不再使用时,它可以被释放以节省磁盘空间。在Oracle 11g中,可以按照以下步骤来释放Undo表空间: 1. 确定未使用的Undo表空间:首先需要确定哪些Undo表空间未使用。可以通过查询v$undostat视图来获取当前的Undo表空间使用情况。该视图提供有关Undo表空间大小、使用量、可用量等等信息。 2. 切换所有事务到新Undo表空间:在释放旧的Undo表空间之前,需要将所有正在运行的事务切换到新的Undo表空间中。可以通过以下方法创建一个新的Undo表空间: CREATE UNDO TABLESPACE new_undo_ts DATAFILE '/path/to/new_undo_ts.dbf' SIZE 10G; ALTER SYSTEM SET UNDO_TABLESPACE=new_undo_ts SCOPE=SPFILE; SHUTDOWN IMMEDIATE; STARTUP; 在创建新的Undo表空间之后,需要将所有正在使用旧Undo表空间的事务切换到新的Undo表空间中。可以使用以下命令来完成: ALTER SYSTEM SET UNDO_TABLESPACE=new_undo_ts; 3. 等待Undo表空间变为闲置状态:在切换所有事务到新Undo表空间之后,需要等待旧的Undo表空间变为闲置状态。可以通过查询v$rollstat视图来检查它的状态。当状态更改为“NEEDS_COMPACT”时,就开始可以释放旧的Undo表空间了。 4. 释放Undo表空间:使用以下命令释放Undo表空间: ALTER TABLESPACE old_undo_ts OFFLINE; DROP TABLESPACE old_undo_ts INCLUDING CONTENTS AND DATAFILES; 此时,“old_undo_ts”是要释放的Undo表空间的名称。 总之,在释放Undo表空间之前,需要确保所有活动的事务切换到新的Undo表空间中,并且该Undo表空间处于“闲置”状态。释放Undo表空间应该是仔细计划和谨慎实施的过程。 ### 回答3: 当Oracle 11g释放undo表空间时,需要遵循以下步骤: 1. 确认undo表空间已经没有任何无需保留的信息。可以通过检查v$rollstat动态视图、使用SQL查询语句或运行Oracle标准性能分析工具来查看当前undo空间的使用情况。 2. 执行回滚段清理,并确保没有任何未提交的事务或会话进行操作。可以使用以下语句进行回滚段清理: ALTER SYSTEM CHECKPOINT; 3. 确定当前正在使用的回滚段及其数据文件。可以使用以下语句来查询当前正在使用的回滚段: SELECT segment_name, tablespace_name FROM dba_rollback_segs WHERE status = 'USABLE' AND tablespace_name = '&tablespace_name'; 4. 更改所有正在使用的回滚段的表空间为新的undo表空间。可以使用以下语句来更改表空间: ALTER ROLLBACK SEGMENT &segment_name ONLINE; ALTER ROLLBACK SEGMENT &segment_name STORAGE (TABLESPACE &new_tablespace); 5. 删除所有旧的undo表空间。可以使用以下语句来删除表空间: DROP TABLESPACE &old_tablespace INCLUDING CONTENTS AND DATAFILES; 需要注意的是,释放undo表空间不会发生立即效果,因为Oracle在使用undo信息时会将其添加到其内部事务表中,所以要等待所有当前执行的事务完成并更新内部事务表后,才能彻底释放undo表空间。同时,释放undo表空间也要谨慎操作,以免影响数据库的稳定性和数据完整性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值