9i新特性之Flashback Query的應用-------------針對DML誤操作的恢復(1)

 

9i新特性之Flashback Query的應用-------------針對DML誤操作的恢復<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

作者:劉穎博

時間:2003-12-29

mail[email protected],請指正

 

轉載請註明出處及作者

 

9i之前,如果出現DML的誤操作,只能通過備份來完成基於時間點的恢復,9i給提供了一個新的特性Flashback Query,我們可以應用此特性,可以很方便的實現恢復。但是要注意的是,Flashback Query 僅僅是一個查詢的機制,不會真正的UNDO任何數據。

 

1.       什麼是Flashback Query

利用Oracle 多版本讀一致的特性通過undo 來提供所需的前鏡像中的數據。通過這個功能,可以看到歷史數據,甚至用歷史數據來修復誤操作引起的錯誤。可以通過指定時間或者SCN 來檢索需要的數據。Uses Oracle's multiversion read-consistency capabilities to restore data by applying undo as needed. You can view and repair historical data, and you can perform queries on the database as of a certain wall clock time or user-specified system commit number (SCN).

可以理解成,Oracle在之前的版本中就已經存在了Flashback Query了,之前我們把它稱爲多版本的讀一致性。(多版本特性提供跨多個用戶會話的一致性視圖,Oracle不執行dirty read

2.       準備工作

the best way:數據庫處於Automatic Undo Management 狀態(也有文章說必須,我查找了oracle文檔應用了這個詞Prerequisite<先決條件>,同時在AskTom上我也查找到相應的解釋,指明最好是自動Undo管理,手動的Undo管理也是可以的,並且有例子)

最大可以閃回查詢的時間段由UNDO_RETENTION 初始化參數(單位爲秒)指定,參看下面執行命令

SQL> show parameter undo

 

NAME                              TYPE        VALUE

------------------------------------ ----------- ------------------------------

undo_management                    string      AUTO

undo_retention                       integer     600

undo_suppress_errors                 boolean     FALSE

undo_tablespace                      string      UNDOTBS1

SQL>

這是一個可以動態的修改的參數,可以通過ALTER SYSTEM SET UNDO_RETENTION =<seconds>;來修改參數值

比較顯然的是,你設置了相對大的UNDO_RETENTION,就必須設置足夠大的UNDO ROLLBACK SEGMENTS。

3.    如何使用Flashback Query

我們可以通過兩種方式來使用Flashback Query:

SQL

使用SELECT 語句的AS OF 來進行閃回查詢,語法如下:

as of  scn ( timestamp) expr

 

通過關鍵詞 AS OF 可以對錶,視圖,物化視圖 進行Flashback Query,可以制定SCN或者TIMESTAMP,其中TIMESTAMP9i中出現的,可以有毫秒的時間單位,如

SQL> select systimestamp from dual;

 

SYSTIMESTAMP

---------------------------------------------------------------------------

29-12-03 10.15.05.171000 下午 +08:00

 

下面,進行一個例子:

SQL> connect scott/tiger

已連接。

SQL> create table test (id number(1));

 

表已創建。

 

SQL> insert into test values (1);

 

已創建 1 行。

 

SQL> insert into test values (2);

 

已創建 1 行。

 

SQL> commit;

 

提交完成。

 

SQL> select * from test;

 

        ID

----------

         1

         2

 

SQL> delete from test where id=1;

 

已刪除 1 行。

 

SQL> commit;

 

提交完成。

SQL> select * from test;

 

        ID

----------

         2

SQL> select * from test as of timestamp (systimestamp -interval'10'second);

 

        ID

----------

         1

         2

SQL> insert into test (select * from test as of timestamp (systimestamp -interva

l'10'second) where id =1);

 

已創建 1 行。

 

SQL> commit;

 

提交完成。

 

SQL> select * from test;

 

        ID

----------

         2

         1

現在,利用了Flashback Query 我們恢復了test表中被誤刪除的記錄。當然我們可以通過一些其他的方法,類似於建立一箇中間表等,進行這種少量數據的DML誤操作的恢復.




 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章