一、现象

将数据迁移到新库时,执行较大的存过,会报这个错误。

二、原因

产生该报错的原因:

(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;
View Code

回滚段足够大,使用率也不高,故不是回滚段的问题。

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