利用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

这种方式确实比较快捷方便,但是我在测试过程中碰到了很多的问题,一方面可能因为我没有做很好的准备,只是一个即兴的测试,但这个新东西确实问题也不少,要到实用的阶段估计还需要打几个补丁了。