程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oralce數據庫的災難恢復

Oralce數據庫的災難恢復

編輯:Oracle數據庫基礎

隨著辦公自動化和電子商務的飛速發展,企業對信息系統的依賴性越來越高,數據庫作為信息系統的核心擔當著重要的角色。尤其在一些對數據可靠性要求很高的行業如銀行、證券、電信等,如果發生意外停機或數據丟失其損失會十分慘重。為此數據庫管理員應針對具體的業務要求制定詳細的數據庫備份與災難恢復策略,並通過模擬故障對每種可能的情況進行嚴格測試,只有這樣才能保證數據的高可用性。數據庫的備份是一個長期的過程,而恢復只在發生事故後進行,恢復可以看作是備份的逆過程,恢復的程度的好壞很大程度上依賴於備份的情況。此外,數據庫管理員在恢復時采取的步驟正確與否也直接影響最終的恢復結果,本文主要針對Oracle數據庫可能遇到的各種故障提供了相應的恢復的方法,僅供大家參考。

要對Oracle數據庫備份與恢復有清晰的認識,首先有必要對數據庫的幾種運行狀態有充分的了解。Oracle數據庫的運行狀態主要分為3種,他們依次為:

l Nomount(非安裝)Oracle只是讀取ini文件中的配置信息,並初始化SGA區。

l Mount(安裝)Oracle除了需要讀取ini文件還要讀取控制文件,並從中獲取有關數據庫的物理結構等信息。

l Open(打開)數據庫要檢查所有文件處於同一時間點,對錯誤進行恢復對未完成事務回滾,並最終可以允許用戶訪問。

數據庫的備份主要分為三種類型:冷備份;熱備份;邏輯備份;

數據庫的備份不是本文討論的重點,在這裡只作一個概要的介紹,Oracle數據庫備份主要有:

l Cold Backup(冷備份) 主要指在關閉數據庫的狀態下進行的數據庫完全備份,備份內容包括所有數據文件、控制文件、聯機日志文件、ini文件。

l Hot Backup(熱備份) 指在數據庫處於運行狀態下,對數據文件和控制文件進行備份,要使用熱備份必須將數據庫運行在(Archive Log)歸檔方式下。

l Export(邏輯備份)這是最簡單的備份方法,可按數據庫中某個表、某個用戶或整個數據庫來導出,並且支持全部、累計、增量三種方式。使用這種方法,數據庫必須處於打開狀態,而且如果數據庫不是在restrict狀態將不能保證導出數據的一致性。

數據庫的恢復可分為兩大類:完全恢復;不完全恢復;

完全恢復指將數據庫恢復到發生故障的時間點,不丟失任何數據。不完全恢復指將數據庫恢復到發生故障前的某一個時間點,此時間點以後的所有改動將會丟失。如果沒有特殊需求,我們建議應盡量使用完全恢復。

Oracle數據庫的恢復過程分兩步進行,首先將把存放在重做日志文件中的所有重做運用到數據文件,之後對重做中所有未提交的事務進行回滾,這樣所有數據就恢復到發生災難那一時刻了。數據庫的恢復只能在發生故障之前的數據文件上運用重做,將其恢復到故障時刻,而不能將數據文件反向回滾到之前的某一個時刻。舉個例子,我們有一個2001/1/1的數據庫備份,當2001/5/1使我們發現數據庫中數據發生混亂,希望將數據庫恢復到2001/4/30時的狀態,我們只能先恢復2001/1/1的數據庫備份然後在其上運用重做記錄使其前滾到2001/4/30時的狀態,而不能將2001/5/1的數據庫向後回滾到2001/4/30。

為了系統的設計數據庫的恢復方案,我們先對可能遇到的錯誤進行分類,Oracle數據庫錯誤主要分為5大類:

l SQL語句失敗

l 線程失敗

l 實例失敗

l 用戶操作失敗

l 存儲設備失敗

如果發生前三種失敗,不需要我們人為干涉,Oracle系統會自動進行恢復。對於用戶操作型的失敗(如誤刪除數據),我們采取的補救措施主要有導入最新的邏輯備份或進行到某一時間點的不完全恢復。從Oracle 8之後的新版本中引入了基於表空間的時間點恢復(TSPITR),可以單獨將包含錯誤操作的表空間恢復到指定時間,而不必對整個數據庫進行不完全恢復。當錯誤操作發現比較及時而且數據量不大的情況下也可以考慮使用logminer生成反向SQL。

