使用rman duplicate创建复制数据库是非常方便的,但是也有很多的让人容易误解的地方。我在网上也看了很多个别人写的 文章,发现使用的方法都是一样的,但是我使用同样的方法实验时,无论如何都不能成功,看来我的理解能力太差劲了,但是我可以使用其它的方法完成我的实验。
1,当复制数据库为nomout状态时,监听的状态如下:
[oracle@redhat6 tmp]$ lsnrctl status

LSNRCTL for Linux: Version 10.2.0.5.0 - Production on 30-12月-2010 21:13:39

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=redhat6)(PORT=1521)))
LISTENER 的 STATUS
------------------------
别名                      LISTENER
版本                      TNSLSNR for Linux: Version 10.2.0.5.0 - Production
启动日期                  30-12月-2010 20:18:40
正常运行时间              0 天 0 小时 54 分 59 秒
跟踪级别                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
监听程序参数文件          /u01/soft/product/10.2.0/db_1/network/admin/listener.ora
监听程序日志文件          /u01/soft/product/10.2.0/db_1/network/log/listener.log
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=redhat6)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "demo" 包含 1 个例程。
例程 "demo", 状态 BLOCKED, 包含此服务的 1 个处理程序...
服务 "demo_XPT" 包含 1 个例程。
例程 "demo", 状态 BLOCKED, 包含此服务的 1 个处理程序...
命令执行成功
以上是我看到的,当监听的状态为blocked时,我通过rman target sys/sys@gbk auxiliary sys/sys@demo是连接不了复制数据库的,报错如下:
[oracle@redhat6 tmp]$ rman target sys/sys@gbk auxiliary sys/sys@demo

恢复管理器: Release 10.2.0.5.0 - Production on 星期四 12月 30 21:21:24 2010

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

连接到目标数据库: GBK (DBID=1872796505)
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00554: 内部恢复管理器程序包初始化失败
RMAN-04006: 来自辅助数据库的错误: ORA-12528: TNS: 监听程序: 所有适用例程都无法建立新连接

但是这样连接却是可以的rman target sys/sys@gbk auxiliary /
[oracle@redhat6 tmp]$ rman target sys/sys@gbk auxiliary /

恢复管理器: Release 10.2.0.5.0 - Production on 星期四 12月 30 21:22:17 2010

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

连接到目标数据库: GBK (DBID=1872796505)
已连接到辅助数据库: DEMO (未装载)

RMAN>

2,run命令集执行recover失败后,可以通过resetlogs方式打开数据库。
run命令集执行报错如下:
内存脚本的内容:
{
set until scn  420273;
recover
clone database
delete archivelog
;
}
正在执行内存脚本

正在执行命令: SET until clause

启动 recover 于 30-12月-10
使用通道 ORA_AUX_DISK_1
MAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: Duplicate Db 命令 (在 12/30/2010 20:54:08 上) 失败
RMAN-03015: 在存储的脚本Memory Script中出现错误
RMAN-06136: 来自辅助数据库的 ORACLE 错误: RMAN-20021: 数据库尚未设置
RMAN-06031: 无法转换数据库关键字

应该是介质恢复失败了,需要重新执行介质恢复,但是我直接使用resetlogs命令打开了数据库,甚是不解。
SQL>alter database open resetlogs;

数据库已更改。

3,成功的创建复制数据库的过程是这样的,在备用机器上创建监听,必要的目录、参数文件,然后启动数据库到nomout模式,rman target sys/sys@gbk auxiliary /同时连接两个数据库,在rman模式下执行
run {
set newname for datafile 1 to '/u01/soft/oradata/standby/system01.dbf';
set newname for datafile 2 to '/u01/soft/oradata/standby/undotbs01.dbf';
set newname for datafile 3 to '/u01/soft/oradata/standby/sysaux01.dbf';
set newname for datafile 4 to '/u01/soft/oradata/standby/users01.dbf';
duplicate target database to demo nofilenamecheck logfile
'/u01/soft/oradata/standby/redo01.log' size 50m,
'/u01/soft/oradata/standby/redo02.log' size 50m,
'/u01/soft/oradata/standby/redo03.log' size 50m;
}

恢复显示内容如下:

RMAN> run {
2> set newname for datafile 1 to '/u01/soft/oradata/standby/system01.dbf';
3> set newname for datafile 2 to '/u01/soft/oradata/standby/undotbs01.dbf';
4> set newname for datafile 3 to '/u01/soft/oradata/standby/sysaux01.dbf';
5> set newname for datafile 4 to '/u01/soft/oradata/standby/users01.dbf';
6> duplicate target database to demo nofilenamecheck logfile
7> '/u01/soft/oradata/standby/redo01.log' size 50m,
8> '/u01/soft/oradata/standby/redo02.log' size 50m,
9> '/u01/soft/oradata/standby/redo03.log' size 50m;
10> }

正在执行命令: SET NEWNAME

使用目标数据库控制文件替代恢复目录

正在执行命令: SET NEWNAME

正在执行命令: SET NEWNAME

正在执行命令: SET NEWNAME

启动 Duplicate Db 于 30-12月-10
分配的通道: ORA_AUX_DISK_1
通道 ORA_AUX_DISK_1: sid=155 devtype=DISK

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

正在执行命令: SET until clause

正在执行命令: SET NEWNAME

正在执行命令: SET NEWNAME

正在执行命令: SET NEWNAME

正在执行命令: SET NEWNAME

启动 restore 于 30-12月-10
使用通道 ORA_AUX_DISK_1

