深入淺出undo記載02

dotaddjj發表於2011-12-26

繼續理解eygle深入淺出的undo回滾於撤銷的重要細節知識點,先說一下以前blog中就提到的關於塊清除的知識點。(塊清除是個及其複雜的過程,這裡因為個人理解只能整理出如下要點)

Ora-01555快照過久,oracle經典錯誤,主要由以下三種情況構成

1 查詢scn小於blockscn需要undo構造cr塊實現一致性讀,回滾段被覆蓋

2 延遲塊清除,查詢觸發延遲塊清除需要從回滾段獲得事務提交的scn,如果事務前映象已經被覆蓋,並且查詢scn小於回滾段中最小提交的scn,那麼oracle將無法判斷查詢scn和事務提交scn大小,出現ora-01555(這裡還說一下極端的情況,執行延遲塊清除時,回滾段或原回滾表空間已經被刪除,此時oracle還是可以透過字典表undo$來獲得scn資訊,執行塊清除)

3 利用sqlldrdirect=true方式插入資料時,由於沒有記錄redoundo資訊,oracle直接指定cache commit scn給載入資料,訪問這些資料時,可能會出現ora-01555

(對於eygle所述第三種情況,還未能理解清晰)

這裡再說下分批提交:

對於一個大型事務由於要記錄回滾段資訊,當回滾段不足時很可能會出現一個大事務由於回滾段過久而直接失敗,所以在大型事務中儘量使用分批提交減少回滾段的競爭。

Undo空間的記載,在oracle 9i自動管理的undo表空間,undo_retention引數的引入正是為了減少ora-01555錯誤出現,這個引數設定當transaction提交後,回滾段非啟用後,回滾段保留的時間,oracle9IR1初始值為900秒,oracle9IR2增加10800秒,該引數越大,回滾段保留的時間也越長,不過也需要消耗相應的undo儲存空間。

Undo_retention該引數並不是一個擔保值,在事務比較頻繁下,oracle很可能會覆蓋在undo_retention之內的undo資訊。

SQL> select * from v$version where rownum=1;

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

SQL> show parameter undo;

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

undo_management string AUTO

undo_retention integer 900

undo_tablespace string UNDOTBS1

oracle 10gundo_retention會在AUM下自動管理,預設會啟用,oracle自動滿足最大允許的長時間查詢,而不需要設定undo_retention引數來保留undo資訊。Oracle 10g的新特性的引入伴隨著兩個主要隱含引數_undo_autotune_collect_undo_stats

SQL> col ksppinm for a20

SQL> col ksppdesc for a40

SQL> col ksppstvl for a10

SQL> select ksppinm,ksppdesc,ksppstvl from x$ksppi a,x$ksppcv b

2 where a.indx=b.indx and a.ksppinm like '%undo_autotune%';

KSPPINM KSPPDESC KSPPSTVL

-------------------- ---------------------------------------- ----------

_undo_autotune enable auto tuning of undo_retention TRUE

SQL> select ksppinm,ksppdesc,ksppstvl from x$ksppi a,x$ksppcv b

2 where a.indx=b.indx and a.ksppinm like '%collect_undo_stats%';

KSPPINM KSPPDESC KSPPSTVL

-------------------- ---------------------------------------- ----------

_collect_undo_stats Collect Statistics v$undostat TRUE

同樣oracle 10g中增加了Guarantee控制,使用者也可以指定undo表空間必須滿足undo_retention的範圍之內。預設的是noguarantee

SQL> select tablespace_name,status,contents,retention from dba_tablespaces where contents='UNDO';

TABLESPACE_NAME STATUS CONTENTS RETENTION

------------------------------ --------- --------- -----------

UNDOTBS1 ONLINE UNDO NOGUARANTEE

SQL> alter tablespace undotbs1 retention guarantee;

Tablespace altered

SQL> select tablespace_name,status,contents,retention from dba_tablespaces where contents='UNDO';

TABLESPACE_NAME STATUS CONTENTS RETENTION

------------------------------ --------- --------- -----------

UNDOTBS1 ONLINE UNDO GUARANTEE

undo表空間設定為guarantee,提交事務的回滾空間必須被保留足夠的時間,如果新的事務需要undo空間,此時不會覆蓋und_retention範圍之內的undo資訊,事務會因為沒有足夠回滾空間而失敗,而不是覆蓋。

[@more@]

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

相關文章