Flashback 是ORACLE 自9i 就開始提供的一項特性,在9i 中利用oracle 查詢多版本一致的特點,實現從復原段中讀取表一定時間內操作過的資料,可用來進行資料比對,或者修正意外提交造成的錯誤資料,該項特性也被稱為Flashback Query。
一、Flashback Query
正如前言中所提,Flashback Query 是利用多版本讀一致性的特性從UNDO 資料表空間讀取操作前的記錄資料!
什麼是多版本讀一致性
Oracle 採用了一種非常優秀的設計,通過undo 資料來確保寫不堵塞讀,簡單的講,不同的事務在寫資料時,會將資料的前映像寫入undo 資料表空間,這樣如果同時有其它事務查詢該表資料,則可以通過undo 資料表空間中資料的前映像來構造所需的完整記錄集,而不需要等待寫入的事務提交或復原。
flashback query 有多種方式構建查詢記錄集,記錄集的選擇範圍可以基於時間或基於scn,甚至可以同時查詢出記錄在undo 資料表空間中不同事務時的前映象。用法與標準查詢非常類似,要通過flashback query 查詢undo 中的撤銷資料,最簡單的方式只需要在標準查詢語句的表名後面跟上as of timestamp(基於時間)或as of scn(基於scn)即可。as of timestamp|scn 的文法是自9iR2 後才開始提供支援。
1、As of timestamp 的樣本:
SQL> alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss';
會話已更改。
SQL> select sysdate from dual;
SYSDATE
-------------------
2009-10-15 19:04:16
SQL> select * from A;
ID
----------
2
1
3
4
類比使用者誤操作,刪除資料
SQL> delete from A;
已刪除4行。
SQL> commit;
提交完成。
SQL> select * from A;
未選定行
查看刪除之前的狀態:
假設當前距離刪除資料已經有5 分鐘左右的話:
SQL> select * from A as of timestamp sysdate-5/1440;
ID
----------
2
1
3
4
或者:
SQL>select * from A as of timestamp to_timestamp('2009-10-15 19:04:16','YYYY-MM-DD hh24:mi:ss');
ID
----------
2
1
3
4
用Flashback Query恢複之前的資料:
SQL>Insert into A select * from A as of timestamp to_timestamp('2009-10-15 19:04:16','YYYY-MM-DD hh24:mi:ss');
已建立4行。
SQL> COMMIT;
提交完成。
SQL> select * from A;
ID
----------
2
1
3
4
如上述樣本中所表示的,as of timestamp 的確非常易用,但是在某些情況下,我們建議使用as of scn 的方式執行flashback query,比如需要對多個相互有主外鍵約束的表進行恢複時,如果使用as of timestamp 的方式,可能會由於時間點不統一的緣故造成資料選擇或插入失敗,通過scn 方式則能夠確保記錄的約束一致性。
2. As of scn 樣本
查看SCN:
SELECT dbms_flashback.get_system_change_number FROM dual;
SELECT CURRENT_SCN FROM V$DATABASE;
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
1095782
刪除資料:
SQL> delete from A;
已刪除4行。
SQL> commit;
提交完成。
查看刪除之前的狀態:
SQL> select * from A as of scn 1095782;
ID
----------
2
1
3
4
用Flashback Query恢複之前的資料:
SQL> insert into A select * from A as of scn 1095782;
已建立4行。
SQL> commit;
提交完成。
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/