一、常規還原與恢復
RMAN 的整個恢復過程可以分為還原(restore)與恢復(recover) ,他們在含義上是有很大差別的,一個是指物理意義的文件的還原與拷貝,一個是指數據庫一致性的恢復,所以,正確的理解這兩個概念,有助于正確的恢復數據庫。
對于RMAN 的備份,還原操作只能是在用 RMAN 或 RMAN 包來做了,對于恢復操作則是很靈活的了,除了 RMAN,也可以在 SQLPLUS 中完成。還原與恢復一個數據庫,可以用如下兩個簡單的命令完成
RMAN>restore database;
RMAN>recover database;
恢復一個表空間,或者恢復一個數據文件,相對比較恢復數據庫可能花費更少的時間。
RMAN> SQL "ALTER TABLESPACE tools OFFLINE IMMEDIATE";
RMAN> RESTORE TABLESPACE tools;
RMAN> RECOVER TABLESPACE tools;
RMAN> SQL "ALTER TABLESPACE tools ONLINE";
對于數據庫與數據文件,可以從指定的tag恢復
RMAN>RESTORE DATAFILE 1 FROM TAG=’tag name’
對于時間點恢復等不完全恢復,可能只有完全的還原數據庫了。
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; }
不完全恢復在 RMAN 中還可以用基于日志的恢復
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> }
如果有可能,也可以恢復數據文件到一個新的位置
SET NEWNAME FOR datafile
'/u01/oradata/tools01.dbf' TO '/tmp/tools01.dbf';
RESTORE datafile '/u01/oradata/tools01.dbf';
SWITCH DATAFILE ALL;
除了恢復數據庫與數據文件,我們也可以恢復控制文件,需要啟動到 nomount 下,用如下
的命令即可 14
Restore controlfile from ‘file name’
Restore controlfile from autobackup
Restore controlfile from tag=‘……’
在正常情況下,不用恢復歸檔日志,恢復進程會自動尋找所需要的歸檔日志,當然我們也可以指定恢復到哪里。
SET ARCHIVELOG DESTINATION TO '/u02/tmp_restore';
RESTORE ARCHIVELOG ALL;
如果使用的服務器參數文件(spfile) ,RMAN 可以備份該參數文件,如果發生文件損壞,可以用 RMAN 恢復 spfile 參數文件,在沒有參數文件的情況下,用 Rman 的臨時參數文件啟動數據庫到Nomount下,執行如下命令即可
Restore controlfile from autobackup
Restore controlfile from ‘file name’
二、特殊情況下的恢復
在假定丟失了恢復目錄與控制文件,只剩下備份集與備份片,這個時候,可能只能從文件中恢復了。以下是調用dbms_backup_restore包,從文件中恢復的例子。
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; /
三、還原檢查與恢復測試
與備份檢查一樣,還原操作也可以檢查是否能正常restore或者是否該備份集是否有效。如:
RMAN> RESTORE DATABASE VALIDATE;
RMAN> VALIDATE BACKUPSET 218;
Recover 還可以進行測試,檢測恢復的錯誤,錯誤信息記載在alert文件中,通過測試,我們可以知道該恢復操作是否能正常完成。 15
SQL>RECOVER TABLESPACE sales TEST;
SQL>RECOVER DATABASE UNTIL CANCEL TEST
四、塊級別的恢復
塊恢復Block Media Recovery (BMR), 塊是恢復的最小單元, 通過塊可以減少恢復時間,而且數據文件可以在線。恢復塊的時候,必須指定具體的塊號,如:
BLOCKRECOVER datafile 6 BLOCK 3;
要恢復的壞塊信息可以從報警與跟蹤文件,表與索引的分析,DBV 工具或第三方媒體管理工具以及具體的查詢語句中獲得。產生塊損壞的原因一般是間斷或隨機的 IO 錯誤或者是內存的塊錯誤。
塊的錯誤信息保存在 V$DATABASE_BLOCK_CORRUPTION,用如下命令恢復該視圖中列出的壞塊
RMAN> BLOCKRECOVER CORRUPTION LIST
2> RESTORE UNTIL TIME 'sysdate – 10';
備份的壞塊信息保存在
V$BACKUP_CORRUPTION
V$COPY_CORRUPTION
可以用如下的命令來恢復壞塊。
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';
五、數據庫復制
可以用RMAN 來進行數據庫的復制與克隆,RMAN提供一個專門的命令來完成這個操作。如
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;
在以上的命令執行之前,注意如下幾點
1、備份主庫上的所有數據文件,控制文件以及備份時與備份后產生的歸檔日志,并把該備份拷貝到需要復制的機器同樣的目錄下(如果不是同樣的目錄,在linux/unix 環境下可以考慮建立一個鏈接來完成) 。
2、拷貝主數據庫的初始化參數文件到復制的機器上,并做相應的修改,如修改數據庫名稱與實例名稱
3、在要復制的機器上創建新的密碼文件,并啟動復制的數據庫到 nomount下。
4、配置主數據庫到復制數據庫的網絡連接或者復制數據庫到主數據庫的連接。
5、在主數據庫或者復制的數據庫上運行RMAN,分別連接主數據庫與復制數據庫實例。
6、運行復制命令,命令將還原所有數據文件,重新創建控制文件,并利用新的參數文件啟動恢復數據庫到一致狀態,最后用resetlog方式打開數據庫,創建指定的redolog。
復制命令也可以從磁帶上的備份進行復制,并改變數據庫名稱,也可以改變數據庫文件的新的路徑以及恢復到以前的時間點, 跳過不需要復制的表空間等, 如一個比較復雜的復制命令:
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創建備用數據庫
利用 RMAN 創建備用數據庫可以用兩種辦法,一種是常規的 Restore 命令,利用從主數據庫拷貝過去的備用控制文件,把備用數據庫啟動到備用 mount 下,這個時候的備用數據庫是沒有數據文件的。 然后在備用端, 啟動 RMAN命令, 連接該數據庫 (與主數據庫 DBID一樣) ,把從主數據庫拷貝過來的RMAN 備份還原出來。最后就與其它方法一樣了,進入備用的管理恢復模式。
另外一個辦法就是復制命令了,如
DUPLICATE TARGET DATABASE FOR STANDBY NOFILENAMECHECK;
以下詳細的介紹了這一個過程。
1、創建備用參數文件與密碼文件,啟動備用數據庫到 nomount下
2、備份主數據庫與備用控制文件以及所有歸檔
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、拷貝所有的備份到備用數據庫相同路徑下
4、配置主數據庫到備用數據庫的連接
5、啟動RMAN
rman target / auxiliary sys/change_on_install@STANDBY 17
6,開始創建備用數據庫
RMAN> duplicate target database for standby dorecover nofilenamecheck;
整個過程包括了備用控制文件的創建,啟動到 Mount 下,參數文件中指定的路徑轉換與數據文件的還原,歸檔日志的還原等。
7、最后恢復日志并啟動到管理恢復模式下。
SQL> recover standby database;
SQL> alter database recover managed standby database disconnect;
Oracle社區PDM中文網:http://www.pdmcn.com/bbs,
Oracle 專家QQ群:60632593、60618621
Oracle技術資料:《Oracle 9i RMAN參考使用手冊》、《ORACLE10G備份與恢復》、《Oracle Database 10gRMAN備份與恢復》