2012年1月10日 星期二

undo

參考來源:
http://tw.myblog.yahoo.com/jw!37UBDJOGGRCT69pAGBXOw7JoSw--/article?mid=185


Undo類型區段
共通

.無論何時都只會存在一個「作用中Undo表格空間」。(RAC的每個instacne會各自擁有一個)
.作用中Undo表格空間無法離線或捨棄。
.當決定使用Undo區段後,所有的Rollback區段都會被離線,且無法再設回ONLINE。
.初始化參數
UNDO_MANAGEMENT(MAUNAL為Rollback區段;AUTO為Undo區段)
決定Undo區段的使用種類。
UNDO_RETENTION(單位:秒)
只會讓Oracle儘量達成此目標,Undo該覆寫時仍舊會毫不客氣的給它寫下去。
(但是當Undo表格空間有被指定Retention Guarantee子句時,就真的會保留至那一刻。此舉,只能由SQL命令來指定,無法藉由EM)
UNDO_TABLESPACE
指定要用哪個表格空間來當現行Undo表格空間。
Rollback區段
.TYPE1  UNDO區段,就是以前的Rollback區段。
.SYS表格空間在建立時,會使用到內建的Rollback區段,但之後資料庫正常運行後就不會再使用它。
.Rollback區段則可存在於任何表格空間中。
Undo區段
.TYPE2 Undo區段,目前Oracle強烈建議使用的區段類型。
.只能存在於Undo表格空間中。


Undo表格空間的必要設定:
.續存類型。
.本地管理。
.自動配置延伸區。
(這樣的設定也意謂著Undo會自動管理其大小)


針對交易
.每個交易,都會由一個區段來保護。(多個並行交易情況發生時,Undo區段會自行產生多個來應對)
.交易無法跨區段。(因為會和↑這一點相衝突)。
.共享區段的問題可能發生,只不過發生機率很低。
.區段埴滿時,會自動配置延伸區使交易正常運行。
.已過期Undo:已提交之交易的Undo資料。
.作用中Undo:未提交的Undo資料。
.當有新交易開始,或是執行中交易產生過多資料時,就會重頭覆寫已過期的Undo資料。
.ORA-1555錯誤,代表提出SELEC的使用者,被導向 Undo區塊的原始資料已被覆寫。(因↑情況)
.ORA-30036錯誤,代表空間耗盡無法再擴充Undo區段。


優化Undo表格空間的大小:
.V$UNDOSATA
.UNDOBLKS:最大使用Uodo區數量。
.MAXQUERYLEN:最長查詢時間。(秒)
.SSOLDERRCNT:快照過舊(ORA-1555)的發生次數。
(以上皆是以十分鐘為一列資料)
.決定表格空間大小
(取最大的UNDOBLKS / 600秒 )X (取最長的 MAXQUERYLEN)X DB_BLOCK_SIZE



建議:平時就用一般的Undo表格空間,當有大型批次處理作業時,就切換成有RETENTION GUARANTEE的Undo表格空間。

==========================================================
目的:保證Undo資料不被覆寫,讓最長之查詢避免快照過舊之問題。
範例
ALTER TABLESPACE demo_undotablespace RETENTION GUARANTEE;
解說:
.保留的時間長短受參數UNDO_RETENTION影響。



==========================================================
目的:切換Undo表格空間
範例
ALTER  SYSTEM  SET  UNDO_TABLESPACE='demo_undotablespace';