且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

通过RMAN备份duplicate异机克隆恢复数据库

更新时间:2022-06-12 01:05:59

说明:
本来是想做no target目标库通过目标库备份集创建dataguard测试的,发现从原理上不能实现,但它有一个非常有用的功能,可以实现快速的rman备份异机恢复。
之前通过RMAN备份异机恢复要操作很多步骤,通过rman duplicate方式来实现数据库将非常快速。将为今后有整库迁移工作任务提供又一种方案。
本文将记录完整过程。


一、环境介绍

1. 主数据库环境

操作系统版本  : OEL5.8 x64
数据库版本    : Oracle 11.2.0.3 x64
数据库名      : orcl
数据库SID     : orcl
db_unique_name: orcl
instance_name : orcl
IP:192.168.233.200


2. 备库环境

操作系统版本  : OEL5.8 x64
数据库版本    : Oracle 11.2.0.3 x64 (只安装oracle数据库软件,no netca dbca)
数据库名      : orcl
数据库SID     : orcl
db_unique_name: orcl
instance_name : orcl
IP:192.168.233.150


二、主数据库环境准备


1. 目标库环境

重新创建口令文件

# su - oracle
$ orapwd file='/u01/app/oracle/product/11.2.0/db_1/dbs/orapworcl' password=oracle entries=10 force=y


2. lisener监听文件

$ cat /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora  

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.233.200)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
      (SID_NAME = orcl)
    )
  )

ADR_BASE_LISTENER = /u01/app/oracle


4. tnsname.ora

说明:ORCL是主库的服务名

$ cat /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.233.200)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

 

5. rman备份主库

创建rman备份目录

$ mkdir -p /u01/rman

连接到target准备备份

$ rman target /

恢复管理器: Release 11.2.0.3.0 - Production on 星期二 8月 20 21:22:40 2013

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

已连接到目标数据库: ORCL (DBID=1351765128)

RMAN> backup format '/u01/rman/fulldb_%d_%U' database include current controlfile plus archivelog delete input;  


启动 backup 于 20-8月 -13
当前日志已存档
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=1 设备类型=DISK
通道 ORA_DISK_1: 正在启动归档日志备份集
通道 ORA_DISK_1: 正在指定备份集内的归档日志
输入归档日志线程=1 序列=6 RECID=1 STAMP=823986366
输入归档日志线程=1 序列=7 RECID=2 STAMP=823986369
输入归档日志线程=1 序列=8 RECID=3 STAMP=823987442
通道 ORA_DISK_1: 正在启动段 1 于 20-8月 -13
通道 ORA_DISK_1: 已完成段 1 于 20-8月 -13
段句柄=/u01/rman/fulldb_ORCL_01ohq37j_1_1 标记=TAG20130820T212403 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
通道 ORA_DISK_1: 正在删除归档日志
RMAN-08137: 警告: 归档日志未删除, 因为备用或上游捕获进程需要它
归档日志文件名=/u01/archivelog/arch_823984394_1_6.arc 线程=1 序列=6
RMAN-08137: 警告: 归档日志未删除, 因为备用或上游捕获进程需要它
归档日志文件名=/u01/archivelog/arch_823984394_1_7.arc 线程=1 序列=7
RMAN-08137: 警告: 归档日志未删除, 因为备用或上游捕获进程需要它
归档日志文件名=/u01/archivelog/arch_823984394_1_8.arc 线程=1 序列=8
完成 backup 于 20-8月 -13

启动 backup 于 20-8月 -13
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
输入数据文件: 文件号=00001 名称=/u01/app/oracle/oradata/orcl/system01.dbf
输入数据文件: 文件号=00002 名称=/u01/app/oracle/oradata/orcl/sysaux01.dbf
输入数据文件: 文件号=00003 名称=/u01/app/oracle/oradata/orcl/undotbs01.dbf
输入数据文件: 文件号=00004 名称=/u01/app/oracle/oradata/orcl/users01.dbf
通道 ORA_DISK_1: 正在启动段 1 于 20-8月 -13
通道 ORA_DISK_1: 已完成段 1 于 20-8月 -13
段句柄=/u01/rman/fulldb_ORCL_02ohq37l_1_1 标记=TAG20130820T212405 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:02:13
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
备份集内包括当前控制文件
备份集内包括当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 20-8月 -13
通道 ORA_DISK_1: 已完成段 1 于 20-8月 -13
段句柄=/u01/rman/fulldb_ORCL_03ohq3bq_1_1 标记=TAG20130820T212405 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 20-8月 -13

