RMAN 常用命令 3 [final]

tolywang發表於2011-08-01


13.  使用RMAN進行恢復

在使用RMAN恢復資料庫時,包括兩個步驟:
A. 使用restore 讀取備份檔案中的資料塊,根據資料塊所屬資料檔案,將這些數
   據塊放回到相應的資料檔案中,完成還原工作。
B. 使用recover命令,把那些從備份以來生成的歸檔日誌檔案以及聯機日誌檔案應
   用到還原出來的資料檔案上,恢復到最新或指定的時間點。

備註:
a. 目標資料庫如果是歸檔模式,可以是open及mounted狀態進行備份
b. 目標資料庫如果是非歸檔模式,必須是mounted狀態進行備份
c. 目標資料庫如果是歸檔模式,可以是open,mounted或close狀態進行恢復 
d. 目標資料庫如果是非歸檔模式,必須是mounted狀態進行恢復

(1). 完全恢復

在使用RMAN進行恢復時,分為歸檔和非歸檔模式。
A. 如果目標庫為非歸檔,那麼只能是mount狀態進行恢復 
B. 如果為歸檔模式,只要不是恢復undo,system表空間及控制檔案,都可以在open進行。

(1.1) 還原SPFILE和控制檔案

A. 啟用了自動備份控制檔案且備份集位於閃回恢復區域 
如果spfile和控制檔案都丟失了,我們一般先還原spfile. 如果我們啟用了自動
備份控制檔案,那麼每次備份時都會自動備份控制檔案和spfile, 並且將這兩種
檔案放在同一個備份集中,如果我們丟失了spfile, 我們至少需要將庫開啟為
nomount , 那麼我們必須先借助一個臨時引數檔案,將庫啟動到nomount

SQL> startup pfile='/u01/init_temp.ora'  nomount ;

因為預設情況下,spfile和控制檔案所在的備份集位於閃回恢復區,該區域的文
件名都是隨機產生的,記錄後設資料的控制檔案也丟失了,所以找到含spfile的備
份集很難,我們只有透過它的大小來初步判斷,一般spfile和控制檔案大小比較
小,不超過10M,  那麼我們可以大概找到spfile的備份集:

RMAN > restore spfile to '/u01/spfile_restore.ora' from '/u02/backup/05j0tr4v_1_1 ;

然後透過恢復的spfile開啟到nomount狀態,還原控制檔案。
RMAN > restore controlfile to '/u01/controlfile01.ctl' from '/u02/backup/05j0tr4v_1_1 ;


B. 啟用了自動備份控制檔案且備份集位於指定的非閃迴路徑,如果我們修改了
自動備份控制檔案的路徑,比如 /u01/backup/%F, 那麼在恢復spfile的時候可
以使用下面的命令進行: 

RMAN > set dbid=373937390 (如果使用恢復目錄,則不需要set dbid)
RMAN > run{
set controlfile autobackup format for device type disk to '/u01/backup/%F';
restore spfile to '/u01/spfile.ora' from autobackup ;
}
還原完spfile以後,類似命令還原controlfile ,如下
RMAN > run{
set controlfile autobackup format for device type disk to '/u01/backup/%F';
restore controlfile to '/u01/control02.ctl' from autobackup ;
}

我們還可以直接根據備份中在spfile建立pfile
RMAN > restore spfile to pfile '/u01/spfile_restore.ora' from autobackup ;

C. 沒有啟動自動備份控制檔案(預設是未啟動)
如果沒有啟用自動備份控制檔案,那麼每次備份system空間檔案時,都會強制備份控制
檔案和spfile. 所以我們可以根據大小找到含有控制檔案的備份片,進行還原:
RMAN> restore spfile to '/u01/spfile_restore.ora' from '/u01/bak/06j9uyft_1_1';
RMAN> restore controlfile to '/u01/control03.ctl' from '/u01/bak/06j9uyft_1_1';

 

 

14.  非歸檔模式下的完全恢復

A. 控制檔案,聯機日誌檔案,資料檔案全部損壞
我們先利用spfile啟動到nomount狀態,然後恢復控制檔案 

RMAN > set dbid=373937390 ;
RMAN > run{
set controlfile autobackup format for device type disk to '/u01/backup/%F';
restore controlfile  from autobackup ;
}
RMAN > sql 'alter database mount ' ; 
使用restore 命令還原所有的資料檔案,還原所用到的備份後設資料從恢復回來的控制
檔案中獲得。  
RMAN > restore database ;
(備註: restore database不能加from,需要讓控制檔案可以自動找到備份檔案)
恢復資料庫
RMAN > recover database noredo ; (聯機日誌檔案損壞,所以加入noredo)
RMAN > alter database open resetlogs ;

