solaris下通過rman工具將備份到帶庫上的db異機恢復

sxitsxit發表於2013-03-19
登入到1.71上執行如下操作,從帶庫中恢復控制檔案到dev02上,恢復的資料庫RMAN備份是0級全備,不含2級累積增量備份。
生產環境的主機名為db2,ORACLE_SID和db_name 都為 PROD ,dev02環境的主機名為zone04,ORACLE_SID和db_name都叫 DEV02

此次恢復實驗,採用的控制檔案備份是跟0級備份是同一時刻備份到帶庫上的

Last login: Thu Mar 14 17:06:04 2013 from 192.168.1.210
Oracle Corporation      SunOS 5.10      Generic Patch   January 2005
You have new mail.
Sourcing //.profile-EIS.....
root@test # bash
root@test # obtool
ob> cd --host db2    //切換到db2主機上
ob> ls
/
ob> cd /
ob> ls
db_data/  opt/
ob> cd db_data
ob> ls
PROD/                 PROD.db.20130125.tar  PROD.tar.20121223.db.yj
PROD.db.20130116.tar  PROD.db.bak.20130104  PROD.tar.20121225.db
ob> cd PROD       
ob> ls
db/  nohup.out  oraInventory/  temp/
ob> cd db
ob> ls
apps_st/  tech_st/
ob> cd tech_st
ob> ls
11.2.0/  cfbak/
ob> cd cfbak        //找到控制檔案備份目錄
ob> ls -l
-rw-r-----  oraprod.dba        40.4 MB 2013/03/12.00:45 cntrl_936_1_809829905_20130312                                                    
-rw-r-----  oraprod.dba        40.4 MB 2013/03/13.00:40 cntrl_945_1_809916020_20130313
-rw-r-----  oraprod.dba        40.4 MB 2013/03/14.00:39 cntrl_954_1_810002383_20130314
-rw-r-----  oraprod.dba        40.4 MB 2013/03/18.00:34 cntrl_1023_1_810381548_20130318
-rwxr-xr-x  oraprod.dba        12.1 KB 2013/03/10.15:03 rman_bak.sh        (16)
-rw-rw-rw-     root.root       60.6 KB 2013/03/14.00:39 rman_bak.sh.out    (16)
-rwxr-xr-x  oraprod.dba       246      2013/02/18.19:19 run_bak.sh         (16)

ob> pwd
/db_data/PROD/db/tech_st/cfbak on host db2 (browsing catalog data)
ob> cd /   
ob> restore --tohost zone04 --go /db_data/PROD/db/tech_st/cfbak/cntrl_1023_1_810381548_20130318 --aspath /export/home/oradev/cfbak/cntrl_1023_1_810381548_20130318
Info: 1 catalog restore request item submitted; job id is admin/69.

這樣首先將db2的控制檔案從帶庫目錄 /db_data/PROD/db/tech_st/cfbak/cntrl_1023_1_810381548_20130318 恢復到 dev02主機的/export/home/oradev/cfbak目錄,名字保持一致
然後在dev02主機(也就是zone04主機)的/export/home/oradev/cfbak目錄下可以看到還原回來的控制檔案

緊接著從備份集中恢復控制檔案
bash-3.2$ export ORACLE_SID=PROD   //(注意此時的ORACLE_SID仍然為PROD ,而且用生產環境的pfile啟動db到nomount狀態)
bash-3.2$ rman target /
Recovery Manager: Release 11.2.0.3.0 - Production on Thu Mar 14 18:28:05 2013
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
connected to target database (not started)
RMAN> 
RMAN> startup nomount pfile='/export/zones/zone04/root/uat_data/DEV02/db/tech_st/11.2.0/dbs/initPROD.ora';
Oracle instance started
Total System Global Area    1069252608 bytes
Fixed Size                     2166160 bytes
Variable Size                427823728 bytes
Database Buffers             624951296 bytes
Redo Buffers                  14311424 bytes

RMAN> restore controlfile   from '/export/home/oradev/cfbak/cntrl_1023_1_810381548_20130318';
Starting restore at 18-MAR-13
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=551 device type=DISK
channel ORA_DISK_1: copied control file copy
output file name=/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/cntrl01.dbf
output file name=/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/cntrl02.dbf
output file name=/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/cntrl03.dbf
Finished restore at 18-MAR-13
RMAN> 

這時候在 /export/zones/zone04/root/uat_data/DEV02/db/apps_st/data目錄下可以看到三個控制檔案
然後將db啟動到mount狀態(原rman視窗中)

RMAN> alter database mount;
using target database control file instead of recovery catalog
database mounted

