undo的工作原理

小亮520cl發表於2015-07-14
首先我們確定一點,一般情況下ORACLE UNDO表空間90%以上甚至99%以上是沒有任何問題的
一般情況下?什麼是一般情況下,這裡我們需要搞清楚一個概念,那就是GUARANTEE,先記住,後面講,先了解一下UDUO的工作原理。
undo_retention設的為900秒是指undo資料留在undo段裡面至少要900秒以後才能被覆蓋掉,因為Undo段是迴圈的,如果一個DML操作產生了大量的undo資訊時,可能undo空間不夠用,此時就要覆蓋掉一些Undo塊,undo_retention就是保證900秒後那些塊才能被覆蓋(這是一般情況)


如何檢視undo_retention大小
SQL>SHOW PARAMETER UNDO_RETENTION;
undo其實裡面有N個段,不同的session會共用這些段而已。只不過這些段的其中一部分會被標註成可以覆蓋,用多少覆蓋多少,所以我們看到的就是undo好像只增長是不能簡單的縮小,undo_retention:指定事物commit後undo 將要儲存的時間(秒),在ORACLE10g中預設的是900秒。
GUARANTEE :保證undo_retention引數所設定的時間有效,這個是10g的新功能。
SQL> ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;
SQL> ALTER TABLESPACE undotbs1 RETENTION NOGUARANTEE;
在沒有guarantee的保證下,ORACLE並不能保證能夠將undo資訊儲存900秒,如果undo表空間不足,那麼ORACLE將忽略undo_retention的設定,直接覆蓋掉以前的undo,這個時候有可能會產生ORA-01555錯誤。如果undo表空間空間足夠,那麼undo將會儲存很長一段時間,直到undo表空間達到maxsize,這個時候才會覆蓋undo資訊,而且ORACLE會從最古老的undo資訊開始覆蓋。
ORACLE推薦我們將undo 表空間中的datafile 設定MAXSIZE ,不要讓它一直自動擴充套件,如果ORACLE獲得了自動擴充套件的能力,那麼舊的undo不會被覆蓋,到後來undo表空間會越來越大,越來越大,直到將磁碟空間耗盡。
在有guarantee的保證下,ORACLE將會保證undo資訊能夠儲存到undo_retention設定的值之後才被覆蓋,如果這個時候同時執行了很多事物,將undo表空間耗完了,那麼那個事物會失敗,會報ORA-30036 錯誤,所以使用guarantee一定要慎用,如果非要使用guarantee,那麼儘量將undo 表空間設大一點。
Oracle10g開始,如果你設定UNDO_RETENTION為0,那麼Oracle啟用自動調整以滿足最長執行查詢的需要。當然如果空間不足,那麼Oracle滿足最大允許的長時間查詢。而不再需要使用者手工調整。

如果非得清理undo tablespace
可以採用如下步驟
1。新建一個undo_tablespace
2.alter system set undo_tablespace = new_undo_tbs
3.drop old undo_tablespace
這個操作的後果想必大家都知道,最好不要這麼操作,如果操作了但願這900秒內你沒有要UNDO的事情
最後需要注意一點:這個功能很少用,畢竟ORACLE沒有強烈推薦,可能是一個過渡的,而且我們不知道它有沒有什麼BUG。
就是說一個庫執行時間長了以後undo表空間的使用率達到90%以上那屬於正常的現象了!

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