一、常規(guī)還原與恢復(fù)
      RMAN 的整個(gè)恢復(fù)過程可以分為還原(restore)與恢復(fù)(recover) ,他們在含義上是有很大差別的,一個(gè)是指物理意義的文件的還原與拷貝,一個(gè)是指數(shù)據(jù)庫一致性的恢復(fù),所以,正確的理解這兩個(gè)概念,有助于正確的恢復(fù)數(shù)據(jù)庫。
對(duì)于RMAN 的備份,還原操作只能是在用 RMAN 或 RMAN 包來做了,對(duì)于恢復(fù)操作則是很靈活的了,除了 RMAN,也可以在 SQLPLUS 中完成。還原與恢復(fù)一個(gè)數(shù)據(jù)庫,可以用如下兩個(gè)簡單的命令完成
RMAN>restore database;
RMAN>recover database;
恢復(fù)一個(gè)表空間,或者恢復(fù)一個(gè)數(shù)據(jù)文件,相對(duì)比較恢復(fù)數(shù)據(jù)庫可能花費(fèi)更少的時(shí)間。
RMAN> SQL "ALTER TABLESPACE tools OFFLINE IMMEDIATE";
RMAN> RESTORE TABLESPACE tools;
RMAN> RECOVER TABLESPACE tools;
RMAN> SQL "ALTER TABLESPACE tools ONLINE";
對(duì)于數(shù)據(jù)庫與數(shù)據(jù)文件,可以從指定的tag恢復(fù)
RMAN>RESTORE DATAFILE 1 FROM TAG=’tag name’
對(duì)于時(shí)間點(diǎn)恢復(fù)等不完全恢復(fù),可能只有完全的還原數(shù)據(jù)庫了。
RMAN> RUN {
2> ALLOCATE CHANNEL c1 TYPE DISK;
3> ALLOCATE CHANNEL c2 TYPE DISK;
4> SET UNTIL TIME = '2002-12-09:11:44:00';
5> RESTORE DATABASE;
6> RECOVER DATABASE;
7> ALTER DATABASE OPEN RESETLOGS; }
不完全恢復(fù)在 RMAN 中還可以用基于日志的恢復(fù)
RMAN> RUN {
2> SET UNTIL SEQUENCE 120 THREAD 1;
3> ALTER DATABASE MOUNT;
4> RESTORE DATABASE;
5> RECOVER DATABASE; # recovers through log 119
6> ALTER DATABASE OPEN RESESTLOGS;
7> }
如果有可能,也可以恢復(fù)數(shù)據(jù)文件到一個(gè)新的位置
SET NEWNAME FOR datafile
'/u01/oradata/tools01.dbf' TO '/tmp/tools01.dbf';
RESTORE datafile '/u01/oradata/tools01.dbf';
SWITCH DATAFILE ALL;
除了恢復(fù)數(shù)據(jù)庫與數(shù)據(jù)文件,我們也可以恢復(fù)控制文件,需要啟動(dòng)到 nomount 下,用如下
的命令即可   14
Restore controlfile from ‘file name’
Restore controlfile from autobackup
Restore controlfile from tag=‘……’
在正常情況下,不用恢復(fù)歸檔日志,恢復(fù)進(jìn)程會(huì)自動(dòng)尋找所需要的歸檔日志,當(dāng)然我們也可以指定恢復(fù)到哪里。
SET ARCHIVELOG DESTINATION TO '/u02/tmp_restore';
RESTORE ARCHIVELOG ALL;
如果使用的服務(wù)器參數(shù)文件(spfile) ,RMAN 可以備份該參數(shù)文件,如果發(fā)生文件損壞,可以用 RMAN 恢復(fù) spfile 參數(shù)文件,在沒有參數(shù)文件的情況下,用 Rman 的臨時(shí)參數(shù)文件啟動(dòng)數(shù)據(jù)庫到Nomount下,執(zhí)行如下命令即可
Restore controlfile from autobackup 
Restore controlfile from ‘file name’
二、特殊情況下的恢復(fù)
在假定丟失了恢復(fù)目錄與控制文件,只剩下備份集與備份片,這個(gè)時(shí)候,可能只能從文件中恢復(fù)了。以下是調(diào)用dbms_backup_restore包,從文件中恢復(fù)的例子。
declare
devtype varchar2(100);
done boolean;
recid number;
stamp number;
fullname varchar2(80);
begin
devtype :=
dbms_backup_restore.deviceallocate('sbt_tape',params=>'ENV=
(NSR_SERVER=backup_server)');
dbms_backup_restore.restoresetdata file;
dbms_backup_restore.restorecontrolfileto(
'first_control_file');
dbms_backup_restore.restorebackuppiece('backup_piece', done);
dbms_backup_restore.copycontrolfile ('first_control_file',
'second_control_file', recid, stamp,fullname);
-- repeat the above copycontrolfile for each control file
end; /
三、還原檢查與恢復(fù)測試
與備份檢查一樣,還原操作也可以檢查是否能正常restore或者是否該備份集是否有效。如: 
RMAN> RESTORE DATABASE VALIDATE;
RMAN> VALIDATE BACKUPSET 218;
Recover 還可以進(jìn)行測試,檢測恢復(fù)的錯(cuò)誤,錯(cuò)誤信息記載在alert文件中,通過測試,我們可以知道該恢復(fù)操作是否能正常完成。   15
SQL>RECOVER TABLESPACE sales TEST;
SQL>RECOVER DATABASE UNTIL CANCEL TEST
四、塊級(jí)別的恢復(fù)
塊恢復(fù)Block Media Recovery (BMR), 塊是恢復(fù)的最小單元, 通過塊可以減少恢復(fù)時(shí)間,而且數(shù)據(jù)文件可以在線。恢復(fù)塊的時(shí)候,必須指定具體的塊號(hào),如:
BLOCKRECOVER datafile 6 BLOCK 3;
要恢復(fù)的壞塊信息可以從報(bào)警與跟蹤文件,表與索引的分析,DBV 工具或第三方媒體管理工具以及具體的查詢語句中獲得。產(chǎn)生塊損壞的原因一般是間斷或隨機(jī)的 IO 錯(cuò)誤或者是內(nèi)存的塊錯(cuò)誤。
塊的錯(cuò)誤信息保存在 V$DATABASE_BLOCK_CORRUPTION,用如下命令恢復(fù)該視圖中列出的壞塊
RMAN> BLOCKRECOVER CORRUPTION LIST
2> RESTORE UNTIL TIME 'sysdate – 10';
備份的壞塊信息保存在
V$BACKUP_CORRUPTION
V$COPY_CORRUPTION
可以用如下的命令來恢復(fù)壞塊。
BLOCKRECOVER datafile 2 BLOCK 12, 13 datafile 7 BLOCK 5, 98, 99 datafile 9 BLOCK 19;
BLOCKRECOVER  TABLESPACE  SYSTEM  DBA  4194404,  4194405  FROM  TAG
"weekly_backup";
BLOCKRECOVER TABLESPACE SYSTEM DBA 4194404, 4194405 RESTORE UNTIL TIME
'SYSDATE-2';
五、數(shù)據(jù)庫復(fù)制
可以用RMAN 來進(jìn)行數(shù)據(jù)庫的復(fù)制與克隆,RMAN提供一個(gè)專門的命令來完成這個(gè)操作。如
CONNECT TARGET
CONNECT AUXILIARY
SYS/aux_pwd@newdb
DUPLICATE TARGET DATABASE TO ndbnewh 
   LOGFILE 
     '?/dbs/log_1.f' SIZE 100M,
     '?/dbs/log_2.f' SIZE 100M 
   SKIP READONLY 
   NOFILENAMECHECK;
在以上的命令執(zhí)行之前,注意如下幾點(diǎn)
1、備份主庫上的所有數(shù)據(jù)文件,控制文件以及備份時(shí)與備份后產(chǎn)生的歸檔日志,并把該備份拷貝到需要復(fù)制的機(jī)器同樣的目錄下(如果不是同樣的目錄,在linux/unix 環(huán)境下可以考慮建立一個(gè)鏈接來完成) 。
2、拷貝主數(shù)據(jù)庫的初始化參數(shù)文件到復(fù)制的機(jī)器上,并做相應(yīng)的修改,如修改數(shù)據(jù)庫名稱與實(shí)例名稱

3、在要復(fù)制的機(jī)器上創(chuàng)建新的密碼文件,并啟動(dòng)復(fù)制的數(shù)據(jù)庫到 nomount下。
4、配置主數(shù)據(jù)庫到復(fù)制數(shù)據(jù)庫的網(wǎng)絡(luò)連接或者復(fù)制數(shù)據(jù)庫到主數(shù)據(jù)庫的連接。
5、在主數(shù)據(jù)庫或者復(fù)制的數(shù)據(jù)庫上運(yùn)行RMAN,分別連接主數(shù)據(jù)庫與復(fù)制數(shù)據(jù)庫實(shí)例。
6、運(yùn)行復(fù)制命令,命令將還原所有數(shù)據(jù)文件,重新創(chuàng)建控制文件,并利用新的參數(shù)文件啟動(dòng)恢復(fù)數(shù)據(jù)庫到一致狀態(tài),最后用resetlog方式打開數(shù)據(jù)庫,創(chuàng)建指定的redolog。
復(fù)制命令也可以從磁帶上的備份進(jìn)行復(fù)制,并改變數(shù)據(jù)庫名稱,也可以改變數(shù)據(jù)庫文件的新的路徑以及恢復(fù)到以前的時(shí)間點(diǎn), 跳過不需要復(fù)制的表空間等, 如一個(gè)比較復(fù)雜的復(fù)制命令: 
RUN
{  
   ALLOCATE AUXILIARY CHANNEL newdb1 DEVICE TYPE sbt; 
   DUPLICATE TARGET DATABASE TO newdb
   DB_FILE_NAME_CONVERT=('/h1/oracle/dbs/trgt/','/h2/oracle/oradata/newdb/')
   UNTIL TIME 'SYSDATE-1'   # specifies incomplete recovery
   SKIP TABLESPACE cmwlite, drsys, example    # skip desired tablespaces
   PFILE = ?/dbs/initNEWDB.ora
   lOGFILE
       GROUP 1 ('?/oradata/newdb/redo01_1.f', 
                  '?/oradata/newdb/redo01_2.f') SIZE 200K, 
       GROUP 2 ('?/oradata/newdb/redo02_1.f', 
                  '?/oradata/newdb/redo02_2.f') SIZE 200K 
       GROUP 3 ('?/oradata/newdb/redo03_1.f',
                  '?/oradata/newdb/redo03_2.f') SIZE 200K REUSE;
}
六、利用 RMAN創(chuàng)建備用數(shù)據(jù)庫
利用 RMAN 創(chuàng)建備用數(shù)據(jù)庫可以用兩種辦法,一種是常規(guī)的 Restore 命令,利用從主數(shù)據(jù)庫拷貝過去的備用控制文件,把備用數(shù)據(jù)庫啟動(dòng)到備用 mount 下,這個(gè)時(shí)候的備用數(shù)據(jù)庫是沒有數(shù)據(jù)文件的。 然后在備用端, 啟動(dòng) RMAN命令, 連接該數(shù)據(jù)庫 (與主數(shù)據(jù)庫 DBID一樣) ,把從主數(shù)據(jù)庫拷貝過來的RMAN 備份還原出來。最后就與其它方法一樣了,進(jìn)入備用的管理恢復(fù)模式。
另外一個(gè)辦法就是復(fù)制命令了,如
DUPLICATE TARGET DATABASE FOR STANDBY NOFILENAMECHECK;
以下詳細(xì)的介紹了這一個(gè)過程。
1、創(chuàng)建備用參數(shù)文件與密碼文件,啟動(dòng)備用數(shù)據(jù)庫到 nomount下
2、備份主數(shù)據(jù)庫與備用控制文件以及所有歸檔
RMAN> Backup Database;
RMAN> Backup current controlfile for standby;
RMAN> sql "Alter System Archive Log Current"; 
RMAN> Backup filesperset 10 ArchiveLog all delete input;
3、拷貝所有的備份到備用數(shù)據(jù)庫相同路徑下
4、配置主數(shù)據(jù)庫到備用數(shù)據(jù)庫的連接
5、啟動(dòng)RMAN
rman target / auxiliary
sys/change_on_install@STANDBY    17
6,開始創(chuàng)建備用數(shù)據(jù)庫
RMAN> duplicate target database for standby dorecover nofilenamecheck;
整個(gè)過程包括了備用控制文件的創(chuàng)建,啟動(dòng)到 Mount 下,參數(shù)文件中指定的路徑轉(zhuǎn)換與數(shù)據(jù)文件的還原,歸檔日志的還原等。
7、最后恢復(fù)日志并啟動(dòng)到管理恢復(fù)模式下。
SQL> recover standby database; 
SQL> alter database recover managed standby database disconnect;

 Oracle社區(qū)PDM中文網(wǎng):http://www.pdmcn.com/bbs

 Oracle 專家QQ群:60632593、60618621

 Oracle技術(shù)資料:《Oracle 9i RMAN參考使用手冊》、《ORACLE10G備份與恢復(fù)》、《Oracle Database 10gRMAN備份與恢復(fù)