RMAN创建物理备库需满足主库ARCHIVELOG和FORCE LOGGING启用、显式规避控制文件与密码文件复制、正确配置路径转换及双向LOG_ARCHIVE_CONFIG,并验证日志传输与STANDBY REDO LOG后方可启动MRP。

RMAN 创建物理备库不是“一键复制”,而是依赖主库状态、网络连通性、参数匹配和文件路径映射的协同过程。跳过任一环节,RMAN DUPLICATE 会卡在 RMAN-05501 或启动后报 ORA-01102。
主库必须满足的两个硬性前提
备库同步失败,90% 源于主库配置缺失。不是“建议开启”,而是“不满足就无法继续”:
-
ARCHIVELOG模式必须启用:执行ARCHIVE LOG LIST,确认输出含Archive Mode且Automatic archival Enabled;若为No Archive Mode,需先SHUTDOWN IMMEDIATE→STARTUP MOUNT→ALTER DATABASE ARCHIVELOG→ALTER DATABASE OPEN -
FORCE LOGGING必须开启:仅靠归档日志不够,NOCACHE INSERT、/*+ APPEND */等操作默认不写重做,会导致备库块损坏。查SELECT FORCE_LOGGING FROM V$DATABASE,返回YES才算生效;若为NO,执行ALTER DATABASE FORCE LOGGING(需MOUNT状态)
RMAN DUPLICATE FOR STANDBY 的关键绕过点
直接 DUPLICATE TARGET DATABASE FOR STANDBY 会尝试复制主库控制文件和密码文件——这在物理 DG 场景下是错误的。必须显式规避:
- 控制文件不能复制:加
NOFILENAMECHECK,并确保备库使用自己生成的备用控制文件(通过BACKUP CURRENT CONTROLFILE FOR STANDBY或后续CREATE CONTROLFILE) - 密码文件必须独立生成:主库的
orapw$ORACLE_SID不能拷贝过去。在备库执行ORAPWD FILE=$ORACLE_HOME/dbs/orapw$ORACLE_SID PASSWORD=xxx ENTRIES=10 - 路径映射必须手动指定:用
DB_FILE_NAME_CONVERT和LOG_FILE_NAME_CONVERT显式声明主备数据文件/日志路径差异,例如'/u01/oradata/beijing','/u01/oradata/shanghai'
备库参数文件里最容易漏掉的双向配置
LOG_ARCHIVE_CONFIG 不是单向声明,而是主备双方都要配对写。只在主库写 DG_CONFIG=(prod,standby),备库没写或写错,V$ARCHIVE_DEST_STATUS 就会显示 ERROR 或 DEFERRED:
- 主库
init.ora至少含:DB_UNIQUE_NAME=beijing、LOG_ARCHIVE_CONFIG='DG_CONFIG=(beijing,shanghai)'、LOG_ARCHIVE_DEST_2='SERVICE=tnsshanghai ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=shanghai' - 备库
init.ora对应设为:DB_UNIQUE_NAME=shanghai、LOG_ARCHIVE_CONFIG='DG_CONFIG=(beijing,shanghai)'、LOG_ARCHIVE_DEST_2='SERVICE=tnsbeijing ASYNC VALID_FOR=(ONLINE_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=beijing' -
tnsbeijing和tnsshanghai必须在各自tnsnames.ora中可解析,且监听器已启动(lsnrctl status可查)
启动日志应用前的三个验证动作
即使 RMAN DUPLICATE 成功完成,备库仍处于 MOUNT 状态,未开始同步。别急着 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE:
- 确认主库已有日志传到备库:
SELECT SEQUENCE#, APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE# DESC,至少看到一条APPLIED=NO的记录,说明日志已接收但未应用 - 检查网络连通性:
tnsping tnsshanghai(在主库执行)、tnsping tnsbeijing(在备库执行),双向都得通 - 确认备库已收到主库最新日志:
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE DEST_ID=1(备库本地归档),对比主库SELECT MAX(SEQUENCE#) FROM V$LOG_HISTORY,差值不应超过 2~3 组
实际最易被忽略的点是:备库启动 MRP 进程前,STANDBY REDO LOG 组必须存在且大小 ≥ 主库 ONLINE REDO LOG。没建 SRL,ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT 会静默失败,V$MANAGED_STANDBY 里看不到 MRP0 进程。


















