1. 克隆场景说明

本次实战基于 Oracle 11g 11.2.0.4 版本,需将 172.21.204.201(源端)的 rkhy 实例通过 RMAN duplicate 命令克隆到 172.21.204.200(目标端);目标端已预装同配置 Oracle 实例(SID / 目录 / 环境变量与源端一致),且两端均开启归档、监听 /hosts 配置正常。

1.1. 开启归档

SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /data/u02/rkhy/archivelog
Oldest online log sequence     1
Next log sequence to archive   1
Current log sequence           1
SQL> 

1.2. 监听 /hosts 配置正常

[oracle@zb-yunweitest-mysql-204-201 admin]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

172.21.204.200 zb-yunweitest-mysql-204-200
172.21.204.201 zb-yunweitest-mysql-204-201

2. 克隆过程核心错误汇总与解决方案

2.1.错误 1:RMAN-06024: no backup or copy of the control file found to restore

错误现象

执行 duplicate target database to rkhy nofilenamecheck; 时,RMAN 提示找不到控制文件备份,克隆中断。

根因分析

Oracle 11g 的 duplicate 命令默认采用 “基于备份的克隆” 模式,会优先查找源端 RMAN 备份集;若未提前备份源库,且未指定 from active database,则会触发此错误(11g 需显式指定活动数据库克隆)。

解决方案

在克隆命令中添加 from active database 参数,指定 “活动数据库克隆”(无需源端备份,直接从运行中的源库克隆):
duplicate target database to rkhy 
from active database 
nofilenamecheck;

避坑要点

  • Oracle 11g 活动数据库克隆必须显式添加 from active database,12c+ 版本可省略,但 11g 无此兼容逻辑;
  • 切勿省略该参数直接执行克隆,否则必触发控制文件备份缺失错误。

2.2.错误 2:Segmentation fault(段错误)+ rman crashed

错误现象

执行克隆命令时,RMAN 进程触发 Segmentation fault 崩溃,日志提示 rlwrap: warning: rman crashed, killed by SIGSEGV

根因分析

  • 表层原因:rlwrap 工具(命令行增强工具)与 11g RMAN 交互时触发内存异常;
  • 底层原因:Oracle 11.2.0.4 版本 RMAN 存在已知 BUG(如 BUG 19074702),活动数据库克隆阶段处理控制文件时易触发段错误。

解决方案

  • 第一步:移除 rlwrap 干扰,直接执行 rman 命令(而非 rlwrap rman);
  • 第二步:若仍报错,可先手动备份源端控制文件,规避 BUG 触发逻辑:
    # 源端执行
    rman target /
    backup current controlfile format '/tmp/rkhy_ctl.bak';
    exit;

避坑要点

  • 生产环境执行 11g RMAN 命令时,避免使用 rlwrap 封装,减少进程交互异常;
  • 11.2.0.4 版本优先选择 “基于备份的本地克隆”(后文步骤),规避活动数据库克隆的 BUG 风险。

2.3.错误 3:RMAN-06034: at least 1 channel must be allocated to execute this command

错误现象

手动分配辅助通道后执行克隆,RMAN 提示 “至少需分配 1 个通道”,但实际已分配通道。

根因分析

11g RMAN 执行 duplicate 时会自动生成 Memory Script(内存脚本),脚本执行阶段会释放手动分配的通道,导致后续操作无可用通道,触发此错误。

解决方案

放弃手动分配通道,直接执行简化版克隆命令(依赖 RMAN 自动分配通道):
duplicate target database to rkhy 
from active database 
nofilenamecheck;

避坑要点

  • 11g 活动数据库克隆无需手动分配 auxiliary channel,依赖 RMAN 自动分配即可;
  • 手动分配通道易与自动内存脚本冲突,增加报错概率。

2.4.错误 4:ORA-17629 + ORA-01017: invalid username/password; logon denied

错误现象

