源机器是Oracle ODA一体机,2节点RAC系统,目标机器为单机。Oracle版本为11.2.0.4。
源机器上获取必要的文件
源机器上已经存在RMAN的备份数据,可以查看备份位置
$ rman target / RMAN> list backup ... 如下信息显示了数据文件备份位置 Piece Name: /backup/rman_full_bak/bak_arc_20220114_p70j7k4b_1_1 ... 如下信息显示了SPFILE、Control File是否包含及位置 Piece Name: /u03/app/oracle/fast_recovery_area/ORCL/autobackup/2022_01_14/o1_mf_s_1093914812_jy0qfz6p_.bkp ...
准备数据文件
在目标机器上建立备份数据目录
# mkdir /bak # chown -R oracle:oinstall /bak # su - oracle $ mkdir -p /bak/oradata/orcl
把"/backup/rman_full_bak/"中的数据文件和归档备份文件传输到目标机器
scp /backup/rman_full_bak/bak_*_20220214* oracle@192.168.20.67:/bak/oradata/orcl/
把控制文件传输到目标机器
scp /u03/app/oracle/fast_recovery_area/ORCL/autobackup/2022_02_14/o1_mf_s_1096593101_k0lgygpn_.bkp oracle@192.168.20.67:/bak/oradata/
准备zone文件
缺少zone文件会产生"ORA-01804: failure to initialize timezone information"错误及"ORA-00600"错误
SQL> col name format a30 SQL> col value$ format a10 SQL> select NAME, VALUE$ from SYS.PROPS$ where NAME like 'DST_%_TT_VERSION'; NAME VALUE$ ------------------------------ ---------- DST_PRIMARY_TT_VERSION 31 DST_SECONDARY_TT_VERSION 0 $ scp $ORACLE_HOME/oracore/zoneinfo/timez*_31.dat oracle@192.168.20.67:/bak/
在目标服务器上恢复
准备timezone文件
$ cp /bak/timez*.dat $ORACLE_HOME/oracore/zoneinfo/
初始化目录
mkdir -p /u01/app/oracle/oradata/ mkdir -p /u01/app/oracle/redo/ mkdir -p /u01/app/oracle/fast_recovery_area/ mkdir -p /u01/app/oracle/admin/orcl/adump/
初始pfile文件
cat > /bak/oradata/init.orcl.ora << EOF *.audit_file_dest='/u01/app/oracle/admin/orcl/adump' *.audit_trail='db' *.compatible='11.2.0.4' *.control_files='/u01/app/oracle/oradata/control.orcl.01.ctl' *.db_block_size=8192 *.db_create_file_dest='/u01/app/oracle/oradata/' *.db_create_online_log_dest_1='/u01/app/oracle/redo/' *.db_domain='' *.db_name='orcl' *.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area/' *.DB_RECOVERY_FILE_DEST_SIZE=4G *.db_unique_name='orcl' *.diagnostic_dest='/u01/app/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' *.open_cursors=300 *.processes=150 *.remote_login_passwordfile='EXCLUSIVE' *.undo_tablespace='UNDOTBS1' EOF
启动数据库
# su - oracle $ sqlplus / as sysdba SQL> startup nomount pfile='/bak/oradata/init.orcl.ora';
恢复控制文件
$ rman target / RMAN> restore controlfile from '/bak/oradata/o1_mf_s_1096593101_k0lgygpn_.bkp'; RMAN> alter database mount;
修改文件路径
有很多文档中提到需要人工处理,实际使用中,貌似Oracle在恢复中可以自己处理并转换。
目前为止系统中是旧的文件路径:
SQL> select name from v$datafile union all select name from v$tempfile union all select member from v$logfile;
恢复数据库
RMAN> crosscheck backup; crosscheck archivelog all; delete noprompt expired backup; delete noprompt expired archivelog all; catalog start with '/bak/oradata/orcl/'; crosscheck backup;
使用RMAN恢复并重定向文件
RMAN> restore database; RMAN> recover database; RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of recover command at 01/15/2022 17:52:00 RMAN-06054: media recovery requesting unknown archived log for thread 2 with sequence 28494 and starting SCN of 5992769821705 RMAN> recover database until scn=5992769821705;
再次查看文件路径,并确认redo日志路径是否正常
$ sqlplus / as sysdba SQL> select name from v$datafile union all select name from v$tempfile union all select member from v$logfile;
启动数据
SQL> alter database open resetlogs; SQL> shutdown immediate; SQL> startup mount; SQL> alter database open; SQL> create spfile from pfile='/bak/oradata/init.orcl.ora'; SQL> create pfile='/bak/oradata/init.orcl.2.ora' from spfile;
失败重来
rm -rf /u01/app/oracle/oradata/* rm -rf /u01/app/oracle/redo/* rm -rf /u01/app/oracle/fast_recovery_area/* rm -rf /u01/app/oracle/admin/orcl/adump/* reboot