用Oracle閃回功能恢復偶然丟失的資料

2021-05-23 14:32:49 字數 3459 閱讀 2851

引言

人為的錯誤是資料庫系統失敗的重要原因之一,根據調查約40%的系統問題是操作失誤或者使用者錯誤引起的,這些人為的錯誤又特別難以避免。傳統上當發生資料丟失、資料錯誤問題時,解決的主要方法就是資料的匯入/匯出、備份/恢復技術。這些方法都需要發生資料錯誤之前有乙個正確的備份,才能進行恢復。恢復時不取決於錯誤程度,而只取決於備份/恢復策略。這種方法既耗時又使資料庫系統不能提供服務,對於一些使用者偶然地刪除資料這類小錯誤來說顯得有些"大材小用"。那麼如何來恢復這種偶然的錯誤操作造成的資料丟失呢?從oracle 9i開始提供了基於回滾段的閃回查詢(flashback query)功能,可用於恢復錯誤的dml操作。在oracle 10g中對閃回查詢做了較大改進,不再侷限於閃回查詢,還可用於恢復錯誤的ddl(drop)操作、閃回表、閃回資料庫等。

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; id1

2 可以看出,雖然刪除記錄並提交,但是通過閃回操作,仍能查詢到刪除前的兩條記錄。需要注意oracle每5分鐘記錄一次scn,並將scn和對應時間的對映進行紀錄。如果原來插入的記錄到做閃回操作的時間在5分鐘之內,用基於時間的閃回查詢可能得不到記錄,因為基於時間點的查詢實際上是轉化為最近的一次scn,然後從這個scn開始進行恢復。因此,如果需要精確的查詢可以採用基於scn的閃回查詢,可精確閃回到需要恢復的時間。可以通過dbms_flashback.get_system_change_number語句獲取scn。

Oracle 閃回功能

檢視閃回功能是否開啟 sql select flashback on from v database flashback on yes 開啟閃回功能 確保資料庫處於歸檔模式 sql shutdown immediate sql startup mount sql alter database arc...

恢復oracle資料 回閃

1.刪除表後,可以採用如下操作 在 user recyclebin中找到最近操作過的表名稱,然後用閃回 只能用於10g及以上版本 flash back table table name to before drop 如果是刪了或修改裡面的資料,可以先建立乙個快表將刪除修改之前狀態的資料找回到這個表中...

oracle閃回功能示例

閃回表中的資料 必須開啟行移動功能alter table ccc log enable row movement select from ccc log delete from ccc log select from ccc log select from ccc log as of scn 945...