Oracle數(shù)據(jù)庫(kù)的災(zāi)難恢復(fù)

字號(hào):

要對(duì)Oracle數(shù)據(jù)庫(kù)備份與恢復(fù)有清晰的認(rèn)識(shí),首先有必要對(duì)數(shù)據(jù)庫(kù)的幾種運(yùn)行狀態(tài)有充分的了解。Oracle數(shù)據(jù)庫(kù)的運(yùn)行狀態(tài)主要分為3種,他們依次為:
     信息,并初始化SGA區(qū)。
    Mount(安裝)Oracle除了需要讀取ini文件還要讀取控制文件,并從中獲取有關(guān)數(shù)據(jù)庫(kù)的物理結(jié)構(gòu)等信息。
    Open(打開)數(shù)據(jù)庫(kù)要檢查所有文件處于同一時(shí)間點(diǎn),對(duì)錯(cuò)誤進(jìn)行恢復(fù)對(duì)未完成事務(wù)回滾,并最終可以允許用戶訪問(wèn)。
    數(shù)據(jù)庫(kù)的備份主要分為三種類型:冷備份;熱備份;邏輯備份;
    數(shù)據(jù)庫(kù)的備份不是本文討論的重點(diǎn),在這里只作一個(gè)概要的介紹,Oracle數(shù)據(jù)庫(kù)備份主要有:
    Cold Backup(冷備份) 主要指在關(guān)閉數(shù)據(jù)庫(kù)的狀態(tài)下進(jìn)行的數(shù)據(jù)庫(kù)完全備份,備份內(nèi)容包括所有數(shù)據(jù)文件、控制文件、聯(lián)機(jī)日志文件、ini文件。
    Hot Backup(熱備份) 指在數(shù)據(jù)庫(kù)處于運(yùn)行狀態(tài)下,對(duì)數(shù)據(jù)文件和控制文件進(jìn)行備份,要使用熱備份必須將數(shù)據(jù)庫(kù)運(yùn)行在(Archive Log)歸檔方式下。
    Export(邏輯備份)這是最簡(jiǎn)單的備份方法,可按數(shù)據(jù)庫(kù)中某個(gè)表、某個(gè)用戶或整個(gè)數(shù)據(jù)庫(kù)來(lái)導(dǎo)出,并且支持全部、累計(jì)、增量三種方式。使用這種方法,數(shù)據(jù)庫(kù)必須處于打開狀態(tài),而且如果數(shù)據(jù)庫(kù)不是在restrict狀態(tài)將不能保證導(dǎo)出數(shù)據(jù)的一致性。
    數(shù)據(jù)庫(kù)的恢復(fù)可分為兩大類:完全恢復(fù);不完全恢復(fù);
    完全恢復(fù)指將數(shù)據(jù)庫(kù)恢復(fù)到發(fā)生故障的時(shí)間點(diǎn),不丟失任何數(shù)據(jù)。不完全恢復(fù)指將數(shù)據(jù)庫(kù)恢復(fù)到發(fā)生故障前的某一個(gè)時(shí)間點(diǎn),此時(shí)間點(diǎn)以后的所有改動(dòng)將會(huì)丟失。如果沒有特殊需求,我們建議應(yīng)盡量使用完全恢復(fù)。
    Oracle數(shù)據(jù)庫(kù)的恢復(fù)過(guò)程分兩步進(jìn)行,首先將把存放在重做日志文件中的所有重做運(yùn)用到數(shù)據(jù)文件,之后對(duì)重做中所有未提交的事務(wù)進(jìn)行回滾,這樣所有數(shù)據(jù)就恢復(fù)到發(fā)生災(zāi)難那一時(shí)刻了。數(shù)據(jù)庫(kù)的恢復(fù)只能在發(fā)生故障之前的數(shù)據(jù)文件上運(yùn)用重做,將其恢復(fù)到故障時(shí)刻,而不能將數(shù)據(jù)文件反向回滾到之前的某一個(gè)時(shí)刻。舉個(gè)例子,我們有一個(gè)2001/1/1的數(shù)據(jù)庫(kù)備份,當(dāng)2001/5/1使我們發(fā)現(xiàn)數(shù)據(jù)庫(kù)中數(shù)據(jù)發(fā)生混亂,希望將數(shù)據(jù)庫(kù)恢復(fù)到2001/4/30時(shí)的狀態(tài),我們只能先恢復(fù)2001/1/1的數(shù)據(jù)庫(kù)備份然后在其上運(yùn)用重做記錄使其前滾到2001/4/30時(shí)的狀態(tài),而不能將2001/5/1的數(shù)據(jù)庫(kù)向后回滾到2001/4/30。
    為了系統(tǒng)的設(shè)計(jì)數(shù)據(jù)庫(kù)的恢復(fù)方案,我們先對(duì)可能遇到的錯(cuò)誤進(jìn)行分類,Oracle數(shù)據(jù)庫(kù)錯(cuò)誤主要分為5大類:
    SQL語(yǔ)句失敗
    線程失敗
    實(shí)例失敗
    用戶操作失敗
    存儲(chǔ)設(shè)備失敗
    如果發(fā)生前三種失敗,不需要我們?nèi)藶楦缮妫琌racle系統(tǒng)會(huì)自動(dòng)進(jìn)行恢復(fù)。對(duì)于用戶操作型的失敗(如誤刪除數(shù)據(jù)),我們采取的補(bǔ)救措施主要有導(dǎo)入最新的邏輯備份或進(jìn)行到某一時(shí)間點(diǎn)的不完全恢復(fù)。從Oracle 8之后的新版本中引入了基于表空間的時(shí)間點(diǎn)恢復(fù)(TSPITR),可以單獨(dú)將包含錯(cuò)誤操作的表空間恢復(fù)到指定時(shí)間,而不必對(duì)整個(gè)數(shù)據(jù)庫(kù)進(jìn)行不完全恢復(fù)。當(dāng)錯(cuò)誤操作發(fā)現(xiàn)比較及時(shí)而且數(shù)據(jù)量不大的情況下也可以考慮使用logminer生成反向SQL。
    針對(duì)存儲(chǔ)設(shè)備的失敗的情況比較復(fù)雜也是本文討論的重點(diǎn),存儲(chǔ)設(shè)備的失敗必然會(huì)使放置在其上的文件變?yōu)椴豢捎?,我們先將Oracle數(shù)據(jù)庫(kù)所涉及到的文件進(jìn)行一個(gè)劃分,主要可分為:
    Oracle的系統(tǒng)文件,指Oracle的運(yùn)行文件,各種應(yīng)用程序
    數(shù)據(jù)庫(kù)控制文件
    數(shù)據(jù)庫(kù)聯(lián)機(jī)重做日志文件
    數(shù)據(jù)文件
    歸檔日志文件
    避免第一種文件失敗主要依賴系統(tǒng)管理員進(jìn)行操作系統(tǒng)級(jí)的備份,當(dāng)發(fā)生事故后只能依靠操作系統(tǒng)備份將其恢復(fù)。
    控制文件中記錄著整個(gè)數(shù)據(jù)庫(kù)的結(jié)構(gòu)、每個(gè)數(shù)據(jù)文件的狀況、系統(tǒng)SCN、檢查點(diǎn)計(jì)數(shù)器等重要信息,在創(chuàng)建數(shù)據(jù)庫(kù)時(shí)會(huì)讓用戶指定三個(gè)位置來(lái)存放控制文件,他們之間互為鏡像,當(dāng)其中任何一個(gè)發(fā)生故障,只需將其從ini文件中注釋掉故障數(shù)據(jù)文件就可重新將數(shù)據(jù)啟動(dòng)。當(dāng)所有控制全部失效時(shí),可以在Nomount模式下執(zhí)行create controlfile來(lái)重新生成控制文件,但必須提供redo log,data file,文件名和地址以及MAXLOGFILES,MAXDATAFILES,MAXINSTANCES等信息。如果失敗之前運(yùn)行過(guò)alter database backup controlfile to trace或alter database backup controlfile to ‘xxx’對(duì)控制文件作備份,恢復(fù)時(shí)可使用生成的腳本來(lái)重建或用備份文件覆蓋,如果使用了舊的控制文件在恢復(fù)時(shí)要使用recover xxx using backup controlfile選項(xiàng)來(lái)進(jìn)行恢復(fù),并使用resetlogs選項(xiàng)來(lái)打開數(shù)據(jù)庫(kù)。