oracle10g中,針對dba_tablespace,加了其中一個額外列是retention.
回憶一下Oracle 10g之前,在自動Undo管理的模式下,我們都知道undo_retention參數的作用是用來控制當transaction被commit之后,undo信息的保留時間。這些undo信息可以用來構造consistent read以及用于一系列的閃回恢復,而且足夠的undo信息還可以減少經典的ORA-01555錯誤的發生,在Oracle 9R1中呢,這個value的默認值是900秒,Oracle 9R2以后這個value提高到了10800秒。即使我們設置了undo_retention這個參數,那么在默認情況下,這是一個noguarantee的限制。也就是說我將undo_retention=10800,那么原本以為在一個transaction commit之后,之前的undo還可以保存10800秒,才可以被別的transaction DML覆蓋,孰不知當有其他的transaction DML處理過程中需要undo空間的時候,恰恰這個時候not enough space for undo,也就說我并沒有允許undo tablespace自動擴展。由于我們的retention是noguarantee的,所以transaction DML就會忽略這種retention的時間限制直接回繞覆蓋我們的undo信息,這種結果下其實在很多情況下是不希望得到的。
Oracle 10g之后,oracle提出了一個特性就是undo的guarantee,可以強制oracle來guarantee的undo信息,也就說如果一個session的transaction DML需要undo空間的時候,即使undo的空間不足,這個session也不會強制覆蓋由undo_retention所保護的undo信息,那么這個transaction DML會因為undo空間的不足會而report一個error并自動退出。
在Oracle10g中如何要修改guarantee模式可以
SQL> select tablespace_name,block_size,extent_management
2 segment_space_management,contents,retention
3 from dba_tablespaces;
TABLESPACE_NAME?BLOCK_SIZE SEGMENT_SP CONTENTS RETENTION?BIG
------------------------------ ---------- ---------- --------- ----------- ---
SYSTEM?8192 LOCAL?PERMANENT NOT APPLY?NO
UNDOTBS1?8192 LOCAL?UNDO?NOGUARANTEE NO
SYSAUX?8192 LOCAL?PERMANENT NOT APPLY?NO
TEMP?8192 LOCAL?TEMPORARY NOT APPLY?NO
USERS?8192 LOCAL?PERMANENT NOT APPLY?NO
EXAMPLE?8192 LOCAL?PERMANENT NOT APPLY?NO
TEST