Oracle Flashback 閃回查詢功能操作範例(9i and 10g)

tolywang發表於2008-08-15

Oracle Flashback 閃回查詢功能操作範例(9i and 10g) 

          Oracle 從 9i開始提供了基於回滾段的閃回查詢(Flashback Query)功能,可用於恢復錯誤的DML操作。在Oracle 10g中對閃回查詢做了較大改進,不再侷限於閃回查詢,還可用於恢復錯誤的DDL(Drop)操作、閃回表、閃回資料庫等。

          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與時間的同步問題,需要5分鐘以後才能同步,也就是說,如果新插入的資料,還不到5分鐘,馬上就根據時間來flashback query,是查不到資料的。

查詢 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透過建立新的Flashback Logs(閃回日誌),記錄資料庫的閃回操作。如果希望能閃回資料庫,需要設定如下引數: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 ;

       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;

最後清理回收站:

    清除回收站中的單個表:purge table test_drop

  清除整個回收站:purge recyclebin

  清除不同的物件回收站:purge user_recyclebin或purge dba_recyclebin 

徹底刪除一個table:  SQL>drop table test_drop purge;  就不能被恢復了。

 

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

相關文章