启动 backup 于 20-8月 -13
当前日志已存档
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动归档日志备份集
通道 ORA_DISK_1: 正在指定备份集内的归档日志
输入归档日志线程=1 序列=9 RECID=4 STAMP=823987583
通道 ORA_DISK_1: 正在启动段 1 于 20-8月 -13
通道 ORA_DISK_1: 已完成段 1 于 20-8月 -13
段句柄=/u01/rman/fulldb_ORCL_04ohq3bv_1_1 标记=TAG20130820T212623 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
通道 ORA_DISK_1: 正在删除归档日志
RMAN-08137: 警告: 归档日志未删除, 因为备用或上游捕获进程需要它
归档日志文件名=/u01/archivelog/arch_823984394_1_9.arc 线程=1 序列=9
完成 backup 于 20-8月 -13

RMAN> 
RMAN> quit

之后会将备份拷贝到150服务器上。

 

三、目标库配置(要恢复的服务器)


1. 修改配置lisener监听文件

$ vi /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora  

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.233.150)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
      (SID_NAME = orcl)
    )
  )

ADR_BASE_LISTENER = /u01/app/oracle


2. 修改配置tnsname.ora文件

说明:ORCL是主库的服务名,DG是备库的服务名。

$ vi /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.233.150)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )


测试服务名连通性:

tnsping orcl


3. 创建11g数据库基本目录

# su - oracle

mkdir -p /u01/app/oracle/admin/orcl/{adump,dpdump,pfile,scripts}  
mkdir -p /u01/app/oracle/oradata/orcl  
mkdir -p /u01/app/oracle/fast_recovery_area/orcl
mkdir -p /u01/archivelog


4. 拷贝主库口令文件(也可直接创建一个新的口令文件)

$ cd /u01/app/oracle/product/11.2.0/db_1/dbs/
$ scp oracle@192.168.233.200:/u01/app/oracle/product/11.2.0/db_1/dbs/orapworcl  $ORACLE_HOME/dbs/


5. 拷贝rman备份

$ scp -r oracle@192.168.233.200:/u01/rman  /u01/


6. 启动到nomount状态

$ echo 'db_name=orcl' > $ORACLE_HOME/dbs/initorcl.ora  
$ sqlplus /nolog
SQL> conn / as sysdba;
SQL> startup nomount;


四、 开始在RMAN duplicate数据库


1. RMAN同进连接主库与备库

$ rman auxiliary /

恢复管理器: Release 11.2.0.3.0 - Production on 星期三 8月 21 22:16:40 2013
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
已连接到辅助数据库: SLAVE (未装载)


2. 开始duplicate数据库

RMAN> duplicate target database to slave backup location '/u01/rman/' nofilenamecheck ;


启动 Duplicate Db 于 21-8月 -13

内存脚本的内容:
{
   sql clone "create spfile from memory";
}
正在执行内存脚本

sql 语句: create spfile from memory

内存脚本的内容:
{
   shutdown clone immediate;
   startup clone nomount;
}
正在执行内存脚本

Oracle 实例已关闭

已连接到辅助数据库 (未启动)
Oracle 实例已启动

系统全局区域总计     238034944 字节

Fixed Size                     2227136 字节
Variable Size                180356160 字节
Database Buffers              50331648 字节
Redo Buffers                   5120000 字节

内存脚本的内容:
{
   sql clone "alter system set  db_name = 
 ''ORCL'' comment=
 ''Modified by RMAN duplicate'' scope=spfile";
   sql clone "alter system set  db_unique_name = 
 ''ORCL'' comment=
 ''Modified by RMAN duplicate'' scope=spfile";
   shutdown clone immediate;
   startup clone force nomount
   restore clone primary controlfile from  '/u01/rman/fulldb_ORCL_03ohq3bq_1_1';
   alter clone database mount;
}
正在执行内存脚本

sql 语句: alter system set  db_name =  ''ORCL'' comment= ''Modified by RMAN duplicate'' scope=spfile
sql 语句: alter system set  db_unique_name =  ''ORCL'' comment= ''Modified by RMAN duplicate'' scope=spfile

Oracle 实例已关闭
Oracle 实例已启动

系统全局区域总计     238034944 字节

