RMAN DUPLICATE FROM ACTIVE DATABASE 是 Oracle 11gR2 起主流物理备库搭建方式,要求主库启用 ARCHIVELOG 和 FORCE LOGGING、辅助实例 NOMOUNT 启动且密码文件同步、显式配置路径转换与 compatible≥11.1.0,命令须含 nocatalog 和 nofilenamecheck。

直接用 RMAN DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE 是 Oracle 11gR2 及以上最主流、最稳妥的物理备库搭建方式。它绕过本地备份文件中转,主库在线时直接网络拉取数据块和归档,全程无需停机,但对网络、参数、权限要求非常具体——错一个就卡在 RMAN-05501 或 ORA-01102。
主库必须开归档 + 强制日志,否则 RMAN duplicate 会静默失败
很多人执行 duplicate 命令后备库启动不了,或者日志应用一直挂起,根源常在主库配置缺失。不是“建议开启”,而是硬性前提:
-
ARCHIVE LOG LIST必须显示Database log mode: Archive Mode;若为No Archive Mode,RMAN不报错但后续日志传输完全中断 -
SELECT force_logging FROM v$database;必须返回YES;只开归档不开FORCE LOGGING,遇到INSERT /*+ APPEND */或NOLOGGING操作,备库对应数据块就是坏块,MRP 进程报ORA-00600 [kcrf_rescan_lwn]类错误 - 开启强制日志需在
MOUNT状态下执行:ALTER DATABASE FORCE LOGGING;,且执行后要等 I/O 刷完(可能耗时数分钟),不能立刻切回OPEN
RMAN duplicate 命令里必须带 nocatalog 和显式连接串
官方文档写法宽松,但生产环境不加约束极易触发权限或路径冲突。真实可用的最小命令是:
su - oracle rman target sys/oracle@ORCL auxiliary sys/oracle@ORCLDG nocatalog \ duplicate target database for standby from active database nofilenamecheck;
关键点:
- 两个
sys/xxx@xxx都必须显式写出,不能用/或target /;否则RMAN会尝试用本地 OS 认证连备库,而备库实例尚未启动,报RMAN-04006或连接超时 -
nocatalog不可省略:有恢复目录时默认走 catalog 元数据校验,但备库还没控制文件,校验必失败,直接退出 -
nofilenamecheck是物理 DG 的刚需:避免 RMAN 尝试把主库数据文件路径原样写进备库控制文件,引发ORA-01102(无法独占挂载)
备库密码文件和参数文件不能复用主库的
RMAN duplicate 会自动复制 SPFILE 并改写部分参数(如 DB_UNIQUE_NAME),但以下两项必须人工干预:
- 密码文件必须在备库本地生成:
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=xxx entries=10;直接拷贝主库orapw文件会导致备库无法通过SYS远程登录,RMAN报ORA-01017或RMAN-05540 -
DB_FILE_NAME_CONVERT和LOG_FILE_NAME_CONVERT必须在备库 SPFILE 中显式设置(哪怕路径相同);否则RMAN恢复时可能把主库重做日志路径写进备库控制文件,导致 MRP 启动时报ORA-00308找不到日志 - 验证是否生效:
SHOW PARAMETER convert在备库上运行,确认两个参数值非空且方向正确(主→备)
duplicate 完成后,备库处于 mount 状态,但日志应用不会自动启动
很多人以为 RMAN 执行完就万事大吉,其实最关键的一步常被跳过:
- 备库默认停在
MOUNT状态,需手动启动日志接收与应用:ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT; - 如果主库
LOG_ARCHIVE_DEST_2没配好(比如DB_UNIQUE_NAME写错、SERVICE名解析失败),备库查V$ARCHIVE_DEST_STATUS会看到STATUS = ERROR或DEFERRED,此时 MRP 根本收不到任何日志 - 检查日志流是否通:在主库执行
ALTER SYSTEM ARCHIVE LOG CURRENT;,然后在备库查SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE# DESC FETCH FIRST 5 ROWS ONLY;,看最新归档序列是否递增
最容易被忽略的是:主备双方 LOG_ARCHIVE_CONFIG 必须完全对称,比如主库设 'DG_CONFIG=(ORCL,ORCLDG)',备库也得是同一字符串,漏掉任何一个 DB_UNIQUE_NAME,日志传输服务就拒绝启动。