B. 控制檔案,聯機日誌檔案完好,只是資料檔案全部損壞我們將庫啟動到mount狀態,
利用resoter 還原資料庫
RMAN > resoter database ;
還原完成後,利用聯機日誌中的條目恢復資料庫
RMAN > recover database ;
因為是非歸檔模式,如果當前的日誌檔案在備份後沒有被覆蓋,那麼可以完全恢復數
據庫。 但是如果當前日誌檔案在備份結束後內容被覆蓋,我們只能使用:
RMAN > recover database until cancel ;
RMAN > alter database open resetlogs ;

C. 控制檔案完好,聯機日誌檔案和資料檔案全部損壞我們將庫啟動到mount狀態,
利用resoter 還原資料庫
RMAN > resoter database ;
還原完成後,因為當前聯機日誌檔案損壞,所以需要不完全恢復
RMAN > recover database until cancel ;
RMAN > alter database open resetlogs ;  

D. 資料檔案所在磁碟損壞,需要轉移資料檔案 
將資料庫啟動到mount狀態
SQL > alter database mount;
RMAN > run{
set newname for datafile '/u01/app/oradata/system01.dbf' to '/u02/system01.dbf' ;
set newname for datafile '/u01/app/oradata/undo01.dbf' to '/u02/undo01.dbf' ;
set newname for datafile '/u01/app/oradata/users01.dbf' to '/u02/users01.dbf' ;
set newname for datafile '/u01/app/oradata/sysaux01.dbf' to '/u02/sysaux01.dbf' ;
restore database;       -- 將資料檔案還原到新的指定路徑
switch datafile all ;   -- 將資料檔案新路徑寫入控制檔案
}
然後恢復資料庫(利用redo log),開啟(對照前面一些情況進行)。
RMAN > recover database ;
RMAN > alter database open;

 

 


15.  歸檔模式下的完全恢復

進行歸檔模式下的完全恢復的前提是必須具有從備份以來所有的歸檔日誌以及聯機
日誌檔案,如果缺少,只能進行不完全恢復。

如果在恢復過程中使用的是增量備份,過程和非增量備份一樣,只是在執行restore
時,只會還原0級備份,完成還原後,再執行recover,則rman將增量備份及歸檔日
志檔案應用到還原出來的0級備份上。

A. 非系統表空間損壞,控制檔案,聯機日誌檔案完好。

如果資料庫是開啟狀態:
RMAN > run {
sql 'alter tablespace users offline immediate '; 
restore tablespace users ;
recover tablespace users;
sql 'alter tablespace users online' ;
}

如果資料庫為關閉狀態,那麼需要將庫開啟到mount,離線那個表空間的datafile,
然後開啟庫,最後執行上面的程式 ; 
SQL> shutdown immediate
SQL> startup mount
SQL> alter database datafile 'D:\oracle\test\USERS01.DBF' offline ;
SQL> alter database open ;
RMAN > run {
sql 'alter tablespace users offline immediate '; 
restore tablespace users ;
recover tablespace users;
sql 'alter tablespace users online' ;
}


B. 某非系統資料檔案損壞,控制檔案,聯機日誌檔案完好。
RMAN> run {
sql ' alter database datafile '/u01/app/oradata/users01.dbf' offline;
restore datafile  '/u01/app/oradata/users01.dbf' ;
recover datafile  '/u01/app/oradata/users01.dbf' ;
sql  'alter database datafile '/u01/app/oradata/users01.dbf' online; 
}
備註: 如果資料庫為開啟狀態,可以直接進行資料檔案級別的恢復,如果是關閉
狀態,那麼需要將庫開啟到mount, 將受損的資料檔案離線, 然後開啟庫,最後執
行上面的程式 ;  具體步驟類似於上面表空間損壞的命令。


C. 系統表空間的資料檔案損壞,控制檔案和聯機日誌檔案沒有損壞
如果系統表空間損壞,那麼只能將庫啟動到mount狀態,進行資料檔案的恢復。
RMAN > run {
alter database datafile '/u01/app/oradata/system01.dbf' offline;
restore datafile '/u01/app/oradata/system01.dbf' ;
recover datafile '/u01/app/oradata/system01.dbf' ;
sql  'alter database datafile '/u01/app/oradata/system01.dbf' online;
}


D. 所有資料檔案損壞,控制檔案和聯機日誌檔案沒有損壞
我們需要進行資料庫級別的恢復,那麼只能將庫啟動到mount狀態,執行如下: 
RMAN > run {
restore database ;
recover database ;
alter database open ;
}

 

 

16.   不完全恢復 

使用RMAN進行不完全恢復的時候,只能在mount狀態下進行,而且必須使用
基於資料庫的還原, 即必須還原所有的資料檔案。

A. 基於時間點

SQL > shutdown immeidate ; 
SQL > startup mount ;
RMAN > run {
set until time="to_date('2007-11-15 04:20:25','YYYY-MM-DD HH24:MI:SS')";
restore database;
recover database;
alter database open resetlogs;
}


