Oracle 12c多租户环境下Data Guard仅支持CDB级配置,不支持单个PDB单独容灾;因DG所有机制(日志传输、保护模式等)均绑定CDB层级,PDB内无法执行DG命令且无对应视图与参数。

Oracle 12c 多租户环境下 Data Guard 只能在 CDB 级别搭建,无法为单个 PDB 单独配置——这是硬性限制,不是操作不到位的问题。
为什么 ALTER PLUGGABLE DATABASE 命令在 DG 中完全失效
所有 Data Guard 核心机制(日志传输、归档应用、保护模式)都运行在 CDB$ROOT 层级。PDB 内部查不到 V$DATABASE、V$ARCHIVE_DEST_STATUS,也改不了 LOG_ARCHIVE_DEST_2 或 FORCE LOGGING 这类参数。你在 PDB 里执行 ALTER PLUGGABLE DATABASE SET STANDBY DATABASE,直接报 ORA-65040: operation not allowed from within a pluggable database。
根本原因在于:Oracle 把 PDB 设计成逻辑隔离单元,而非独立灾备单元。DG 的物理日志流、redo 应用、SRL 管理全部由 CDB 实例统一调度。
LOG_ARCHIVE_DEST_2 的 SERVICE 参数必须指向备库 CDB,不能填 PDB 服务名
主库 CDB$ROOT 中配置归档目标时,LOG_ARCHIVE_DEST_2 的 SERVICE 必须是备库 CDB 的监听服务名(如 stby_cdb),而不是某个 PDB 的服务名(如 pdb1_stby)。填错会导致:
-
V$ARCHIVE_DEST_STATUS.STATUS显示ERROR或INACTIVE - 主库归档日志生成但无法传到备库
- 备库 PDB 始终卡在
MOUNTED状态(因为没收到任何日志)
验证方式:在主库 CDB$ROOT 执行 SELECT DEST_ID, STATUS, ERROR FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID = 2;,只要不是 VALID 就得立刻排查网络连通性、tnsnames.ora 配置、监听是否启动。
备库 PDB 默认 MOUNTED,OPEN READ ONLY 和 CLOSE IMMEDIATE 必须手动配对
即使 CDB 级 DG 已正常运行,备库上所有 PDB 默认仍是 MOUNTED —— 这是 Oracle 的明确设计,不是 bug。要让某个 PDB 提供只读查询,必须按顺序执行:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;ALTER PLUGGABLE DATABASE pdb1 OPEN READ ONLY;
切回同步前,必须先关闭该 PDB:ALTER PLUGGABLE DATABASE pdb1 CLOSE IMMEDIATE;。漏掉这步,后续执行 START APPLY 会报 ORA-65115。这个步骤在脚本自动化中极易被忽略,是现场最常踩的坑。
不同 PDB 无法设置不同保护模式,混合 RPO 需求只能拆 CDB
MAXIMUM PROTECTION、MAXIMUM AVAILABILITY 这些模式由 LOG_ARCHIVE_DEST_2 的 SYNC/AFFIRM 属性决定,作用于整个 CDB。你不能让 pdb1 走最大保护,pdb2 走最大性能。强行在一个 CDB 内混用,结果只有两个:
- 高 RPO 要求的 PDB 实际降级(因低要求 PDB 拖慢整体日志确认)
- 或低要求 PDB 的事务提交被拖慢(因高要求 PDB 强制 SYNC)
真正需要“单 PDB 容灾”的场景,本质是业务隔离诉求没被 CDB 架构满足——这时候该重新评估是否该用多个独立 CDB,各自配一套 DG。在 DG 上硬凑,只会让问题更难诊断、更难运维。


















