原机: OS:XP oracle:10.2.0.1.0
异机: OS:XP oracle:10.2.0.3.0
目的:利用原机的rman备份集将原库恢复到异机。
1.全备份数据库(rman)
备份脚本如下:
# start backup database
run {
allocate channel c1 type disk;
backup format 'E:\oracle\rman_backup\full%u_%s_%p' database
plus archivelog format 'E:\oracle\rman_backup\archive_%d_%T_%s' delete all input;
release channel c1;
}
# end
2.在异机的操作。
异机的oracle软件安装目录跟原机一样。
ORACLE_BASE=C:\oracle\product\10.2.0
ORACLE_HOME=C:\oracle\product\10.2.0\db_1
设置环境变量ORACLE_SID=orasjh
set ORACLE_SID=orasjh
验证:set ORACLE_SID
创建和原数据库相同的目录结构:
E:\oracle\orasjh --存放数据库的数据文件,日志文件,控制文件。
E:\oracle\orasjh\archive --存放归档日志。
C:\oracle\product\10.2.0\admin\orasjh --audmp,bdump等目录的路径。
C:\oracle\product\10.2.0\db_1\database --密码文件,初始化参数的位置。
E:\oracle\rman_backup --rman备份存放的地方。
配置监听器,本地服务名(主要编辑listener.ora,tnsnames.ora文件)
创建密码文件,工具orapwd:
C:\oracle\product\10.2.0\db_1\database>orapwd file=PWDorasjh.ora password=sys entries=5
3.在原机的操作
复制原数据库的spfile到异机。
从RMAN中恢复控制文件:
C:\>rman catalog target
恢复管理器: Release 10.2.0.1.0 - Production on 星期二 3月 3 14:55:24 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到目标数据库: ORASJH (DBID=2615173674)
连接到恢复目录数据库
RMAN> list backup of controlfile;
备份集列表
===================
BS 关键字 类型 LV 大小 设备类型 经过时间 完成时间
------- ---- -- ---------- ----------- ------------ ----------
297 Full 6.80M DISK 00:00:03 02-3月 -09
BP 关键字: 300 状态: AVAILABLE 已压缩: NO 标记: TAG20090302T170100
段名:E:\ORACLE\RMAN_BACKUP\FULL06K8U104_6_1
包括的控制文件: Ckp SCN: 344003 Ckp 时间: 02-3月 -09
RMAN> restore controlfile to 'e:\oracle\control.ctl' from 'E:\ORACLE\RMAN_BACKUP
\FULL06K8U104_6_1';
启动 restore 于 03-3月 -09
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=158 devtype=DISK
通道 ORA_DISK_1: 正在复原控制文件
通道 ORA_DISK_1: 恢复完成, 用时: 00:00:02
完成 restore 于 03-3月 -09
RMAN> restore spfile to 'e:\oracle\rman_backup\spfile.bak' from autobackup;
启动 restore 于 09-3月 -09
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 寻找以下日期的自动备份: 20090309
通道 ORA_DISK_1: 已找到的自动备份: c-2615173674-20090309-00
通道 ORA_DISK_1: 从自动备份复原 SPFILE 已完成
完成 restore 于 09-3月 -09
RMAN> restore archivelog sequence 235;
启动 restore 于 09-3月 -09
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动到默认目标的存档日志恢复
通道 ORA_DISK_1: 正在恢复存档日志
存档日志线程 =1 序列=235
通道 ORA_DISK_1: 正在读取备份段 E:\ORACLE\RMAN_BACKUP\ARCHIVE_ORASJH_20090309_10
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = E:\ORACLE\RMAN_BACKUP\ARCHIVE_ORASJH_20090309_10 标记 = TAG20090309T145
408
通道 ORA_DISK_1: 恢复完成, 用时: 00:00:02
完成 restore 于 09-3月 -09
--将原机的e:\oracle\control.ctl复制到异机的相同目录,复制成三个镜像的控制文件:CONTROL01.CTL CONTROL02.CTL CONTROL03.CTL。同时将spfile.bak,备份期间的归档日志也copy到异机,并正确的改名。将全备后的备份文件(备份集)复制到异机,这里是E:\oracle\rman_backup。
--修改原机的tnsname.ora使orasjh的host指向异机的IP地址(192.168.10.150):
ORASJH =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.150)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orasjh)
)
)
4.在异机打开数据库
在异机打开数据库,只能到mount状态,open时报错。很正常,数据文件都还没有了。
5.在原机用RMAN进行恢复
--在原机启动RMAN开始恢复:
E:\oracle\rman_scripts>rman catalog target
恢复管理器: Release 10.2.0.1.0 - Production on 星期一 3月 9 17:06:40 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
已连接到目标数据库: ORASJH (DBID=2615173674, 未打开) --这时连接的目标库是异机上的。
连接到恢复目录数据库
RMAN> restore database;
启动 restore 于 09-3月 -09
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=155 devtype=DISK
通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00001恢复到E:\ORACLE\ORASJH\SYSTEM01.DBF
正将数据文件00002恢复到E:\ORACLE\ORASJH\UNDOTBS01.DBF
正将数据文件00003恢复到E:\ORACLE\ORASJH\SYSAUX01.DBF
正将数据文件00004恢复到E:\ORACLE\ORASJH\USERS01.DBF
通道 ORA_DISK_1: 正在读取备份段 E:\ORACLE\RMAN_BACKUP\FULL09K9G827_9_1
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = E:\ORACLE\RMAN_BACKUP\FULL09K9G827_9_1 标记 = TAG20090309T145255
通道 ORA_DISK_1: 恢复完成, 用时: 00:01:05
完成 restore 于 09-3月 -09
RMAN> recover database;
启动 recover 于 09-3月 -09
使用通道 ORA_DISK_1
正在开始介质的恢复
存档日志线程 1 序列 235 已作为文件 E:\ORACLE\ORASJH\ARCHIVE\ARC00235_0679223338.
001 存在于磁盘上
--备份期间的归档应用上了。
6.在异机上的最后处理
--在异机的SQL*PLUS中用resetlogs打开数据库:
SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-01092: ORACLE 实例终止。强制断开连接
--查看告警日志如下:
ORA-00704: 引导程序进程失败
ORA-39700: 必须用 UPGRADE 选项打开数据库
Mon Mar 09 17:08:41 2009
Error 704 happened during db open, shutting down database
USER: terminating instance due to error 704
ARC1 started with pid=18, OS id=3252
Mon Mar 09 17:08:42 2009
Errors in file c:\oracle\product\10.2.0\admin\orasjh\bdump\orasjh_lgwr_4816.trc:
ORA-00704: ????????
Mon Mar 09 17:08:42 2009
Errors in file c:\oracle\product\10.2.0\admin\orasjh\bdump\orasjh_dbw0_3556.trc:
ORA-00704: ????????
Mon Mar 09 17:08:42 2009
Errors in file c:\oracle\product\10.2.0\admin\orasjh\bdump\orasjh_mman_232.trc:
ORA-00704: ????????
Mon Mar 09 17:08:42 2009
Errors in file c:\oracle\product\10.2.0\admin\orasjh\bdump\orasjh_psp0_2940.trc:
ORA-00704: ????????
Mon Mar 09 17:08:42 2009
Errors in file c:\oracle\product\10.2.0\admin\orasjh\bdump\orasjh_pmon_2800.trc:
ORA-00704: ????????
Mon Mar 09 17:08:42 2009
Errors in file c:\oracle\product\10.2.0\admin\orasjh\bdump\orasjh_ckpt_3096.trc:
ORA-00704: ????????
Mon Mar 09 17:08:43 2009
Errors in file c:\oracle\product\10.2.0\admin\orasjh\bdump\orasjh_reco_3016.trc:
ORA-00704: ????????
--因为相同平台的数据库软件版本不一样,所以需要upgrade选项打开。
--shutdown数据库用upgrade选项打开数据库:
SQL>startup upgrade
--数据库竟然打开了。
SQL>@C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\catupgrd.sql
--执行这个脚本。这个脚本调用catlog.sql和 catproc.sql来重建字典对象等,在执行完这个脚本之后,我们可以关闭数据库后,正常打开数据库:
SQL> select count(*) from dba_objects where status='INVALID';
COUNT(*)
----------
116
--有INVALID的对象。
SQL> @C:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\utlrp.sql --重新进行编译
SQL> select count(*) from dba_objects where status='INVALID';
COUNT(*)
----------
0
--INVALID的对象消失。
--将原机的tnsnames.ora的orasjh的host改回原来的IP。异机恢复完成。