Fixed Size                     2227136 字节
Variable Size                180356160 字节
Database Buffers              50331648 字节
Redo Buffers                   5120000 字节

启动 restore 于 21-8月 -13
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: SID=18 设备类型=DISK

通道 ORA_AUX_DISK_1: 正在还原控制文件
通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:01
输出文件名=/u01/app/oracle/product/11.2.0/db_1/dbs/cntrlorcl.dbf
完成 restore 于 21-8月 -13

数据库已装载
释放的通道: ORA_AUX_DISK_1
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: SID=18 设备类型=DISK

内存脚本的内容:
{
   set until scn  1071039;
   set newname for datafile  1 to 
 "/u01/app/oracle/oradata/orcl/system01.dbf";
   set newname for datafile  2 to 
 "/u01/app/oracle/oradata/orcl/sysaux01.dbf";
   set newname for datafile  3 to 
 "/u01/app/oracle/oradata/orcl/undotbs01.dbf";
   set newname for datafile  4 to 
 "/u01/app/oracle/oradata/orcl/users01.dbf";
   restore
   clone database
   ;
}
正在执行内存脚本

正在执行命令: SET until clause
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
启动 restore 于 21-8月 -13
使用通道 ORA_AUX_DISK_1

通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集
通道 ORA_AUX_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_AUX_DISK_1: 将数据文件 00001 还原到 /u01/app/oracle/oradata/orcl/system01.dbf
通道 ORA_AUX_DISK_1: 将数据文件 00002 还原到 /u01/app/oracle/oradata/orcl/sysaux01.dbf
通道 ORA_AUX_DISK_1: 将数据文件 00003 还原到 /u01/app/oracle/oradata/orcl/undotbs01.dbf
通道 ORA_AUX_DISK_1: 将数据文件 00004 还原到 /u01/app/oracle/oradata/orcl/users01.dbf
通道 ORA_AUX_DISK_1: 正在读取备份片段 /u01/rman/fulldb_ORCL_02ohq37l_1_1
通道 ORA_AUX_DISK_1: 段句柄 = /u01/rman/fulldb_ORCL_02ohq37l_1_1 标记 = TAG20130820T212405
通道 ORA_AUX_DISK_1: 已还原备份片段 1
通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:01:36
完成 restore 于 21-8月 -13

内存脚本的内容:
{
   switch clone datafile all;
}
正在执行内存脚本

数据文件 1 已转换成数据文件副本
输入数据文件副本 RECID=1 STAMP=824077182 文件名=/u01/app/oracle/oradata/orcl/system01.dbf
数据文件 2 已转换成数据文件副本
输入数据文件副本 RECID=2 STAMP=824077182 文件名=/u01/app/oracle/oradata/orcl/sysaux01.dbf
数据文件 3 已转换成数据文件副本
输入数据文件副本 RECID=3 STAMP=824077182 文件名=/u01/app/oracle/oradata/orcl/undotbs01.dbf
数据文件 4 已转换成数据文件副本
输入数据文件副本 RECID=4 STAMP=824077182 文件名=/u01/app/oracle/oradata/orcl/users01.dbf

内存脚本的内容:
{
   set until scn  1071039;
   recover
   clone database
    delete archivelog
   ;
}
正在执行内存脚本

正在执行命令: SET until clause

启动 recover 于 21-8月 -13
使用通道 ORA_AUX_DISK_1

正在开始介质的恢复

通道 ORA_AUX_DISK_1: 正在开始将归档日志还原到默认目标
通道 ORA_AUX_DISK_1: 正在还原归档日志
归档日志线程=1 序列=9
通道 ORA_AUX_DISK_1: 正在读取备份片段 /u01/rman/fulldb_ORCL_04ohq3bv_1_1
通道 ORA_AUX_DISK_1: 段句柄 = /u01/rman/fulldb_ORCL_04ohq3bv_1_1 标记 = TAG20130820T212623
通道 ORA_AUX_DISK_1: 已还原备份片段 1
通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:01
归档日志文件名=/u01/app/oracle/product/11.2.0/db_1/dbs/arch1_9_823984394.dbf 线程=1 序列=9
通道 clone_default: 正在删除归档日志
归档日志文件名=/u01/app/oracle/product/11.2.0/db_1/dbs/arch1_9_823984394.dbf RECID=1 STAMP=824077183
介质恢复完成, 用时: 00:00:01
完成 recover 于 21-8月 -13
Oracle 实例已启动

