Oracle 從 9i開始提供了基于復原段的閃回查詢(Flashback Query)功能,可用于恢複錯誤的DML操作。在Oracle 10g中對閃回查詢做了較大改進,不再局限于閃回查詢,還可用于恢複錯誤的DDL(Drop)操作、閃回表、閃回 資料庫等。
Oracle9i中提供閃回查詢,由一個新的包DBMS_FLASH來實作。使用者使用閃回查詢可以及時取得誤操作DML(Delete、Update、Insert)前某一時間點資料庫的映像視圖,使用者可以利用系統時間或系統改變号(SCN:System ChangeNumber)來指定這個隻讀視圖,并可以針對錯誤進行相應的恢複措施。閃回查詢功能完全依賴于自動復原段管理(AUM),對于Drop等誤操作不能恢複 。
因為Oracle9i 使用undo 來作為flashback query的前鏡像存放點,是以 undo_management = auto , 而且undo_retention 設定時間要合理。
還有5分鐘的問題。 9i的時候,根據時間來做flashbackquery,是很容易有比較大的誤差的,不過幸好的是,10g改進了這一點,其實,主要的原因是因為,9i的scn與時間的同步問題,需要5分鐘以後才能同步,也就是說,如果新插入的資料,還不到5分鐘,馬上就根據時間來flashbackquery,是查不到資料的。
查找 SCN , Time對應關系: select to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’),
to_char(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER) AS SCN from dual;
通過時間flashback query資料: SELECT * FROM test AS OF TIMESTAMP
TO_TIMESTAMP(’2007-04-09 11:25:17′, ‘YYYY-MM-DD HH:MI:SS’);
通過SCN 閃回資料: SELECT * FROM test AS OF SCN 23565583;
------------------------------------------------------------------------------------------
Oracle10g 閃回原理不一樣:
Oracle Flashback Database特性允許通過SQL語句Flashback Database語句,讓資料庫前滾到目前的前一個時間點或者SCN,而不需要做時間點的恢複。閃回資料庫可以迅速将資料庫回到誤操作或人為錯誤的前一個時間點,如Word中的"撤消"操作,可以不利用備份就快速的實作基于時間點的恢複。Oracle通過建立新的FlashbackLogs(閃回日志),記錄資料庫的閃回操作。如果希望能閃回資料庫,需要設定如下參數:DB_RECOVER_FILE_DEST日志的存放位置,DB_RECOVER_FILE_DEST_SIZE恢複區的大小。在建立資料庫的時候,Oracle将自動建立恢複區,但預設是關閉的,需要執行alter database flashback on指令。
SQL>flashback database to time to_timestamp(xxx);
SQL>flashback database to scn xxx ;
OracleFlashback Table特性允許利用Flashback Table語句,確定閃回到表的前一個時間點。與Oracle9i中的Flashback Query相似,利用復原段資訊來恢複一個或一些表到以前的一個時間點(一個快照)。要注意的是,FlashbackTable不等于Flashback Query,FlashbackQuery僅僅是查詢以前的一個快照點而已,并不改變目前表的狀态,而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特性提供一個類似資源回收筒的功能,用來恢複不小心被删除的表。當删除表時,Oracle10g并不立刻釋放被删除的表所占用的空間,而是将這個被删除的表進行自動重命名(為了避免同類對象名稱的重複)并放進資源回收筒中。所謂的資源回收筒類似于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;
最後清理資源回收筒:
清除資源回收筒中的單個表:purge table test_drop
清除整個資源回收筒:purge recyclebin
清除不同的對象資源回收筒:purge user_recyclebin或purge dba_recyclebin
徹底删除一個table: SQL>drop table test_drop purge; 就不能被恢複了。