針對存儲設備的失敗的情況比較復雜也是本文討論的重點,存儲設備的失敗必然會使放置在其上的文件變為不可用,我們先將Oracle數據庫所涉及到的文件進行一個劃分,主要可分為:

l Oracle的系統文件,指Oracle的運行文件,各種應用程序

l 數據庫控制文件

l 數據庫聯機重做日志文件

l 數據文件

l 歸檔日志文件

避免第一種文件失敗主要依賴系統管理員進行操作系統級的備份,當發生事故後只能依靠操作系統備份將其恢復。

控制文件中記錄著整個數據庫的結構、每個數據文件的狀況、系統SCN、檢查點計數器等重要信息,在創建數據庫時會讓用戶指定三個位置來存放控制文件,他們之間互為鏡像,當其中任何一個發生故障,只需將其從ini文件中注釋掉故障數據文件就可重新將數據啟動。當所有控制全部失效時,可以在Nomount模式下執行create controlfile來重新生成控制文件,但必須提供redo log,data file,文件名和地址以及MAXLOGFILES,MAXDATAFILES,MAXINSTANCES等信息。如果失敗之前運行過alter database backup controlfile to trace或alter database backup controlfile to ‘xxx’對控制文件作備份,恢復時可使用生成的腳本來重建或用備份文件覆蓋,如果使用了舊的控制文件在恢復時要使用recover xxx using backup controlfile選項來進行恢復,並使用resetlogs選項來打開數據庫。

如果丟失的是聯機日志文件,分兩種情況處理1、丟失的是非活動的日志文件;2、丟失的是當前激活的日志文件。

如果是第一種情況,而發生故障的日志文件組又具有多個成員,可以先將數據庫shutdown,然後用操作系統命令將損壞日志文件組中好的日志成員文件把損壞的成員文件覆蓋(在同一個日志成員組中的所有日志文件的各為鏡象的),如果其物理位置不可用可將其拷貝到新的驅動器上,使用alter database rename file ‘xxxx’ to ‘xxxx’改變文件位置,之後啟動數據庫,如果正常馬上進行一個冷備份。如果損壞的日志組中只有一個日志成員,先mount上數據庫,將其轉換為noarchivelog模式,執行alter database add logfile member ‘xxx’ to group ‘x’給相關組增加一個成員,再執行alter database drop logfile member ‘bad_file’將損壞的日志文件刪除,由於數據庫的結構發生變動需要備份控制文件,之後將數據庫改回archivelog模式,做一個冷備份。

如果丟失的是當前激活的日志文件,數據庫又沒有鏡像而且當前日志組中所有成員均變為不可用。首先將數據庫shutdown abort,從最近的一次全備份中恢復所有的數據文件,將數據庫啟動到mount狀態。如果原來的日志文件物理位置不可用,使用alter database rename file ‘xxx’ to ‘xxx’改變文件的存放位置。然後,使用recover database until cancel命令來恢復數據庫,直到提示最後一個歸檔日志運用完之後,輸入cancel。之後用alter database open resetlogs打開數據庫,如果沒有問題,立即進行一個冷備份。注意!所有包含在損壞的redo log中的信息將會丟失,也就是說數據庫崩潰前已經提交的數據有可能會丟失。這對於某些要求很高的應用將會損失慘重,因此應盡量使每個日志組具有多個日志成員,並且放置在不同的驅動器上一防止發生介質故障。

數據文件發生故障的情況也分為多種情況,1、丟失包含在SYSTEM表空間的數據文件;2、丟失沒有回滾段的非SYSTEM數據文件;3、丟失有回滾段的非SYSTEM數據文件。

如果損壞的是系統表空間的數據文件。唯一的辦法是從上一次備份中恢復受損的數據文件,(如果原位置不可用使用alter database rename命令改變新文件的位置),之後在數據庫mount的狀態下執行recover database/datafile對數據庫進行回復,才能將數據庫打開。注意:當SYSTEM表空間或其中的數據文件脫機,數據庫是無法被打開的,因此必須在mount狀態下將所有的恢復工作完成。

