说明:
本来是想做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 异机恢复数据库成功,本文目录结构与原数据库一致。