9i新特性之Flashback Query的應用-------------針對DML誤操作的恢復(1
2024-07-21 02:11:38
供稿:網友
本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。
9i新特性之flashback query的應用-------------針對dml誤操作的恢復
作者:劉穎博
時間: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,其中timestamp是9i中出現的,可以有毫秒的時間單位,如
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誤操作的恢復.