系统全局区域总计     238034944 字节

Fixed Size                     2227136 字节
Variable Size                180356160 字节
Database Buffers              50331648 字节
Redo Buffers                   5120000 字节

内存脚本的内容:
{
   sql clone "alter system set  db_name = 
 ''ORCL'' comment=
 ''Reset to original value by RMAN'' scope=spfile";
   sql clone "alter system reset  db_unique_name scope=spfile";
   shutdown clone immediate;
   startup clone nomount;
}
正在执行内存脚本

sql 语句: alter system set  db_name =  ''ORCL'' comment= ''Reset to original value by RMAN'' scope=spfile
sql 语句: alter system reset  db_unique_name scope=spfile

Oracle 实例已关闭

已连接到辅助数据库 (未启动)
Oracle 实例已启动

系统全局区域总计     238034944 字节

Fixed Size                     2227136 字节
Variable Size                180356160 字节
Database Buffers              50331648 字节
Redo Buffers                   5120000 字节
sql 语句: CREATE CONTROLFILE REUSE SET DATABASE "ORCL" RESETLOGS ARCHIVELOG 
  MAXLOGFILES     16
  MAXLOGMEMBERS      3
  MAXDATAFILES      100
  MAXINSTANCES     8
  MAXLOGHISTORY      292
 LOGFILE
  GROUP   1 ( '/u01/app/oracle/oradata/orcl/redo01.log' ) SIZE 50 M  REUSE,
  GROUP   2 ( '/u01/app/oracle/oradata/orcl/redo02.log' ) SIZE 50 M  REUSE,
  GROUP   3 ( '/u01/app/oracle/oradata/orcl/redo03.log' ) SIZE 50 M  REUSE
 DATAFILE
  '/u01/app/oracle/oradata/orcl/system01.dbf'
 CHARACTER SET ZHS16GBK


内存脚本的内容:
{
   set newname for tempfile  1 to 
 "/u01/app/oracle/oradata/orcl/temp01.dbf";
   switch clone tempfile all;
   catalog clone datafilecopy  "/u01/app/oracle/oradata/orcl/sysaux01.dbf", 
 "/u01/app/oracle/oradata/orcl/undotbs01.dbf", 
 "/u01/app/oracle/oradata/orcl/users01.dbf";
   switch clone datafile all;
}
正在执行内存脚本

正在执行命令: SET NEWNAME

临时文件 1 在控制文件中已重命名为 /u01/app/oracle/oradata/orcl/temp01.dbf

已将数据文件副本列入目录
数据文件副本文件名=/u01/app/oracle/oradata/orcl/sysaux01.dbf RECID=1 STAMP=824077195
已将数据文件副本列入目录
数据文件副本文件名=/u01/app/oracle/oradata/orcl/undotbs01.dbf RECID=2 STAMP=824077195
已将数据文件副本列入目录
数据文件副本文件名=/u01/app/oracle/oradata/orcl/users01.dbf RECID=3 STAMP=824077195

数据文件 2 已转换成数据文件副本
输入数据文件副本 RECID=1 STAMP=824077195 文件名=/u01/app/oracle/oradata/orcl/sysaux01.dbf
数据文件 3 已转换成数据文件副本
输入数据文件副本 RECID=2 STAMP=824077195 文件名=/u01/app/oracle/oradata/orcl/undotbs01.dbf
数据文件 4 已转换成数据文件副本
输入数据文件副本 RECID=3 STAMP=824077195 文件名=/u01/app/oracle/oradata/orcl/users01.dbf
对辅助数据库重新启用控制文件选项
执行: alter database force logging

内存脚本的内容:
{
   Alter clone database open resetlogs;
}
正在执行内存脚本

数据库已打开
完成 Duplicate Db 于 21-8月 -13

RMAN> 
RMAN> quit


3. 查看备库状态

说明:duplicate数据库之后,备库只是处于mount状态,查看备库状态。

$ sqlplus / as sysdba

# 查看备库状态

SQL> select open_mode from v$database;

OPEN_MODE
--------------------
READ WRITE


到时通过rman备份duplicate 异机恢复数据库成功,本文目录结构与原数据库一致。

 


本文转自 koumm 51CTO博客,原文链接:http://blog.51cto.com/koumm/1280217,如需转载请自行联系原作者