克隆过程中提示 “无法连接远程数据库”“用户名 / 密码无效”,远程 sysdba 认证失败。

根因分析

活动数据库克隆时,源端需以 sysdba 身份远程连接目标端辅助实例,若目标端 orapw<SID> 密码文件与源端 sys 密码不一致,会触发认证失败。

解决方案

  • 第一步:将源端密码文件直接复制到目标端对应目录(推荐):
    # 源端执行
    scp $ORACLE_HOME/dbs/orapwrkhy oracle@172.21.204.200:$ORACLE_HOME/dbs/
  • 第二步:若复制失败,目标端重建密码文件(与源端 sys 密码一致):
    # 目标端执行
    orapwd file=$ORACLE_HOME/dbs/orapwrkhy password=源端sys密码 entries=10 force=y
  • 第三步:验证目标端远程登录参数:
    # 目标端执行
    sqlplus / as sysdba
    show parameter remote_login_passwordfile; -- 需返回 EXCLUSIVE/SHARED
    alter system set remote_login_passwordfile=EXCLUSIVE scope=spfile;

避坑要点

  • 密码文件是 sysdba 远程认证的核心,目标端密码文件必须与源端 sys 密码完全一致(包括大小写);
  • 克隆前务必验证源端可远程登录目标端:sqlplus sys/密码@目标端TNS as sysdba,避免认证错误。

2.5.错误 5:ORA-00344 + Linux Error 2: No such file or directory

错误现象

克隆最后阶段提示 “无法重建在线日志”,Linux 系统返回 “无此文件或目录”。

根因分析

克隆命令中指定的重做日志(redo log)存储目录在目标端不存在,Oracle 无法创建日志文件,导致 alter database open resetlogs 失败。

解决方案

在目标端创建缺失的重做日志目录,并设置正确权限:
# 目标端执行
mkdir -p /data/oradata/rkhy  # 与克隆命令中日志路径一致
chown -R oracle:oinstall /data/oradata/rkhy
chmod -R 775 /data/oradata/rkhy

避坑要点

  • 克隆前需提前验证目标端所有文件路径(数据文件 / 日志文件 / 控制文件)均存在,避免 “文件不存在” 类错误;
  • 若克隆命令显式指定 logfile 参数,需确保参数中所有路径在目标端已创建。

3. Oracle 11g RMAN 活动数据库克隆正确步骤(简洁稳定版)

3.1.前置准备

  1. 源端 / 目标端 1521 端口互通,Oracle 用户 ssh 免密互信(可选);
  2. 目标端重建 / 复制密码文件(与源端 sys 密码一致);
    # 源端将密码文件复制到目标端:
    [
    oracle@zb-yunweitest-mysql-204-201 dbs]$ scp orapwrkhy zb-yunweitest-mysql-204-200:/data/u01/app/oracle/product/11.2.0.4/db_1/dbs oracle@zb-yunweitest-mysql-204-200's password: orapwrkhy 100% 1536 1.5KB/s 00:00 [oracle@zb-yunweitest-mysql-204-201 dbs]$
  3. 目标端关闭实例,并使用pfile启动到nomount状态:
    [oracle@zb-yunweitest-mysql-204-200 admin]$ sqlplus / as sysdba
    
    SQL*Plus: Release 11.2.0.4.0 Production on Tue Jan 27 17:33:27 2026
    
    Copyright (c) 1982, 2013, Oracle.  All rights reserved.
    
    Connected to an idle instance.
    
    SQL> startup nomount pfile='/data/u01/app/oracle/product/11.2.0.4/db_1/dbs/initrkhy.ora';
    ORACLE instance started.
    
    Total System Global Area 2137886720 bytes
    Fixed Size                  2254952 bytes
    Variable Size             687867800 bytes
    Database Buffers         1442840576 bytes
    Redo Buffers                4923392 bytes
    SQL> exit
    Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    [oracle@zb-yunweitest-mysql-204-200 admin]$ 
  4. 目标端创建所有必要目录(数据文件 / 日志文件 / 控制文件目录)。
  5. 源端添加目标端的TNS解析:RKHY_TARGET_200 ,并 lsnrctl reload(可选)
