程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> 關於Oracle數據庫 >> 用Oracle閃回功能恢復偶然丟失的數據

用Oracle閃回功能恢復偶然丟失的數據

編輯:關於Oracle數據庫

Oracle 9i的閃回查詢概述

  1、Oracle 9i的閃回查詢功能

  在Oracle 9i之前,如果用戶錯誤操作數據後,除了不完全恢復外,沒有好的解決辦法。Oracle 9i中提供閃回查詢,由一個新的包DBMS_FLASH來實現。用戶使用閃回查詢可以及時取得誤操作DML(Delete、Update、Insert)前某一時間點數據庫的映像視圖,用戶可以利用系統時間或系統改變號(SCN:System Change Number)來指定這個只讀視圖,並可以針對錯誤進行相應的恢復措施。閃回查詢功能完全依賴於自動回滾段管理(AUM),對於Drop等誤操作不能恢復。閃回特性可應用在以下方面:

  (1)自我維護過程中的修復:當一些重要的記錄被意外刪除,用戶可以向後移動到一個時間點,查看丟失的行並把它們重新插入現在的表內恢復。

  (2)恢復Email和聲音Email:當用戶意外刪除了Email或者聲音信息時,可以通過移回到固定時間點來恢復刪除。

  (3)賬號平衡狀況:可以查看以前的歷史數據。如銀行外幣管理中用於記錄特定時間的匯率。在以前,匯率變更被記錄在一個歷史表中,現在就可以通過閃回功能進行查詢。

  (4)用於趨勢分析的決策支持系統:決策支持系統和聯機分析應用必須執行一個長時間的事務。使用閃回查詢,這些應用可以對歷史數據執行分析和建模。例如,特定產品如礦泉水隨季節變化需求情況的變化。

  2、回滾段概述

  回滾段用於存放數據修改之前的位置和值,回滾段的頭部包含正在使用的該回滾段事務的信息。回滾段的作用如下:

  (1)事務回滾:當事務修改表中數據的時候,該數據修改前的值(即前影像)會存放在回滾段中,當用戶回滾事務時,Oracle將會利用回滾段中的數據前影像來將修改的數據恢復到原來的值。

  (2)事務恢復:當事務正在處理的時候,例程失敗,回滾段的信息保存在重做日志文件中,Oracle將在下次打開數據庫時利用回滾來恢復未提交的數據。

  (3)讀一致性:當一個會話正在修改數據時,其它的會話將看不到該會話未提交的修改。而且,當一個語句正在執行時,該語句將看不到從該語句開始執行後的未提交的修改(語句級讀一致性)。

  3、Oracle中Delete和Commit操作的流程分析

  (1)刪除(Delete)流程

  ·Oracle讀Block(數據塊)到Buffer Cache(緩沖區)(如果該Block在Buffer中不存在);

  ·在Redo Log Buffer(重做日志緩沖區)中記錄Delete操作的細節;

  ·在相應回滾段段頭的事物表中創建一個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。

  • 首頁
  • 上一頁
  • 1
  • 2
  • 下一頁
  • 尾頁
  • 共2頁
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved