http://blog.itpub.net/30126024/viewspace-2122858/
結論:
1. Rman可以跨平台,網上有資料基於ID 413586.1(metalink上有),但是還是少用rman來進行跨平台操作。
2. Rman可以跨版本,但是一般只能從低到高,且要執行catupgrd.sql。不能從高到低,唯一成功的是低版本升級到高版本后備份可以恢復到同樣的低版本
跨平台的實例:
Solaris上的9i的DB通過rman備份后恢復到RHEL5.4上的11.2.0.1
跨版本的實例:
RMAN_11.2.0.1異機恢復到11.2.0.4
RMAN_11.2.0.1升級到11.2.0.4的DB異機恢復到11.2.0.1版本的DB
RMAN_11.2.0.1升級到11.2.0.4的DB異機恢復到12.1.0.2
RMAN_備份在異地恢復
A的整庫備份在B還原
以下相當於到在一個只安裝了oracle軟件的B服務器上進行的恢復,B沒有任何關於A庫的數據,也發現在整個過程中都沒有去手動創建B庫的在線日志,因為B庫在線日志會在alter database open resetlogs的時候自動創建,只要B服務器的在線日志路徑和A庫一樣即可(如果B服務器已經安裝了oracle軟件並創建了DB,則第五、六步可以合並成一步即目標庫根據spfile創建pfile,並修改pfile中的db_name為源庫DB名稱,並在目標庫創建源庫datafile、online redo log對應的目錄)
1. A庫執行backup database format ‘/backup/rman/full_%U.bak’;
在A的/backup/rman會出現兩個以full命名的文件,一個是數據庫備份,一個參數文件和控制的備份
2. A庫再執行alter system archive log current或alter system switch logfile
在A的歸檔目錄下生成剛剛最新的歸檔日志
以上兩步可接變成一步如下
Rman>backup database format '/u01/app/rman/full%U.bak' plus archivelog format '/u01/app/rman/arch%U.bak'
3. 把A庫/backup/rman下的兩個文件和剛剛最新的歸檔日志拷貝到B庫一樣的目錄
4. 修改目標庫的.bash_profile中ORACLE_SID=源庫的sid,並source應用一下
5. 在B庫執行echo $ORACLE_SID,等於A庫sid的情況下再執行
rman target /
rman>startup nomount
rman>restore spfile to pfile '$ORACLE_HOME目錄/dbs/initA的SID.ora' from'/backup/rman/full_09l9esg4_1_1';
6. 修改剛剛還原出來的pfile,並根據pfile文件創建諸如dump、archivelog、datafile、online redo log等路徑,如B庫創建了和A庫一樣的控制文件路徑、數據文件路徑、日志文件路徑
7. B庫shutdown abort再startup nomount
8. B庫rman 恢復操作
rman>restore controlfile from'/backup/rman/full_09l9esg4_1_1';
rman>alter database mount;
rman>restore database;
rman>recover database until sequence 主庫拷貝過來的那個歸檔日志的sequence+1
以上如果使用歸檔日志的備份包需要在recover database之前執行如下兩句(需要catalog 最后一個歸檔日志的備份包,為什么需要catalog是因為它在controlfile備份包之后生成的。XX只需要from最大的那個sequence-2就可以了,不需要源庫和目標庫的archivelog目錄一致,只要目標庫有archivelog目錄就可以了,會自動restore到目標庫的archivelog目錄)
rman>catalog backuppiece '';
rman>restore archivelog from sequence XX;
9. B庫open resetlogs
Sqlplus>alter database open resetlogs
心得:
第8步,如果沒有了A庫最新的歸檔日志,restore database后直接recover database,會報錯說找不到歸檔日志,所以進行整庫備份后,必須手動歸檔,並把歸檔日志也拷貝到異地
第8步,萬一不小心在mount狀態時修改了B的歸檔路徑,導致A庫和B庫的歸檔日志路徑不一樣,則把A庫的歸檔日志拷貝到B庫的實際歸檔路徑,即可恢復,不要重新創建一個歸檔路徑和A庫一樣,再把歸檔日志拷貝到這個新建的歸檔路徑,一切以B庫的archive log list中的路徑為准
20150812RMAN異地還原的操作的例子
1. 源庫A執行如下
Rman>delete noprompt archivelog until time 'sysdate-1';
Rman>backup database format '/orabackup/rman_backup/data%U.bak' plus archivelog format '/orabackup/rman_backup/arch%U.bak'
2. 把源庫的備份包拷貝至目標庫B(並非/orabackup/rman_backup/,所以后面第8步要catalog數據文件備份包和歸檔日志文件備份包)
3. 在B庫的linux下執行ORACLE_SID=A庫的sid或修改.bash_profile中ORACLE_SID=A庫的sid並source .bash_profile
4. B庫關閉DB並確認spfile已經刪除(順便刪除所有datafile、redofile和archivelog)
5. 在B庫執行echo $ORACLE_SID,等於A庫sid的情況下再執行
rman target /
rman>startup nomount
rman>restore spfile to pfile '$ORACLE_HOME目錄/dbs/initA的SID.ora' from'/backup/rman/data_09l9esg4_1_1';
6. 修改剛剛還原出來的pfile,如control、dump、archivelog等路徑
7. B庫shutdown abort再startup nomount
8. B庫rman 恢復操作
rman>restore controlfile from'/backup/rman/full_09l9esg4_1_1';
rman>alter database mount;
rman> catalog backuppiece '/backup/rman/data0bqedd5a_1_1.bak';
RMAN>run{
set newname for datafile 1 to ' /datafile/system01.dbf';
set newname for datafile 2 to ' /datafile/sysaux01.dbf';
set newname for datafile 3 to ' /datafile/undotbs01.dbf';
set newname for datafile 4 to ' /datafile/users01.dbf';
set newname for tempfile 1 to '/datafile/temp01.dbf';
restore database;
switch datafile all;
switch tempfile all;
}
rman> catalog backuppiece '/backup/rman/arch0bqedd5a_1_1.bak';
rman> catalog backuppiece '/backup/rman/arch0bqedd5a_1_1.bak';
RMAN> recover database;
根據上面報錯提示再執行
RMAN> recover database until sequence 3160;
9. 退出rman進入[oracle@localhost dbs]$ sqlplus / as sydba
10.SQL> alter database open resetlogs;
如果報錯ORA-00344: unable to re-create online log '/oradata/TESTIO/redo01.log'
則select * from v$logfile;后再執行
SQL> alter database rename file '/oradata/TESTIO/redo01.log' to '/u01/app/oracle/oradata/redo01.log';
SQL> alter database rename file '/oradata/TESTIO/redo02.log' to '/u01/app/oracle/oradata/redo02.log';
SQL> alter database rename file '/oradata/TESTIO/redo03.log' to '/u01/app/oracle/oradata/redo03.log';
SQL> alter database open resetlogs;
以上需要了解的是
set newname for datafile其中是包含datafile和undofile
set newname for tempfile只包含tempfile
所以一開始需要先在源庫執行
select file_id,file_name from dba_data_files order by file_id
select file_id,file_name from dba_temp_files order by file_id
當然如果前面set newname for tempfile導致后面報錯
ALTER TABLESPACE TEMP drop TEMPFILE '/oradata/TESTIO/temp01.dbf';
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/temp01.dbf' size 500M autoextend on next 50M maxsize 30G;
RMAN_11.2.0.1異機恢復到直接安裝11.2.0.4的版本
RMAN_11.2.0.1異機恢復到11.2.0.1升級后的11.2.0.4版本
源DB信息:DB_NAME為DB521102,版本為直接安裝的11.2.0.1
目標DB信息:DB_NAME為DB11204,版本為直接安裝的11.2.0.4,非11.2.0.1升級的版本
目標DB信息:DB_NAME為DB11204,版本為11.2.0.1升級到直接安裝的11.2.0.4的版本
1. 源DB執行
Rman>backup database format '/u01/app/rman/full%U.bak' plus archivelog format '/u01/app/rman/arch%U.bak' delete input;
2. 源庫把備份后的四個備份包scp到目標庫/u01/app/rman/目錄
3. 目標庫根據spfile創建pfile,並修改pfile中的db_name為DB521102,並在目標庫創建源庫datafile、online redo log對應的目錄
4. 修改目標庫的.bash_profile中ORACLE_SID=源庫的sid,並source應用一下
5. 目標庫按順序執行如下語句(下面第5個語句,需要catalog 最后一個歸檔日志的備份包,為什么需要catalog是因為它在controlfile備份包之后生成的。下面第6個語句,只需要from最大的那個sequence-2就可以了,不需要源庫和目標庫的archivelog目錄一致,只要目標庫有archivelog目錄就可以了,會自動restore到目標庫的archivelog目錄)
sql>startup nomount pfile=’’
rman>restore controlfile from ’/u01/app/rman/fullXX.bak’
rman>alter database mount;
rman>restore database;
rman>catalog backuppiece ’/u01/app/rman/52arch04rc7tru_1_1’
rman>restore archivelog from sequence XX;
rman>recover database until sequence 最大的sequence+1;
sql>alter database open resetlogs;
出現如下報錯
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00704: bootstrap process failure
ORA-39700: database must be opened with UPGRADE option
6. 解決方法,目標庫重新登陸按如下執行(執行catupgrd.sql完后實例會自動shutdown,之后直接startup的過程不再需要resetlogs了)
sql>startup upgrade;
SQL>@$ORACLE_HOME/rdbms/admin/catupgrd.sql;
sql> startup
RMAN_11.2.0.4異機恢復到11.2.0.1
源DB信息:DB_NAME為DB11204,版本為直接安裝的11.2.0.4
目標DB信息:DB_NAME為ORCL,版本為11.2.0.1
1. 源DB執行
Rman>backup database format '/u01/app/rman/full%U.bak' plus archivelog format '/u01/app/rman/arch%U.bak' delete input;
2. 源庫把備份后的四個備份包scp到目標庫/u01/app/rman/目錄
3. 目標庫根據spfile創建pfile,並修改pfile中的db_name為DB11204,並在目標庫創建源庫datafile、online redo log對應的目錄
4. 修改目標庫的.bash_profile中ORACLE_SID=源庫的sid,並source應用一下
5. 目標庫按順序執行如下語句
sql>startup nomount pfile=’’
rman>restore controlfile from ’/u01/app/rman/fullXX.bak’
直接報錯如下(把pfile中的由*.compatible='11.2.0.0.0'改成*.compatible='11.2.0.4.0'並shutdown abort再startup nomount pfile的過程中則報錯ORA-00401: the value for parameter compatible is not supported by this release,即pfile中的由*.compatible改成啥都沒用)
RMAN_11.2.0.1升級到11.2.0.4的DB異機恢復到11.2.0.1版本的DB
源DB信息:DB_NAME為ORCL,由11.2.0.1升級到了11.2.0.4
目標DB信息:DB_NAME為TESTDB,版本為11.2.0.1
1. 源DB執行
Rman>backup database format '/u01/app/rman/full%U.bak' plus archivelog format '/u01/app/rman/arch%U.bak' delete input;
2. 源庫把備份后的四個備份包scp到目標庫/u01/app/rman/目錄
3. 目標庫根據spfile創建pfile,並修改pfile中的db_name為ORCL,並在目標庫創建源庫datafile、online redo log對應的目錄
4. 修改目標庫的.bash_profile中ORACLE_SID=源庫的sid,並source應用一下
5. 目標庫按順序執行如下語句(下面第5個語句,需要catalog 最后一個歸檔日志的備份包,為什么需要catalog是因為它在controlfile備份包之后生成的。下面第6個語句,只需要from最大的那個sequence-2就可以了,不需要源庫和目標庫的archivelog目錄一致,只要目標庫有archivelog目錄就可以了,會自動restore到目標庫的archivelog目錄)
sql>startup nomount pfile=’’
rman>restore controlfile from ’/u01/app/rman/fullXX.bak’
rman>alter database mount;
rman>restore database;
rman>catalog backuppiece ’/u01/app/rman/52arch04rc7tru_1_1’;
rman>restore archivelog from sequence XX;
rman>recover database until sequence 最大的sequence+1;
sql>alter database open resetlogs;
出現如下報錯
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00704: bootstrap process failure
ORA-39700: database must be opened with UPGRADE option
6. 解決方法,目標庫重新登陸按如下執行(奇怪的是下面第2個語句執行過程中遇到問題,不像正常升級一樣會shutdown數據庫,而且以下第四個語句也不用再resetlogs了)
sql>startup upgrade;
SQL> @$/rdbms/admin/catupgrd.sql;
sql> shutdown immediate;
sql> startup
RMAN_11.2.0.1異機恢復到直接安裝12.1.0.2的版本
源DB信息:DB_NAME為DB521102,版本為直接安裝的11.2.0.1
目標DB信息:DB_NAME為DB12c,版本為直接安裝的12.1.0.2
前面restore spfile to pfile,並修改pfile中*.compatible='12.1.0.0.0'
Startup nomount
Restore controlfile
Alter database mount
Restore database
Recover database until sequence都是正常的,alter database open resetlogs開始出現問題了,不知道什么原因,難道真是11GR2不能異機恢復到12CR1?