[oracle@zb-yunweitest-mysql-204-201 admin]$ cat tnsnames.ora 
# tnsnames.ora Network Configuration File: /data/u01/app/oracle/product/11.2.0.4/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

RKHY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = zb-yunweitest-mysql-204-201)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = rkhy)
    )
  )



RKHY_TARGET_200 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = zb-yunweitest-mysql-204-200)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = rkhy)
      (INSTANCE_NAME = rkhy)
    )
  )
[oracle@zb-yunweitest-mysql-204-201 admin]$ 
[oracle@zb-yunweitest-mysql-204-201 admin]$ lsnrctl reload

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 16-JAN-2026 11:19:38

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=zb-yunweitest-mysql-204-201)(PORT=1521)))
The command completed successfully
[oracle@zb-yunweitest-mysql-204-201 admin]$ 

3.2.克隆执行

# 源端执行
rman target / auxiliary sys/密码@目标端TNS

# RMAN 交互界面执行
duplicate target database to rkhy 
from active database 
nofilenamecheck;
[oracle@zb-yunweitest-mysql-204-201 dbs]$ rman target / auxiliary sys/oracle@RKHY_TARGET_200

Recovery Manager: Release 11.2.0.4.0 - Production on Tue Jan 27 17:33:57 2026

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

connected to target database: RKHY (DBID=1740157838)
connected to auxiliary database: RKHY (not mounted)

RMAN> duplicate target database to rkhy 
2> from active database 
3> nofilenamecheck;

Starting Duplicate Db at 27-JAN-26
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=488 device type=DISK

contents of Memory Script:
{
   sql clone "create spfile from memory";
}
executing Memory Script

sql statement: create spfile from memory

contents of Memory Script:
{
   shutdown clone immediate;
   startup clone nomount;
}
executing Memory Script

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area    2137886720 bytes

Fixed Size                     2254952 bytes
Variable Size                704645016 bytes
Database Buffers            1426063360 bytes
Redo Buffers                   4923392 bytes

contents of Memory Script:
{
   sql clone "alter system set  db_name = 
 ''RKHY'' comment=
 ''Modified by RMAN duplicate'' scope=spfile";
   sql clone "alter system set  db_unique_name = 
 ''RKHY'' comment=
 ''Modified by RMAN duplicate'' scope=spfile";
   shutdown clone immediate;
   startup clone force nomount
   backup as copy current controlfile auxiliary format  '/data/u02/rkhy/oradata/control01.ctl';
   restore clone controlfile to  '/data/u01/app/oracle/fast_recovery_area/rkhy/control02.ctl' from 
 '/data/u02/rkhy/oradata/control01.ctl';
   alter clone database mount;
}
executing Memory Script

sql statement: alter system set  db_name =  ''RKHY'' comment= ''Modified by RMAN duplicate'' scope=spfile

sql statement: alter system set  db_unique_name =  ''RKHY'' comment= ''Modified by RMAN duplicate'' scope=spfile

Oracle instance shut down

Oracle instance started

Total System Global Area    2137886720 bytes

Fixed Size                     2254952 bytes
Variable Size                704645016 bytes
Database Buffers            1426063360 bytes
Redo Buffers                   4923392 bytes

Starting backup at 27-JAN-26
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=685 device type=DISK
channel ORA_DISK_1: starting datafile copy
copying current control file
output file name=/data/u01/app/oracle/product/11.2.0.4/db_1/dbs/snapcf_rkhy.f tag=TAG20260127T173421 RECID=1 STAMP=1223660061
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 27-JAN-26

Starting restore at 27-JAN-26
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=488 device type=DISK

channel ORA_AUX_DISK_1: copied control file copy
Finished restore at 27-JAN-26

database mounted

