前言
rman在实际应用中用到的不多,很多时候一个项目开始设置好备份策略,后续基本上都用不到了,除非数据库出现异常,可以说,rman是一个不常用但是却非常重要的技能,但是又非常容易忘记。为了不在关键时刻掉链子,做了一个rman异地恢复数据库的试验。
试验环境介绍
操作系统 | 数据库版本 | RAC? | |
源系统 | CentOS 6.3 x64 | 11.2.0.4 | 2节点 |
目标系统 | RedHat 6.4 x64 | 11.2.0.4 | 单节点 |
Rman备份: 0级数据库全备 |
操作步骤
- 将rman备份文件从源库上面拷贝到目标库/dbbackup/full/20150815目录中,做好准备工作
- 设置目标库sid,pfile等;pfile可以通过源系统获取;
[[email protected] ~]$ export ORACLE_SID=testdb
3. 通过pfile创建spfile,启动实例到nomount状态
[[email protected] ~]$ sqlplus / as sysdba SQL> create spfile from pfile=‘/home/oracle/pwss.ora‘; SQL> startup nomount ORACLE 例程已经启动。
4. 连接rman,恢复controlfile
RMAN> restore controlfile from ‘/dbbackup/full/20150815/CTL_WSSDB_d1qek9nr_1_120150815.bak‘; 启动 restore 于 2015-09-22 09:32:30 使用目标数据库控制文件替代恢复目录 分配的通道: ORA_DISK_1 通道 ORA_DISK_1: SID=133 设备类型=DISK 通道 ORA_DISK_1: 正在还原控制文件 通道 ORA_DISK_1: 还原完成, 用时: 00:00:04 输出文件名=/app/oradata/wssdb/control01.ctl 输出文件名=/app/oradata/wssdb/control02.ctl 完成 restore 于 2015-09-22 09:32:34 RMAN> alter database mount;
5. 使用rman恢复数据文件
因为源系统使用的是ASM存储,但是目标系统是单实例,使用的是本地磁盘作为存储的,数据文件目录不一致,所以我们要使用 set newname for datafiel 子句将数据文件制定新的目录以及文件名,恢复脚本如下:
RMAN> run{ allocate channel c1 type disk; allocate channel c2 type disk; allocate channel c3 type disk; set newname for datafile 1 to ‘/app/oradata/wssdb/system01.bdf‘; set newname for datafile 2 to ‘/app/oradata/wssdb/sysaux01.bdf‘; set newname for datafile 3 to ‘/app/oradata/wssdb/undotbs1_01.bdf‘; set newname for datafile 4 to ‘/app/oradata/wssdb/undotbs2_01.bdf‘; set newname for datafile 5 to ‘/app/oradata/wssdb/users_01.bdf‘; set newname for datafile 6 to ‘/app/oradata/wssdb/wss_01.bdf‘; set newname for datafile 7 to ‘/app/oradata/wssdb/smicwrps_tablespace_01.bdf‘; set newname for datafile 8 to ‘/app/oradata/wssdb/xm_db_portal.bdf‘; set newname for datafile 9 to ‘/app/oradata/wssdb/xm_db_push.bdf‘; set newname for datafile 10 to ‘/app/oradata/wssdb/xdbts.bdf‘; restore database; switch datafile all; release channel c1; release channel c2; release channel c3; }
分配的通道: c1 通道 c1: SID=133 设备类型=DISK 分配的通道: c2 通道 c2: SID=10 设备类型=DISK 分配的通道: c3 通道 c3: SID=135 设备类型=DISK 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 正在执行命令: SET NEWNAME 启动 restore 于 2015-09-22 09:53:48 通道 c1: 正在开始还原数据文件备份集 通道 c1: 正在指定从备份集还原的数据文件 通道 c1: 将数据文件 00001 还原到 /app/oradata/wssdb/system01.bdf 通道 c1: 将数据文件 00003 还原到 /app/oradata/wssdb/undotbs1_01.bdf 通道 c1: 将数据文件 00005 还原到 /app/oradata/wssdb/users_01.bdf 通道 c1: 将数据文件 00008 还原到 /app/oradata/wssdb/xm_db_portal.bdf 通道 c1: 将数据文件 00010 还原到 /app/oradata/wssdb/xdbts.bdf 通道 c1: 正在读取备份片段 /dbbackup/full/20150815/WSSDB_crqek9mr_1_120150815.bak 通道 c2: 正在开始还原数据文件备份集 通道 c2: 正在指定从备份集还原的数据文件 通道 c2: 将数据文件 00002 还原到 /app/oradata/wssdb/sysaux01.bdf 通道 c2: 将数据文件 00004 还原到 /app/oradata/wssdb/undotbs2_01.bdf 通道 c2: 将数据文件 00006 还原到 /app/oradata/wssdb/wss_01.bdf 通道 c2: 将数据文件 00007 还原到 /app/oradata/wssdb/smicwrps_tablespace_01.bdf 通道 c2: 将数据文件 00009 还原到 /app/oradata/wssdb/xm_db_push.bdf 通道 c2: 正在读取备份片段 /dbbackup/full/20150815/WSSDB_cqqek9mr_1_120150815.bak 通道 c1: 段句柄 = /dbbackup/full/20150815/WSSDB_crqek9mr_1_120150815.bak 标记 = TAG20150815T001003 通道 c1: 已还原备份片段 1 通道 c1: 还原完成, 用时: 00:33:05 通道 c2: 段句柄 = /dbbackup/full/20150815/WSSDB_cqqek9mr_1_120150815.bak 标记 = TAG20150815T001003 通道 c2: 已还原备份片段 1 通道 c2: 还原完成, 用时: 00:34:58 完成 restore 于 2015-09-22 10:28:47 数据文件 1 已转换成数据文件副本 输入数据文件副本 RECID=11 STAMP=891080928 文件名=/app/oradata/wssdb/system01.bdf 数据文件 2 已转换成数据文件副本 输入数据文件副本 RECID=12 STAMP=891080928 文件名=/app/oradata/wssdb/sysaux01.bdf 数据文件 3 已转换成数据文件副本 输入数据文件副本 RECID=13 STAMP=891080928 文件名=/app/oradata/wssdb/undotbs1_01.bdf 数据文件 4 已转换成数据文件副本 输入数据文件副本 RECID=14 STAMP=891080928 文件名=/app/oradata/wssdb/undotbs2_01.bdf 数据文件 5 已转换成数据文件副本 输入数据文件副本 RECID=15 STAMP=891080928 文件名=/app/oradata/wssdb/users_01.bdf 数据文件 6 已转换成数据文件副本 输入数据文件副本 RECID=16 STAMP=891080928 文件名=/app/oradata/wssdb/wss_01.bdf 数据文件 7 已转换成数据文件副本 输入数据文件副本 RECID=17 STAMP=891080928 文件名=/app/oradata/wssdb/smicwrps_tablespace_01.bdf 数据文件 8 已转换成数据文件副本 输入数据文件副本 RECID=18 STAMP=891080928 文件名=/app/oradata/wssdb/xm_db_portal.bdf 数据文件 9 已转换成数据文件副本 输入数据文件副本 RECID=19 STAMP=891080928 文件名=/app/oradata/wssdb/xm_db_push.bdf 数据文件 10 已转换成数据文件副本 输入数据文件副本 RECID=20 STAMP=891080928 文件名=/app/oradata/wssdb/xdbts.bdf 释放的通道: c1 释放的通道: c2 释放的通道: c3
恢复完成,因为控制文件中的在线日志还是原来的ASM路径,我们需要重建控制文件,步骤如下:
添加新的在线日志:
SQL> alter database add logfile thread 1 group 7 ‘/app/oradata/wssdb/onlinelog_01_128M_001.log‘ size 128M; SQL> alter database add logfile thread 1 group 8 ‘/app/oradata/wssdb/onlinelog_02_128M_001.log‘ size 128M; SQL> alter database add logfile thread 1 group 9 ‘/app/oradata/wssdb/onlinelog_03_128M_001.log‘ size 128M;
删除原来的在线日志:
SQL> alter database drop logfile group 5; 数据库已更改。 SQL> alter database drop logfile group 1; alter database drop logfile group 1 * 第 1 行出现错误: ORA-01624: 日志 1 是紧急恢复实例 wssdb (线程 1) 所必需的 ORA-00312: 联机日志 1 线程 1: ‘+DATA/wssdb/onlinelog/group_1.257.874510059‘ ORA-00312: 联机日志 1 线程 1: ‘+DATA/wssdb/onlinelog/group_1.273.874523985‘ SQL> alter database drop logfile group 2; alter database drop logfile group 2 * 第 1 行出现错误: ORA-01623: 日志 2 是实例 wssdb (线程 1) 的当前日志 - 无法删除 ORA-00312: 联机日志 2 线程 1: ‘+DATA/wssdb/onlinelog/group_2.258.874510061‘ ORA-00312: 联机日志 2 线程 1: ‘+DATA/wssdb/onlinelog/group_2.274.874523987‘ SQL> alter database drop logfile group 3; alter database drop logfile group 3 * 第 1 行出现错误: ORA-01624: 日志 3 是紧急恢复实例 wssdb (线程 1) 所必需的 ORA-00312: 联机日志 3 线程 1: ‘+DATA/wssdb/onlinelog/group_3.259.874510065‘ ORA-00312: 联机日志 3 线程 1: ‘+DATA/wssdb/onlinelog/group_3.275.874523989‘ SQL> alter database backup controlfile to trace; 数据库已更改。
发现删除报错,那么我们通过重建controlfile来删除这些在线日志,如下:
SQL> shutdown immediate ORA-01109: 数据库未打开 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> SQL> SQL> SQL> startup nomount ORACLE 例程已经启动。 Total System Global Area 334036992 bytes Fixed Size 2253024 bytes Variable Size 113250080 bytes Database Buffers 213909504 bytes Redo Buffers 4624384 bytes SQL> SQL> SQL> SQL> CREATE CONTROLFILE REUSE DATABASE "WSSDB" RESETLOGS ARCHIVELOG MAXLOGFILES 192 MAXLOGMEMBERS 3 MAXDATAFILES 8192 MAXINSTANCES 32 MAXLOGHISTORY 292 LOGFILE GROUP 7 ‘/app/oradata/wssdb/onlinelog_01_128M_001.log‘ SIZE 128M BLOCKSIZE 5 2 3 4 5 6 7 8 12, GROUP 8 ‘/app/oradata/wssdb/onlinelog_02_128M_001.log‘ SIZE 128M BLOCKSIZE 512, GROUP 9 ‘/app/oradata/wssdb/onlinelog_03_128M_001.log‘ SIZE 128M BLOCKSIZE 512 -- STANDBY LOGFILE DATAFILE ‘/app/oradata/wssdb/system01.bdf‘, ‘/app/oradata/wssdb/ 9 10 11 12 13 14 sysaux01.bdf‘, ‘/app/oradata/wssdb/undotbs1_01.bdf‘, ‘/app/oradata/wssdb/undotbs2_01.bdf‘, ‘/app/oradata/wssdb/users_01.bdf‘, ‘/app/oradata/wssdb/wss_01.bdf‘, ‘/app/oradata/wssdb/smicwrps_tablespace_01.bdf‘, ‘/app/oradata/wssdb/xm_db_portal.bdf 15 16 17 18 19 20 ‘, ‘/app/oradata/wssdb/xm_db_push.bdf‘, ‘/app/oradata/wssdb/xdbts.bdf‘ CHARACTER SET ZHS16GBK ; 21 22 23 24 控制文件已创建。
这个时候,我使用 alter database mount; 命令想将数据库改变到mount状态,却发现报错,这个因为重建控制文件以后,数据库会自动启动到mount状态。
通过alter database open resetlogs打开数据库:
SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-01152: 文件 2 没有从过旧的备份中还原
ORA-01110: 数据文件 2: ‘/app/oradata/wssdb/sysaux01.bdf‘
SQL> recover database until cancel;
ORA-00283: recovery session canceled due to errors
ORA-01610: recovery using the BACKUP CONTROLFILE option must be done
依然报错,这个时候通过_allow_resetlogs_corruption=true参数强行开启数据库
SQL> alter system set "_allow_resetlogs_corruption"=TRUE scope=spfile; 系统已更改。 SQL> shutdown immediate ORA-01109: 数据库未打开 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> startup mount ORACLE 例程已经启动。 Total System Global Area 334036992 bytes Fixed Size 2253024 bytes Variable Size 113250080 bytes Database Buffers 213909504 bytes Redo Buffers 4624384 bytes 数据库装载完毕。 SQL> alter database open resetlogs; alter database open resetlogs * 第 1 行出现错误: ORA-38856: 无法将实例 UNNAMED_INSTANCE_2 (重做线程 2) 标记为启用
通过查找资料,发现这个Oracle的一个Bug,解决办法如下:
SQL> alter system set "_no_recovery_through_resetlogs"=TRUE scope=spfile; 系统已更改。
SQL> shutdown immediate ORA-01109: 数据库未打开 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> SQL> SQL> startup mount ORACLE 例程已经启动。 Total System Global Area 334036992 bytes Fixed Size 2253024 bytes Variable Size 113250080 bytes Database Buffers 213909504 bytes Redo Buffers 4624384 bytes 数据库装载完毕。 SQL> SQL> alter database open resetlogs; 数据库已更改。
数据库异地恢复完成!
关于
ORA-38856: 无法将实例 UNNAMED_INSTANCE_2 (重做线程 2) 标记为启用
这个错误,可以参考
http://dbaway.blog.51cto.com/7099215/1697030