环境介绍:
操作系统:windows server 2008
Oracle数据库:oracle 10.2.0.3
源机器和目标机器操作系统及数据库版本一致;
源数据库使用RMAN的做全备;
源数据库和目标数据库所有文件存放路径都不一致(包括数据文件、联机重做日志文件、备份存放路径)
具体操作步骤:
1.在源数据库使用rman备份创建备份集,然后将备份集复制到目标服务器;
2.在目标服务器上创建OracleService
ORADIM -NEW -SID ORCL
注意点:
a.此处仅在windows环境下需要,linux等环境不需要该步骤,直接在Oracle用户下
set oracle_sid=xxx就可以;
b.创建服务命令为
oradim,不是
oradmin;
c.下面提及的RMAN及SQL操作,无特别说明,均为在目标数据库进行操作。
3.设置初始化参数
a.将源数据库的spfile复制到目标服务器对应的目录
windows下spfile对应的目录为%ORACLE_HOME%\database
b.由于路径不一致,需要修改spfile中的部分参数,否则startup nomount时候数据库会报错。注意:此处路径不存在的需要自己手动新建
需要修改的参数值包括以下几个
audit_file_dest
background_dump_dest
control_files
core_dump_dest
db_recovery_file_dest
log_archive_dest_1
user_dump_dest
注意点:
a.建议将参数文件中的带路径的参数均修改为目标机器存在的路径;
b.spfile为二进制文件无法编辑,pfile可以使用文本编辑器编辑。首先将spfile转换为pfile,然后修改pfile中的参数,最后将pfile转换为spfile;
具体修改方法:
set oracle_sid=orcl
sqlplus "/ as sysdba"
SQL>create pfile='d:\orabak\pfile_oracl.ora' from spfile;
修改完成之后
SQL>create spfile from pfile='d:\orabak\pfile_orcl.ora';
接下来启动数据库到nomount状态
SQL>startup nomount;
假如spfile中的参数路径修改不正确,会导致此处启动报错,根据错误提示建立相应的路径即可。
4.恢复控制文件,并进入加载状态
set oracle_sid=ORCL
rman target /
目标数据库尚无控制文件,此处首先需要指定DBID
RMAN>set DBID=955645210
注意点:
a.此处DBID必须和源数据库DBID保持一致;
b.DBID获取方式(此操作在源数据库进行)
采用SQL查询方式获取为:
SQL>select DBID from v$database;
使用RMAN登录方式获取(成功连接之后即显示DBID):
RMAN TARGET /
从制定的备份集中恢复控制文件
RMAN>restore controlfile from 'D:\software\ORCL\CTRL_20140731_854392059_85_1';
有控制文件之后,将数据库启动至mount
RMAN>alter database mount;
5.修复数据库
执行命令恢复数据库
RMAN>catalog start with 'D:\software\ORCL\';
注意点:
备份的时候使用的为nocatalog方式,目录信息存放在控制文件,当源数据库备份文件存放路径和传输之后在目标机器存放路径不一致时,需要使用catalog start with命令注册目录,否则会报错,提示找不到数据文件的副本;当存放路径一致时不需要该命令。
RMAN>RUN
{
set newname for datafile 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF' to 'D:\oracle\product\10.2.0\oradata\ORCL\SYSTEM01.DBF';
set newname for datafile 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF'to 'D:\oracle\product\10.2.0\oradata\ORCL\UNDOTBS01.DBF';
set newname for datafile 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF' to 'D:\oracle\product\10.2.0\oradata\ORCL\SYSAUX01.DBF';
set newname for datafile 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF' to 'D:\oracle\product\10.2.0\oradata\ORCL\USERS01.DBF';
set newname for tempfile 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TEMP01.DBF' to 'D:\oracle\product\10.2.0\oradata\aqhseTEMP01.DBF';
set newname for tempfile 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\TEMPORARYDATA.DBF' to 'D:\oracle\product\10.2.0\oradata\aqhseTEMPORARYDATA.DBF';
RESTORE DATABASE;
SWITCH DATAFILE ALL;
RECOVER DATABASE;
}
注意点:
a.由于源数据库和目标数据库数据文件路径不一致,需要使用set new name命令指定数据文件的路径;当数据文件过多时,可以使用下面的sql(此sql需要在源数据库执行;标红的为目标数据库中数据文件的新路径,根据需要自己替换);
SQL>select 'set newname for datafile '''||name||''' to ''D:\oracle\product\10.2.0\oradata\aqhse\'|| substr(name, instr(name, '\', -1) + 1)||'''; ' cmd
from v$datafile
union all
select 'set newname for tempfile '''||name||''' to ''D:\oracle\product\10.2.0\oradata\aqhse\'|| substr(name, instr(name, '\', -1) + 1)||'''; ' cmd
from v$tempfile; --该sql来源于网络,感谢原作者的分享
b.set new name命令必须写在run块内执行;
c.执行recover命令之后,最后可能会报RMAN-06054错误,这是由于创建的rman备份不是一致性备份,只有归档,但不包括源数据库的联机重做日志文件。
6.更改联机重做日志路径,打开数据库
SQL>alter database open resetlogs;
注意点:
当执行上述命令报错ORA-00344,显示为无法创建联机重做日志文件时,需要先更改目标数据库联机重做日志文件路径,然后重新执行上述命令,具体修改SQL命令如下:
SQL>alter database rename file 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG' to 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO01.LOG';