小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

用Oracle閃回功能(flashback)恢復(fù)刪除的數(shù)據(jù)

 左目右于 2011-09-16

摘 要:本文提出了閃回功能的原理,描述了利用Oracle 9i或Oracle 10g的閃回功能進(jìn)行恢復(fù)偶然丟失數(shù)據(jù)的方法。

 

  關(guān)鍵詞:Oracle;閃回;回滾段;數(shù)據(jù)恢復(fù)

 

  人為的錯誤是數(shù)據(jù)庫系統(tǒng)失敗的重要原因之一,根據(jù)調(diào)查約40%的系統(tǒng)問題是操作失誤或者用戶錯誤引起的,這些人為的錯誤又特別難以避免。傳統(tǒng)上當(dāng)發(fā)生數(shù)據(jù)丟失、數(shù)據(jù)錯誤問題時,解決的主要方法就是數(shù)據(jù)的導(dǎo)入/導(dǎo)出、備份/恢復(fù)技術(shù)。這些方法都需要發(fā)生數(shù)據(jù)錯誤之前有一個正確的備份,才能進(jìn)行恢復(fù)?;謴?fù)時不取決于錯誤程度,而只取決于備份/恢復(fù)策略。這種方法既耗時又使數(shù)據(jù)庫系統(tǒng)不能提供服務(wù),對于一些用戶偶然地刪除數(shù)據(jù)這類小錯誤來說顯得有些"大材小用"。那么如何來恢復(fù)這種偶然的錯誤操作造成的數(shù)據(jù)丟失呢?從Oracle 9i開始提供了基于回滾段的閃回查詢(Flashback Query)功能,可用于恢復(fù)錯誤的DML操作。在Oracle 10g中對閃回查詢做了較大改進(jìn),不再局限于閃回查詢,還可用于恢復(fù)錯誤的DDL(Drop)操作、閃回表、閃回數(shù)據(jù)庫等。

 

  Oracle 9i的閃回查詢概述

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

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

  (1)自我維護(hù)過程中的修復(fù):當(dāng)一些重要的記錄被意外刪除,用戶可以向后移動到一個時間點(diǎn),查看丟失的行并把它們重新插入現(xiàn)在的表內(nèi)恢復(fù)。

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

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

  (4)用于趨勢分析的決策支持系統(tǒng):決策支持系統(tǒng)和聯(lián)機(jī)分析應(yīng)用必須執(zhí)行一個長時間的事務(wù)。使用閃回查詢,這些應(yīng)用可以對歷史數(shù)據(jù)執(zhí)行分析和建模。例如,特定產(chǎn)品如礦泉水隨季節(jié)變化需求情況的變化。

  2、回滾段概述

  回滾段用于存放數(shù)據(jù)修改之前的位置和值,回滾段的頭部包含正在使用的該回滾段事務(wù)的信息?;貪L段的作用如下:

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

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

 ?。?)讀一致性:當(dāng)一個會話正在修改數(shù)據(jù)時,其它的會話將看不到該會話未提交的修改。而且,當(dāng)一個語句正在執(zhí)行時,該語句將看不到從該語句開始執(zhí)行后的未提交的修改(語句級讀一致性)。

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

  (1)刪除(Delete)流程

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

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

  ·在相應(yīng)回滾段段頭的事物表中創(chuàng)建一個Undo(回滾)條目;

  ·把將要刪除的記錄創(chuàng)建前鏡像,存放到Undo Block(回滾塊)中;

  ·在Buffer Cache中的相應(yīng)數(shù)據(jù)塊上刪除記錄,并且標(biāo)記相應(yīng)的數(shù)據(jù)塊為Dirty(臟)。

 ?。?)提交(Commit)流程

  ·Oracle產(chǎn)生一個SCN;

  ·在回滾段事物表中標(biāo)記該事物狀態(tài)為Commited;

  ·LGWR(日志讀寫進(jìn)程) Flush Log Buffer到日志文件;

  ·如果此時數(shù)據(jù)塊仍然在Buffer Cache中,那么SCN將被記錄到Block Header上,這被稱為快速提交;

  ·如果Dirty Block已經(jīng)被寫回到磁盤,那么下一個訪問這個Block的進(jìn)程將會自回滾段中獲取該事物的狀態(tài),確認(rèn)該事物被提交。然后這個進(jìn)程獲得提交SCN并寫回到Block Header上,這被稱為延遲塊清除。

 

  4、Oracle 9i中閃回查詢操作實(shí)例

  進(jìn)行閃回查詢必須設(shè)置自動回滾段管理,在init.ora設(shè)置參數(shù)UNDO_MANAGEMENT=AUTO,參數(shù)UNDO_RETENTION=n,決定了能往前閃回的最大時間,值越大就需要越多Undo空間。

  例:Oracle 9i的Flashback Query操作。

 ?。?)創(chuàng)建閃回查詢用戶

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;

 

 ?。?)創(chuàng)建測試表,插入測試記錄

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

  注意:在執(zhí)行步驟3或者步驟4之前,等待5分鐘。

 

 ?。?)刪除記錄

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找到刪除的記錄

 

 ?。?)閃回查詢

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和對應(yīng)時間的映射進(jìn)行紀(jì)錄。如果原來插入的記錄到做閃回操作的時間在5分鐘之內(nèi),用基于時間的閃回查詢可能得不到記錄,因?yàn)榛跁r間點(diǎn)的查詢實(shí)際上是轉(zhuǎn)化為最近的一次SCN,然后從這個SCN開始進(jìn)行恢復(fù)。因此,如果需要精確的查詢可以采用基于SCN的閃回查詢,可精確閃回到需要恢復(fù)的時間??梢酝ㄟ^DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER語句獲取SCN

 

 

