熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

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

2013-11-13 22:13:51  來源: Oracle 

  引言
  
  人為的錯誤是數據庫系統失敗的重要原因之一根據調查約%的系統問題是操作失誤或者用戶錯誤引起的這些人為的錯誤又特別難以避免傳統上當發生數據丟失數據錯誤問題時解決的主要方法就是數據的導入/導出備份/恢復技術這些方法都需要發生數據錯誤之前有一個正確的備份才能進行恢復恢復時不取決於錯誤程度而只取決於備份/恢復策略這種方法既耗時又使數據庫系統不能提供服務對於一些用戶偶然地刪除數據這類小錯誤來說顯得有些大材小用那麼如何來恢復這種偶然的錯誤操作造成的數據丟失呢?從Oracle i開始提供了基於回滾段的閃回查詢(Flashback Query)功能可用於恢復錯誤的DML操作在Oracle g中對閃回查詢做了較大改進不再局限於閃回查詢還可用於恢復錯誤的DDL(Drop)操作閃回表閃回數據庫等
  
  Oracle i的閃回查詢概述
  
  Oracle i的閃回查詢功能
  
  在Oracle i之前如果用戶錯誤操作數據後除了不完全恢復外沒有好的解決辦法Oracle i中提供閃回查詢由一個新的包DBMS_FLASH來實現用戶使用閃回查詢可以及時取得誤操作DML(DeleteUpdateInsert)前某一時間點數據庫的映像視圖用戶可以利用系統時間或系統改變號(SCNSystem Change Number)來指定這個只讀視圖並可以針對錯誤進行相應的恢復措施閃回查詢功能完全依賴於自動回滾段管理(AUM)對於Drop等誤操作不能恢復閃回特性可應用在以下方面
  
  ()自我維護過程中的修復當一些重要的記錄被意外刪除用戶可以向後移動到一個時間點查看丟失的行並把它們重新插入現在的表內恢復
  
  ()恢復Email和聲音Email當用戶意外刪除了Email或者聲音信息時可以通過移回到固定時間點來恢復刪除
  
  ()賬號平衡狀況可以查看以前的歷史數據如銀行外幣管理中用於記錄特定時間的匯率在以前匯率變更被記錄在一個歷史表中現在就可以通過閃回功能進行查詢
  
  ()用於趨勢分析的決策支持系統決策支持系統和聯機分析應用必須執行一個長時間的事務使用閃回查詢這些應用可以對歷史數據執行分析和建模例如特定產品如礦泉水隨季節變化需求情況的變化
  
  回滾段概述
  
  回滾段用於存放數據修改之前的位置和值回滾段的頭部包含正在使用的該回滾段事務的信息回滾段的作用如下
  
  ()事務回滾當事務修改表中數據的時候該數據修改前的值(即前影像)會存放在回滾段中當用戶回滾事務時Oracle將會利用回滾段中的數據前影像來將修改的數據恢復到原來的值
  
  ()事務恢復當事務正在處理的時候例程失敗回滾段的信息保存在重做日志文件中Oracle將在下次打開數據庫時利用回滾來恢復未提交的數據
  
  ()讀一致性當一個會話正在修改數據時其它的會話將看不到該會話未提交的修改而且當一個語句正在執行時該語句將看不到從該語句開始執行後的未提交的修改(語句級讀一致性)
  
  Oracle中Delete和Commit操作的流程分析
  
  ()刪除(Delete)流程
  
  ·Oracle讀Block(數據塊)到Buffer Cache(緩沖區)(如果該Block在Buffer中不存在)
  
  ·在Redo Log Buffer(重做日志緩沖區)中記錄Delete操作的細節
  
  ·在相應回滾段段頭的事物表中創建一個Undo(回滾)條目
  
  ·把將要刪除的記錄創建前鏡像存放到Undo Block(回滾塊)中
  
  ·在Buffer Cache中的相應數據塊上刪除記錄並且標記相應的數據塊為Dirty(髒)
  
  ()提交(Commit)流程
  
  ·Oracle產生一個SCN
  
  ·在回滾段事物表中標記該事物狀態為Commited
  
  ·LGWR(日志讀寫進程) Flush Log Buffer到日志文件
  
  ·如果此時數據塊仍然在Buffer Cache中那麼SCN將被記錄到Block Header上這被稱為快速提交
  
  ·如果Dirty Block已經被寫回到磁盤那麼下一個訪問這個Block的進程將會自回滾段中獲取該事物的狀態確認該事物被提交然後這個進程獲得提交SCN並寫回到Block Header上這被稱為延遲塊清除
  
  Oracle i中閃回查詢操作實例
  
  進行閃回查詢必須設置自動回滾段管理在initora設置參數UNDO_MANAGEMENT=AUTO參數UNDO_RETENTION=n決定了能往前閃回的最大時間值越大就需要越多Undo空間
  
  例Oracle i的Flashback Query操作
  
  ()創建閃回查詢用戶
  
  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;
  
  ()創建測試表插入測試記錄
  
  SQL> create table test(id number());
  SQL> insert into test values ();
  SQL> insert into test values();
  SQL> commit;
  SQL> create table rec_date(date_scn);
  
  注意在執行步驟或者步驟之前等待分鐘
  
  ()刪除記錄
  
  SQL> execute dbms_flashbackdisable;
  SQL> insert into rec_date select sysdate from dual;
  SQL> commit;
  SQL> delete from test where id=;
  SQL> commit;
  
  通過以上的操作我們插入了兩條記錄並刪除了其中一條記錄在以下的操作中我們將通過flashback query找到刪除的記錄
  
  ()閃回查詢
  
  SQL> DECLARE
  Restore_scn date;
  BEGIN
  Select date_scn into restore_scn from rec_date;
  Dbms_flashbackenable_at_time (restore_scn);
  END;
  SQL> select * from test;
  ID
  
  
  
  可以看出雖然刪除記錄並提交但是通過閃回操作仍能查詢到刪除前的兩條記錄需要注意Oracle每分鐘記錄一次SCN並將SCN和對應時間的映射進行紀錄如果原來插入的記錄到做閃回操作的時間在分鐘之內用基於時間的閃回查詢可能得不到記錄因為基於時間點的查詢實際上是轉化為最近的一次SCN然後從這個SCN開始進行恢復因此如果需要精確的查詢可以采用基於SCN的閃回查詢可精確閃回到需要恢復的時間可以通過DBMS_FLASHBACKGET_SYSTEM_CHANGE_NUMBER語句獲取SCN
  
  Oracle g的閃回查詢概述
  
  與Oracle i相比Oracle g的Flashback有了非常大的改進從普通的Flashback Query發展到了多種形式主要表現在如下幾方面新特性
  
  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命令格式
  
  SQL>flashback database to time to_timestamp(xxx);
  SQL>flashback database to scn xxx
  
  Flashback Table
  
  Oracle Flashback Table特性允許利用Flashback Table語句確保閃回到表的前一個時間點與Oracle i中的Flashback Query相似利用回滾段信息來恢復一個或一些表到以前的一個時間點(一個快照)要注意的是Flashback Table不等於Flashback QueryFlashback Query僅僅是查詢以前的一個快照點而已並不改變當前表的狀態而Flashback Table將改變當前表及附屬對象一起回到以前的時間點
  
  語法
  
  flashback table tablename to timestamp xxx或
  flashback table tablename to scn xxx
  
  注意如果需要閃回一個表需要以下條件
  
  ·需要有flashback any table的系統權限或者是該表的flashback對象權限
  
  ·需要有該表的selectinsertdeletealter權限
  
  ·必須保證該表row movement
  
  例執行將test表閃回到日下午
  
  SQL>flashback table test to timestamp to_timestamp( ::yyyymmdd hh:mi:ss);
  
  Flashback Drop
  
  Oracle Flashback Drop特性提供一個類似回收站的功能用來恢復不小心被刪除的表當刪除表時Oracle g並不立刻釋放被刪除的表所占用的空間而是將這個被刪除的表進行自動重命名(為了避免同類對象名稱的重復)並放進回收站中所謂的回收站類似於Windows系統中的回收站是一個虛擬的容器用於存放所有被刪除的對象在回收站中被刪除的對象將占用創建時的同樣的空間如果這個被刪除的表需要進行恢復就可利用Flashback Drop功能
  
  例進行一個刪除表後恢復的簡單測試
  
  ()顯示回收站信息
  
  SQL>show recyclebin;
  
  可以看到回收站中是沒有任何
From:http://tw.wingwit.com/Article/program/Oracle/201311/18545.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.