RMAN異機恢復注意事項:
1、RMAN 異機恢復的時候,db_name必須相同。 如果說要想改成其他的實例名,可以在恢復成功後,用nid 命令修改。 實例名的信息會記錄到控制文件裡,所以如果在恢復的時候,如果實例名不一致,恢復的時候會報錯。
2、如果恢復的路徑和源庫不一致,就需要在restore時用set 命令指定新位置。 並且使用switch datafile all將信息更新的到控制文件。在做duplicate的時候,RMAN 會自動根據pfile中的log_file_name_convert和db_file_name_convert來進行set 的轉換。 手工restore時,只能使用set 命令。
1. 在恢復機上准備好以下內容:
》備份文件:
/ora_rman_backup/20150618/{控制文件.bak ; 數據文件.bak ; 歸檔日志.bak ; 參數文件.bak; 口令文件.bak}
注:將rman備份文件放到這裡,是因為在源DB上做RMAN備份時指定備份到這裡,若不建立同樣的目錄,
下面恢復時,就都必須指定RMAN備份文件的位置。
》OracleDB已經安裝好,並且配置了基本環境變量。
》cd $ORACLE_HOME/dbs
orapwd file=orapw$ORACLE_SID password=oracle
》mkdir $ORACLE_BASE/oradata
mkdir -pv $ORACLE_BASE/admin/$ORACLE_SID/{a,b,dp,u}dump
2. 恢復參數文件
export ORACLE_SID=udpay
rman target /
RMAN> restore spfile to pfile '$ORACLE_HOME/dbs/initdave2.ora' from '/ora_rman_backup/20150618/dave_spfile_16m6qtde_1_1_20110309';
或
直接使用從源DB上復制過來的init$ORACLE_SID.ora 文件也可,只要復制到$ORACLE_HOME/dbs下,
上面的ORACLE_SID配置了,也可以。
3. 還原控制文件
》修改 參數文件:
*.control_files='/oracle/oradata/orcl/control01.ctl','/oracle/oradata/orcl/control02.ctl','/oracle/oradata/orcl/control03.ctl'
》恢復控制文件:
RMAN> startup nomount;
RMAN> restore controlfile from '/ora_rman_backup/20150618/ctl_20150618';
4. 啟動DB到mount
RMAN> alter database mount;
5. 恢復archivelog
RMAN> crosscheck archivelog all; 【含義參看】
RMAN> crosscheck backup of archivelog all;
RMAN> delete expired archivelog all;
RMAN> list backup of archivelog all;
RMAN> restore archivelog from sequence=642; //注:此642是指恢復archivelog時,從Sequence為4620的備份開始還原。
BS 關鍵字 大小 設備類型占用時間 完成時間
------- ---------- ----------- ------------ ----------
1 149.20M DISK 00:00:01 22-7月 -16
BP 關鍵字: 1 狀態: AVAILABLE 已壓縮: NO 標記: TAG20160722T152937
段名:/tmp/archlog_DBINFO_1
備份集 1 中的已存檔日志列表
線程序列 低 SCN 時間下限 下一個 SCN 下一次
---- ------- ---------- ---------- ---------- ---------
1 642 126150727 19-7月 -16 126275396 22-7月 -16
6. 修改數據文件恢復的新路徑【報錯參考,見文末尾】
# 查看恢復的控制文件中記錄的redolog的位置.
# select group#, member from v$logfile;
注:這些需要放到run 運行塊中。
RMAN> run {
allocate channel a1 type disk;
allocate channel a2 type disk;
set until sequence=4631 thread=1;
set newname for datafile '/dev/udpay/lv_system01_1024m' to '/oracle/oradata/udpay/1024m_system01.dbf';
set newname for datafile '/dev/udpay/lv_undo01_8192m' to '/oracle/oradata/udpay/8192m_undotbs01.dbf';
set newname for datafile '/dev/udpay/lv_tools01_256m' to '/oracle/oradata/udpay/256m_users01.dbf';
set newname for datafile '/dev/udpay/lv_users01_256m' to '/oracle/oradata/udpay/256m_tools01.dbf';
set newname for datafile '/dev/udpay/lv_perf_256m' to '/oracle/oradata/udpay/256m_perf.dbf';
set newname for datafile '/dev/udpay/lv_whtapp_data01' to '/oracle/oradata/udpay/whtapp_data01.dbf';
set newname for datafile '/dev/udpay/lv_whtapp_data02' to '/oracle/oradata/udpay/whtapp_data02.dbf';
set newname for datafile '/dev/udpay/lv_whtapp_data03' to '/oracle/oradata/udpay/whtapp_data03.dbf';
set newname for datafile '/dev/udpay/lv_whtapp_index01' to '/oracle/oradata/udpay/whtapp_index01.dbf';
set newname for datafile '/dev/udpay/lv_indx01_256m' to '/oracle/oradata/udpay/indx01.dbf';
restore database; //這裡就是直接采用默認RMAN備份路徑中恢復數據文件。
#注: RMAN中使用sql來執行SQL命令時,SQL命令需要用雙引號引起來, 並且,雙引號內部有單引號,則單引號要寫兩次.
# 下面雙引號內部的都是單引號,並且都是雙寫的。
sql "alter database rename file ''/dev/udpay/lv_redo11_256m'' to ''/oracle/oradata/udpay/256m_redo11.log''";
sql "alter database rename file ''/dev/udpay/lv_redo12_256m'' to ''/oracle/oradata/udpay/256m_redo12.log''";
sql "alter database rename file ''/dev/udpay/lv_redo21_256m'' to ''/oracle/oradata/udpay/256m_redo21.log''";
sql "alter database rename file ''/dev/udpay/lv_redo22_256m'' to ''/oracle/oradata/udpay/256m_redo22.log''";
sql "alter database rename file ''/dev/udpay/lv_redo31_256m'' to ''/oracle/oradata/udpay/256m_redo31.log''";
sql "alter database rename file ''/dev/udpay/lv_redo32_256m'' to ''/oracle/oradata/udpay/256m_redo32.log''";
sql "alter database rename file ''/dev/udpay/lv_redo41_256m'' to ''/oracle/oradata/udpay/256m_redo41.log''";
sql "alter database rename file ''/dev/udpay/lv_redo42_256m'' to ''/oracle/oradata/udpay/256m_redo42.log''";
sql "alter database rename file ''/dev/udpay/lv_redo51_256m'' to ''/oracle/oradata/udpay/256m_redo51.log''";
sql "alter database rename file ''/dev/udpay/lv_redo52_256m'' to ''/oracle/oradata/udpay/256m_redo52.log''";
sql "alter database rename file ''/dev/udpay/lv_redo61_256m'' to ''/oracle/oradata/udpay/256m_redo61.log''";
sql "alter database rename file ''/dev/udpay/lv_redo62_256m'' to ''/oracle/oradata/udpay/256m_redo62.log''";
switch datafile all;
release channel a1;
release channel a2;
}
8. 在RMAN中執行數據庫一致性恢復
rman target /
RMAN> recover database;
------------------------------------------------------------------------------------------------------------------------------
出現下面錯誤是正常的:
RMAN-00571: =========================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===
RMAN-00571: =========================================
RMAN-03002: failure of recover command at 06/24/2015 16:02:25
RMAN-06054: media recovery requesting unknown log: thread 1 scn 277200603
------------------------------------------------------------------------------------------------------------------------------
若失敗則回到sqlplus 中嘗試:
sqlplus /nolog;
SQL> conn / as sysdba
SQL> alter database open resetlogs;
補充1:
這是另一次恢復Oracle數據庫時,出現的錯誤:
RMAN> alter database open resetlogs;
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: alter db 命令 (在 07/24/2016 16:36:40 上) 失敗
ORA-01152: 文件 1 沒有從過舊的備份中還原
ORA-01110: 數據文件 1: '/home/oracle/ora/oradata/dbinfo/system01.dbf'
上面這個錯誤,網上有說:是system01.dbf中的頭部的SCN與控制文件中記錄的數據文件頭部SCN不同.
解決方法:
數據文件頭部start scn比控制文件記錄的數據庫文件頭部SCN要新,那麼
就要使用日志(包括歸檔日志+聯機重做日志)前推控制文件中記錄的數據庫
頭部SCN與數據文件start scn一致,就能保證打開數據庫。
因為是使用備份的控制文件恢復數據庫,那麼就必須alter database open resetlogs打開數據庫
sqlplus / as sysdba
SQL> startup mount
SQL> recover database using backup controlfile until cancel;
# 注意:這一步,因為備份的控制文件沒有記錄聯機重做日志文件的scn,
# 這裡需要手動輸入redo文件來取消恢復.
ORA-00279: 更改 126276941 (在 07/22/2016 15:43:45 生成) 對於線程 1 是必需的
ORA-00289: 建議:
/home/oracle/ora/product/11.2.0.3/dbhome_1/dbs/arch1_644_810751417.dbf
ORA-00280: 更改 126276941 (用於線程 1) 在序列 #644 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
/tmp/redo01.log #這是手動輸入備份的redolog文件.
ORA-00310: 歸檔日志包含序列 642; 要求序列 644
ORA-00334: 歸檔日志: '/tmp/redo01.log'
注:
總共有10個redolog,我都這樣執行了一次,不知道是否有必要.
另注:
我並不十分明白,這究竟是什麼原因,我還嘗試了使用ArchiveLog文件來恢復.
但我發現歸檔文件依然不包含序列644.最後,我嘗試使用“alter database open resetlogs;”
提示:
alter database open resetlogs
*
第 1 行出現錯誤:
ORA-01139: RESETLOGS 選項僅在不完全數據庫恢復後有效
# 然後,我再次使用:
alter database open;
# 竟然打開了。神奇的事件。
補充2:
執行:第6步時,出現以下錯誤:
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: restore 命令 (在 07/24/2016 15:47:27 上) 失敗
RMAN-06026: 有些目標沒有找到 - 終止還原
RMAN-06023: 沒有找到數據文件4的副本來還原
RMAN-06023: 沒有找到數據文件3的副本來還原
RMAN-06023: 沒有找到數據文件2的副本來還原
RMAN-06023: 沒有找到數據文件1的副本來還原
此錯誤:網上描述這是Oracle10以後,出的一個新特性incarnation, 導致的錯誤。
注: incarnation 是:為了解決還原resetlogs以前的備份,而出的一個特性;
這個圖是我對incarnation的理解:
意思是第一個不完全恢復到SCN(檢查點)700處,resetlogs後,incarnation+1,開始使用數據庫
這時,SCN將從700處繼續增加,這時發現有些數據沒有,需要在往前還原, 就有了第
二次不完全恢復,接著再繼續使用DB, 第三次,又發現還需要還原,但是, 是還原到
前一次resetlogs後,SCN增長到800的地方的,但從上圖可以很清楚的知道, 現在若直接
恢復到SCN800處,是第二次resetlogs後,SCN增長到800的地方,但現在要恢復到第一次
resetlogs後,SCN增長的800的地方,就需要先回到incarnation 1的場景中。在做恢復就可以了。
即:先reset database to incarnation 1; 在進行不完全恢復。
還回到上面RMAN恢復時出現錯誤這個話題:
由於當前版本是Oracle11.2.0.3,肯定是有Incarnation的問題的, 但事實上,我是做完全恢復,
不需要incarnation特性,要想關閉它,可以直接修改 $ORACLE_HOME/dbs/init$ORACLE_SID.ora
文件,將其中的下面兩個注釋掉,即直接在前面加“#”即可。
#*.db_recovery_file_dest='/home/oracle/ora/flash_recovery_area'
#*.db_recovery_file_dest_size=4070572032
為何要這麼做? 【下面是我的理解,僅做參考】
因為,異機恢復時,Incarnation特性,找恢復的SCN點時,這個SCN可能與備份集中的SCN一樣,就像
上面第一次和第二次都包含SCN800一樣,因此,它從當前(就上上圖中從第二次resetlogs)的SCN中找
恢復時指定的SCN點, 而這裡是沒有這些數據文件的。為了不讓Oracle采用這種機制,可將恢復文件
位置注釋掉,這樣Oracle就不會到恢復文件目錄中找當前resetlogs後的備份集文件了。
第二個錯誤:
SQL> startup
#在Startup時,出現下面這個錯誤:[下面這個博客總結了這個錯誤.]
# http://www.cnblogs.com/kerrycode/p/3656655.html
ORA-01102: cannot mount database in EXCLUSIVE mode
出現這種錯誤的三種情況:
a、 Oracle的共享內存段或信號量沒有被釋放;
b、 Oracle的後台進程(如SMON、PMON、DBWn等)沒有被關閉;
c、 用於鎖內存的文件lk<sid>和sgadef<sid>.dbf文件沒有被刪除。【注:這個文件最好不要刪除,而是改名】