Oracle 10g的閃回查詢概述

  與Oracle 9i相比Oracle 10g的Flashback有了非常大的改進(jìn),從普通的Flashback Query發(fā)展到了多種形式,主要表現(xiàn)在如下幾方面新特性:

  1、Flashback Database

  Oracle Flashback Database特性允許通過SQL語句Flashback Database語句,讓數(shù)據(jù)庫前滾到當(dāng)前的前一個時間點(diǎn)或者SCN,而不需要做時間點(diǎn)的恢復(fù)。閃回數(shù)據(jù)庫可以迅速將數(shù)據(jù)庫回到誤操作或人為錯誤的前一個時間點(diǎn),如Word中的"撤消"操作,可以不利用備份就快速的實(shí)現(xiàn)基于時間點(diǎn)的恢復(fù)。Oracle通過創(chuàng)建新的Flashback Logs(閃回日志),記錄數(shù)據(jù)庫的閃回操作。如果希望能閃回數(shù)據(jù)庫,需要設(shè)置如下參數(shù):

DB_RECOVER_FILE_DEST日志的存放位置,DB_RECOVER_FILE_DEST_SIZE恢復(fù)區(qū)的大小。在創(chuàng)建數(shù)據(jù)庫的時候,Oracle將自動創(chuàng)建恢復(fù)區(qū),但默認(rèn)是關(guān)閉的,需要執(zhí)行alter database flashback on命令。

  例:執(zhí)行Flashback Database命令格式。

SQL>flashback database to time to_timestamp(xxx);

SQL>flashback database to scn xxx

  2、Flashback Table

  Oracle Flashback Table特性允許利用Flashback Table語句,確保閃回到表的前一個時間點(diǎn)。與Oracle 9i中的Flashback Query相似,利用回滾段信息來恢復(fù)一個或一些表到以前的一個時間點(diǎn)(一個快照)。要注意的是,F(xiàn)lashback Table不等于Flashback Query,F(xiàn)lashback Query僅僅是查詢以前的一個快照點(diǎn)而已,并不改變當(dāng)前表的狀態(tài),而Flashback Table將改變當(dāng)前表及附屬對象一起回到以前的時間點(diǎn)。

  語法:

flashback table tablename to timestamp xxx或

flashback table tablename to scn xxx

  注意:如果需要閃回一個表,需要以下條件:

  ·需要有flashback any table的系統(tǒng)權(quán)限或者是該表的flashback對象權(quán)限;

  ·需要有該表的select,insert,delete,alter權(quán)限;

  ·必須保證該表row movement。

  例:執(zhí)行將test表閃回到2005年5月7日下午3點(diǎn)。

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特性提供一個類似回收站的功能,用來恢復(fù)不小心被刪除的表。當(dāng)刪除表時,Oracle 10g并不立刻釋放被刪除的表所占用的空間,而是將這個被刪除的表進(jìn)行自動重命名(為了避免同類對象名稱的重復(fù))并放進(jìn)回收站中。所謂的回收站類似于Windows系統(tǒng)中的回收站,是一個虛擬的容器,用于存放所有被刪除的對象,在回收站中被刪除的對象將占用創(chuàng)建時的同樣的空間。如果這個被刪除的表需要進(jìn)行恢復(fù),就可利用Flashback Drop功能。

  例:進(jìn)行一個刪除表后恢復(fù)的簡單測試。

  (1)顯示回收站信息

SQL>show recyclebin;

  可以看到,回收站中是沒有任何結(jié)果的,表示沒有任何表在回收站中。

 ?。?)創(chuàng)建一個表,并刪除,再次顯示回收站信息

SQL>create table test_drop(name varchar2(10));

SQL>drop table test_drop;

SQL>show recyclebin;

ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME

TEST_DROP BIN$b+XkkO1RS5K10uKo9BfmuA==$0 TABLE 2005-05-07:14:30:47

  (3)對被刪除的表進(jìn)行恢復(fù)

SQL>flashback table test_drop to before drop;或

SQL>flashback table "BIN$b+XkkO1RS5K10uKo9BfmuA==$0" to before drop;

 ?。?)管理回收站

  清除回收站中的單個表:purge table test_drop

  清除整個回收站:purge recyclebin

  清除不同的對象回收站:purge user_recyclebin或purge dba_recyclebin

 ?。?)確認(rèn)刪除一個表

