一、現象
將數據遷移到新庫時,執行較大的存過,會報這個錯誤。
二、原因
產生該報錯的原因:
(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