Flashback Query閃回查詢

jane_pop發表於2014-10-30
從oracle9i就提供了基本形式的閃回查詢:可以查詢過去某個時間的資料庫狀態。工作原理是將查詢指定的時間對映到一個scn,每當查詢找到自從該scn以來更改的一個塊,它將轉到撤銷段以提取回滾此更改所需的撤銷資料。嚴格上說這種回滾是臨時性的,並且僅對執行閃回查詢的會話可見,顯然,為了成功執行閃回查詢,撤銷資料必須是可用的
在後續版本中,大大增強了閃回查詢的功能,現在它可以用來檢索一個行的所有版本,反轉各個事務,或反轉某個時間以來對錶作出的所有更改。當然,也可以保證閃回成功執行---------但是做到這一點要付出代價:它可能引起事務失敗。

注意:所有形式的閃回查詢以來撤銷資料來重構它在過去某個時間點的資料
(1)首先建立一個測試表regions_backup:
HR@orcl 07-OCT-14>create table regions_backup as select * from regions; 

Table created.

HR@orcl 07-OCT-14>select * from regions_backup; 

REGION_ID REGION_NAME 
---------- ------------------------- 
1 Europe 
2 Americas 
3 Asia 
4 Middle East and Africa

(2)記錄時間:
HR@orcl 07-OCT-14>alter session set nls_date_format='yy-mm-dd hh24:mi:ss'; 

Session altered. 

HR@orcl 14-10-07 20:17:28>select sysdate from dual; 

SYSDATE 
----------------- 
14-10-07 20:17:36

(3)從表中刪除一些行,並且提交更改:
HR@orcl 14-10-07 20:17:36>delete from regions_backup where region_name like 'A%'; 

2 rows deleted. 

HR@orcl 14-10-07 20:18:35>commit; 

Commit complete. 

HR@orcl 14-10-07 20:18:24>select * from regions_backup; 

REGION_ID REGION_NAME 
---------- ------------------------- 
1 Europe 
4 Middle East and Africa

(3)查詢針對以前某個時間的表:
HR@orcl 14-10-07 20:22:25>select * from regions_backup as of timestamp to_timestamp('14-10-07 20:17:36','yy-mm-dd hh24:mi:ss'); 

REGION_ID REGION_NAME 
---------- ------------------------- 
1 Europe 
2 Americas 
3 Asia 
4 Middle East and Africa 

(4)查詢組合實時資料和歷史資料,以瞭解刪除了哪些行。該查詢的輸出可以用於修復的目的,以便將那些行重新插入回表中:
HR@orcl 14-10-07 20:23:00>select * from regions_backup as of timestamp to_timestamp('14-10-07 20:17:36','yy-mm-dd hh24:mi:ss') minus select * from regions_backup; 

REGION_ID REGION_NAME 
---------- ------------------------- 
2 Americas 
3 Asia


儘管針對過去某個時間點的資料執行查詢是有用的,但是有時也希望完成一系列選擇。透過使用DBMS_FLASHBACK程式包可以將整個會話回退到過去某個時間:
SYS@orcl 07-OCT-14>grant execute on dbms_flashback to hr; 

Grant succeeded. 

HR@orcl 07-OCT-14>execute dbms_flashback.enable_at_time(to_timestamp('14-10-07 20:17:36','yy-mm-dd hh24:mi:ss')); 

PL/SQL procedure successfully completed.

HR@orcl 07-OCT-14>select * from regions_backup; 

REGION_ID REGION_NAME 
---------- ------------------------- 
1 Europe 
2 Americas 
3 Asia 
4 Middle East and Africa


從此以後,所有查詢將看到的資料庫在指定時間的狀態。其他所有會話將看到實時資料-----但是在取消閃回之前這個會話將看到一個凍結版本的資料庫。

HR@orcl 07-OCT-14>update regions_backup set region_id=5 where region_name='EUROPE'; 
update regions_backup set region_id=5 where region_name='EUROPE' 

ERROR at line 1: 
ORA-08182: operation not supported while in Flashback mode 

HR@orcl 07-OCT-14>execute dbms_flashback.disable; 

PL/SQL procedure successfully completed. 

HR@orcl 07-OCT-14>select * from regions_backup; 

REGION_ID REGION_NAME 
---------- ------------------------- 
1 Europe 
4 Middle East and Africa
當處於閃回模式時,無法執行DML命令,否則會丟擲錯誤,只能執行select語句。
閃回查詢(透過一個查詢或使用DBMS_FLASHBACK)可以回退到多久以前取決於撤銷段的內容。如果構造過時的結果集所需的撤銷資料不可用,那麼查詢將會失敗並給出一個ORA-08180錯誤訊息“No snapshot found based on specified time“。

啟用閃回查詢的語法接受時間戳或scn,如果使用scn,那麼閃迴轉到的時間點是精確的,如果指定某個時間,那麼它將對映到一個scn上並且精度是3秒。

注意:可以查詢以前某個時間點的資料庫,但是永遠不能對過去版本的資料執行DML。






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

相關文章