color="#ff6600"> 在上述查詢中,列 versions_starttime、versions_endtime、versions_xid、versions_Operation 是偽列,與 ROWNUM、LEVEL 等其他熟悉的偽列相類似。其他偽列 如 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN 顯示了該時刻的系統更改號。列 versions_xid 顯示了更改該行的事務標識符。有關該事務的更多詳細信息可在視圖 FlashBACK_TRANSACTION_QUERY 中找到,其中列 XID 顯示事務 id。例如,使用上述的 VERSIONS_XID 值 000A000D00000029,UNDO_SQL 值顯示了實際的語句。 an> 01-DEC-03 03.57.55 PM ; 000A000C00000029 D 1.1013
T-SIZE: 10pt; COLOR: #993300; LINE-HEIGHT: 120%"> (2)事務恢復:當事務正在處理的時候,例程失敗,回滾段的信息保存在重做日志文件中,Oracle將在下次打開數據庫時利用回滾來恢復未提交的數據。 span>·Oracle讀Block(數據塊)到Buffer Cache(緩沖區)(如果該Block在Buffer中不存在);
pan style="FONT-SIZE: 10pt; COLOR: #993300">SQL>Flashback database to time to_timestamp(xxx);
例如,假定該 DBA 在正常業務過程中數次更新匯率 ,甚至刪除了某行並重新插入該行:
insert into rates values (''EURO'',1.1012);
commit;
update rates set rate = 1.1014;
commit;
update rates set rate = 1.1013;
commit;
delete rates;
commit;
insert into rates values (''EURO'',1.1016);
commit;
update rates set rate = 1.1011;
commit;
在進行了這一系列操作後,DBA 將通過以下命令獲得 RATE 列的當前提交值
SQL> select * from rates;
CURR RATE
---- ----------
EURO 1.1011
此輸出顯示 RATE 的當前值,沒有顯示從第一次創建該行以來發生的所有變更。這時使用閃回查詢,您可以找出給定時間點的值;但我們對構建變更的審計線索更感興趣 ? 有些類似於通過便攜式攝像機來記錄變更,而不只是在特定點拍攝一系列快照。
以下查詢顯示了對表所做的更改:
select versions_starttime, versions_endtime, versions_xid,
versions_Operation, rate
from rates versions between timestamp minvalue and maxvalue
order by VERSIONS_STARTTIME
/
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V RATE
---------------------- ---------------------- ---------------- - ----------
01-DEC-03 03.57.12 PM 01-DEC-03 03.57.30 PM 0002002800000C61 I 1.1012
01-DEC-03 03.57.30 PM 01-DEC-03 03.57.39 PM 000A000A00000029 U 1.1014
01-DEC-03 03.57.39 PM 01-DEC-03 03.57.55 PM 000A000B00000029 U 1.1013
01-DEC-03 03.57.55 PM
000A000C00000029 D 1.1013
01-DEC-03 03.58.07 PM 01-DEC-03 03.58.17 PM 000A000D00000029 I 1.1016
01-DEC-03 03.58.17 PM 000A000E00000029 U 1.1011
注意,此處顯示了對該行所作的所有更改,甚至包括該行被刪除和重新插入的情況。VERSION_OperaTION 列顯示對該行執行了什麼操作 (Insert/Update/Delete)。所做的這些工作不需要歷史表或額外的列。
SELECT UNDO_SQL
FROM FlashBACK_TRANSACTION_QUERY
WHERE XID = ''000A000D00000029'';
UNDO_SQL
----------------------------------------------------------------------------
insert into "ANANDA"."RATES"("CURRENCY","RATE") values (''EURO'',''1.1013'');
除了實際語句之外,該視圖還顯示提交操作的時間標記和 SCN、查詢開始時的 SCN 和時間標記以及其他信息。
找出一段時期中的變更
現在,讓我們來看如何有效地使用這些信息。假設我們需要找出下午 3:57:54 時 RATE 列的值。我們可以執行:
select rate, versions_starttime, versions_endtime
from rates versions
between timestamp
to_date(''12/1/2003 15:57:54'',''mm/dd/yyyy hh24:mi:ss'')
and to_date(''12/1/2003 16:57:55'',''mm/dd/yyyy hh24:mi:ss'')
/
RATE VERSIO
NS_STARTTIME VERSIONS_ENDTIME
---------- ---------------------- ----------------------
1.1011
此查詢與閃回查詢類似。在以上的示例中,開始和結束時間為空,表示匯率在該時間段中沒有更改,而是包含一個時間段。還可以使用 SCN 來找出過去的版本值。可以從偽列 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN 中獲得 SCN 號。以下是一個示例:
select rate, versions_starttime, versions_endtime
from rates versions
between scn 1000 and 1001
/
使用關鍵詞 MINVALUE 和 MAXVALUE,可以顯示還原段中提供的所有變更。您甚至可以提供一個特定的日期或 SCN 值作為范圍的一個端點,而另一個端點是文字 MAXVALUE 或 MINVALUE。例如,以下查詢提供那些只從下午 3:57:52 開始的變更,而不是全部范圍的變更:
select versions_starttime, versions_endtime, versions_xid,
versions_Operation, rate
from rates versions between timestamp
to_date(''12/11/2003 15:57:52'', ''mm/dd/yyyy hh24:mi:ss'')
and maxvalue
order by VERSIONS_STARTTIME
/
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V RATE
---------------------- ---------------------- ---------------- - ----------
01-DEC-03 03.58.07 PM 01-DEC-03 03.58.17 PM 000A000D00000029 I 1.1016
01-DEC-03 03.58.17 PM 000A000E00000029 U 1.1011
最終的分析
閃回版本查詢隨取隨用地復制表變更的短期易變數值審計。這一優點使得 DBA 能夠獲得過去時間段中的所有變更而不是特定值,只要還原段中提供數據,就可以盡情使用。因此,最大的可用版本依賴於 UNDO_RETENTION 參數。
有關閃回版本查詢的更多信息,請參見 Oracle Database Concepts 10g Release 1 (10.1) 指南的相關部分。
1、Oracle 9i的閃回查詢功能
在Oracle 9i之前,如果用戶錯誤操作數據後,除了不完全恢復外,沒有好的解決辦法。Oracle 9i中提供閃回查詢,由一個新的包DBMS_Flash來實現。用戶使用閃回查詢可以及時取得誤操作
LOR: #993300; LINE-HEIGHT: 120%">DML(Delete、Update、Insert)前某一時間點數據庫的映像視圖,用戶可以利用系統時間或系統改變號(SCN:System Change Number)來指定這個只讀視圖,並可以針對錯誤進行相應的恢復措施。閃回查詢功能完全依賴於自動回滾段管理(AUM),對於Drop等誤操作不能恢復。閃回特性可應用在以下方面:
(1)自我維護過程中的修復:當一些重要的記錄被意外刪除,用戶可以向後移動到一個時間點,查看丟失的行並把它們重新插入現在的表內恢復。
(2)恢復Email和聲音Email
(3)賬號平衡狀況:可以查看以前的歷史數據。如銀行外幣管理中用於記錄特定時間的匯率。在以前,匯率變更被記錄在一個歷史表中,現在就可以通過閃回功能進行查詢。
(4)用於趨勢分析的決策支持系統:決策支持系統和聯機分析應用必須執行一個長時間的事務。使用閃回查詢,這些應用可以對歷史數據執行分析和建模。例如,特定產品如礦泉水隨季節變化需求情況的變化。
2、回滾段概述
回滾段用於存放數據修改之前的位置和值,回滾段的頭部包含正在使用的該回滾段事務的信息。回滾段的作用如下:
(1)事務回滾:當事務修改表中數據的時候,該數據修改前的值(即前影像)會存放在回滾段中,當用戶回滾事務時,Oracle將會利用回滾段中的數據前影像來將修改的數據恢復到原來的值。
(3)讀一致性:當一個會話正在修改數據時,其它的會話將看不到該會話未提交的修改。而且,當一個語句正在執行時,該語句將看不到從該語句開始執行後的未提交的修改(語句級讀一致性)。
3、Oracle中Delete和Commit操作的流程分析
(1)刪除(Delete)流程
歡迎光臨學網,點擊這裡查看更多文章教程 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30]
·在Redo Log Buffer(重做日志緩沖區)中記錄Delete操作的細節;
·在相應回滾段段頭的事物表中創建一個
HT: 120%">Undo(回滾)條目;
·把將要刪除的記錄創建前鏡像,存放到Undo Block(回滾塊)中;
·在Buffer Cache中的相應數據塊上刪除記錄,並且標記相應的數據塊為Dirty(髒)。
(2)提交(Commit)流程
·Oracle產生一個SCN;
·在回滾段事物表中標記該事物狀態為Commited;
·LGWR(日志讀寫進程) Flush Log Buffer到日志文件;
·如果此時數據塊仍然在Buffer Cache中,那麼SCN將被記錄到Block Header上,這被稱為快速提交;
·如果Dirty Block已經被寫回到磁盤,那麼下一個訪問這個Block的進程將會自回滾段中獲取該事物的狀態,確認該事物被提交。然後這個進程獲得提交SCN並寫回到Block Header上,這被稱為延遲塊清除。
4、Oracle 9i中閃回查詢操作實例
進行閃回查詢必須設置自動回滾段管理,在init.ora設置參數UNDO_MANAGEMENT=AUTO,參數UNDO_RETENTION=n,決定了能往前閃回的最大時間,值越大就需要越多Undo空間。
例:Oracle 9i的Flashback Query操作。
(1)創建閃回查詢用戶
SQL> create user flashtest identifIEd by Flashtest;
SQL> grant connect, resource to Flashtest;
SQL> grant execute on dbms_flashback to Flashtest;
SQL> connect flashtest/Flashtest;
(2)創建測試表,插入測試記錄
SQL> create table test(id number(3));
SQL> insert into test values (1);
SQL> insert into test values(2);
SQL> commit;
SQL> create table rec_date(date_scn);
注意:在執行步驟3或者步驟4之前,等待5分鐘。
(3)刪除記錄
SQL> execute dbms_Flashback.disable;
SQL> insert into rec_date select sysdate from dual;
SQL> commit;
SQL> delete from test where id=1;
SQL> commit;
通過以上的操作,我們插入了兩條記錄,並刪除了其中一條記錄。在以下的操作中,我們將通過Flashback query找到刪除的記錄
(4)閃回查詢
SQL> DECLARE
Restore_scn date;
BEGIN
Select date_scn into restore_scn from rec_date;
Dbms_Flashback.enable_at_time (restore_scn);
END;
SQL> select * from test;
ID
1
2
可以看出,雖然刪除記錄並提交,但是通過閃回操作,仍能查詢到刪除前的兩條記錄。需要注意Oracle每5分鐘記錄一次SCN,並將SCN和對應時間的映射進行紀錄。如果原來插入的記錄到做閃回操作的時間在5分鐘之內,用基於時間的閃回查詢可能得不到記錄,因為基於時間點的查詢實際上是轉化為最近的一次SCN,然後從這個SCN開始進行恢復。因此,如果需要精確的查詢可以采用基於SCN的閃回查詢,可精確閃回到需要恢復的時間。可以通過DBMS_FlashBACK.GET_SYSTEM_CHANGE_NUMBER語句獲取SCN。
Oracle 10g的閃回查詢概述
與Oracle 9i相比Oracle 10g的 Flashback有了非常大的改進,從普通的Flashback Query發展到了多種形式,主要表現在如下幾方面新特性:
1、Flashback Database
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命令。
例:執行Flashback Database命令格式。學網,點擊這裡查看更多文章教程 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30]
SQL>Flashback database to scn xxx
2、Flashback Table
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
注意:如果需要閃回一個表,需要以下條件:
·需要有flashback any table的系統權限或者是該表的Flashback對象權限;
·需要有該表的select,insert,delete,alter權限;
·必須保證該表
例:執行將test表閃回到2005年5月7日下午3點。
SQL>Flashback table test to timestamp to_timestamp(’2005-05-07 15:00:00’,’yyyy-mm-dd hh24:mi:ss’);
3、Flashback Drop
Oracle Flashback Drop特性提供一個類似回收站的功能,用來恢復不小心被刪除的表。
例:進行一個刪除表後恢復的簡單測試。
(1)顯示回收站信息
SQL>show recyclebin;
可以看到,回收站中是沒有任何結果的,表示沒有任何表在回收站中。
(2)創建一個表,並刪除,再次顯示回收站信息
OLOR: #993300; LINE-HEIGHT: 120%"> 清除不同的對象回收站:purge user_recyclebin或
purge dba_recyclebin這時如果利用Flash Table或者是Flash Query,只能看到過去的某一時間點的一個快照,而利用Flashback Version Query,能夠把時間1、時間2的操作給記錄下來,並詳細的查詢出對表進行的任何操作。
pan>Oracle Flashback Transaction Query特性確保檢查數據庫的任何改變在一個事務級別,可以利用此功能進行診斷 問題、性能分析和審計事務。它其實是Flashback Version Query查詢的一個擴充,Flashback Version Query說明了可以審計一段時間內表的所有改變,但是也僅僅是能發現問題,對於錯誤的事務,沒有好的處理辦法。而Flashback Transaction Query提供了從FlashBACK_TRANSACTION_QUERY視圖中獲得事務的歷史以及Undo_sql(回滾事務對應的sql語句),也就是說審計一個事務到底做了什麼,甚至可以回滾一個已經提交的事務。
ING-RIGHT: 0cm; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; PADDING-TOP: 0cm">