异机还原数据库的前提条件:
(1)同os 同版本
(2)同数据库实例名 和 dbid [select dbid from v$database]
(3)数据库spfile 和 pfile [可以用默认spfile]
(4)数据文件列表 [序号和原路径可以在恢复了control 文件后 list backup 获取]
(5)备份集要copy到原机器备份时相同的路径下
(6)如果路径不同,恢复时 set newname... 更换路径
恢复步骤:
1. dbca新建同名数据库实例 gcgkdb
配置好 listener 和 tns
2. shutdown immediate;
备份新数据库实例 gcgkdb 默认常见的pfile spfile 等
E:\oracle\admin\
E:\oracle\product\11.2.0\dbhome_1\database\PWDGCGKDB.ora
E:\oracle\product\11.2.0\dbhome_1\database\SPFILEGCGKDB.ORA
删除默认的数据文件
E:\oracle\oradata\gcgkdb\*.dbf
3. lsnrctl start
启动空闲服务
SET ORACLE_SID=gcgkdb
orcl是你的数据库实例名
sqlplus sys/sys@gcgkdb as sysdba
已连接到空闲例程(shutdown immediate 之后会连接到空闲例程)
4. 用默认新gcgkdb 的 spfile 或者预先备份的spfile 启动数据库
SQL > startup nomount;
或者
SQL > startup pfile = '全路径/SPFILEGCGKDB.ora'
5. 把完整rman备份copy到和备份相同的路径下(没有就创建)
E:\backup\gcgkdb
6. 用rman先从备份中恢复控制文件
SET ORACLE_SID=gcgkdb
cmd > rman target sys/sys@gcgkdb
RMAN > set dbid=1379996969;
RMAN > restore controlfile from 'D:\backup\gcgkdb\CONTROLFILE_C-1379996969-20180503-00';
dbid 查原数据库的:select dbid from v$database;
如果restore执行成功,则原数据库的控制文件就会还原到新数据库 spfile 中指定的控制文件位置,
但是此时因为目录变更 control 文件里面的路径是不正确的,后面需要 set newname 重新设置路径
7. 挂载数据库
RMAN > alter database mount;
此时可以通过 list backup; 命令来查看备份情况
8. 将已经还原好的 control 控制文件 trace 出来(为了重建 control 文件)
SQL> alter database backup controlfile to trace as 'e:\control_new.txt';
后面的路径无所谓,主要是为了能看到 control 文件里的内容
9. 观察导出的 control_new.txt 文件会发现 backup 中datafile路径是错误的,需要修正
(原数据库在 D盘,新数据库在E盘)如果路径完全相同直接 restore database 就行
执行以下脚本修正路径并 restore 数据库,这个脚本只是个范例,实际的中间的 datafile 文件要和 control_new.txt 中的 datafile 文件对应
这里的 序号 1、2 ...与各数据文件的对应关系,可以通过 list backup 命令来获取
run {
set newname for datafile 1 to 'E:\oracle\ORADATA\gcgkdb\SYSTEM01.DBF';
set newname for datafile 2 to 'E:\oracle\ORADATA\gcgkdb\SYSAUX01.DBF';
set newname for datafile 3 to 'E:\oracle\ORADATA\gcgkdb\UNDOTBS01.DBF';
set newname for datafile 4 to 'E:\oracle\ORADATA\gcgkdb\USERS01.DBF';
set newname for datafile 5 to 'E:\oracle\ORADATA\gcgkdb\EXAMPLE01.DBF';
set newname for datafile 6 to 'E:\oracle\ORADATA\gcgkdb\TS_BIZ_01.DBF';
set newname for datafile 7 to 'E:\oracle\ORADATA\gcgkdb\TS_APPLOG_01.DBF';
restore database;
switch datafile all;
}
这一步如果数据量大,需要的时间会很长, switch datafile all 是将新的路径更新到控制文件
10. restore 恢复成功之后 recover
rman > recover database until cancel using backup controlfile;
RMAN-06054: 介质恢复正在请求未知的线程 1 序列 16 的归档日志以及起始 SCN 81351791 只能不完全恢复
rman > recover database until scn 81351791;
介质恢复正在请求未知的线程 1 序列 8945 的归档日志以及起始 SCN 218684941
recover database until scn 218684941;
recover database until scn 218141409;
11. recover 成功之后
alter database open resetlogs;
12. 重建临时表空间
alter tablespace temp add tempfile 'E:\oracle\oradata\gcgkdb\temp01.dbf' size 500m;
alter tablespace ts_temp add tempfile 'E:\oracle\oradata\gcgkdb\ts_temp_01.dbf' size 500m;