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.前置准备
- 源端 / 目标端 1521 端口互通,Oracle 用户 ssh 免密互信(可选);
- 目标端重建 / 复制密码文件(与源端 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]$ - 目标端关闭实例,并使用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]$
- 目标端创建所有必要目录(数据文件 / 日志文件 / 控制文件目录)。
- 源端添加目标端的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>
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. 关键避坑总结
- 版本特性:11g 活动数据库克隆必须加
from active database,避免控制文件备份缺失错误; - 环境干扰:禁用
rlwrap工具,减少 RMAN 进程崩溃风险; - 认证核心:目标端密码文件与源端 sys 密码一致,提前验证远程登录;
- 路径检查:克隆前确保目标端所有文件路径存在且权限正确;
- 方案选择:11.2.0.4 版本优先选择 “基于备份的本地克隆”(备份源库→拷贝备份→目标端本地恢复),规避活动数据库克隆的 BUG 风险。
文章中加入克隆过程中使用的命令及参数说明
写一篇关于Oracle数据库备份与恢复的文章
如何避免Oracle数据库克隆过程中的错误?
posted on
浙公网安备 33010602011771号