摘 要:本文提出了閃回功能的原理,描述了利用Oracle 9i或Oracle 10g的閃回功能進(jìn)行恢復(fù)偶然丟失數(shù)據(jù)的方法。
關(guān)鍵詞:Oracle;閃回;回滾段;數(shù)據(jù)恢復(fù)
人為的錯(cuò)誤是數(shù)據(jù)庫系統(tǒng)失敗的重要原因之一,根據(jù)調(diào)查約40%的系統(tǒng)問題是操作失誤或者用戶錯(cuò)誤引起的,這些人為的錯(cuò)誤又特別難以避免。傳統(tǒng)上當(dāng)發(fā)生數(shù)據(jù)丟失、數(shù)據(jù)錯(cuò)誤問題時(shí),解決的主要方法就是數(shù)據(jù)的導(dǎo)入/導(dǎo)出、備份/恢復(fù)技術(shù)。這些方法都需要發(fā)生數(shù)據(jù)錯(cuò)誤之前有一個(gè)正確的備份,才能進(jìn)行恢復(fù)。恢復(fù)時(shí)不取決于錯(cuò)誤程度,而只取決于備份/恢復(fù)策略。這種方法既耗時(shí)又使數(shù)據(jù)庫系統(tǒng)不能提供服務(wù),對(duì)于一些用戶偶然地刪除數(shù)據(jù)這類小錯(cuò)誤來說顯得有些"大材小用"。那么如何來恢復(fù)這種偶然的錯(cuò)誤操作造成的數(shù)據(jù)丟失呢?從Oracle 9i開始提供了基于回滾段的閃回查詢(Flashback Query)功能,可用于恢復(fù)錯(cuò)誤的DML操作。在Oracle 10g中對(duì)閃回查詢做了較大改進(jìn),不再局限于閃回查詢,還可用于恢復(fù)錯(cuò)誤的DDL(Drop)操作、閃回表、閃回?cái)?shù)據(jù)庫等。
Oracle 9i的閃回查詢概述 1、Oracle 9i的閃回查詢功能 在Oracle 9i之前,如果用戶錯(cuò)誤操作數(shù)據(jù)后,除了不完全恢復(fù)外,沒有好的解決辦法。Oracle 9i中提供閃回查詢,由一個(gè)新的包DBMS_FLASH來實(shí)現(xiàn)。用戶使用閃回查詢可以及時(shí)取得誤操作DML(Delete、Update、Insert)前某一時(shí)間點(diǎn)數(shù)據(jù)庫的映像視圖,用戶可以利用系統(tǒng)時(shí)間或系統(tǒng)改變號(hào)(SCN:System Change Number)來指定這個(gè)只讀視圖,并可以針對(duì)錯(cuò)誤進(jìn)行相應(yīng)的恢復(fù)措施。閃回查詢功能完全依賴于自動(dòng)回滾段管理(AUM),對(duì)于Drop等誤操作不能恢復(fù)。閃回特性可應(yīng)用在以下方面: ?。?)自我維護(hù)過程中的修復(fù):當(dāng)一些重要的記錄被意外刪除,用戶可以向后移動(dòng)到一個(gè)時(shí)間點(diǎn),查看丟失的行并把它們重新插入現(xiàn)在的表內(nèi)恢復(fù)。 ?。?)恢復(fù)Email和聲音Email:當(dāng)用戶意外刪除了Email或者聲音信息時(shí),可以通過移回到固定時(shí)間點(diǎn)來恢復(fù)刪除。 ?。?)賬號(hào)平衡狀況:可以查看以前的歷史數(shù)據(jù)。如銀行外幣管理中用于記錄特定時(shí)間的匯率。在以前,匯率變更被記錄在一個(gè)歷史表中,現(xiàn)在就可以通過閃回功能進(jìn)行查詢。 ?。?)用于趨勢分析的決策支持系統(tǒng):決策支持系統(tǒng)和聯(lián)機(jī)分析應(yīng)用必須執(zhí)行一個(gè)長時(shí)間的事務(wù)。使用閃回查詢,這些應(yīng)用可以對(duì)歷史數(shù)據(jù)執(zhí)行分析和建模。例如,特定產(chǎn)品如礦泉水隨季節(jié)變化需求情況的變化。 2、回滾段概述 回滾段用于存放數(shù)據(jù)修改之前的位置和值,回滾段的頭部包含正在使用的該回滾段事務(wù)的信息。回滾段的作用如下: ?。?)事務(wù)回滾:當(dāng)事務(wù)修改表中數(shù)據(jù)的時(shí)候,該數(shù)據(jù)修改前的值(即前影像)會(huì)存放在回滾段中,當(dāng)用戶回滾事務(wù)時(shí),Oracle將會(huì)利用回滾段中的數(shù)據(jù)前影像來將修改的數(shù)據(jù)恢復(fù)到原來的值。 (2)事務(wù)恢復(fù):當(dāng)事務(wù)正在處理的時(shí)候,例程失敗,回滾段的信息保存在重做日志文件中,Oracle將在下次打開數(shù)據(jù)庫時(shí)利用回滾來恢復(fù)未提交的數(shù)據(jù)。 ?。?)讀一致性:當(dāng)一個(gè)會(huì)話正在修改數(shù)據(jù)時(shí),其它的會(huì)話將看不到該會(huì)話未提交的修改。而且,當(dāng)一個(gè)語句正在執(zhí)行時(shí),該語句將看不到從該語句開始執(zhí)行后的未提交的修改(語句級(jí)讀一致性)。 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)建一個(gè)Undo(回滾)條目; ·把將要?jiǎng)h除的記錄創(chuàng)建前鏡像,存放到Undo Block(回滾塊)中; ·在Buffer Cache中的相應(yīng)數(shù)據(jù)塊上刪除記錄,并且標(biāo)記相應(yīng)的數(shù)據(jù)塊為Dirty(臟)。 ?。?)提交(Commit)流程 ·Oracle產(chǎn)生一個(gè)SCN; ·在回滾段事物表中標(biāo)記該事物狀態(tài)為Commited; ·LGWR(日志讀寫進(jìn)程) Flush Log Buffer到日志文件; ·如果此時(shí)數(shù)據(jù)塊仍然在Buffer Cache中,那么SCN將被記錄到Block Header上,這被稱為快速提交; ·如果Dirty Block已經(jīng)被寫回到磁盤,那么下一個(gè)訪問這個(gè)Block的進(jìn)程將會(huì)自回滾段中獲取該事物的狀態(tài),確認(rèn)該事物被提交。然后這個(gè)進(jìn)程獲得提交SCN并寫回到Block Header上,這被稱為延遲塊清除。
4、Oracle 9i中閃回查詢操作實(shí)例 進(jìn)行閃回查詢必須設(shè)置自動(dòng)回滾段管理,在init.ora設(shè)置參數(shù)UNDO_MANAGEMENT=AUTO,參數(shù)UNDO_RETENTION=n,決定了能往前閃回的最大時(shí)間,值越大就需要越多Undo空間。 例:Oracle 9i的Flashback Query操作。 (1)創(chuàng)建閃回查詢用戶 SQL> create user flashtest identified by flashtest;
?。?)創(chuàng)建測試表,插入測試記錄 SQL> create table test(id number(3)); 注意:在執(zhí)行步驟3或者步驟4之前,等待5分鐘。
?。?)刪除記錄 SQL> execute dbms_flashback.disable; 通過以上的操作,我們插入了兩條記錄,并刪除了其中一條記錄。在以下的操作中,我們將通過flashback query找到刪除的記錄
?。?)閃回查詢 SQL> DECLARE 可以看出,雖然刪除記錄并提交,但是通過閃回操作,仍能查詢到刪除前的兩條記錄。需要注意Oracle每5分鐘記錄一次SCN,并將SCN和對(duì)應(yīng)時(shí)間的映射進(jìn)行紀(jì)錄。如果原來插入的記錄到做閃回操作的時(shí)間在5分鐘之內(nèi),用基于時(shí)間的閃回查詢可能得不到記錄,因?yàn)榛跁r(shí)間點(diǎn)的查詢實(shí)際上是轉(zhuǎn)化為最近的一次SCN,然后從這個(gè)SCN開始進(jìn)行恢復(fù)。因此,如果需要精確的查詢可以采用基于SCN的閃回查詢,可精確閃回到需要恢復(fù)的時(shí)間??梢酝ㄟ^DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER語句獲取SCN
|
|