oracle 的跨平台迁移---从linux到windows
原库环境:
OS:Red Hat Linux As 5
DB:10.2.0.1
目标环境:
OS:windows xp
DB:10.2.0.1
使用工具:rman
有些时候因为测试环境需要,我们需要使用生产库的备份集在另外一台新的机器上做恢复(前提是新机器事先安装Oracle软件,版本跟原库一致),下面是恢复过程.
1.在原库上做全备(在原库上操作)
run{
allocate channel c1 device type disk;
allocate channel c2 device type disk;
backup format '/u01/backup/full_backup_%U' database;
sql 'alter system archive log current';
backup format '/u01/backup/arc_backup_%U' archivelog all;
release channel c1;
release channel c2;
}
备注:执行热备后要执行alter system archive log current 这个语句,对数据库中的所有实例执行日志切换,就可以将所有的归档都备份出来。而alter system switch logfile强制日志切换,不一定就归档当前的重做日志文件,除非自动归档打开。
2.查看原库的DBID(在原库上操作)
因为在做恢复的过程中需要设定DBID,这里需要找到原库的DBID
SQL> select dbid from v$database;
DBID
----------
1820932955
-----以下的操作没有特殊说明,全部在目的库上操作-----
3.使用ftp将原库上的备份集拷贝到目标库的目录C:\backup下(具体操作省略)
4.在目标机器上创建如下目录
mkdir -p C:\oracle\product\10.2.0\admin\orcl\{adump,bdump,cdump,dpdump,udump,pfile}
mkdir -p C:\oracle\product\10.2.0\oradata\orcl
mkdir -p C:\oracle\product\10.2.0\flash_recovery_area
备注:必须创建,后面会用。
5.创建密码文件
orapwd file=C:\oracle\product\10.2.0\db_1\dbs\pwdRAC.ora password=system
6、创建windows的oracle服务:
oradim -new -sid orcl (如果删除服务的话,可以:oradim -delete -sid orcl)
7.恢复参数文件
在原库上执行下面的语句创建pfile:
create pfile='/u01/backup/initorcl.ora' from spfile
如果数据库是通过pfile打开的,有可能会报下下面的错误:
ORA-27040: file create error, unable to create file. OSD-04002: unable to open file. O/S-Error: (OS 3) The system cannot find the path specified
因为原库和目的库各文件保存的路径不一致,这个时候需要修改参数文件,修改的地方如下,各文件路径指向新目录:
*.audit_file_dest='C:\oracle\product\10.2.0\admin\orcl\adump'
*.background_dump_dest='C:\oracle\product\10.2.0\admin\orcl\bdump'
*.core_dump_dest='C:\oracle\product\10.2.0\admin\orcl\cdump'
*.user_dump_dest='C:\oracle\product\10.2.0\admin\orcl\udump'
*.control_files='C:\oracle\product\10.2.0\oradata\orcl\control01.ctl','C:\oracle\product\10.2.0\oradata\orcl\control02.ctl','C:\oracle\product\10.2.0\oradata\orcl\control03.ctl'
*.db_recovery_file_dest='C:\oracle\product\10.2.0\flash_recovery_area'
8.使用编辑好的参数文件启动数据库到nomount状态并恢复控制文件
SQL> startup nomount pfile=c:\backup\initorcl.ora
ORACLE instance started.
Total System Global Area 1048576000 bytes
Fixed Size 1223368 bytes
Variable Size 310379832 bytes
Database Buffers 734003200 bytes
Redo Buffers 2969600 bytes
下一步是恢复控制文件,可以从备份中恢复,也可以从原库直接拷贝过来。
枫叶尝试的方法是直接从原库拷贝归档日志到相应的目录。然后 alter database mount没有问题。(下面紫色部分的方法没有成功,仅供参考)
列出当前的所有数据文件
SQL> column name format a60;
SQL> select file# as "file/grp#", name from v$datafile;
file/grp# NAME
---------- ------------------------------------------------------------
1 /u01/app/oracle/oradata/oracl/system01.dbf';
2 /u01/app/oracle/oradata/oracl/undotbs01.dbf';
3 /u01/app/oracle/oradata/oracl/sysaux01.dbf';
4 /u01/app/oracle/oradata/oracl/users01.dbf';
可以看到,当前控制文件中记录的数据文件的路径是原来的路径,我们在做恢复的时候需要指向新的路径.
run{
set newname for datafile 1 to 'C:\oracle\product\10.2.0\oradata\orcl\system01.dbf';
set newname for datafile 2 to 'C:\oracle\product\10.2.0\oradata\orcl\undotbs01.dbf';
set newname for datafile 3 to 'C:\oracle\product\10.2.0\oradata\orcl\sysaux01.dbf';
set newname for datafile 4 to 'C:\oracle\product\10.2.0\oradata\orcl\users01.dbf';
SET UNTIL SCN 462045;
restore database;
switch datafile all;
recover database;
}
恢复数据库失败,失败原因:找不到重做日志 /u01/app/oracle/oradata/orcl/redo03.log。当然找不到了,我们的目标数据库是windows的,没有这种路径。怎么办?尝试切换一下:
alter database add logfile group 4 'C:\oracle\product\10.2.0\oradata\orcl\redo04.log' size 50M;
alter database add logfile group 5 'C:\oracle\product\10.2.0\oradata\orcl\redo05.log' size 50M;
alter database add logfile group 6 'C:\oracle\product\10.2.0\oradata\orcl\redo06.log' size 50M;
SQL> alter system switch logfile;
alter system switch logfile
ERROR at line 1:
ORA-01109: database not open
失败。枫叶又找到了个方法,没这个路径那我改名吧:
又失败了。撞得头破血流后发现,linux和windows路径定义不一样,只有重建控制文件,不然没办法解决redo日志的问题。(紫色部分为弯路,大家看下就可以了)
重新创建控制文件:
创建完控制文件,数据库自动mount,再执行alter database mount报错。
生成控制文件的方法很简单,在原库上执行alter database backup controlfile to trace,一般默认是在udump目录下生成trace文件,打开trace文件有noresetlogs和resetlogs两部分,如果你的数据库打开了归档做的热备的话,请选择resetlogs;如果你做的是冷备份的话,可以选择noresetlogs。
9、恢复数据文件和修复数据库
在RMAN下执行list backupset查看备份集为空,因为控制文件重建后找不到备份集,需要手动注册下,如下图(备份集拷贝到目标数据库的C:\backup):
注册完以后再执行list backupset:
通过比较可以看出,最大的scn为462050。数据库可以前滚到该SCN处,设置until scn 462050,如下:
run{
SET UNTIL SCN 462050;
restore database;
recover database;
}
修复数据库成功,下面open数据库。
RMAN> alter database open resetlogs;
database opened
RMAN> alter database open resetlogs;
database opened。
终于成功了,偶也!
长期以来,枫叶一直在网上学习大家写的各种文档,受益匪浅,自己却很少贡献。这次在借鉴了众多前辈写的RMAN文档基础上,再经过枫叶不断的尝试,终于成功完成ORACLE的跨平台迁移。枫叶尽量提供一个详细的文档供大家参考,大家如果有什么问题的话,请留言。