然後直接在dev02主機上/export/zones/zone04/root/uat_data目錄下建立指令碼 catlog.txt ,catlog.txt指令碼內容如下:
注意資料檔案編號一定要跟資料檔名對應,否則恢復會出錯
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
run{
ALLOCATE CHANNEL ch00 TYPE sbt parms 'ENV=(ob_media_family=erpdb-mf)';                                     
set newname for datafile 1 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/system01.dbf';
set newname for datafile 2 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/system02.dbf';
set newname for datafile 3 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/system03.dbf';
set newname for datafile 4 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/system04.dbf';
set newname for datafile 5 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/system05.dbf';
set newname for datafile 6 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/system06.dbf';
set newname for datafile 7 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/system07.dbf'; 
set newname for datafile 8 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/system08.dbf';
set newname for datafile 9 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/system09.dbf';                                    
set newname for datafile 10 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/system10.dbf';                                      
set newname for datafile 11 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/system11.dbf';                                      
set newname for datafile 12 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/undo01.dbf';                                        
set newname for datafile 13 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_archive01.dbf';                                   
set newname for datafile 14 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_int01.dbf';                                       
set newname for datafile 15 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_media01.dbf';                                     
set newname for datafile 16 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_nolog01.dbf'; 
set newname for datafile 17 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_queue01.dbf';                                    
set newname for datafile 18 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_queue02.dbf';
set newname for datafile 19 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_ref01.dbf';
set newname for datafile 20 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_ref02.dbf';
set newname for datafile 21 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_summ01.dbf';
set newname for datafile 22 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_txn_data01.dbf';
set newname for datafile 23 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_txn_data02.dbf';                                      
set newname for datafile 24 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_txn_data03.dbf';
set newname for datafile 25 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_txn_ind01.dbf';
set newname for datafile 26 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_txn_ind02.dbf';
set newname for datafile 27 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_txn_ind03.dbf';                                  
set newname for datafile 28 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_txn_ind04.dbf';                                  
set newname for datafile 29 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_txn_ind05.dbf';                                                                                                                     
set newname for datafile 30 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/ctxd01.dbf';                                   
set newname for datafile 31 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/odm.dbf';                                           
set newname for datafile 32 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/olap.dbf';                        
set newname for datafile 33 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/owad01.dbf';     
set newname for datafile 34 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/portal01.dbf';                                      
set newname for datafile 35 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/sysaux01.dbf';                                      
set newname for datafile 36 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/apps_ts_tools01.dbf';                               
set newname for datafile 37 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/interim.dbf';
set newname for datafile 38 to '/export/zones/zone04/root/uat_data/DEV02/db/apps_st/data/a_txn_data4.dbf';
restore database;                                            
switch datafile all;
RELEASE CHANNEL ch00;
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                      

再在 /export/zones/zone04/root/uat_data 目錄下建立 zx.sh 指令碼,指令碼內容如下:
-bash-3.2$ more zx.sh 
rman target / cmdfile='/export/zones/zone04/root/uat_data/catlog.txt' log='/export/zones/zone04/root/uat_data/cat.log'

然後在vnc視窗中,export ORACLE_SID=PROD , 然後直接執行 sh zx.sh  , 這個時候資料庫就進行恢復。
接下來是 recover 資料庫
注意:一定要指定備份到帶庫上的歸檔日誌通道 ALLOCATE CHANNEL , 否則報錯

RMAN> run{
ALLOCATE CHANNEL ch00 TYPE sbt parms 'ENV=(ob_media_family=erpdb-mf)';
recover database;
RELEASE CHANNEL ch00;
}
allocated channel: ch00
channel ch00: SID=551 device type=SBT_TAPE
channel ch00: Oracle Secure Backup
Starting recover at 18-MAR-13
starting media recovery
channel ch00: starting archived log restore to default destination
channel ch00: restoring archived log
archived log thread=1 sequence=938
channel ch00: restoring archived log
archived log thread=1 sequence=939
channel ch00: reading from backup piece al_1021_1_810381476
channel ch00: piece handle=al_1021_1_810381476 tag=TAG20130318T095756
channel ch00: restored backup piece 1
channel ch00: restore complete, elapsed time: 00:02:35
archived log file name=/export/zones/zone04/root/uat_data/DEV02/db/tech_st/11.2.0/dbs/arch1_938_800615529.dbf thread=1 sequence=938
archived log file name=/export/zones/zone04/root/uat_data/DEV02/db/tech_st/11.2.0/dbs/arch1_939_800615529.dbf thread=1 sequence=939
unable to find archived log
archived log thread=1 sequence=940
released channel: ch00
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 03/18/2013 12:16:15
RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 940 and starting SCN of 226495995
RMAN> 


上述提示的兩個歸檔日誌此時會在下述的路徑下出現:

-bash-3.2$ cd $ORACLE_HOME/dbs
-bash-3.2$ ls
arch1_938_800615529.dbf    initDEV02_noaq.ora         lkDEV02
arch1_939_800615529.dbf    initDEV02.ora.bak20120312  lkPROD
DEV02_zone04_ifile.ora     init.ora                   orapwPROD
hc_DEV02.dat               initPROD.ora
hc_PROD.dat                initPROD.ora.bak.ok
-bash-3.2$ 

出現上述錯誤以後,可以直接在rman中執行 

RMAN> run{
ALLOCATE CHANNEL ch00 TYPE sbt parms 'ENV=(ob_media_family=erpdb-mf)';
recover database until scn 226495995;
RELEASE CHANNEL ch00;
}

若接下來不重建控制檔案,而直接以resetlogs方式開啟資料庫會提示報錯,主要是因為日誌檔案路徑還是PROD的路徑。

RMAN> alter database open resetlogs;    
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of alter db command at 03/18/2013 18:21:50
ORA-00349: failure obtaining block size for '/db_data/PROD/db/apps_st/data/log01b.dbf'
ORA-27041: unable to open file
SVR4 Error: 2: No such file or directory
Additional information: 9

而在這裡,我們採取的方法是在open resetlogs報錯的情況下,重建控制檔案 
找到控制檔案建立的語法,重新建立控制檔案
bash-3.2$ export ORACLE_SID=PROD (注意這裡還是用之前sid為PROD的引數檔案啟動db)
bash-3.2$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Mon Mar 18 14:48:37 2013
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Connected to an idle instance.
SQL>  startup nomount pfile='/export/zones/zone04/root/uat_data/DEV02/db/tech_st/11.2.0/dbs/initPROD.ora';
ORACLE instance started.
Total System Global Area 1069252608 bytes
Fixed Size                  2166160 bytes
Variable Size             427823728 bytes
Database Buffers          624951296 bytes
Redo Buffers               14311424 bytes
SQL> 
SQL> alter database mount;
Database altered.
SQL> alter database backup controlfile to trace as  '/tmp/control.sql';
Database altered.

找到restlogs方式的語法

--     Set #2. RESETLOGS case

將db的名字改為 DEV02,同時更改資料檔案、日誌檔案的路徑
然後關閉資料庫,備份之前的控制檔案,然後將三個控制檔案刪除
SQL> shutdown immediate ;
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
SQL> exit
bash-3.2$ cp cntrl01.dbf cntrl01.dbf.bak20130318
bash-3.2
bash-3.2$ cd $ORACLE_HOME/dbs
bash-3.2$ cp initPROD.ora  initDEV02.ora 

注意這裡改用新的ORACLE_SID了,而且startup nomount啟動的時候,使用的是 initDEV02.ora (db_name 為 DEV02) 檔案,而不是
initPROD.ora ( db_name 為 PROD)檔案,他們的唯一區別是引數檔案裡的 db_name不一樣,其他都一樣

root@zone04 # su - oradev
Oracle Corporation      SunOS 5.10      Generic Patch   January 2005
-bash-3.2$ 
-bash-3.2$ env|grep ORACLE_SID
ORACLE_SID=DEV02
-bash-3.2$ 
-bash-3.2$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Mon Mar 18 15:00:41 2013
Copyright (c) 1982, 2011, Oracle.  All rights reserved.
Connected to an idle instance.
SQL> startup nomount pfile='/export/zones/zone04/root/uat_data/DEV02/db/tech_st/11.2.0/dbs/initDEV02.ora';
ORACLE instance started.
Total System Global Area 1069252608 bytes
Fixed Size                  2166160 bytes
Variable Size             427823728 bytes
Database Buffers          624951296 bytes
Redo Buffers               14311424 bytes
SQL> 

然後將控制檔案的語法貼上到sql中,也可以放到一個文字檔案ctr.sql 中,執行這個sql檔案,如果控制檔案建立成功會顯示 Control file created.

最終以resetlogs方式開啟db
SQL> alter database open resetlogs;
Database altered.

最後新增臨時表空間

SQL> select file_name from dba_data_files where tablespace_name='TEMP2';
no rows selected

SQL> ALTER TABLESPACE TEMP1 ADD TEMPFILE '/uat_data/DEV02/db/apps_st/data/temp01.dbf' SIZE 800M  AUTOEXTEND on next 50 maxsize 8000M;
Tablespace altered.

SQL> ALTER TABLESPACE TEMP2 ADD TEMPFILE '/uat_data/DEV02/db/apps_st/data/temp02.dbf' SIZE 800M  AUTOEXTEND on next 50 maxsize 8000M;
Tablespace altered.

以上是完整的異機恢復步驟

另外一種方法是:在我們執行 alter database open resetlogs 報錯的時候,可以不重建控制檔案,直接用nid修改db,但是個人理解從本質上還是修改控制檔案

RMAN> alter database open resetlogs;    

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of alter db command at 03/18/2013 18:21:50
ORA-00349: failure obtaining block size for '/db_data/PROD/db/apps_st/data/log01b.dbf'
ORA-27041: unable to open file
SVR4 Error: 2: No such file or directory
Additional information: 9

這個時候可以用 如下命令強制清除當前日誌組4 

SQL> alter database clear logfile group 4;   //清除當前日誌組

然後再進行  alter database open resetlogs  

再按照步驟執行 nid ,步驟參考  http://blog.csdn.net/tianlesoftware/article/details/6240983

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

相關文章