通道 ORA_AUX_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_AUX_DISK_1: 正在指定从备份集还原的数据文件
正将数据文件00001还原到/u01/soft/oradata/standby/system01.dbf
正将数据文件00002还原到/u01/soft/oradata/standby/undotbs01.dbf
正将数据文件00003还原到/u01/soft/oradata/standby/sysaux01.dbf
正将数据文件00004还原到/u01/soft/oradata/standby/users01.dbf
通道 ORA_AUX_DISK_1: 正在读取备份片段 /app/oracle/flash_recovery_area/GBK/backupset/2011_01_05/o1_mf_nnndf_TAG20110105T145212_6l858y89_.bkp
通道 ORA_AUX_DISK_1: 已还原备份片段 1
段句柄 = /app/oracle/flash_recovery_area/GBK/backupset/2011_01_05/o1_mf_nnndf_TAG20110105T145212_6l858y89_.bkp 标记 = TAG20110105T145212
通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:35
完成 restore 于 30-12月-10
sql 语句: CREATE CONTROLFILE REUSE SET DATABASE "DEMO" RESETLOGS ARCHIVELOG
MAXLOGFILES     16
MAXLOGMEMBERS      3
MAXDATAFILES      100
MAXINSTANCES     8
MAXLOGHISTORY      292
LOGFILE
GROUP  1 '/u01/soft/oradata/standby/redo01.log' SIZE 50 M ,
GROUP  2 '/u01/soft/oradata/standby/redo02.log' SIZE 50 M ,
GROUP  3 '/u01/soft/oradata/standby/redo03.log' SIZE 50 M
DATAFILE
'/u01/soft/oradata/standby/system01.dbf'
CHARACTER SET ZHS16GBK

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

数据文件 2 已转换成数据文件副本
输入数据文件副本 recid=1 stamp=739141659 文件名=/u01/soft/oradata/standby/undotbs01.dbf
数据文件 3 已转换成数据文件副本
输入数据文件副本 recid=2 stamp=739141659 文件名=/u01/soft/oradata/standby/sysaux01.dbf
数据文件 4 已转换成数据文件副本
输入数据文件副本 recid=3 stamp=739141659 文件名=/u01/soft/oradata/standby/users01.dbf

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

正在执行命令: SET until clause

启动 recover 于 30-12月-10
使用通道 ORA_AUX_DISK_1

正在开始介质的恢复

通道 ORA_AUX_DISK_1: 正在启动到默认目标的存档日志恢复
通道 ORA_AUX_DISK_1: 正在恢复存档日志
存档日志线程 =1 序列=4
通道 ORA_AUX_DISK_1: 正在读取备份片段 /tmp/GBK_4.bak
通道 ORA_AUX_DISK_1: 已还原备份片段 1
段句柄 = /tmp/GBK_4.bak 标记 = TAG20110105T145502
通道 ORA_AUX_DISK_1: 还原完成, 用时: 00:00:01
存档日志文件名 =/u01/soft/flash_recovery_area/DEMO/archivelog/2010_12_30/o1_mf_1_4_6ks10ws5_.arc 线程 =1 序列 =4
通道 clone_default: 正在删除存档日志
存档日志文件名 =/u01/soft/flash_recovery_area/DEMO/archivelog/2010_12_30/o1_mf_1_4_6ks10ws5_.arc 记录 ID=2 时间戳 =739141660
介质恢复完成, 用时: 00:00:01
完成 recover 于 30-12月-10

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

数据库已卸装
Oracle 实例已关闭

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

系统全局区域总计     209715200 字节

Fixed Size                     1272840 字节
Variable Size                 75498488 字节
Database Buffers             130023424 字节
Redo Buffers                   2920448 字节
sql 语句: CREATE CONTROLFILE REUSE SET DATABASE "DEMO" RESETLOGS ARCHIVELOG
MAXLOGFILES     16
MAXLOGMEMBERS      3
MAXDATAFILES      100
MAXINSTANCES     8
MAXLOGHISTORY      292
LOGFILE
GROUP  1 '/u01/soft/oradata/standby/redo01.log' SIZE 50 M ,
GROUP  2 '/u01/soft/oradata/standby/redo02.log' SIZE 50 M ,
GROUP  3 '/u01/soft/oradata/standby/redo03.log' SIZE 50 M
DATAFILE
'/u01/soft/oradata/standby/system01.dbf'
CHARACTER SET ZHS16GBK

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

正在执行命令: SET NEWNAME

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

已将数据文件副本列入目录
数据文件副本 filename=/u01/soft/oradata/standby/undotbs01.dbf recid=1 stamp=739141731

已将数据文件副本列入目录
数据文件副本 filename=/u01/soft/oradata/standby/sysaux01.dbf recid=2 stamp=739141731

已将数据文件副本列入目录
数据文件副本 filename=/u01/soft/oradata/standby/users01.dbf recid=3 stamp=739141731

数据文件 2 已转换成数据文件副本
输入数据文件副本 recid=1 stamp=739141731 文件名=/u01/soft/oradata/standby/undotbs01.dbf
数据文件 3 已转换成数据文件副本
输入数据文件副本 recid=2 stamp=739141731 文件名=/u01/soft/oradata/standby/sysaux01.dbf
数据文件 4 已转换成数据文件副本
输入数据文件副本 recid=3 stamp=739141731 文件名=/u01/soft/oradata/standby/users01.dbf

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

数据库已打开
完成 Duplicate Db 于 30-12月-10