利用Rman的duplicate命令,可以很方便的将原库复制出一个新库,这在诸如data guard等应用中非常有用。但是在Oracle11g之前,执行duplicate要求首先对原库用rman进行备份,然后将备份复制到复制库,同时连接原库(做为target)和复制库(做为auxiliary),执行duplicate命令进行复制。在Oracle11g中推出的active database duplicate特性,则省略了进行rman备份的步骤,能够直接从原库复制出新库,对于一些大型的数据库来说,这个特性可以节省很多操作时间。本文将简单的演示一下操作过程(在同一个主机上执行duplicate):
原库:ora11g(归档模式)
新库:oradup
操作系统:windows
一、首先手工创建新的instance
包括windows服务,dump路径,初始化参数文件,password文件,监听配置等等,这些步骤就不赘述了。理论上,初始化参数最少只需要指定db_name一个参数就可以了。当然,简单起见,最好还是设置如下参数:
DB_NAME=ORADUP
CONTROL_FILES=(‘F:\ORACLE\ORADATA\ORADUP\CONTROL01.CTL’,
‘F:\ORACLE\ORADATA\ORADUP\CONTROL02.CTL’)
DB_FILE_NAME_CONVERT=(‘F:\ORACLE\ORADATA\ORA11G’,'F:\ORACLE\ORADATA\ORADUP’)
LOG_FILE_NAME_CONVERT=(‘F:\ORACLE\ORADATA\ORA11G’,'F:\ORACLE\ORADATA\ORADUP’)
log_archive_dest_1=F:\ORACLE\ARCH\ORADUP
compatible=11.1.0
经过试验,必须加入compatible=11.1.0的参数,如果不加,默认是compatible=11.0.0,那么rman duplicate最后在创建控制文件的时候会报错:
RMAN-03002: Duplicate Db 命令 (在 10/23/2007 22:43:40 上) 失败
RMAN-06136: 来自辅助数据库的 ORACLE 错误: ORA-01503: CREATE CONTROLFILE 失败
ORA-01130: 数据库文件版本 11.1.0.0.0 与 ORACLE 版本 11.0.0.0.0 不兼容
ORA-01110: 数据文件 1: ‘F:\ORACLE\ORADATA\ORADUP\SYSTEM01.DBF’
这个应该算是一个bug吧,11.0.0应该是beta版的版本号
加入log_archive_dest_1参数,则是因为最后需要复制原库的归档日志到备库,如果两个库都没有设置归档路径,那么都会放在默认的$ORACLE_HOME\rdbms目录下,就会发生冲突。当然,如果原库和新库在不同的主机上,则只需要db_name和compatible就足够了。
二、将oradup启动到nomount状态
C:\>set oracle_sid=oradup
C:\>sqlplus /nolog
SQL*Plus: Release 11.1.0.6.0 - Production on 星期二 10月 23 21:43:18 2007
Copyright (c) 1982, 2007, Oracle. All rights reserved.
SQL> conn / as sysdba
已连接到空闲例程。
SQL> startup nomount
ORACLE 例程已经启动。
三、启动rman,同时连接原库和新库
C:\>rman target sys/pass@ora11g auxiliary sys/pass@oradup
恢复管理器: Release 11.1.0.6.0 - Production on 星期二 10月 23 23:01:04 2007
Copyright (c) 1982, 2007, Oracle. All rights reserved.
连接到目标数据库: ORA11G (DBID=4032954551)
已连接到辅助数据库: ORADUP (未装载)
这里连接auxiliary库必须提供用户名和密码,采用os认证的话可以连接进去但是duplicate会出错,估计这个应该也是bug
RMAN-03002: Duplicate Db 命令 (在 10/23/2007 22:43:40 上) 失败
RMAN-06136: 来自辅助数据库的 ORACLE 错误: ORA-01503: CREATE CONTROLFILE 失败
ORA-01130: 数据库文件版本 11.1.0.0.0 与 ORACLE 版本 11.0.0.0.0 不兼容
ORA-01110: 数据文件 1: ‘F:\ORACLE\ORADATA\ORADUP\SYSTEM01.DBF’
四、执行duplicate
RMAN> duplicate target database to oradup
2> from active database;
启动 Duplicate Db 于 23-10月-07
使用目标数据库控制文件替代恢复目录
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: SID=99 设备类型=DISK
内存脚本的内容:
{
set newname for datafile 1 to
"F:\ORACLE\ORADATA\ORADUP\SYSTEM01.DBF";
set newname for datafile 2 to
"F:\ORACLE\ORADATA\ORADUP\SYSAUX01.DBF";
set newname for datafile 3 to
"F:\ORACLE\ORADATA\ORADUP\UNDOTBS01.DBF";
set newname for datafile 4 to
"F:\ORACLE\ORADATA\ORADUP\USERS01.DBF";
backup as copy reuse
datafile 1 auxiliary format
"F:\ORACLE\ORADATA\ORADUP\SYSTEM01.DBF" datafile
2 auxiliary format
"F:\ORACLE\ORADATA\ORADUP\SYSAUX01.DBF" datafile
3 auxiliary format
"F:\ORACLE\ORADATA\ORADUP\UNDOTBS01.DBF" datafile
4 auxiliary format
"F:\ORACLE\ORADATA\ORADUP\USERS01.DBF" ;
sql 'alter system archive log current';
}
正在执行内存脚本
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
正在执行命令: SET NEWNAME
启动 backup 于 23-10月-07
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=138 设备类型=DISK
通道 ORA_DISK_1: 启动数据文件副本
输入数据文件: 文件号=00001 名称=F:\ORACLE\ORADATA\ORA11G\SYSTEM01.DBF
输出文件名=F:\ORACLE\ORADATA\ORADUP\SYSTEM01.DBF 标记=TAG20071023T230115 RECID=0 STAMP=0
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:35
通道 ORA_DISK_1: 启动数据文件副本
输入数据文件: 文件号=00002 名称=F:\ORACLE\ORADATA\ORA11G\SYSAUX01.DBF
输出文件名=F:\ORACLE\ORADATA\ORADUP\SYSAUX01.DBF 标记=TAG20071023T230115 RECID=0 STAMP=0
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:15
通道 ORA_DISK_1: 启动数据文件副本
输入数据文件: 文件号=00003 名称=F:\ORACLE\ORADATA\ORA11G\UNDOTBS01.DBF
输出文件名=F:\ORACLE\ORADATA\ORADUP\UNDOTBS01.DBF 标记=TAG20071023T230115 RECID=0 STAMP=0
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:15
通道 ORA_DISK_1: 启动数据文件副本
输入数据文件: 文件号=00004 名称=F:\ORACLE\ORADATA\ORA11G\USERS01.DBF
输出文件名=F:\ORACLE\ORADATA\ORADUP\USERS01.DBF 标记=TAG20071023T230115 RECID=0 STAMP=0
通道 ORA_DISK_1: 数据文件复制完毕, 经过时间: 00:00:01
完成 backup 于 23-10月-07
sql 语句: alter system archive log current
sql 语句: CREATE CONTROLFILE REUSE SET DATABASE "ORADUP" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ( 'F:\ORACLE\ORADATA\ORADUP\REDO01.LOG' ) SIZE 5 M REUSE,
GROUP 2 ( 'F:\ORACLE\ORADATA\ORADUP\REDO02.LOG' ) SIZE 5 M REUSE,
GROUP 3 ( 'F:\ORACLE\ORADATA\ORADUP\REDO03.LOG' ) SIZE 5 M REUSE
DATAFILE
'F:\ORACLE\ORADATA\ORADUP\SYSTEM01.DBF'
CHARACTER SET ZHS16GBK
内存脚本的内容:
{
backup as copy reuse
archivelog like "F:\ORACLE\PRODUCT\11.1.0\DB_1\RDBMS\ARC00122_0636754423.001" auxiliary format
"F:\ORACLE\ARCH\ORADUP\ARC00122_0636754423.001" ;
catalog clone archivelog "F:\ORACLE\ARCH\ORADUP\ARC00122_0636754423.001";
switch clone datafile all;
}
正在执行内存脚本
启动 backup 于 23-10月-07
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在开始复制归档日志
输入归档日志线程=1 序列=122 RECID=6 STAMP=636764560
输出文件名=F:\ORACLE\ARCH\ORADUP\ARC00122_0636754423.001 RECID=0 STAMP=0
通道 ORA_DISK_1: 归档日志复制完成, 经过时间: 00:00:01
完成 backup 于 23-10月-07
已编目的归档日志
归档日志文件名=F:\ORACLE\ARCH\ORADUP\ARC00122_0636754423.001 RECID=1 STAMP=636764566
数据文件 2 已转换成数据文件副本
输入数据文件副本 RECID=1 STAMP=636764566 文件名=F:\ORACLE\ORADATA\ORADUP\SYSAUX01.DBF
数据文件 3 已转换成数据文件副本
输入数据文件副本 RECID=2 STAMP=636764567 文件名=F:\ORACLE\ORADATA\ORADUP\UNDOTBS01.DBF
数据文件 4 已转换成数据文件副本
输入数据文件副本 RECID=3 STAMP=636764567 文件名=F:\ORACLE\ORADATA\ORADUP\USERS01.DBF
内存脚本的内容:
{
set until scn 208584;
recover
clone database
delete archivelog
;
}
正在执行内存脚本
正在执行命令: SET until clause
启动 recover 于 23-10月-07
使用通道 ORA_AUX_DISK_1
正在开始介质的恢复
线程 1 序列 122 的归档日志已作为文件 F:\ORACLE\ARCH\ORADUP\ARC00122_0636754423.001 存在于磁盘上
归档日志文件名=F:\ORACLE\ARCH\ORADUP\ARC00122_0636754423.001 线程=1 序列=122
介质恢复完成, 用时: 00:00:00
完成 recover 于 23-10月-07
内存脚本的内容:
{
shutdown clone immediate;
startup clone nomount ;
}
正在执行内存脚本
数据库已卸装
Oracle 实例已关闭
已连接到辅助数据库 (未启动)
Oracle 实例已启动
系统全局区域总计 146472960 字节
Fixed Size 1331740 字节
Variable Size 92278244 字节
Database Buffers 50331648 字节
Redo Buffers 2531328 字节
sql 语句: CREATE CONTROLFILE REUSE SET DATABASE "ORADUP" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ( 'F:\ORACLE\ORADATA\ORADUP\REDO01.LOG' ) SIZE 5 M REUSE,
GROUP 2 ( 'F:\ORACLE\ORADATA\ORADUP\REDO02.LOG' ) SIZE 5 M REUSE,
GROUP 3 ( 'F:\ORACLE\ORADATA\ORADUP\REDO03.LOG' ) SIZE 5 M REUSE
DATAFILE
'F:\ORACLE\ORADATA\ORADUP\SYSTEM01.DBF'
CHARACTER SET ZHS16GBK
内存脚本的内容:
{
set newname for tempfile 1 to
"F:\ORACLE\ORADATA\ORADUP\TEMP01.DBF";
switch clone tempfile all;
catalog clone datafilecopy "F:\ORACLE\ORADATA\ORADUP\SYSAUX01.DBF";
catalog clone datafilecopy "F:\ORACLE\ORADATA\ORADUP\UNDOTBS01.DBF";
catalog clone datafilecopy "F:\ORACLE\ORADATA\ORADUP\USERS01.DBF";
switch clone datafile all;
}
正在执行内存脚本
正在执行命令: SET NEWNAME
临时文件 1 在控制文件中已重命名为 F:\ORACLE\ORADATA\ORADUP\TEMP01.DBF
已将数据文件副本列入目录
数据文件副本文件名=F:\ORACLE\ORADATA\ORADUP\SYSAUX01.DBF RECID=1 STAMP=636764585
已将数据文件副本列入目录
数据文件副本文件名=F:\ORACLE\ORADATA\ORADUP\UNDOTBS01.DBF RECID=2 STAMP=636764585
已将数据文件副本列入目录
数据文件副本文件名=F:\ORACLE\ORADATA\ORADUP\USERS01.DBF RECID=3 STAMP=636764585
数据文件 2 已转换成数据文件副本
输入数据文件副本 RECID=1 STAMP=636764585 文件名=F:\ORACLE\ORADATA\ORADUP\SYSAUX01.DBF
数据文件 3 已转换成数据文件副本
输入数据文件副本 RECID=2 STAMP=636764585 文件名=F:\ORACLE\ORADATA\ORADUP\UNDOTBS01.DBF
数据文件 4 已转换成数据文件副本
输入数据文件副本 RECID=3 STAMP=636764585 文件名=F:\ORACLE\ORADATA\ORADUP\USERS01.DBF
内存脚本的内容:
{
Alter clone database open resetlogs;
}
正在执行内存脚本
数据库已打开
完成 Duplicate Db 于 23-10月-07
五、检查新库状态
C:\>set oracle_sid=oradup
C:\>sqlplus /nolog
SQL*Plus: Release 11.1.0.6.0 - Production on 星期二 10月 23 23:04:30 2007
Copyright (c) 1982, 2007, Oracle. All rights reserved.
SQL> conn / as sysdba
已连接。
SQL> select instance_name,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
oradup OPEN
这种方式确实比较快捷方便,但是我在测试过程中碰到了很多的问题,一方面可能因为我没有做很好的准备,只是一个即兴的测试,但这个新东西确实问题也不少,要到实用的阶段估计还需要打几个补丁了。