著名的ORA-1555:snapshot too old

swq618發表於2021-08-12

  我們進行大查詢時,可能會出現ORA-1555:snapshot too old 錯誤,Oracle提示的錯誤原因是回滾段太小( rollback segment number string with name "string" too small ),而實際上無論怎麼設定回滾段,都有可能出現這個問題。
       一個 事務 執行時 ,Oracle會檢查所有的行,確認這些資料從 事務 啟動的那個時間點開始沒有發生變化。如果要訪問的資料發生的變化,那麼Oracle會到回滾段中去查詢那個時間點的資料。若使資料發生變化的事務沒有被提交,則資料會一直在回滾段中存在,此時不會產生ORA-1555錯誤;若事務被提交,那麼回滾段就有可能被其他事務覆蓋,碰到這種情況,Oracle 無法透過UNDO中的記錄 完成讀取一致性查詢 ,因此報ORA-1555。即  
      執行大查詢時,訪問的資料已發生變化,但未提交--->去undo中的回滾段查詢那個時間點的資料--->查詢尚未結束前,變化資料被提交,此時回滾段允許被覆蓋--->查詢仍為結束,回滾段被其他事務覆蓋--->Oracle無法完成一致性讀,產生ORA-1555錯誤。
      無論系統有多大的回滾段,提交過的事 務相關的 回滾段都有可能被覆蓋。當然,回滾段越大,被覆蓋的機會越小,但機率小不等於不發生。針對這個問題,我們只能儘量去避免。
       1. 在業務允許的範圍內,調整大事務的執行時間,使之能夠在其他事務較少時執行,或者把大事務分解成多個小事務。
        2. 確保所有回滾段線上。回滾段越多,回滾資訊被覆蓋的機率越小。
       3. 確保所有回滾段的擴充套件屬性大小相同。較小的、容易發生迴轉的回滾段更易導致ORA-1555。
       4. 設定 UNDO_RETENTION引數
        UNDO_RETENTION 引數是UNDO資訊在UNDO表空間的保留時間,單位是秒。理論是來說,在保留時間內,回滾段是不會被覆蓋的,但如果UNDO表空間容量不夠大, UNDO_RETENTION 範圍內的UNDO資料也有可能被覆蓋(若開啟了“保證 ”模式,當UNDO表空間不足以支撐 UNDO_RETENTION的需要,Oracle 報UNDO表空間不足
        總的來說, UNDO_RETENTION引數可以解決大部分ORA-1555問題,前提是 有足夠的UNDO表空間與之匹配。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29674916/viewspace-2786709/,如需轉載,請註明出處,否則將追究法律責任。

相關文章