Oracle從9i開始提供了基於復原段的閃回查詢(Flashback Query)功能,可用於恢複錯誤的DML操作.在Oracle 10g中對閃回查詢做了較大改進,不再局限於閃回查詢,還可用於恢複錯誤的DDL(Drop)操作,閃回表,閃回資料庫等.下面介紹兩個版本的區別:
Oracle9i 閃回原理:
Oracle 9i中提供閃回查詢,由一個新的包DBMS_FLASH來實現.使用者使用閃回查詢可以及時取得誤操作DML(Delete, Update, Insert)前某一時間點資料庫的映像視圖,使用者可以利用系統時間或系統改變號(SCN:System Change Number)來指定這個唯讀視圖,並可以針對錯誤進行相應的恢複措施.閃回查詢功能完全依賴於自動復原段管理(AUM),對於Drop等誤操作不能恢複.
因為Oracle9i使用undo來作為flashback query的前鏡像存放點,所以 undo_management = auto,而且undo_retention設定時間要合理. 還有5分鐘的問題,9i的時候,根據時間來做flashback query,是很容易有比較大的誤差的,不過幸好的是,10g改進了這一點.其實,主要的原因是因為,9i的scn與時間的同步問題,www.bkjia.com需要5分鐘以後才能同步,也就是說,如果新插入的資料,還不到5分鐘,馬上就根據時間來flashback query,是查不到資料的.
1.尋找SCN, Time對應關係:SELECT to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'),
to_char(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER) AS SCN
FROM dual;
2.通過時間flashback query資料:SELECT * FROM test AS OF TIMESTAMP
TO_TIMESTAMP('2007-04-09 11:25:17', 'YYYY-MM-DD HH:MI:SS');
3.通過SCN閃回資料:SELECT * FROM test AS OF SCN 23565583;
-------------------------------------------------------------------------------------------------------
Oracle10g 閃回原理:
Oracle Flashback Database特性允許通過SQL語句Flashback Database語句,讓資料庫前滾到當前的前一個時間點或者SCN,而不需要做時間點的恢複.閃回資料庫可以迅速將資料庫回到誤操作或人為錯誤的前一個時間點,如Word中的"撤消"操作,可以不利用備份就快速的實現基於時間點的恢複.Oracle通過建立新的Flashback Logs(閃回日誌),記錄資料庫的閃回操作.如果希望能閃回資料庫,需要設定如下參數:1.DB_RECOVER_FILE_DEST日誌的存放位置,。
2.DB_RECOVER_FILE_DEST_SIZE恢複區的大小.在建立資料庫的時候,Oracle將自動建立恢複區,但預設是關閉的,需要執行 alter database flashback on命令.
SQL>flashback database to time to_timestamp(xxx);
SQL>flashback database to scn xxx ;
Oracle Flashback Table特性允許利用Flashback Table語句,確保閃回到表的前一個時間點.與Oracle 9i中的Flashback Query相似,利用復原段資訊來恢複一個或一些表到以前的一個時間點(一個快照).要注意的是,Flashback Table不等於Flashback Query, Flashback Query僅僅是查詢以前的一個快照點而已,並不改變當前表的狀態,而Flashback Table將改變當前表及附屬對象一起回到以前的時間點.
flashback table tablename to timestamp xxx或
flashback table tablename to scn xxx
例如:SQL>flashback table test to timestamp to_timestamp('2005-05-07 15:00:00', 'yyyy-mm-dd hh24:mi:ss');
Oracle Flashback Drop特性提供一個類似資源回收筒的功能,用來恢複不小心被刪除的表.當刪除表時,Oracle 10g並不立刻釋放被刪除的表所佔用的空間,而是將這個被刪除的表進行自動重新命名(為了避免同類對象名稱的重複)並放進資源回收筒中.所謂的資源回收筒類似於 Windows系統中的資源回收筒,是一個虛擬容器,用於存放所有被刪除的對象,在資源回收筒中被刪除的對象將佔用建立時的同樣的空間.如果這個被刪除的表需要進行恢複,就可利用Flashback Drop功能.
SQL>show recyclebin;
SQL>drop table test_drop;
SQL>show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
TEST_DROP BIN$b+XkkO1RS5K10uKo9BfmuA==$0 TABLE 2005-05-07:14:30:47
SQL>flashback table test_drop to before drop;或
SQL>flashback table "BIN$b+XkkO1RS5K10uKo9BfmuA==$0" to before drop;
最後清理資源回收筒:
1.清除資源回收筒中的單個表:purge table test_drop
2.清除整個資源回收筒:purge recyclebin
3.清除不同的對象資源回收筒:purge user_recyclebin或purge dba_recyclebin
4.徹底刪除一個table:SQL>drop table test_drop purge;就不能被恢複了.