注意事项
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;