注意事项

1、建议源端以冷备方式备份数据库

对于 linux<->windows 迁移数据库跨平台的操作rman restore database 可以执行,recover 是无法解析归档日志的。
RMAN DUPLICATE/RESTORE/RECOVER Mixed Platform Support (Doc ID 1079563.1)

Linux <-> Windows
Note:  Backup must be cold/consistent backup.  I.e. cannot apply redo between Windows and Linux。

建议使用冷备方式来恢复:
How to restore cold backup of database taken using Rman (Doc ID 1391384.1)

2、目标端数据库名最好与源端相同,否则需要重建pfile文件,数据库名相同可跳过该步骤

源端创建pfile
create pfile='xxx' from spfile;

修改pfile中以下四个路径(由windows改为Linux)
icu.__oracle_base='/u01/app/oracle'
*.audit_file_dest='/u01/app/oracle/admin/TESTDB/adump/'
*.control_files='/oradata/TESTDB/control01.ctl','/u01/app/oracle/fast_recovery_area/TESTDB/control02.ctl'
*.diagnostic_dest='/u01/app/oracle'

用源端修改后的pfile启动目标端数据库
startup nomount from pfile='xxx';

目标端使用pfile创建spfile
create spfile from pfile='xxx';

目标端以spfile启动到nomount状态
shutdown immediate;
startup nomount;

3、源端如果启用了快速恢复区,目标端也必须启用,建议源端暂时关闭快速恢复区

4、目标端数据库版本不低于源端

源端rman冷备

shutdown immediate;
startup mount;

rman target /
configure controlfile autobackup on;
run {
allocate channel ch1 device type disk maxpiecesize 1000M;
allocate channel ch2 device type disk maxpiecesize 1000M;
allocate channel ch3 device type disk maxpiecesize 1000M;
allocate channel ch4 device type disk maxpiecesize 1000M;
crosscheck backup;
crosscheck archivelog all;
backup as compressed BACKUPSET database tag='_db' format 'D:/bak/db_%d_%T_%s_%U.bak';
backup as compressed BACKUPSET archivelog all tag '_arch' format 'D:/bak/arc_%d_%T_s%s_p%p_%U.bak';
backup current controlfile tag='_ctl' format='D:/bak/ctl_%d_%U_%T.bak';
backup spfile tag='_spfile' format='D:/bak/spfile_%d_%U_%T.bak';
release channel ch1;
release channel ch2;
release channel ch3;
release channel ch4;
}

目标端恢复

将windows端rman备份的文件上传至/backup目录

rman target /

# 启动数据库到nomount
shutdown immediate;
startup nomount;

# 恢复控制文件
restore controlfile from '/backup/CTL_ICU_062SU9CT_1_1_20240609.BAK';

# 启动数据库到mount
sql 'alter database mount';

# 导入备份集信息到控制文件
catalog start with "/backup/";

# 检查数据文件信息(全是windows路径,需要调整到linux)
select file#, name,status from v$datafile;
select member,STATUS from v$logfile;
select file#,name from v$tempfile;

# 从rman备份还原数据库并重命名
run{
 set newname for datafile 1 to '/oradata/TESTDB/SYSTEM01.DBF';
 set newname for datafile 2 to '/oradata/TESTDB/SYSAUX01.DBF';
 set newname for datafile 3 to '/oradata/TESTDB/UNDOTBS01.DBF';
 set newname for datafile 4 to '/oradata/TESTDB/USERS01.DBF';
 set newname for datafile 5 to '/oradata/TESTDB/EXAMPLE01.DBF';
 set newname for tempfile 1 to '/oradata/TESTDB/temp01.dbf';
 restore database;
 switch datafile all;
 switch tempfile all;
 recover database;
}

# resetlogs方式打开数据库
alter database open resetlogs;

# 重启数据库到mount状态
shutdown immediate;
startup mount;

# resetlogs方式生成的redo在下面这个目录中
/u01/app/oracle/product/11.2.0/db/dbs

# 移动redo日志到正确路径下
mv /u01/app/oracle/product/11.2.0/db/dbs/D:APPADMINISTRATORORADATAICUREDO01.LOG /oradata/TESTDB/redo01.log
mv /u01/app/oracle/product/11.2.0/db/dbs/D:APPADMINISTRATORORADATAICUREDO02.LOG /oradata/TESTDB/redo02.log
mv /u01/app/oracle/product/11.2.0/db/dbs/D:APPADMINISTRATORORADATAICUREDO03.LOG /oradata/TESTDB/redo03.log

# 调整redo日志路径
alter database rename file '/u01/app/oracle/product/11.2.0/db/dbs/D:APPADMINISTRATORORADATAICUREDO01.LOG' to 
'/oradata/TESTDB/redo01.log';
alter database rename file '/u01/app/oracle/product/11.2.0/db/dbs/D:APPADMINISTRATORORADATAICUREDO02.LOG' to 
'/oradata/TESTDB/redo02.log';
alter database rename file '/u01/app/oracle/product/11.2.0/db/dbs/D:APPADMINISTRATORORADATAICUREDO03.LOG' to 
'/oradata/TESTDB/redo03.log';

# 再次检查各文件路径
select file#, name,status from v$datafile;
select member from v$logfile;
select file#,name from v$tempfile;

# 打开数据库
alter database open;