當(dāng)數(shù)據(jù)文件中僅有少量的數(shù)據(jù)塊發(fā)生了介質(zhì)損壞時(shí),我們可以利用RMAN對(duì)其進(jìn)行數(shù)據(jù)塊一級(jí)的恢復(fù)。數(shù)據(jù)塊級(jí)的局部恢復(fù)可以大大縮短恢復(fù)時(shí)間,甚至縮短到其他恢復(fù)方式的千分之幾。此外,在數(shù)據(jù)塊存在損壞而進(jìn)行的恢復(fù)中,系統(tǒng)可以處于運(yùn)行狀態(tài),這個(gè)數(shù)據(jù)文件也可以處于聯(lián)機(jī)應(yīng)用狀態(tài),無(wú)須將其設(shè)置為脫機(jī),保持應(yīng)用運(yùn)行狀態(tài)。
1)連接RMAN環(huán)境,并以 SYSDBA(SYSOPER) 身份連接數(shù)據(jù)庫(kù):
$rman target /
2)執(zhí)行下面的數(shù)據(jù)塊修復(fù)命令進(jìn)行數(shù)據(jù)塊的修復(fù):
rman>blockrecover datafile 3 block 2,150,152;
現(xiàn)在數(shù)據(jù)塊得以恢復(fù),系統(tǒng)繼續(xù)運(yùn)行。
第一步:設(shè)置損壞的數(shù)據(jù)文件脫機(jī)
SQL>alter database datafile 4 offline;
第二步:由RMAN裝載數(shù)據(jù)文件
RMAN>restore datafile 4;
第三步:對(duì)損壞的數(shù)據(jù)文件進(jìn)行恢復(fù)
RMAN>recover datafile 4;
第四步:設(shè)置已恢復(fù)數(shù)據(jù)文件聯(lián)機(jī)
RMAN>sql “alter database datafile 4 online”;
第五步:查看數(shù)據(jù)文件的可用性
SQL>select name,enabled,status from v$datafile;
至此,一個(gè)非系統(tǒng)表空間的數(shù)據(jù)文件恢復(fù)過(guò)程完成。
當(dāng)然數(shù)據(jù)庫(kù)恢復(fù)方法不僅一個(gè),管理員也可以按照表空間恢復(fù)的方法進(jìn)行恢復(fù)操作。還是上面的案例,如果發(fā)生了失敗,現(xiàn)在按照表空間損壞情況下的恢復(fù)方法進(jìn)行恢復(fù)。
下面用備份來(lái)恢復(fù)表空間users中的全部數(shù)據(jù)文件:
第一步:將表空間脫機(jī)
SQL> alter tablespace users offline;
第二步:裝載表空間
RMAN>restore tablespace users;
第三步:恢復(fù)表空間
RMAN>recover tablespace users;
第四步:將表空間聯(lián)機(jī)
RMAN>sql “alter tablespace users online”;
第五步:查看數(shù)據(jù)文件的可用性
SQL>select name,enabled,status from v$datafile;
如果是還原表空間或者系統(tǒng)表空間損壞,則數(shù)據(jù)庫(kù)系統(tǒng)不能運(yùn)行,數(shù)據(jù)庫(kù)一定不能處于打開狀態(tài),在RMAN環(huán)境下連接Oracle,注意,此時(shí)的連接并不是連接到已經(jīng)打開的數(shù)據(jù)庫(kù),而是連接到處于裝載狀態(tài)下的數(shù)據(jù)庫(kù):
第一步:連接RMAN
$rman target /
第二步:裝載表空間
RMAN>restore tablespace system;
第三步:恢復(fù)表空間
RMAN>recover tablespace system;
第四步:打開數(shù)據(jù)庫(kù)
SQL>alter database open;
一種全數(shù)據(jù)庫(kù)恢復(fù)方法,用于數(shù)據(jù)庫(kù)徹底崩潰,不可以進(jìn)行數(shù)據(jù)庫(kù)局部恢復(fù)操作的情況。這種方法很簡(jiǎn)單---裝載回?cái)?shù)據(jù)庫(kù)的一個(gè)完整備份集進(jìn)行恢復(fù)操作。雖然方法是簡(jiǎn)單的,但代價(jià)是龐大的----時(shí)間可能會(huì)很長(zhǎng)! 首先需要啟動(dòng)數(shù)據(jù)庫(kù)實(shí)例。在控制文件完好的情況下,啟動(dòng)到mount狀態(tài)是沒(méi)有問(wèn)題的,如果控制文件損壞,則只能啟動(dòng)到nomount狀態(tài)。在本例中,數(shù)據(jù)庫(kù)可以啟動(dòng)到mount狀態(tài):
第一步:?jiǎn)?dòng)實(shí)例
SQL>startup mount
第二步:進(jìn)入到RMAN環(huán)境下:
$rman target /
第三步:裝載數(shù)據(jù)庫(kù)備份
RMAN>restore database;
第四步:執(zhí)行下面的命令進(jìn)行數(shù)據(jù)庫(kù)的完全恢復(fù):
RMAN>recover database;
第五步:打開數(shù)據(jù)庫(kù)
RMAN>alter database open;
由于某種原因,例如介質(zhì)損壞導(dǎo)致所有控制文件都不可用時(shí),管理員可以使用RMAN的控制文件自動(dòng)備份,對(duì)控制文件進(jìn)行恢復(fù)。
為了描述的方便,這里我們假設(shè)在一套歸檔方式運(yùn)行的數(shù)據(jù)庫(kù)中,所有控制文件由于介質(zhì)損壞導(dǎo)致不可用。其他數(shù)據(jù)庫(kù)文件,包括數(shù)據(jù)文件、參數(shù)文件(SPFILE)、歸檔日志文件、聯(lián)機(jī)重做日志文件等均完好無(wú)損。 我們可以按照下面的步驟進(jìn)行恢復(fù)。由于數(shù)據(jù)庫(kù)控制文件損壞,因此數(shù)據(jù)庫(kù)這時(shí)只能處于脫機(jī)狀態(tài)。
第一步:?jiǎn)?dòng)數(shù)據(jù)庫(kù)到nomount狀態(tài):
SQL>startup nomount
第二步:在RMAN環(huán)境中,注冊(cè)數(shù)據(jù)庫(kù)ID(DBID)
$rman target /rman>set DBID=1195474494
第三步:從數(shù)據(jù)庫(kù)備份集中裝載控制文件備份
RMAN>restore controlfile from autobackup
第四步:將數(shù)據(jù)庫(kù)開啟到mount狀態(tài):
RMAN>alter database mount
第五步:用RMAN備份恢復(fù)數(shù)據(jù)庫(kù)
RMAN>recover database;
第六步:將數(shù)據(jù)庫(kù)實(shí)例打開,但需要進(jìn)行日志的重置(resetlogs):
RMAN>alter database open resetlogs;
由于數(shù)據(jù)庫(kù)以resetlogs方式打開,雖然本系統(tǒng)數(shù)據(jù)并未丟失,但由于所有日志文件已被重置,因此,需要進(jìn)行完全數(shù)據(jù)庫(kù)備份。 如果控制文件損壞,且伴著其他數(shù)據(jù)文件等的損壞,則按照本節(jié)介紹的控制文件恢復(fù),加上數(shù)據(jù)庫(kù)的崩潰恢復(fù),可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)的完全恢復(fù)(或不完全恢復(fù))。
由于數(shù)據(jù)庫(kù)日志可以采用多成員機(jī)制,這種方式保證在單個(gè)日志文件損壞下的系統(tǒng)連續(xù)運(yùn)行。即便一個(gè)日志組的所有成員都已經(jīng)損壞,如果是當(dāng)前日志組,則數(shù)據(jù)丟失、數(shù)據(jù)庫(kù)執(zhí)行不完全恢復(fù)是必然的選擇。如果不是當(dāng)前日志組,可能根本無(wú)須修復(fù),直接將日志組刪除,再創(chuàng)建新的日志組就可以了。
第一步:進(jìn)行數(shù)據(jù)庫(kù)的不完全恢復(fù)
SQL>recover database until cancel;
第二步:按照重置日志的方式打開數(shù)據(jù)庫(kù)
SQL>alter database open resetlogs;
數(shù)據(jù)庫(kù)得到不完全恢復(fù)。當(dāng)然,上述過(guò)程也可以在RMAN中完成。
RMAN> run{ set until scn=1645604; --執(zhí)行不完全恢復(fù)restore database from tag='TAG20110702T231137'; --指定備份集的tag值,在list backup of database中可以查到recover database;sql 'alter database open resetlogs'; }