RMAN恢复RAC备份到高版本单机环境
最近在做一个RAC升级测试11.2.0.1升级到11.2.0.4,为保证业务能在11.2.0.4版本下正常运行,现需要将数据库还原至11.2.0.4的单机环境下,数据库大小为1.04T左右,在这里总结下步骤。
环境简介:
1.本次试验的环境为11.2.0.4的单机环境,存储为Windows NTFS文件系统,系统版本为Windows server 2008R2企业版。
2.备份来自一个双节点的RAC环境,操作系统同为Windows Server 2008R2,存储为ASM磁盘组。
3.RAC环境下文件总大小为1.04T,备份集大小为290G左右。
还原步骤:
1.将备份集拷贝至测试环境。
环境中D盘中安装有Oracle11.2.0.4版本的数据库,安装了默认的orcl实例,实例处于关闭状态。
本次将备份集拷贝至目录'D:\backup\'下。
2.在E盘中新建oradata目录,路径为'E:\oradata'。
E盘空间大小为1.5T,用于存放本次的数据文件,新建archive目录用于存放归档日志。
3.创建实例并强制启动到nomount状态。
oradim -new -sid leo --创建了实例名为leo的windows服务 set oracle_sid=leo --设置当前窗口环境变量
rman target /
startup nomount force --强制启动到nomount状态以便进行spfile的恢复
4.RMAN中还原spfile。
在备份集中找到最小的几个文件,逐一尝试恢复spfile直到成功恢复,当然如果主库正常可以到主库服务器上进入RMAN执行list backup of spfile进行快速识别,图省事可以一个个试。
restore spfile from 'D:\backup\xxx';--恢复spfile
startup nomount force;
5.生成pfile并删除RAC相关参数。
create pfile='D:\pfileleo.txt' from spfile;
删除其中所有的RAC相关参数,同时将audit_file_dest设置为D盘oracle安装目录下的adump目录,并制定log_archive_dest_1的值为E:\archive,此外修改控制文件位置为E:\oradata\control01.ctl,E:\oradata\control02.ctl后保存。
6.使用新的pfile启动到nomount状态。
startup force pfile='D:\pfileleo.txt';
7.RMAN恢复控制文件。
restore controlfile from 'D:\backup\xxx';--xxx为时间最晚的控制文件备份
alter database mount;
8.RMAN注册备份集并恢复数据库。
catalog start with 'D:\backup\';--后继输入yes即可
run{ allocate channel c1 type disk; allocate channel c2 type disk; allocate channel c3 type disk; allocate channel c4 type disk; allocate channel c5 type disk; allocate channel c6 type disk; allocate channel c7 type disk; allocate channel c8 type disk; set newname for datafile 1 to 'E:\oradata\xxx.dbf'; set newname for datafile 2 to 'E:\oradata\xxx.dbf'; set newname for datafile 3 to 'E:\oradata\xxx.dbf'; set newname for datafile 4 to 'E:\oradata\xxx.dbf'; set newname for datafile 5 to 'E:\oradata\xxx.dbf'; set newname for datafile 6 to 'E:\oradata\xxx.dbf'; set newname for datafile 7 to 'E:\oradata\xxx.dbf'; set newname for datafile 8 to 'E:\oradata\xxx.dbf'; ...有多少个数据文件加几个set newname语句。 restore database; switch datafile all; }
在这里可以使用如下类似SQL在原库生成set newname的语句:
select 'set newname for datafile '||file_id||' to '||'E:\oradata\'||substr(file_name,xxx) as "SQL" from dba_data_files;--xxx的大小取决于文件目录的长度。
注意要把路径''括起来再执行,以上生成的语句不带'号。
9.Recover数据库。
Restore之后接下来需要进行Recover,选择的恢复终点如下:
1)通过list archivelog all命令找到归档日志的备份,找到每个thread的sequence值最大的备份集,记录下其next scn号及sequence值,假设分别为seq1 scn1和seq2 scn2。
2)比较scn1和scn2选择其中较小的作为本次恢复终点,假设本次较小者为scn1,其对应seq1的序列号。
run { set until sequence seq1 thread 1; recover database; }
10.修改所有redo文件的目录
Alter database rename file '+DATA/xxx/onlinelog/redo01.log' to 'E:\oradata\redo01.log';--有多少个redo文件执行多少次。...
11.以upgrade模式打开数据库。
shutdown immediate; startup upgrade;
12.删除原临时文件组并新建。
create temporary tablespace TEMP1 tempfile dbfE:\temp01.b' size 2048M; alter database default temporary tablespace TEMP1; drop tablespace TEMP;
13.重新以upgrade模式打开数据库并执行升级脚本。
shutdown immediate; startup upgrade;
sqlplus / as sysdba >@?/rbdms/admin/catupgrd.sql
14.升级完毕后重启数据库。
shutdown immediate; startup
注意升级完毕后可能会出现账号密码不正确的情况,手动修改吧。