当前位置:  数据库>oracle

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

    来源: 互联网  发布时间:2017-06-21

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

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可以通过源系统获取;

[Oracle@test ~]$ export ORACLE_SID=testdb

3.  通过pfile创建spfile,启动实例到nomount状态

[oracle@test ~]$ 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路径,我们需要重建控制文件,步骤如下:

添加新的在线日志:

1
2
3 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;

删除原来的在线日志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 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) 标记为启用

这个错误,可以参考

Oracle数据库rman备份计划及恢复 

Oracle RMAN实现“一键式”表空间TSPITR 

Oracle 11gR2利用RMAN复制整库记录 

RMAN 配置归档日志删除策略

Oracle基础教程之通过RMAN复制数据库

RMAN备份策略制定参考内容

RMAN备份学习笔记

Oracle数据库备份加密 RMAN加密


    
 
 

您可能感兴趣的文章:

  • 如何强制删除或恢复SQLServer正在使用的数据库
  • 原来装了linux和win2k,使用LiLO启动,现在重新win2k,如何恢复使用LILO来引导使得Linux可用
  • 请问:使用fdisk/mbr清除bios中登陆选择菜单后,如何恢复?或重设
  • 在线等。。。使用压力测试工具进行测试有时出现httpd子进程CPU占用率100%,且压力撤除后无法恢复
  • Solaris桌面的程序控制面板中的一项被我使用右键菜单中的Move left/Move right移走了, 出不来了,怎么恢复啊?
  • oracle冷备份恢复和oracle异机恢复使用方法
  • 如何恢复数据库备份到一个已存在的正在使用的数据库上
  • MYSQL使用.frm恢复数据表结构的实现方法
  • 解析Mysql备份与恢复简单总结与tee命令的使用介绍
  • MySQL数据库恢复(使用mysqlbinlog命令)
  • MySQL数据库InnoDB数据恢复工具的使用小结详解
  • mysql数据库下载安装教程和使用技巧
  • 大家在UNIX下都使用什么数据库?使用什么做数据开发?
  • mongodb 数据库常用命令使用实例
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • 请教在linux系统开发环境下,有没有db和dbf数据库引擎,如何使用这个数据库?
  • 使用php语句将数据库*.sql文件导入数据库
  • 使用JDBC连接数据库时Class.forName()语句的使用疑问
  • 如何使用jsp显示数据库中的数据?
  • 收缩后对数据库的使用有影响吗?
  • 当发布的程序中含有数据库的使用时,...?
  • 一个数据库函数的使用?
  • 嵌入式linux下数据库使用
  • 请教数据库连接池的使用....
  • 在tomcat 中使用jdbcrealm是否一定要在数据库中建立用户表和 角色表
  • 使用TCP协议通讯,如果有很多种数据要传输,如:注册信息等,在C++中,我们可以使用结构,java中通常大家又是如何打包的呢? iis7站长之家
  • linux下使用易飞ERP系统出现“报表数据库连接错误!!”是怎么回事
  • linux下服务器开发一般使用什么数据库?
  • linux使用mysql删除数据库的问题,谢谢!
  • 请问如何在jsp中使用JDBC动态更新数据库?
  • 关于使用数据库连接的问题。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在Python3中使用urllib实现http的get和post提交数据操作
  • 请教高高手:如何规划和创建数据池?并使用数据池?有资料也行
  • 使用jquery局部刷新(jquery.load)从数据库取出数据
  • oracle数据库删除数据Delete语句和Truncate语句的使用比较
  • 我时用jdbc打开数据库,使用后是否要显示的关闭数据库,还是等java的垃圾回收器来处理。
  • 超级菜鸟问题:使用VMware安装linux会删除硬盘上的数据吗?
  • 关于数据报套接字的使用
  • 如何使用ip_queue_xmit接口发送数据包
  • 请问使用SELECT()函数怎么监测串口发送数据?
  • 为什么socket程序使用gdb调试执行就接受不到数据了呢?
  • sql server 使用ntile获取数据的例子
  • 使用udp,连续发送大数据发生丢包亲情况
  • linux下如何使用磁带机备份数据
  • 在ACC下不使用循环怎样实现,读取文件指定行的数据.
  • 请问在红旗Linux多功能服务器版上(不是数据库服务器版)能否正常安装使用Oracle?红旗Linux数据库服务器版要比红旗Linux多功能服务器版贵
  • 使用TCP协议通讯,如果有很多种数据要传输,如:注册信息等,在C++中,我们可以使用结构,java中通常大家又是如何打包的呢?
  • SQL Server 2008无日志文件如何使用MDF文件附加数据库
  • 使用EntityBean将中文存入数据库时出现乱码,如何解决?
  • 请问:FTP工具或者命令怎么设置,让数据路和控制路都使用默认的21端口
  • 请问如何使用c++开发数据库客户端程序?
  • 使用X manager连接oracle数据库的步骤
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • Office 2010 Module模式下使用VBA Addressof
  • c#中SAPI使用总结——SpVoice的使用方法
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • 使用了QWidget的程序,如何使用后台程序启动它?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3