Oracle 12c Data Guard 是 CDB 级别特性,主备 CDB 必须同 DB_NAME、不同 DB_UNIQUE_NAME,且需统一配置归档、FORCE LOGGING、LOG_ARCHIVE_CONFIG 等参数,并正确创建 standby redo log 和密码文件。

必须在CDB级别统一配置,PDB不能单独参与DG角色切换;主备CDB的DB_NAME必须相同,DB_UNIQUE_NAME必须不同。
主库CDB必须开归档 + FORCE LOGGING
Oracle 12c Data Guard 是 CDB 级别能力,不是 PDB 级别。哪怕你只关心某个 PDB,整个 CDB 也得一起保护。漏掉任一环节,V$ARCHIVE_DEST_STATUS 就会显示 ERROR 或 DEFERRED,日志根本传不过去。
- 检查当前状态:
ARCHIVE LOG LIST—— 必须是Archive Mode,且Automatic archival为Enabled - 强制开启归档(需 MOUNT):
ALTER DATABASE ARCHIVELOG - 开启强制日志:
ALTER DATABASE FORCE LOGGING(MOUNT 下执行),验证用SELECT FORCE_LOGGING FROM V$DATABASE,返回YES才算生效 - 注意:
FORCE LOGGING对INSERT /*+ APPEND */类操作有轻微性能影响,但这是物理 DG 数据一致性的硬性前提,不可跳过
RMAN DUPLICATE FOR STANDBY 不能复制控制文件或密码文件
用 RMAN DUPLICATE TARGET DATABASE FOR STANDBY 克隆时,默认行为会尝试复用主库控制文件和密码文件——这在 CDB 物理 DG 场景下直接报错,比如 ORA-01102: cannot mount database in EXCLUSIVE mode 或 RMAN-05501: aborting duplication。
- 必须显式跳过控制文件:加
NOFILENAMECHECK,并手动指定DB_FILE_NAME_CONVERT和LOG_FILE_NAME_CONVERT映射路径 - 密码文件不能复制,必须在备库单独生成:
ORAPWD FILE=$ORACLE_HOME/dbs/orapw$ORACLE_SID PASSWORD=xxx ENTRIES=10 - 如果主库用了 Oracle Wallet,备库也要单独配置,RMAN 不传 wallet 文件
- 建议使用
FROM ACTIVE DATABASE模式,避免本地备份介质中转,减少窗口期风险
CDB级参数必须双向配对:LOG_ARCHIVE_CONFIG + DB_UNIQUE_NAME
物理 DG 不是“主→备”单向配置,而是靠 LOG_ARCHIVE_CONFIG 声明双方身份,再靠 DB_UNIQUE_NAME 区分实例。主备两端参数必须对称,否则传输链路建立失败。
- 主库
init.ora至少含:DB_UNIQUE_NAME=cdb1,LOG_ARCHIVE_CONFIG='DG_CONFIG=(cdb1,cdb2)',LOG_ARCHIVE_DEST_2='SERVICE=cdb2 ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=cdb2' - 备库对应设为:
DB_UNIQUE_NAME=cdb2,LOG_ARCHIVE_CONFIG='DG_CONFIG=(cdb1,cdb2)',LOG_ARCHIVE_DEST_2='SERVICE=cdb1 ASYNC VALID_FOR=(ONLINE_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=cdb1' -
FAL_SERVER和FAL_CLIENT要用 TNS 别名(如cdb2),且该别名必须在两边tnsnames.ora中都可解析 - 监听器
listener.ora中SID_DESC.GLOBAL_DBNAME应设为DB_NAME(即 CDB 名),不是DB_UNIQUE_NAME
备库启动前必须补全 standby redo log
没建 standby redo log,备库连日志接收都做不到;建得不对,可能卡在 MRP0 进程等待或应用中断。CDB 的 standby redo log 是全局资源,跟里面有多少个 PDB 无关。
- 大小必须与主库 online redo log 完全一致(查
V$LOGFILE和V$LOG) - 组数规则:单实例主库 → 备库至少建
主库日志组数 + 1组;RAC 主库 → 每线程+1组 × 最大线程数 - 创建语句示例:
ALTER DATABASE ADD STANDBY LOGFILE GROUP 11 '/u01/oradata/cdb2/srl11.log' SIZE 200M - 确认已建好:
SELECT GROUP#, THREAD#, BYTES FROM V$STANDBY_LOG,输出非空才算到位
最容易被忽略的是:主备 CDB 的 DB_NAME 必须完全一致(比如都是 CDB1),而 DB_UNIQUE_NAME 必须不同(如 cdb1 / cdb2)。有人改了 DB_UNIQUE_NAME 却忘了同步 LOG_ARCHIVE_CONFIG 里的列表,或者 TNS 别名拼错一个字母,结果日志传输静默失败,排查时绕很大弯路。


