contents of Memory Script:
{
   set newname for datafile  1 to 
 "/data/u02/rkhy/oradata/system01.dbf";
   set newname for datafile  2 to 
 "/data/u02/rkhy/oradata/sysaux01.dbf";
   set newname for datafile  3 to 
 "/data/u02/rkhy/oradata/undotbs01.dbf";
   set newname for datafile  4 to 
 "/data/u02/rkhy/oradata/users01.dbf";
   backup as copy reuse
   datafile  1 auxiliary format 
 "/data/u02/rkhy/oradata/system01.dbf"   datafile 
 2 auxiliary format 
 "/data/u02/rkhy/oradata/sysaux01.dbf"   datafile 
 3 auxiliary format 
 "/data/u02/rkhy/oradata/undotbs01.dbf"   datafile 
 4 auxiliary format 
 "/data/u02/rkhy/oradata/users01.dbf"   ;
   sql 'alter system archive log current';
}
executing Memory Script

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting backup at 27-JAN-26
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00001 name=/data/u02/rkhy/oradata/system01.dbf
output file name=/data/u02/rkhy/oradata/system01.dbf tag=TAG20260127T173428
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:15
channel ORA_DISK_1: starting datafile copy
input datafile file number=00002 name=/data/u02/rkhy/oradata/sysaux01.dbf
output file name=/data/u02/rkhy/oradata/sysaux01.dbf tag=TAG20260127T173428
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:07
channel ORA_DISK_1: starting datafile copy
input datafile file number=00003 name=/data/u02/rkhy/oradata/undotbs01.dbf
output file name=/data/u02/rkhy/oradata/undotbs01.dbf tag=TAG20260127T173428
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
channel ORA_DISK_1: starting datafile copy
input datafile file number=00004 name=/data/u02/rkhy/oradata/users01.dbf
output file name=/data/u02/rkhy/oradata/users01.dbf tag=TAG20260127T173428
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 27-JAN-26

sql statement: alter system archive log current

contents of Memory Script:
{
   backup as copy reuse
   archivelog like  "/data/u02/rkhy/archivelog/1_8_1223652304.dbf" auxiliary format 
 "/data/u02/rkhy/archivelog/1_8_1223652304.dbf"   ;
   catalog clone archivelog  "/data/u02/rkhy/archivelog/1_8_1223652304.dbf";
   switch clone datafile all;
}
executing Memory Script

Starting backup at 27-JAN-26
using channel ORA_DISK_1
channel ORA_DISK_1: starting archived log copy
input archived log thread=1 sequence=8 RECID=4 STAMP=1223660092
output file name=/data/u02/rkhy/archivelog/1_8_1223652304.dbf RECID=0 STAMP=0
channel ORA_DISK_1: archived log copy complete, elapsed time: 00:00:01
Finished backup at 27-JAN-26

cataloged archived log
archived log file name=/data/u02/rkhy/archivelog/1_8_1223652304.dbf RECID=4 STAMP=1223660079

datafile 1 switched to datafile copy
input datafile copy RECID=1 STAMP=1223660079 file name=/data/u02/rkhy/oradata/system01.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=2 STAMP=1223660079 file name=/data/u02/rkhy/oradata/sysaux01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=3 STAMP=1223660079 file name=/data/u02/rkhy/oradata/undotbs01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=4 STAMP=1223660079 file name=/data/u02/rkhy/oradata/users01.dbf

contents of Memory Script:
{
   set until scn  970565;
   recover
   clone database
    delete archivelog
   ;
}
executing Memory Script

executing command: SET until clause

Starting recover at 27-JAN-26
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 8 is already on disk as file /data/u02/rkhy/archivelog/1_8_1223652304.dbf
archived log file name=/data/u02/rkhy/archivelog/1_8_1223652304.dbf thread=1 sequence=8
media recovery complete, elapsed time: 00:00:01
Finished recover at 27-JAN-26
Oracle instance started

