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