當丟失的數據文件不屬於系統表空間而且也不包含回滾段時,有可選擇在數據庫的兩種狀態下進行恢復---在數據庫open的狀態或者在數據庫mount的狀態。如果用戶急於訪問數據庫中未受損部分的數據或對損壞的數據文件進行恢復需要很長時間,可以先使受損的數據文件脫機,將數據庫打開給用戶訪問,再恢復受損的數據文件最後將其聯機。步驟如下:先在數據庫mount時,將相關的數據文件或表空間進行脫機alter database datafile xxx offline,然後將數據庫open,這樣就能使數據庫未受損的部分先供用戶訪問,之後再進行recover datafile/tablespace,完成後用alter database datafile/tablespace ‘xxx’ online使其恢復聯機就可被訪問了。 當然用戶也可以選擇在數據庫mount狀態下,用recover database/datafile將所有的恢復工作做完,將所有數據文件一起打開供用戶訪問。

如果丟失的數據文件是最後一種情況,即包含有回滾段的非系統表空間數據文件。也可以選擇是在數據庫先open的狀態還是在mount狀態下恢復。不過與上一種情況不同的是當包含回滾段的數據文件損壞時,如果使其先offline將數據庫打開,那麼所有數據庫崩潰前未提交的事務涉及到的表將無法訪問,也就是說在回滾段恢復前其中涉及的對象都不允許被訪問。而且當所有包含回滾段的數據文件都在offline狀態時,數據庫無法進行任何DML操作,因此在數據庫open狀態恢復包含回滾段的數據文件時,可以先創建幾個臨時回滾段供數據使用create rollback segment temp1 tablespace system; alter rollback segment temp1 online;,當數據文件恢復後再將他們刪除alter rollback segment temp1 offline; drop rollback segment temp1;。注意:當用這種方法使恢復的數據文件online之後,所有的原有回滾段將處於offline狀態,必須手工使用alter rollback segment RBSxx online;使他們恢復聯機狀態,這樣才能被數據庫正常使用。如果在數據庫mount狀態下完成所有恢復,則不需要上述步驟。

如果丟失數據文件後,用戶發現沒有故障前的數據文件的備份,而且自從丟失的數據文件最早建立之後一直沒有使用過resetlogs選項打開過數據庫。也就是說用戶的控制文件是在損壞的數據文件建立前創建的,歸檔日志中包括對損壞數據文件的所有重做記錄。用戶就還有一種恢復方法,用戶可以先將損壞的數據文件或表空間脫機alter database datafile / tablespace xxx offline,之後執行alter database create datafile ‘new/xxx.dbf’ as ‘old/xxx.dbf’,數據庫會根據保存在控制文件中的信息重建一個空的數據文件,之後再執行recover tablespace / datafile將所有重做記錄運用到數據文件,使其完全恢復到當前狀態,之後便可再將其恢復聯機。

如果丟失的是最後一種文件---歸檔文件或歸檔文件所處的物理位置不可用,首先shutdown數據庫,立即作一個冷備份。然後修改ini文件中的歸檔日志文件目的路徑,重新啟動數據庫。以後再發生災難只需從最新的備份中將相關文件恢復,數據庫作recover時就不需要備份之前丟失的歸檔文件了。在Oracle 8之後的新版本中提供了log_archive_duplex_dest和log_archive_dest_1...5等參數允許保留多份歸檔文件到不同位置,甚至到遠端服務器從而保證歸檔文件的可靠性。

最後再說幾點數據庫恢復時的注意事項:

1.本文討論所有情況的默認前提是數據庫運行在歸檔(ARCHIVELOG)方式下,並只涉及到一般常見的情況和最基本的恢復方法。使用Oracle提供的恢復管理器RMAN也能完成上述任務,如果運行環境比較復雜建議使用RMAN來做備份和恢復。

2.一旦數據庫發生災難,最好在進行恢復之前做一次完全的冷備份,以便在進行恢復時產生差錯還可以進行補救。很大一部分數據丟失是由於不正確的恢復操作所引起的。

3.當數據庫完成恢復之後,尤其是使用resetlogs選項打開數據庫之後,要馬上關閉數據庫進行一次完全的冷備份。因為,為防止放棄的重做日志被下次恢復時再次運用,resetlogs選項會重新創建redo log文件並將其的計數清零,這將使之前做的所有備份將變為不可用(一般情況下)。

4.要特別注意當進行數據庫完全恢復,從發生故障的時間點前的備份中恢復損壞文件時,一定不要使備份中的redo log文件覆蓋了當前的redo log文件,否則就只能進行不完全恢復並且要丟失一部分數據了。

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