天天看點

Oracle—undo復原段長時間不釋放

Undo復原段中Unexpired Block遲遲不釋放掉,占用90%以上的undo表空間.

導緻資料庫事務等待嚴重. DML運作異常緩慢. JOB運作也有ora-01555錯誤.

Oracle—undo復原段長時間不釋放

詳細詢問了下UNDO表空間的具體設定,如下:

   1、undo_retention=3600;

   2、未設定表空間的retention guarantee;

   3、UNDO表空間設定為非自動擴充;

   4、資料庫版本11.2.0.1.0

   oracle給了個參數,"_smu_debug_mode" = 33554432,改到系統中,報出一大堆ORA-01555,趕緊改了回來。

       莫非是碰到bug了?查了下,在oracle 10.2.0.2-3,确實有個很類似的bug:5387030。

       正常情況下,如果undo 表空間被設定為固定大小,不自動擴充,oracle會啟用Automatic Tuning of undo retention特性。

       啟用Automatic Tuning of undo retention時,oracle會忽略undo_retention的設定,根據undo表空間大小、系統負載情況,自動調整undo_retention為一個合适的值。這個值一般會大于“所有事務的最長運作時間”。

     10gR2的bug現象為,隻要設定了undo表空間自動管理,不管有沒開自動擴充,不管undo_retention設定為多少,都會啟用 Automatic Tuning of undo retention的新特性。

     這個bug的解決辦法:   

  10.2.0.2/10.2.0.3有相應的patch,這個bug在10.2.0.4中已經修複,建議找時間停機打patch   

  設定隐含參數_smu_debug_mode=33554432,将tuned_undoretention取值算法修正為max(maxquerylen secs + 300,undo_retention )   

  設定隐含參數_undo_autotune=false,關閉自動undo retention調整特性  

       在10.2.0.4及以後,這個bug就修複了。朋友那問題,肯定不是這bug引起的。

    在查閱這bug時,發現Automatic Tuning of undo retention的啟用條件,與朋友那完全吻合,莫非這跟Automatic Tuning of undo retention有關。

查了下官方文檔,确實如此。

Oracle—undo復原段長時間不釋放

系統查了下,果然,undo_retention被自動調整了:

Oracle—undo復原段長時間不釋放

最後總結下,呵,在oracle 10.2.0.4,oracle11g裡面,如果碰到undo使用率100%,不釋放的問題。不建議再通過調整隐藏參數來解決undo占用率高的問題。

更推薦設定undo空間的自動擴充 + 限制檔案最大大小的方式來解決。