SQL>drop table test_drop purge;

  如果刪除一個表且不放到回收站中不能進(jìn)行恢復(fù),在drop語句中可以利用purge選項(xiàng)。

  4、Flash Version Query

  Oracle Flashback Version Query特性,利用保存的回滾信息,可以看到特定的表在時間段內(nèi)的任何修改,如電影的回放一樣,可以了解

表在該期間的任何變化。Flashback version query一樣依賴于AUM,提供了一個查看行改變的功能,能找到所有已經(jīng)提交了的行的記錄,分析出過去時間都執(zhí)行了什么操作。Flashback version query采用VERSIONS BETWEEN語句來進(jìn)行查詢,常用的方法:

  ·VERSIONS_SCN - 系統(tǒng)改變號

  ·VERSIONS_TIMESTAMP - 時間

  例如:在test表中,時間1插入一條記錄,時間2刪除了這條記錄,對于時間3執(zhí)行select * from test當(dāng)然查詢不到這條記錄,只能看到該

表最后的提交記錄。這時如果利用Flash Table或者是Flash Query,只能看到過去的某一時間點(diǎn)的一個快照,而利用Flashback Version Query,能夠把時間1、時間2的操作給記錄下來,并詳細(xì)的查詢出對表進(jìn)行的任何操作。

SQL>select versions_starttime,versions_endtime, versions_xid,versions_operation,id

from test versions

between timestamp minvalue and maxvalue

order by versions_starttime;

  在上述查詢中,列 versions_starttime、versions_endtime、versions_xid、versions_operation是偽列,還有一些偽列,如versions_startscn和versions_endscn顯示了該時刻的系統(tǒng)更改號。列versions_xid顯示了更改該行的事務(wù)標(biāo)識符。

  當(dāng)然,除了分析以上所有的變更之外,可以根據(jù)需要指定時間段,如顯示在2005-05-07時間在15:30到16:30之間test表的所有變更。

SQL>select id from test

versions between timestamp to_date(’2005-05-07 15:30:00’,’yyyy-mm-dd hh24:mi:ss’) and to_date(’2005-05-07 16:30:00’,’

yyyy-mm-dd hh24:mi:ss’)

  5、Flashback Transaction Query

  Oracle Flashback Transaction Query特性確保檢查數(shù)據(jù)庫的任何改變在一個事務(wù)級別,可以利用此功能進(jìn)行診斷問題、性能分析和審計事務(wù)。它其實(shí)是Flashback Version Query查詢的一個擴(kuò)充,F(xiàn)lashback Version Query說明了可以審計一段時間內(nèi)表的所有改變,但是也僅僅是能發(fā)現(xiàn)問題,對于錯誤的事務(wù),沒有好的處理辦法。而Flashback Transaction Query提供了從FLASHBACK_TRANSACTION_QUERY視圖中獲得事務(wù)的歷史以及Undo_sql(回滾事務(wù)對應(yīng)的sql語句),也就是說審計一個事務(wù)到底做了什么,甚至可以回滾一個已經(jīng)提交的事務(wù)。

  例:Flashback Transaction Query的操作實(shí)例。

 ?。?)在test表中刪除記錄,獲得事務(wù)的標(biāo)識XID,然后提交。

SQL>delete from test where id=2;

SQL>select xid from v$transaction;

XID

----------------

04001200AE010000

SQL>commit;

  在測試中方便起見,在事務(wù)沒有提交的時候,獲得事務(wù)的XID為04001F0035000000。實(shí)際情況下,不可能去跟蹤每個事務(wù),想要獲得已提交事務(wù)的XID,就必須通過上面的Flashback Version Query。

 ?。?)進(jìn)行Flashback Transaction Query

SQL>select * from FLASHBACK_TRANSACTION_QUERY

where xid=’04001F0035000000’;

UNDO_SQL

insert into "FLASHTEST"."TEST"("ID") values (’2’);

  注意:這個刪除語句對應(yīng)的是1個Insert語句,如果想回滾這個事務(wù),執(zhí)行這個Insert語句即可。

  可以看到,F(xiàn)lashback Transaction Query主要用于審計一個事務(wù),并可以回滾一個已經(jīng)提交的事務(wù)。如果確定出錯的事務(wù)是最后一個事務(wù),我們利用Flashback Table或者Flashback Query就可以解決問題。但是,如果執(zhí)行了一個錯誤的事務(wù)之后,又執(zhí)行了一系列正確的事務(wù),那么上面的方法就無能為力,利用Flashback Transaction Query可以查看或回滾這個錯誤的事務(wù)。

  結(jié)束語

  通過上面的描述,可以看出閃回功能使用戶恢復(fù)偶然的錯誤刪除更加容易,增強(qiáng)了系統(tǒng)的可用性與讀一致性。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多