【徵文】全面學習oracle flashback特性(1.5)--閃回查詢之制約因素

junsansi發表於2008-07-02

5、Flashback Query的制約因素

制約該特性應用的有三方面的因素,

5.1  自動撤銷管理表空間

個是前面也提到要使用flashback的相關特性,必須啟用自動撤銷管理表空間,不僅是flashback query,也包括flashback table和flashback database,而對於後兩項還會有些其它的附加條件,比如flashback table需要啟用了recycle bin(回收站),flashback database還要求必須啟用了flashback area(閃回區)。

附A:

提示:什麼是Automatic Undo Management(自動撤銷管理表空間)

提到自動撤銷管理表空間,就不得不提手動管理的回滾段,接觸過9i之前版本oracle的朋友對此一定有所瞭解(就俺看來,已經可以將其劃歸到歷史的行列中了)。在9i之前,回滾段的管理和監控是需要dba手工介入的,建立合適的回滾段是件非常耗費dba精力的事情,你可能需要不斷關注oracle執行狀況很長一陣子時間後,通過不斷的調整才能基本確認一段時期內回滾段的大小,一旦回滾段建立的不合適,就極有可能引起效能問題甚至錯誤,比如ora-1555就是典型的回滾段設定不合適觸發的。

9i之後呢(含9i),oracle為了清晰它的整個概念,取消了回滾段這個說法(實際上並未取消回滾段),而完全以undo來代替,這也它正好與redo相對應,一個重做,一個撤銷,對於新接觸oracle的朋友來說也更加容易理解。回滾段可以不再由dba手工介入,而是完全由它自己在執行時自動分配,這在一定程度上即解放了dba,也確實起到了提高效能的作用,比如採用自動管理表空間就可以最大程式的降低ora-1555發生的機率(注意是降低,不是避免,我們不可能建立一個無限大的回滾段,ora-1555也並不完全是回滾段造成的,關於ora-1555的問題這裡就不深入討論了,網際網路上已經有太多文章描述和介紹該問題及解決方案)

是否起用自動管理的撤銷表空間由二個初始化引數決定:

UNDO_MANAGEMENT:值為AUTO表示使用了自動撤銷管理表空間,MANUAL則表示手動管理

UNDO_TABLESPACE:當UNDO_MANAGEMENT值為AUTO時,該引數用來指定當前的undo表空間名稱。

undo表空間的大小,直接影響到flashback query的查詢能力,因為多版本查詢所依賴的undo資料都儲存在undo表空間中,該表空間越大,所能夠儲存的undo資料自然也越多,如果該表空間可用空間非常小,別說flashback了,恐怕正常查詢都有可能觸發ora-1555吧。

5.2  初始化引數

初始化引數UNDO_RETENTION設定嚴格說起來也是與undo表空間有關係,但是思量再三,我覺著還是有必要單拎出來詳細介紹。

該引數用來指定undo記錄儲存的最長時間,以秒為單位,是個動態引數,完全可以在例項執行時隨時修改通常預設是900秒,也就是15分鐘。

一定要注意,undo_retention只是指定undo資料的過期時間,並不是說,undo中的資料一定會在undo表空間中儲存15分鐘,比如說剛一個新事務開始的時候,如果undo表空間已經被寫滿,則新事務的資料會自動覆蓋已提交事務的資料,而不管這些資料是否已過期,因此呢,這就又關聯回了第一點,當你建立一個自動管理的undo表空間時,還要注意其空間大小,要儘可能保證undo表空間有足夠的儲存空間。

同時還要注意,也並不是說,undo_retention中指定的時間一過,已經提交事務中的資料就立刻無法訪問,它只是失效,只要不被別的事務覆蓋,它會仍然存在,並可隨時被flashback特性引用。如果你的undo表空間足夠大,而資料庫又不是那麼繁忙,那麼其實undo_retention引數的值並不會影響到你,哪怕你設定成1(這麼說好像絕對了點,大家一定要注意理解,表鑽牛角尖),只要沒有事務去覆蓋undo資料,它就會持續有效。因此呢,這裡還是那句話,要注意undo表空間的大小,保證其有足夠的儲存空間。

提示:

只有在一種情況下,undo表空間能夠確保undo中的資料在undo_retention指定時間過期前一定有效,就是為undo表空間指定Retention Guarantee,指定之後,oracle對於undo表空間中未過期的undo資料不會覆蓋,例如:

SQL> Alter tablespace undotbs1 retention guarantee;

如果想禁止undo表空間retention guarantee,如例:

SQL> Alter tablespace undotbs1 retention noguarantee;

轉了一圈,問題又回來了,既然它看起來有用又像沒有用,為什麼還要設定它呢,黑黑,就我理解,其存在的真實用途,就是提醒你undo表空間很重要,給它指定分配一個合適的大小,更重要喲。

5.3  DDL操作的影響

第三個就是修改並提交過資料之後,對錶做過DDL操作,包括:

drop/modify列, move表, drop分割槽(如果有的話), truncate table/partition,這些操作會另undo表空間中的撤銷資料失效,對於執行過這些操作的表應用flashback query會觸發ORA-01466錯誤。另外一些表結構修改語句雖然並不會影響到undo表空間中的撤銷記錄,但有可能因表結構修改導致undo中重做記錄無法應用的情況,比如對於增加了約束,而flashback query查詢出的undo記錄已經不符合新建的約束條件,這個時候直接恢復顯然不可能成功,你要麼暫時disable約束,要麼通過適當邏輯,對要恢復的資料進行處理之後,再執行恢復。

另外,flashback query對v$tables,x$tables等動態效能檢視無效,不過對於dba_*,all_*,user_*等資料字典是有效的。同時該特性也完全支援訪問遠端資料庫,比如select * from tbl@dblink as of scn 360;的形式。

===================================

檢視前面的連載:

(1.4)--閃回查詢之Transaction query

(1.3)--閃回查詢之Versions between

(1.2)--閃回查詢之As of scn

(1.1)--閃回查詢之As of timestamp

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

相關文章