Total System Global Area    2137886720 bytes

Fixed Size                     2254952 bytes
Variable Size                704645016 bytes
Database Buffers            1426063360 bytes
Redo Buffers                   4923392 bytes

contents of Memory Script:
{
   sql clone "alter system set  db_name = 
 ''RKHY'' 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;
}
executing Memory Script

sql statement: alter system set  db_name =  ''RKHY'' comment= ''Reset to original value by RMAN'' scope=spfile

sql statement: alter system reset  db_unique_name scope=spfile

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area    2137886720 bytes

Fixed Size                     2254952 bytes
Variable Size                704645016 bytes
Database Buffers            1426063360 bytes
Redo Buffers                   4923392 bytes
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "RKHY" RESETLOGS ARCHIVELOG 
  MAXLOGFILES     16
  MAXLOGMEMBERS      3
  MAXDATAFILES      100
  MAXINSTANCES     8
  MAXLOGHISTORY      292
 LOGFILE
  GROUP   1  SIZE 50 M ,
  GROUP   2  SIZE 50 M ,
  GROUP   3  SIZE 50 M 
 DATAFILE
  '/data/u02/rkhy/oradata/system01.dbf'
 CHARACTER SET ZHS16GBK


contents of Memory Script:
{
   set newname for tempfile  1 to 
 "/data/u02/rkhy/oradata/temp01.dbf";
   switch clone tempfile all;
   catalog clone datafilecopy  "/data/u02/rkhy/oradata/sysaux01.dbf", 
 "/data/u02/rkhy/oradata/undotbs01.dbf", 
 "/data/u02/rkhy/oradata/users01.dbf";
   switch clone datafile all;
}
executing Memory Script

executing command: SET NEWNAME

renamed tempfile 1 to /data/u02/rkhy/oradata/temp01.dbf in control file

cataloged datafile copy
datafile copy file name=/data/u02/rkhy/oradata/sysaux01.dbf RECID=1 STAMP=1223660090
cataloged datafile copy
datafile copy file name=/data/u02/rkhy/oradata/undotbs01.dbf RECID=2 STAMP=1223660090
cataloged datafile copy
datafile copy file name=/data/u02/rkhy/oradata/users01.dbf RECID=3 STAMP=1223660090

datafile 2 switched to datafile copy
input datafile copy RECID=1 STAMP=1223660090 file name=/data/u02/rkhy/oradata/sysaux01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=2 STAMP=1223660090 file name=/data/u02/rkhy/oradata/undotbs01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=3 STAMP=1223660090 file name=/data/u02/rkhy/oradata/users01.dbf

contents of Memory Script:
{
   Alter clone database open resetlogs;
}
executing Memory Script

database opened
Finished Duplicate Db at 27-JAN-26

RMAN> 
View Code

3.3.克隆验证

# 目标端执行
sqlplus / as sysdba
select instance_name, status from v$instance; -- 需返回 OPEN
select name, status from v$datafile; -- 所有数据文件 ONLINE
select member from v$logfile; -- 重做日志正常创建

4. 关键避坑总结

  1. 版本特性:11g 活动数据库克隆必须加 from active database,避免控制文件备份缺失错误;
  2. 环境干扰:禁用 rlwrap 工具,减少 RMAN 进程崩溃风险;
  3. 认证核心:目标端密码文件与源端 sys 密码一致,提前验证远程登录;
  4. 路径检查:克隆前确保目标端所有文件路径存在且权限正确;
  5. 方案选择:11.2.0.4 版本优先选择 “基于备份的本地克隆”(备份源库→拷贝备份→目标端本地恢复),规避活动数据库克隆的 BUG 风险。
 
文章中加入克隆过程中使用的命令及参数说明
写一篇关于Oracle数据库备份与恢复的文章
如何避免Oracle数据库克隆过程中的错误?
 
 posted on 2026-01-16 11:22  xibuhaohao  阅读(3)  评论(0)    收藏  举报