情景
一般在oracle数据库中碰到如下报错
ORA-01555: 快照过旧: 回退段号 140 (名称为 "_SYSSMU140_1145098141$") 过小
一般的想法都是对undo表空间进行扩容,因为报错的意思很明显undo表空间不够了,但是我们不能盲目的扩容undo表空间,也需要考虑实际的情况。
当前问题以及分析
最近,ebs环境(数据库的版本是11.2.0.2.0)的undo表空间总是会触发报警表示undo表空间的使用率很高且数据库有ORA-01555报错,而undo表空间APPS_UNDOTS1前不久才进行了扩容,并且当前的undo表空间已经达到300多个G(数据库特别大哦,这个设置较合理),理论上来说是足够用了,那么是什么原因导致报警频发并报出ORA-01555这样的报错呢?
这里关系到一个oracle数据库中的undo的隐含参数"_undo_autotune",这个参数的默认值是true,影响着undo表空间的使用,进而可能会对日结和月结产生影响。在Oracle 10gr2之后版本中添加了undo信息最短保留时间段自动调优的特性,不再仅仅依据参数UNDO_RETENTION的设定,而是根据undo tablespace的大小以及系统的繁忙程度(v$undostat中信息)自动调整undo_retention参数,因此会经常发现undo tablespace一直是满的。
解决方法
查看数据库隐含参数_undo_autotune的值,如果没有修改过,就是ture
SELECT ksppinm, ksppstvl, ksppdesc
FROM x$ksppi x, x$ksppcv y
WHERE x.indx = y.indx
AND TRANSLATE(ksppinm, '_', '#') LIKE '_undo_autotune';
从上述的情况来看需要关闭这个自动调优的参数的值,这个值可以在线进行修改,不需要重启数据库
alter system set "_undo_autotune" = false;
后续验证
在关闭这个参数后,发现undo表空间的使用率迅速降低,从99%降低到49%,应用上报错ORA-01555也消失了.