RMAN_11.2.0.1升級到11.2.0.4的異機恢復到直接安裝12.1.0.2的版本
源DB信息:DB_NAME為DB521102,版本為直接安裝的11.2.0.1,再升級到11.2.0.4
目標DB信息:DB_NAME為DB12c,版本為直接安裝的12.1.0.2
1. 源DB執行
Rman>backup database format '/u01/app/rman/full%U.bak' plus archivelog format '/u01/app/rman/arch%U.bak' delete input;
2. 源庫把備份后的四個備份包scp到目標庫/u01/app/rman/目錄
3. 目標庫根據spfile創建pfile,並修改pfile中的db_name為DB521102,並在目標庫創建源庫datafile、online redo log對應的目錄
rman>restore spfile to pfile 'XX/initDB521102.ora' from'/backup/rman/full_09l9esg4_1_1';
並修改pfile中*.compatible='12.1.0.0.0'
4. 修改目標庫的.bash_profile中ORACLE_SID=源庫的sid,並source應用一下
5. 目標庫按順序執行如下語句(下面第5個語句,需要catalog 最后一個歸檔日志的備份包,為什么需要catalog是因為它在controlfile備份包之后生成的。下面第6個語句,只需要from最大的那個sequence-2就可以了,不需要源庫和目標庫的archivelog目錄一致,只要目標庫有archivelog目錄就可以了,會自動restore到目標庫的archivelog目錄)
sql>startup nomount pfile=’’
rman>restore controlfile from ’/u01/app/rman/fullXX.bak’
rman>alter database mount;
rman>restore database;
rman>catalog backuppiece ’/u01/app/rman/52arch04rc7tru_1_1’
rman>restore archivelog from sequence XX;
rman>recover database until sequence 最大的sequence+1;
sql>alter database open resetlogs;
出現如下報錯
alter database open resetlogs
*
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced
ORA-00704: bootstrap process failure
ORA-00604: error occurred at recursive SQL level 2
ORA-00904: "I"."UNUSABLEBEGINNING#": invalid identifier
Process ID: 11222
Session ID: 188 Serial number: 65058
6. 解決方法,目標庫重新登陸按如下執行(執行/u01/app/oracle/product/12c/db_1/perl/bin/perl catctl.pl -n 4 catup完后實例會自動shutdown,之后直接startup的過程不再需要resetlogs了)
sql>startup upgrade;
cd /u01/app/oracle/product/12c/db_1/rdbms/admin/
/u01/app/oracle/product/12c/db_1/perl/bin/perl catctl.pl -n 4 catupgrd.sql
sql> startup