B. 基於日誌序列號 

SQL > shutdown immeidate ;
SQL > startup mount ;
RMAN > run {
set until sequence 55 thread 1 ;
restore database;
recover database;
alter database open resetlogs;
}


C. 基於SCN號

SQL > shutdown immeidate ;
SQL > startup mount ;
RMAN > run {
set until scn 657981;
restore database;
recover database;
alter database open resetlogs;
}


Restore Point ---
從Oracle10g開始,為了使我們更加方便的進行不完全恢復,Oracle提供了
restore point的概念。可以將之理解為某個時間點或某個SCN的別名,比如
我們要進行一個批次載入,如果該批次載入失敗,我們必須將資料庫恢復到
批次載入開始前的那個時間點,於是我們可以在批次載入前為這個時候的
SCN號建立一個別名,比如:
SQL > create restore point before_load ;

然後,我們啟動批次載入,如果失敗,需要恢復,那麼我們可以:
SQL > shutdown immediate ;
SQL > startup mount;
RMAN > run {
restore database until restore point before_load ;
recover database until restore point before_load ;
alter database open resetlogs;
}
有關restore point的資訊可以從v$restore_point中獲得,它與SCN的關係儲存
在控制檔案中。

 

 


17.  配置恢復目錄 (catalog) 

恢復目錄是資料庫中的一個schema,該schema下面包含多個表,檢視以及儲存過程。
在恢復目錄中存放了RMAN的後設資料,RMAN可以使用目標資料庫中的的控制檔案,將
資料庫的結構,歸檔日誌檔案,備份集以及映象副本等資訊插入到恢復目錄中相關
的表中去,這個過程也叫做同步。

恢復目錄的優勢: 可以存放多個目標資料庫的RMAN後設資料;可以在表中存放很長時
間的備份後設資料,而控制檔案預設只能存放7天。

如果我們決定使用恢復目錄,則應該將恢復目錄單獨放在另一個資料庫中,不要與
產品資料庫放在一起,道理很簡單,一旦產品庫出現問題,恢復目錄也無法訪問,
這時儘管備份檔案都存在,但是由於缺少了後設資料而不能使用RMAN進行恢復,這時
候只能透過 dbms_backup_restore 程式包來完成了。

在恢復目錄中也存在兩個程式包: dbms_rcvman 和 dbms_rcvcat。 dbms_rcvman
與目標庫中的dbms_rcvman 功能是一樣的。實際上,RMAN在備份時可以透過目標
資料庫中的dbms_rcvman 來訪問目標資料庫的控制檔案,從而獲得RMAN相關的元
資料。dbms_rcvcat則負責將備份資訊寫入恢復目錄對應的資料表中。


我們使用下面的步驟建立恢復目錄:
A .SQL> create tablespace rcat_tbs datafile '/u01/rman_tbs01.dbf' size 50M;
B. SQL> create user rcat_owner identified by oracle default tablespace
        rcat_tbs temporary tablespace temp ;
C. SQL> alter user rcat_owner quota unlimited on rcat_tbs;
D. SQL> grant recovery_catalog_owner to rcat_owner ;
   SQL> grant connect , resource to rcat_owner;
E. 建立恢復目錄
   $rman  catalog 
   RMAN > create catalog tablespace rcat_tbs;
F. 透過RMAN連線到目標庫和恢復目錄後,將目標庫註冊到恢復目錄中。
   $rman  target   catalog 
   RMAN > register database ;

在使用恢復目錄進行備份恢復的過程中,實際上總是先將RMAN的後設資料儲存一份
在控制檔案中,然後再將控制檔案中記錄的後設資料同步到恢復目錄中相應的表中,
同步過程可以分為部分同步和完全同步兩種。

在部分同步中,RMAN讀取當前控制檔案並只把發生變化的資料插入到恢復目錄對
應的表中,不會同步資料庫物理結構資料,包括比如資料檔案,表空間,聯機日
志檔案等,當發出備份和恢復命令時,執行的就是部分同步。

在完全同步中,Oracle會將控制檔案中的所有內容更新到恢復目錄中,完全同步
的命令:
RMAN> resync catalog ;

通常我們應該是更改了資料庫中的結構,比如新增或刪除表空間,資料檔案的,
應該進行一次完全同步。

在Oracle10g以前,如果我們完成了不完全恢復,resetlogs開啟資料庫以後,
在使用了恢復目錄的情況下,需要發出下面的命令:
RMAN > reset database;

不過在Oracle10g或之後,已經可以使用發出resetlogs之前的備份和之後產生
的歸檔日誌檔案或聯機日誌檔案,從而將資料庫完全恢復,在這種情況下我們
不需要發出 reset database 命令。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-705807/,如需轉載,請註明出處,否則將追究法律責任。

相關文章