標籤:
概述:
閃回技術是Oracle強大Database Backup恢複機制的一部分,在資料庫發生邏輯錯誤的時候,閃回技術能提供快速且最小損失的恢複(多數閃回功能都能在資料庫聯機狀態下完成)。需要注意的是,閃回技術旨在快速恢複邏輯錯誤,對於物理損壞或是介質丟失的錯誤,閃回技術就無能為力了,還是得藉助於Oracle一些進階的備份恢複工具如RAMN去完成(這才是Oracle強大備份恢複機制的精髓所在啊)
撤銷段(UNDO SEGMENT)
在講閃回技術前,需要先瞭解Oracle中一個邏輯結構--撤銷段。因為大部分閃回技術都是基於撤銷段的。撤銷資料是反轉DML語句結果所需的資訊,只要某個事務修改了資料,那麼更新前的原有資料就會被寫入一個撤銷段。(交易回復也會用到撤銷段中的資料)。事務啟動時,Oracle 會為其指派一個撤銷段,一個事務只能對應一個撤銷段,多個事務可以共用一個撤銷段(不過在資料庫正常運行時一般不會發生這種情況)。
閃回技術
Oracle提供了四種可供使用的閃回技術(閃回查詢,閃回刪除,閃迴歸檔,閃回資料庫),每種都有不同的底層體繫結構支撐,但其實這四種不同的閃回技術部分功能是有重疊的,使用時也需要根據實際情境合理選擇最合適的閃回功能。
閃回查詢
a.基本閃回技術
功能:可以查詢過去某個時間段的資料庫狀態。
工作原理:Oracle 會提取所需要的撤銷資料(前提是撤銷是可用的,即撤銷資料還沒被覆蓋)進行復原,但這種復原是臨時的,僅針對當前session可見。
SQL> select * from dept as of timestamp to_timestamp(‘2016-09-10 11:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘);
b.閃回表
功能:可將某個表回退到過去某個時間點
工作原理:同樣,Oracle會先去查詢撤銷段,提取過去某個時間點之後的所有變更,構造反轉這些變更的SQL語句進行回退,閃回操作是一個單獨的事務,所以若由於撤銷資料到期之類的原因導致無法閃回,整個操作會復原,不會存在不一致的狀態。
步驟:
1.啟用表閃回首先要在表上支援行移動(在資料字典中設定標識來標識該操作可能會改變行ID,即同一條資料閃回成功後主鍵都一樣,但行ID其實已經發生變化了)
SQL> alter table emp enable row movement;
2.閃回表操作
SQL> flashback table dept to timestamp to_timestamp(‘2016-09-10 11:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘);
閃回表可能會失敗,有可能有以下幾種情況:
違反了資料庫約束,比如使用者不小心刪除了子表中的資料,現在想利用閃回表技術進行回退,恰好在這中間,父表中與該資料對應的那條記錄也被刪除了,在這種情況下,由於違反了外鍵約束,導致閃回表操作失敗了;
撤銷資料失效,比如用於支撐閃回操作的撤銷資料被覆蓋了,這種情況閃回表操作自然會失敗;
閃回不能跨越DDL,即在閃回點和當前點之間,表結構有過變更,這種情況閃回操作也會失敗。
閃回刪除
功能:閃回刪除可以輕鬆將一個已經被刪除的表還原回來。相應的索引,資料庫約束也會被還原(除了外鍵約束)
原理:Drop命令其實是Rename命令,早期的Oracle版本(10g之前),閃回刪除意味著從資料字典中刪除了該表的所有引用,雖然表中資料可能還存在,但已成了孤魂野鬼,沒法進行恢複了,10g版本之後,Drop命令則僅僅是一個Rename操作,所以恢複就很容易了。
SQL> flashback table emp to before
如果要還原的表名在當前系統中已經被佔用,也可以在閃回刪除的時候對錶重新命名
SQL> flashback table emp to before drop rename to emp_new
也可以通過資源回收筒查看目前使用者那些表被刪除了,每個使用者都有一個資源回收筒,這個資源回收筒是個邏輯結構,它不是一塊獨立的儲存空間,它還在當前資料表空間內,所以如果有別的操作需要空間,資源回收筒就有可能被清空,這也是導致閃回刪除失敗的原因。
SQL> SHOW RECYCLEBIN;
徹底刪除表,閃回刪除也無能為力
SQL> DROP TABLE EMP PURGE;
清空資源回收筒
SQL> PURGE RECYCLEBIN;
需要注意區分truncate操作和drop命令,truncate會截斷表,清空資料(調節Oracle高水位線),速度很快,弊端是此過程不會產生任何撤銷資料或是重做日誌,如果誤刪,恢複異常麻煩,要謹慎使用。
後記:閃迴歸檔和閃回資料庫後續會做補充。
Oracle閃回技術詳解