使用rman异地恢复数据库试验(RAC恢复到单实例数据库)

前言

rman在实际应用中用到的不多,很多时候一个项目开始设置好备份策略,后续基本上都用不到了,除非数据库出现异常,可以说,rman是一个不常用但是却非常重要的技能,但是又非常容易忘记。为了不在关键时刻掉链子,做了一个rman异地恢复数据库的试验。

试验环境介绍

操作系统 数据库版本 RAC?
源系统 CentOS 6.3 x64 11.2.0.4 2节点
目标系统 RedHat 6.4 x64 11.2.0.4 单节点
Rman备份: 0级数据库全备

操作步骤

  1. 将rman备份文件从源库上面拷贝到目标库/dbbackup/full/20150815目录中,做好准备工作
  2. 设置目标库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

时间: 2024-10-06 15:15:03

使用rman异地恢复数据库试验(RAC恢复到单实例数据库)的相关文章

Oracle 11g R2 rac通过rman 恢复到单实例数据库

生产环境是2个节点的rac + dataguard(物理备库也是两个节点的rac),通过rman每天进行备份,现在需要定期对生产库进行恢复操作 恢复步骤如下: 1.      把生产库的备份拷贝到目标端 建立存放备份的目录修改目录属主属组 mkdir /oracle/backup chown oracle:oinstall /oracle/backup 2.      拷贝备份到目标端 scp -P 22 incremental_level*  [email protected]:/oracle

【RAC】将单实例备份集恢复为rac数据库

[RAC]将单实例备份集恢复为rac数据库 BLOG文档结构图 前言部分 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 单实例环境的备份集如何恢复到rac环境(重点) ② rman恢复数据库的一般步骤 ③ rac环境的简单操作 注意:本篇BLOG中代码部分需要特别关注的地方我都用***背景和红色字体来表示,比如下边的例子中,thread 1的最大归档日志号为33,thread 2的最大归档日志号为43是需要特别关注的地方.

【RAC】将RAC备份集恢复为单实例数据库

[RAC]将RAC备份集恢复为单实例数据库 BLOG文档结构图 前言部分 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① rac数据库的备份集是如何恢复到单实例的数据库 ② ASM文件系统到OS文件系统的转换 ③ 一般的备份恢复过程 本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力. 实验环境介绍 源库:11.2.0.1 rac库 2个节点 目标库:11.2.0.1 RHEL6

使用dataguard将单实例数据库转换为rac数据库

我们经常将oracle rac数据库通过dataguard容灾到一个单实例数据库中,当生产库出现故障后可以将生产库切换到dg服务器上.而当生产库rac修复完成后,我们同样可以通过dg将数据回切到生产库中. 此次测试将单实例数据库通过dg转换为rac数据库,这个单实例是刚创建的,并不是由rac通过dg生成的. 在做dg之前需要安装完成grid,不需要创建数据库实例.在日志应用的时候必须只能是一个实例应用. 具体环境如下: 单实例库: 数据库版本:11.2.0.4.0 sid:suq db_uniq

VM虚拟机下在LINUX上安装ORACLE 11G单实例数据库

VM虚拟机下在LINUX上安装ORACLE 11G单实例数据库 1.环境及安装前规划:虚拟机及OS如下 环境:VMware Wordstation ACE版 6.0.2 操作系统:OracleLinux-R5-U8-Server-i386-dvd    3.2G 安装操作系统,这里需要注意的是磁盘空间要预留足够. 我的规划是: 虚拟机分配1024M内存,当然如果主机内存足够,安装时内存设置2048M可以更快. 虚拟机分配一块磁盘,30G磁盘空间. /boot 100M ext3 /    20G

单实例数据库安装脚本

安装脚本 1.1_preusers.sh #!/bin/bash #Purpose:Create 3 groups named 'oinstall','dba','oper', plus 1 users named 'oracle'. #Also setting the Environment #variable for oracle user. #Usage:Log on as the superuser('root'),and then execute the command:#./1pre

[oracle部署实施] 基于centos7静默安装oracle 11gr2单实例数据库

基于centos7静默安装oracle 11gr2单实例数据库 1.vmware最小化安装centos7 分配20G硬盘+2G内存+nat网络 400mboot+4Gswap 去除kdump 最小化安装 并配置网络cat /etc/sysconfig/network-scripts/ifcfg-ens32BOOTPROTO="static"DEVICE="ens32"ONBOOT="yes"IPADDR=192.168.188.11NETMASK

oracle 12c单实例数据库打12.1.0.2.4补丁记录

操作系统版本: [[email protected] OPatch]$ lsb_release -a LSB Version:    :core-4.0-amd64:core-4.0-ia32:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-ia32:printing-4.0-noarch Distributor ID: Enterpr

在 Oracle Linux 6.5 上安装 Oracle 11g 单实例数据库

Oracle数据库预安装任务 检查硬件要求 系统必须满足下面最小的硬件要求 内存要求 Minimum: 1 GB of RAMRecommended: 2 GB of RAM or more To determine the RAM size, enter the following command: # grep MemTotal /proc/meminfo The following table describes the relationship between the installed