一、现象
将数据迁移到新库时,执行较大的存过,会报这个错误。
二、原因
产生该报错的原因:
(1)sql执行比较久,需要优化sql
(2)回滚段过小
(3)undo保存时间过短
三、具体检查及恢复
1、查看sql的执行计划,看看是否可以优化。因为我这边出现这个现象是数据库迁移后发生的,老库可以执行成功,新库不能,比较这种现象比较多,故先不进行具体的sql优化,先检查另外两个原因。
2、检查回滚段大小:
SELECT UPPER(F.TABLESPACE_NAME) "表空间名", (D.TOT_GROOTTE_MB/1024) "表空间大小(G)", ((D.TOT_GROOTTE_MB - F.TOTAL_BYTES)/1024) "已使用空间(G)", TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100, 2),'990.99') "使用比", (F.TOTAL_BYTES/1024) "空闲空间(G)", (F.MAX_BYTES/1024) "最大块(G)" FROM (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES, ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES FROM SYS.DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F, (SELECT DD.TABLESPACE_NAME, ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB FROM SYS.DBA_DATA_FILES DD GROUP BY DD.TABLESPACE_NAME) D WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME and f.TABLESPACE_NAME like 'UNDO%' ORDER BY 4 DESC;
回滚段足够大,使用率也不高,故不是回滚段的问题。
2、查看undo_retention参数
在pl/sql的命令窗口中输入: show parameter undo_
Undo_retention:是undo数据保存的时间,是一个“目标期望值”,单位为秒,默认为900s。
用户设置出这个值之后,Oracle内部会尽量保证将Undo数据保留超过undo_retention设置的时间。但是,如果Undo使用紧张、没有额外的方法,那么这个时间段也是不能保证的。这个时间如果设置得比较小,数据很快被覆盖了,那么执行较长时间的查询语句就会报ORA-01555的错误。
我查看了老库的这个参数,是2700,将新库的参数,调整和老库一样后,执行存过,不再报错。
alter system set undo_retention=7200 ;--需要比较高的权限才能修改系统参数(基保部执行)
具体undo相关参数参考我的另外一篇博客 https://www.cnblogs.com/weimengjiacan/p/10115505.html