ORA-01555快照過舊報錯


一、現象

將數據遷移到新庫時,執行較大的存過,會報這個錯誤。

二、原因

產生該報錯的原因:

(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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM