在應用oracle數據過(guò)程中,數據庫當機相信是每個(gè)人都會(huì )碰到的問(wèn)題,而如何恢復備份使損失最小是每個(gè)
dba最應該關(guān)心的問(wèn)題,無(wú)論什么情況都用imp恢復全備份是不現實(shí)和完全可用的,希望下面這個(gè)手冊會(huì )對
大家恢復各種情況下的備份有所幫助。
要對Oracle數據庫備份與恢復有清晰的認識,首先有必要對數據庫的幾種運行狀態(tài)有充分的了解。Oracle
數據庫的運行狀態(tài)主要分為3種,他們依次為:
l Nomount(非安裝)Oracle只是讀取ini文件中的配置信息,并初始化SGA區。
l Mount(安裝)Oracle除了需要讀取ini文件還要讀取控制文件,并從中獲取有關(guān)數據庫的物理結構等信
息。
l Open(打開(kāi))數據庫要檢查所有文件處于同一時(shí)間點(diǎn),對錯誤進(jìn)行恢復對未完成事務(wù)回滾,并最終可以
允許用戶(hù)訪(fǎng)問(wèn)。
數據庫的備份主要分為三種類(lèi)型:冷備份;熱備份;邏輯備份;
數據庫的備份不是本文討論的重點(diǎn),在這里只作一個(gè)概要的介紹,Oracle數據庫備份主要有:
l Cold Backup(冷備份) 主要指在關(guān)閉數據庫的狀態(tài)下進(jìn)行的數據庫完全備份,備份內容包括所有數據
文件、控制文件、聯(lián)機日志文件、ini文件。
l Hot Backup(熱備份) 指在數據庫處于運行狀態(tài)下,對數據文件和控制文件進(jìn)行備份,要使用熱備份
必須將數據庫運行在(Archive Log)歸檔方式下。
l Export(邏輯備份)這是最簡(jiǎn)單的備份方法,可按數據庫中某個(gè)表、某個(gè)用戶(hù)或整個(gè)數據庫來(lái)導出,并
且支持全部、累計、增量三種方式。使用這種方法,數據庫必須處于打開(kāi)狀態(tài),而且如果數據庫不是在
restrict狀態(tài)將不能保證導出數據的一致性。
數據庫的恢復可分為兩大類(lèi):完全恢復;不完全恢復;
完全恢復指將數據庫恢復到發(fā)生故障的時(shí)間點(diǎn),不丟失任何數據。不完全恢復指將數據庫恢復到發(fā)生故障
前的某一個(gè)時(shí)間點(diǎn),此時(shí)間點(diǎn)以后的所有改動(dòng)將會(huì )丟失。如果沒(méi)有特殊需求,我們建議應盡量使用完全恢
復。
Oracle數據庫的恢復過(guò)程分兩步進(jìn)行,首先將把存放在重做日志文件中的所有重做運用到數據文件,之后
對重做中所有未提交的事務(wù)進(jìn)行回滾,這樣所有數據就恢復到發(fā)生災難那一時(shí)刻了。數據庫的恢復只能在
發(fā)生故障之前的數據文件上運用重做,將其恢復到故障時(shí)刻,而不能將數據文件反向回滾到之前的某一個(gè)
時(shí)刻。舉個(gè)例子,我們有一個(gè)2001/1/1的數據庫備份,當2001/5/1使我們發(fā)現數據庫中數據發(fā)生混亂,希
望將數據庫恢復到2001/4/30時(shí)的狀態(tài),我們只能先恢復2001/1/1的數據庫備份然后在其上運用重做記錄
使其前滾到2001/4/30時(shí)的狀態(tài),而不能將2001/5/1的數據庫向后回滾到2001/4/30。
為了系統的設計數據庫的恢復方案,我們先對可能遇到的錯誤進(jìn)行分類(lèi),Oracle數據庫錯誤主要分為5大
類(lèi):
l SQL語(yǔ)句失敗
l 線(xiàn)程失敗
l 實(shí)例失敗
l 用戶(hù)操作失敗
l 存儲設備失敗
如果發(fā)生前三種失敗,不需要我們人為干涉,Oracle系統會(huì )自動(dòng)進(jìn)行恢復。對于用戶(hù)操作型的失?。ㄈ缯`
刪除數據),我們采取的補救措施主要有導入最新的邏輯備份或進(jìn)行到某一時(shí)間點(diǎn)的不完全恢復。從
Oracle 8之后的新版本中引入了基于表空間的時(shí)間點(diǎn)恢復(TSPITR),可以單獨將包含錯誤操作的表空間恢
復到指定時(shí)間,而不必對整個(gè)數據庫進(jìn)行不完全恢復。當錯誤操作發(fā)現比較及時(shí)而且數據量不大的情況下
也可以考慮使用logminer生成反向SQL。
針對存儲設備的失敗的情況比較復雜也是本文討論的重點(diǎn),存儲設備的失敗必然會(huì )使放置在其上的文件
變?yōu)椴豢捎?,我們先將Oracle數據庫所涉及到的文件進(jìn)行一個(gè)劃分,主要可分為:
l Oracle的系統文件,指Oracle的運行文件,各種應用程序
l 數據庫控制文件
l 數據庫聯(lián)機重做日志文件
l 數據文件
l 歸檔日志文件
避免第一種文件失敗主要依賴(lài)系統管理員進(jìn)行操作系統級的備份,當發(fā)生事故后只能依靠操作系統備份將
其恢復。
控制文件中記錄著(zhù)整個(gè)數據庫的結構、每個(gè)數據文件的狀況、系統SCN、檢查點(diǎn)計數器等重要信息,在創(chuàng )
建數據庫時(shí)會(huì )讓用戶(hù)指定三個(gè)位置來(lái)存放控制文件,他們之間互為鏡像,當其中任何一個(gè)發(fā)生故障,只需
將其從ini文件中注釋掉故障數據文件就可重新將數據啟動(dòng)。當所有控制全部失效時(shí),可以在Nomount模式
下執行create controlfile來(lái)重新生成控制文件,但必須提供redo log,data file,文件名和地址以及
MAXLOGFILES,MAXDATAFILES,MAXINSTANCES等信息。如果失敗之前運行過(guò)alter database backup
controlfile to trace或alter database backup controlfile to ‘xxx’對控制文件作備份,恢復時(shí)可
使用生成的腳本來(lái)重建或用備份文件覆蓋,如果使用了舊的控制文件在恢復時(shí)要使用recover xxx using
backup controlfile選項來(lái)進(jìn)行恢復,并使用resetlogs選項來(lái)打開(kāi)數據庫。
如果丟失的是聯(lián)機日志文件,分兩種情況處理1、丟失的是非活動(dòng)的日志文件;2、丟失的是當前激活的日
志文件。
如果是第一種情況,而發(fā)生故障的日志文件組又具有多個(gè)成員,可以先將數據庫shutdown,然后用操作系
統命令將損壞日志文件組中好的日志成員文件把損壞的成員文件覆蓋(在同一個(gè)日志成員組中的所有日志
文件的各為鏡象的),如果其物理位置不可用可將其拷貝到新的驅動(dòng)器上,使用alter database rename
file ‘xxxx’ to ‘xxxx’改變文件位置,之后啟動(dòng)數據庫,如果正常馬上進(jìn)行一個(gè)冷備份。如果損壞
的日志組中只有一個(gè)日志成員,先mount上數據庫,將其轉換為noarchivelog模式,執行alter database
add logfile member ‘xxx’ to group ‘x’給相關(guān)組增加一個(gè)成員,再執行alter database drop
logfile member ‘bad_file’將損壞的日志文件刪除,由于數據庫的結構發(fā)生變動(dòng)需要備份控制文件,
之后將數據庫改回archivelog模式,做一個(gè)冷備份。
如果丟失的是當前激活的日志文件,數據庫又沒(méi)有鏡像而且當前日志組中所有成員均變?yōu)椴豢捎?。首先?div style="height:15px;">
數據庫shutdown abort,從最近的一次全備份中恢復所有的數據文件,將數據庫啟動(dòng)到mount狀態(tài)。如果
原來(lái)的日志文件物理位置不可用,使用alter database rename file ‘xxx’ to ‘xxx’改變文件的存
放位置。然后,使用recover database until cancel命令來(lái)恢復數據庫,直到提示最后一個(gè)歸檔日志運
用完之后,輸入cancel。之后用alter database open resetlogs打開(kāi)數據庫,如果沒(méi)有問(wèn)題,立即進(jìn)行
一個(gè)冷備份。注意!所有包含在損壞的redo log中的信息將會(huì )丟失,也就是說(shuō)數據庫崩潰前已經(jīng)提交的數
據有可能會(huì )丟失。這對于某些要求很高的應用將會(huì )損失慘重,因此應盡量使每個(gè)日志組具有多個(gè)日志成員
,并且放置在不同的驅動(dòng)器上一防止發(fā)生介質(zhì)故障。
數據文件發(fā)生故障的情況也分為多種情況,1、丟失包含在SYSTEM表空間的數據文件;2、丟失沒(méi)有回滾段
的非SYSTEM數據文件;3、丟失有回滾段的非SYSTEM數據文件。
如果損壞的是系統表空間的數據文件。唯一的辦法是從上一次備份中恢復受損的數據文件,(如果原位置
不可用使用alter database rename命令改變新文件的位置),之后在數據庫mount的狀態(tài)下執行recover
database/datafile對數據庫進(jìn)行回復,才能將數據庫打開(kāi)。注意:當SYSTEM表空間或其中的數據文件脫
機,數據庫是無(wú)法被打開(kāi)的,因此必須在mount狀態(tài)下將所有的恢復工作完成。
當丟失的數據文件不屬于系統表空間而且也不包含回滾段時(shí),有可選擇在數據庫的兩種狀態(tài)下進(jìn)行恢復
---在數據庫open的狀態(tài)或者在數據庫mount的狀態(tài)。如果用戶(hù)急于訪(fǎng)問(wèn)數據庫中未受損部分的數據或對損
壞的數據文件進(jìn)行恢復需要很長(cháng)時(shí)間,可以先使受損的數據文件脫機,將數據庫打開(kāi)給用戶(hù)訪(fǎng)問(wèn),再恢復
受損的數據文件最后將其聯(lián)機。步驟如下:先在數據庫mount時(shí),將相關(guān)的數據文件或表空間進(jìn)行脫機
alter database datafile xxx offline,然后將數據庫open,這樣就能使數據庫未受損的部分先供用戶(hù)
訪(fǎng)問(wèn),之后再進(jìn)行recover datafile/tablespace,完成后用alter database datafile/tablespace ‘
xxx’ online使其恢復聯(lián)機就可被訪(fǎng)問(wèn)了。 當然用戶(hù)也可以選擇在數據庫mount狀態(tài)下,用recover
database/datafile將所有的恢復工作做完,將所有數據文件一起打開(kāi)供用戶(hù)訪(fǎng)問(wèn)。
如果丟失的數據文件是最后一種情況,即包含有回滾段的非系統表空間數據文件。也可以選擇是在數據庫
先open的狀態(tài)還是在mount狀態(tài)下恢復。不過(guò)與上一種情況不同的是當包含回滾段的數據文件損壞時(shí),如
果使其先offline將數據庫打開(kāi),那么所有數據庫崩潰前未提交的事務(wù)涉及到的表將無(wú)法訪(fǎng)問(wèn),也就是說(shuō)
在回滾段恢復前其中涉及的對象都不允許被訪(fǎng)問(wèn)。而且當所有包含回滾段的數據文件都在offline狀態(tài)時(shí)
,數據庫無(wú)法進(jìn)行任何DML操作,因此在數據庫open狀態(tài)恢復包含回滾段的數據文件時(shí),可以先創(chuàng )建幾個(gè)
臨時(shí)回滾段供數據使用create rollback segment temp1 tablespace system; alter rollback segment
temp1 online;,當數據文件恢復后再將他們刪除alter rollback segment temp1 offline; drop
rollback segment temp1;。注意:當用這種方法使恢復的數據文件online之后,所有的原有回滾段將處
于offline狀態(tài),必須手工使用alter rollback segment RBSxx online;使他們恢復聯(lián)機狀態(tài),這樣才能
被數據庫正常使用。如果在數據庫mount狀態(tài)下完成所有恢復,則不需要上述步驟。
如果丟失數據文件后,用戶(hù)發(fā)現沒(méi)有故障前的數據文件的備份,而且自從丟失的數據文件最早建立之后一
直沒(méi)有使用過(guò)resetlogs選項打開(kāi)過(guò)數據庫。也就是說(shuō)用戶(hù)的控制文件是在損壞的數據文件建立前創(chuàng )建的
,歸檔日志中包括對損壞數據文件的所有重做記錄。用戶(hù)就還有一種恢復方法,用戶(hù)可以先將損壞的數據
文件或表空間脫機alter database datafile / tablespace xxx offline,之后執行alter database
create datafile ‘new/xxx.dbf’ as ‘old/xxx.dbf’,數據庫會(huì )根據保存在控制文件中的信息重建一
個(gè)空的數據文件,之后再執行recover tablespace / datafile將所有重做記錄運用到數據文件,使其完
全恢復到當前狀態(tài),之后便可再將其恢復聯(lián)機。
如果丟失的是最后一種文件---歸檔文件或歸檔文件所處的物理位置不可用,首先shutdown數據庫,立即
作一個(gè)冷備份。然后修改ini文件中的歸檔日志文件目的路徑,重新啟動(dòng)數據庫。以后再發(fā)生災難只需從
最新的備份中將相關(guān)文件恢復,數據庫作recover時(shí)就不需要備份之前丟失的歸檔文件了。在Oracle 8之
后的新版本中提供了log_archive_duplex_dest和log_archive_dest_1...5等參數允許保留多份歸檔文件
到不同位置,甚至到遠端服務(wù)器從而保證歸檔文件的可靠性。
最后再說(shuō)幾點(diǎn)數據庫恢復時(shí)的注意事項:
1.本文討論所有情況的默認前提是數據庫運行在歸檔(ARCHIVELOG)方式下,并只涉及到一般常見(jiàn)的情況和
最基本的恢復方法。使用Oracle提供的恢復管理器RMAN也能完成上述任務(wù),如果運行環(huán)境比較復雜建議使
用RMAN來(lái)做備份和恢復。
2.一旦數據庫發(fā)生災難,最好在進(jìn)行恢復之前做一次完全的冷備份,以便在進(jìn)行恢復時(shí)產(chǎn)生差錯還可以進(jìn)
行補救。很大一部分數據丟失是由于不正確的恢復操作所引起的。
3.當數據庫完成恢復之后,尤其是使用resetlogs選項打開(kāi)數據庫之后,要馬上關(guān)閉數據庫進(jìn)行一次完全
的冷備份。因為,為防止放棄的重做日志被下次恢復時(shí)再次運用,resetlogs選項會(huì )重新創(chuàng )建redo log文
件并將其的計數清零,這將使之前做的所有備份將變?yōu)椴豢捎茫ㄒ话闱闆r下)。
4.要特別注意當進(jìn)行數據庫完全恢復,從發(fā)生故障的時(shí)間點(diǎn)前的備份中恢復損壞文件時(shí),一定不要使備份
中的redo log文件覆蓋了當前的redo log文件,否則就只能進(jìn)行不完全恢復并且要丟失一部分數據了。
載自(天極網(wǎng))
京ICP證041476號