Duplicate是RMAN的一个组成部分,利用Duplicate复制一个数据库相当简单,Duplicate可以在不影响目标数据库的情况下,依靠目标数据库的备份集常见一个数据库副本或者standby数据库,(11g对Duplicate有所加强,已经非必须依赖目标数据库的备份集)。在复制目标数据库的时候,既可以复制完整的数据库,也可以仅复制目标数据库的部分表空间,也可以跳过指定的表空间和只读的表空间,(system和undo表空间不能被跳过)。
一、创建本地Duplicate数据库演示:
环境:Windows XP,oracle 11gR2
1. 创建一个新的oracle服务,linux环境跳过。
C:\Documents and Settings\Administrator>oradim -new -sid orcl
实例已创建。
2. 创建需要的目录
mkdir D:\oracle\oradata\orcl
mkdir D:\oracle\admin\orcl\adump
mkdir D:\oracle\oradata\orcl
mkdir D:\oracle\flash_recovery_area\orcl
3. 创建参数文件和密码文件
D:\oracle\product\11.2.0\dbhome_1\database>copy PWDrac1.ora PWDorcl.ora
已复制 1 个文件。
D:\oracle\product\11.2.0\dbhome_1\database>copy initrac1.ora initorcl.ora
已复制 1 个文件。
4. 修改参数文件
*.audit_file_dest='D:\oracle\admin\orcl\adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='D:\oracle\oradata\orcl\control01.ctl','D:\oracle\flash_recovery_area\orcl\control02.ctl'
*.db_block_size=8192
*.db_name='orcl'
*.db_recovery_file_dest='D:\oracle\flash_recovery_area'
*.db_recovery_file_dest_size=15728640000
*.diagnostic_dest='D:\oracle'
*.sga_target=314572800
*.undo_tablespace='UNDOTBS1'
db_file_name_convert=('D:\oracle\oradata\rac1','D:\oracle\oradata\orcl')
log_file_name_convert=('D:\oracle\oradata\rac1','D:\oracle\oradata\orcl')
5. 创建spfile
set ORACLE_SID=orcl
sqlplus / as sysdba
SQL> create spfile from pfile;
文件已创建。
SQL> startup nomount;
ORACLE 例程已经启动。
Total System Global Area 313860096 bytes
Fixed Size 1374304 bytes
Variable Size 104859552 bytes
Database Buffers 201326592 bytes
Redo Buffers 6299648 bytes
SQL> show parameter name
NAME TYPE VALUE
---------------------- ----------- ------------------------------
db_file_name_convert string D:\oracle\oradata\rac1, D:\oracle\oradata\orcl
db_name string ORCL
db_unique_name string ORCL
global_names boolean FALSE
instance_name string orcl
lock_name_space string
log_file_name_convert string D:\oracle\oradata\rac1, D:\oracle\oradata\orcl
service_names string ORCL
6. Rman备份目标数据库
C:\Documents and Settings\Administrator>set ORACLE_SID=rac1
D:\oracle\product\11.2.0\dbhome_1\database>rman target /
恢复管理器: Release 11.2.0.1.0 - Production on 星期五 10月 7 20:30:28 2011
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
连接到目标数据库: RAC1 (DBID=668639724)
RMAN> backup database plus archivelog;
启动 backup 于 07-10月-11
当前日志已存档
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=140 设备类型=DISK
通道 ORA_DISK_1: 正在启动归档日志备份集
通道 ORA_DISK_1: 正在指定备份集内的归档日志
输入归档日志线程=1 序列=56 RECID=1 STAMP=763936248
通道 ORA_DISK_1: 正在启动段 1 于 07-10月-11
通道 ORA_DISK_1: 已完成段 1 于 07-10月-11
段句柄=D:\ORACLE\FLASH_RECOVERY_AREA\RAC1\BACKUPSET\2011_10_07\O1_MF_ANNNN_TAG20
111007T203049_78XW7T20_.BKP 标记=TAG20111007T203049 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 07-10月-11
启动 backup 于 07-10月-11
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
输入数据文件: 文件号=00001 名称=D:\ORACLE\ORADATA\RAC1\SYSTEM01.DBF
输入数据文件: 文件号=00002 名称=D:\ORACLE\ORADATA\RAC1\SYSAUX01.DBF
输入数据文件: 文件号=00003 名称=D:\ORACLE\ORADATA\RAC1\UNDOTBS01.DBF
输入数据文件: 文件号=00004 名称=D:\ORACLE\ORADATA\RAC1\USERS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 07-10月-11
通道 ORA_DISK_1: 已完成段 1 于 07-10月-11
段句柄=D:\ORACLE\FLASH_RECOVERY_AREA\RAC1\BACKUPSET\2011_10_07\O1_MF_NNNDF_TAG20
111007T203051_78XW7W1K_.BKP 标记=TAG20111007T203051 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:02:05
通道 ORA_DISK_1: 正在启动全部数据文件备份集
通道 ORA_DISK_1: 正在指定备份集内的数据文件
备份集内包括当前控制文件
备份集内包括当前的 SPFILE
通道 ORA_DISK_1: 正在启动段 1 于 07-10月-11
通道 ORA_DISK_1: 已完成段 1 于 07-10月-11
段句柄=D:\ORACLE\FLASH_RECOVERY_AREA\RAC1\BACKUPSET\2011_10_07\O1_MF_NCSNF_TAG20
111007T203051_78XWCTFM_.BKP 标记=TAG20111007T203051 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 07-10月-11
启动 backup 于 07-10月-11
当前日志已存档
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在启动归档日志备份集
通道 ORA_DISK_1: 正在指定备份集内的归档日志
输入归档日志线程=1 序列=57 RECID=2 STAMP=763936379
通道 ORA_DISK_1: 正在启动段 1 于 07-10月-11
通道 ORA_DISK_1: 已完成段 1 于 07-10月-11
段句柄=D:\ORACLE\FLASH_RECOVERY_AREA\RAC1\BACKUPSET\2011_10_07\O1_MF_ANNNN_TAG20
111007T203300_78XWCWHL_.BKP 标记=TAG20111007T203300 注释=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:01
完成 backup 于 07-10月-11
如此部分未备份归档,归档需要单独备份,否则会报找不到备份错误
ORA-19505: 无法识别文件"D:\ORACLE\FLASH_RECOVERY_AREA\RAC1\BACKUPSET\2011_10_07\
O1_MF_NNNDF_TAG20111007T203051_78XW7W1K_.BKP"
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
故障转移到上一个备份
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: Duplicate Db 命令 (在 10/07/2011 21:18:10 上) 失败
RMAN-03015: 在存储的脚本Memory Script中出现错误
RMAN-06026: 有些目标没有找到 - 终止还原
RMAN-06023: 没有找到数据文件4的副本来还原
RMAN-06023: 没有找到数据文件3的副本来还原
RMAN-06023: 没有找到数据文件2的副本来还原
RMAN-06023: 没有找到数据文件1的副本来还原1
7. RMAN连接目标数据库和辅助数据库
D:\oracle\product\11.2.0\dbhome_1\database>rman target / auxiliary sys/oracle@orcl
恢复管理器: Release 11.2.0.1.0 - Production on 星期五 10月 7 20:38:34 2011
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
连接到目标数据库: RAC1 (DBID=668639724)
已连接到辅助数据库: ORCL (未装载)
8. 创建Duplicate数据库
RMAN> Duplicate target database to orcl nofilenamecheck;
启动 Duplicate Db 于 07-10月-11
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: SID=10 设备类型=DISK
内存脚本的内容:
{
sql clone "alter system set db_name =
''RAC1'' 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;
alter clone database mount;
}
正在执行内存脚本
sql 语句: alter system set db_name = ''RAC1'' comment= ''Modified by RMAN dupl
icate'' scope=spfile
sql 语句: alter system set db_unique_name = ''ORCL'' comment= ''Modified by RM
AN Duplicate'' scope=spfile
Oracle 实例已关闭
Oracle 实例已启动
系统全局区域总计 313860096 字节
Fixed Size 1374304 字节
Variable Size 104859552 字节
Database Buffers 201326592 字节
Redo Buffers 6299648 字节
以上日志为启动创建Duplicate数据库,并修改db_name 为RAC1,db_unique_name为ORCL,然后重新启动辅助实例到nomount状态。
启动 restore 于 07-10月-11
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: SID=133 设备类型=DISK
通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集
通道 ORA_AUX_DISK_1: 正在还原控制文件
通道 ORA_AUX_DISK_1: 正在读取备份片段 D:\ORACLE\FLASH_RECOVERY_AREA\RAC1\BACKUPS
ET\2011_10_07\O1_MF_NCSNF_TAG20111007T203051_78XWCTFM_.BKP
通道 ORA_AUX_DISK_1: 段句柄 = D:\ORACLE\FLASH_RECOVERY_AREA\RAC1\BACKUPSET\2011_
10_07\O1_MF_NCSNF_TAG20111007T203051_78XWCTFM_.BKP 标记 = TAG20111007T203051
通道 ORA_AUX_DISK_1: 已还原备份片段 1
通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:03
输出文件名=D:\ORACLE\ORADATA\ORCL\CONTROL01.CTL
输出文件名=D:\ORACLE\FLASH_RECOVERY_AREA\ORCL\CONTROL02.CTL
完成 restore 于 07-10月-11
数据库已装载
以上日志为restore控制文件
内存脚本的内容:
{
set until scn 799964;
set newname for datafile 1 to
"D:\ORACLE\ORADATA\RAC1\SYSTEM01.DBF";
set newname for datafile 2 to
"D:\ORACLE\ORADATA\RAC1\SYSAUX01.DBF";
set newname for datafile 3 to
"D:\ORACLE\ORADATA\RAC1\UNDOTBS01.DBF";
set newname for datafile 4 to
"D:\ORACLE\ORADATA\RAC1\USERS01.DBF";
restore
clone database
;
}
正在执行内存脚本
正在执行命令: SET until clause
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
启动 restore 于 07-10月-11
使用通道 ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: 正在开始还原数据文件备份集
通道 ORA_AUX_DISK_1: 正在指定从备份集还原的数据文件
通道 ORA_AUX_DISK_1: 将数据文件 00001 还原到 D:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF
通道 ORA_AUX_DISK_1: 将数据文件 00002 还原到 D:\ORACLE\ORADATA\ORCL\SYSAUX01.DBF
通道 ORA_AUX_DISK_1: 将数据文件 00003 还原到 D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF
通道 ORA_AUX_DISK_1: 将数据文件 00004 还原到 D:\ORACLE\ORADATA\ORCL\USERS01.DBF
通道 ORA_AUX_DISK_1: 正在读取备份片段 D:\ORACLE\FLASH_RECOVERY_AREA\RAC1\BACKUPS
ET\2011_10_07\O1_MF_NNNDF_TAG20111007T203051_78XW7W1K_.BKP
通道 ORA_AUX_DISK_1: 段句柄 = D:\ORACLE\FLASH_RECOVERY_AREA\RAC1\BACKUPSET\2011_
10_07\O1_MF_NNNDF_TAG20111007T203051_78XW7W1K_.BKP 标记 = TAG20111007T203051
通道 ORA_AUX_DISK_1: 已还原备份片段 1
通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:01:25
完成 restore 于 07-10月-11
内存脚本的内容:
{
switch clone datafile all;
}
正在执行内存脚本
数据文件 1 已转换成数据文件副本
输入数据文件副本 RECID=5 STAMP=763937147 文件名=D:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF
数据文件 2 已转换成数据文件副本
输入数据文件副本 RECID=6 STAMP=763937148 文件名=D:\ORACLE\ORADATA\ORCL\SYSAUX01.DBF
数据文件 3 已转换成数据文件副本
输入数据文件副本 RECID=7 STAMP=763937148 文件名=D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF
数据文件 4 已转换成数据文件副本
输入数据文件副本 RECID=8 STAMP=763937148 文件名=D:\ORACLE\ORADATA\ORCL\USERS01.DBF
以上日志为restore数据文件
内存脚本的内容:
{
set until scn 799964;
recover
clone database
delete archivelog
;
}
正在执行内存脚本
正在执行命令: SET until clause
启动 recover 于 07-10月-11
使用通道 ORA_AUX_DISK_1
正在开始介质的恢复
线程 1 序列 57 的归档日志已作为文件 D:\ORACLE\FLASH_RECOVERY_AREA\RAC1\ARCHIVELO
G\2011_10_07\O1_MF_1_57_78XWCVRC_.ARC 存在于磁盘上
归档日志文件名=D:\ORACLE\FLASH_RECOVERY_AREA\RAC1\ARCHIVELOG\2011_10_07\O1_MF_1_
57_78XWCVRC_.ARC 线程=1 序列=57
介质恢复完成, 用时: 00:00:01
完成 recover 于 07-10月-11
以上日志为recover数据文件
内存脚本的内容:
{
shutdown clone immediate;
startup clone nomount;
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;
}
正在执行内存脚本
数据库已卸装
Oracle 实例已关闭
已连接到辅助数据库 (未启动)
Oracle 实例已启动
系统全局区域总计 313860096 字节
Fixed Size 1374304 字节
Variable Size 104859552 字节
Database Buffers 201326592 字节
Redo Buffers 6299648 字节
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 实例已启动
系统全局区域总计 313860096 字节
Fixed Size 1374304 字节
Variable Size 104859552 字节
Database Buffers 201326592 字节
Redo Buffers 6299648 字节
以上日志为修改db_name为ORCL、重置db_unique_name,并重启到nomount状态
sql 语句: CREATE CONTROLFILE REUSE SET DATABASE "ORCL" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ( 'D:\ORACLE\ORADATA\ORCL\REDO01.LOG' ) SIZE 50 M REUSE,
GROUP 2 ( 'D:\ORACLE\ORADATA\ORCL\REDO02.LOG' ) SIZE 50 M REUSE,
GROUP 3 ( 'D:\ORACLE\ORADATA\ORCL\REDO03.LOG' ) SIZE 50 M REUSE
DATAFILE
'D:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF'
CHARACTER SET ZHS16GBK
内存脚本的内容:
{
set newname for tempfile 1 to
"D:\ORACLE\ORADATA\ORCL\TEMP01.DBF";
switch clone tempfile all;
catalog clone datafilecopy "D:\ORACLE\ORADATA\ORCL\SYSAUX01.DBF",
"D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF",
"D:\ORACLE\ORADATA\ORCL\USERS01.DBF";
switch clone datafile all;
}
正在执行内存脚本
正在执行命令: SET NEWNAME
临时文件 1 在控制文件中已重命名为 D:\ORACLE\ORADATA\ORCL\TEMP01.DBF
已将数据文件副本列入目录
数据文件副本文件名=D:\ORACLE\ORADATA\ORCL\SYSAUX01.DBF RECID=1 STAMP=763937171
已将数据文件副本列入目录
数据文件副本文件名=D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF RECID=2 STAMP=763937171
已将数据文件副本列入目录
数据文件副本文件名=D:\ORACLE\ORADATA\ORCL\USERS01.DBF RECID=3 STAMP=763937172
数据文件 2 已转换成数据文件副本
输入数据文件副本 RECID=1 STAMP=763937171 文件名=D:\ORACLE\ORADATA\ORCL\SYSAUX01.DBF
数据文件 3 已转换成数据文件副本
输入数据文件副本 RECID=2 STAMP=763937171 文件名=D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF
数据文件 4 已转换成数据文件副本
输入数据文件副本 RECID=3 STAMP=763937172 文件名=D:\ORACLE\ORADATA\ORCL\USERS01.DBF
以上为重建控制文件,并将数据文件注册到控制文件内。
内存脚本的内容:
{
Alter clone database open resetlogs;
}
正在执行内存脚本
数据库已打开
完成 Duplicate Db 于 07-10月-11
以上日志为resetlogs方式打开数据库(Standby数据库不会打开数据库)
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
orcl OPEN
db_name已改回ORCL
SQL> show parameter name
NAME TYPE VALUE
---------------------- ----------- ----------------------------------------------
db_file_name_convert string D:\oracle\oradata\rac1, D:\oracle\oradata\orcl
db_name string ORCL
db_unique_name string ORCL
global_names boolean FALSE
instance_name string orcl
lock_name_space string
log_file_name_convert string D:\oracle\oradata\rac1, D:\oracle\oradata\orcl
service_names string ORCL
表空间和数据文件已成功复制
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC
---------- ---------------------------------------- --- --- --- ---
0 SYSTEM YES NO YES
3 TEMP NO NO YES
1 SYSAUX YES NO YES
2 UNDOTBS1 YES NO YES
4 USERS YES NO YES
SQL> select name from v$datafile;
NAME
----------------------------------------
D:\ORACLE\ORADATA\ORCL\SYSTEM01.DBF
D:\ORACLE\ORADATA\ORCL\SYSAUX01.DBF
D:\ORACLE\ORADATA\ORCL\UNDOTBS01.DBF
D:\ORACLE\ORADATA\ORCL\USERS01.DBF
日志序号已从1开始(Standby数据库不会重置redo日志)
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 1
下一个存档日志序列 1
当前日志序列 1
SQL> select GROUP#,THREAD#,SEQUENCE#,BYTES,MEMBERS,ARCHIVED,STATUS from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- ---------- --- ---------
1 1 1 52428800 1 NO CURRENT
2 1 0 52428800 1 YES UNUSED
3 1 0 52428800 1 YES UNUSED
Duplicate数据库已产生新的DBID(Standby数据库不会产生新的DBID)
SQL> select dbid,name,open_mode from v$database;
DBID NAME OPEN_MODE
---------- --------- --------------------
1291717905 ORCL READ WRITE