oracle 12c 不支持为单个 pdb 单独配置 data guard,因dg所有核心机制(日志传输、保护模式等)均为cdb级,pdb内无法执行dg命令,且备库pdb默认mounted,需手动cancel恢复后open read only并close immediate才能切回同步。
做不到。oracle 12c 不支持为单个 pdb 单独配置 data guard。
为什么 ALTER PLUGGABLE DATABASE 不能启用 DG
所有 Data Guard 核心机制(日志传输、归档应用、保护模式)都绑定在 CDB 层级。V$DATABASE、LOG_ARCHIVE_DEST_n、FORCE LOGGING 这些视图和参数只存在于 CDB$ROOT,PDB 内部查不到、也改不了。你在 PDB 里执行任何 DG 相关命令,比如 ALTER PLUGGABLE DATABASE ... SET STANDBY DATABASE,会直接报 ORA-65040: operation not allowed from within a pluggable database。
LOG_ARCHIVE_DEST_2 必须指向备库的 CDB,不是 PDB
主库配置归档目标时,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 只能手动 OPEN READ ONLY,且必须暂停恢复
即使 CDB 级 DG 已正常运行,备库上所有 PDB 默认仍是 MOUNTED —— 这是 Oracle 的明确设计,不是 bug。要让某个 PDB 提供只读查询:
- 先停恢复:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; - 再打开 PDB:
ALTER PLUGGABLE DATABASE pdb1 OPEN READ ONLY; - 切回同步前,必须先关闭:
ALTER PLUGGABLE DATABASE pdb1 CLOSE IMMEDIATE;,否则START APPLY会报ORA-65115
漏掉 CLOSE IMMEDIATE 是最常踩的坑,尤其在脚本自动化时容易忽略。
不同 PDB 无法设置不同保护模式
MAXIMUM PROTECTION、MAXIMUM AVAILABILITY 这些模式由 LOG_ARCHIVE_DEST_2 的 SYNC/AFFIRM 属性决定,作用于整个 CDB。你不能让 pdb1 走最大保护,pdb2 走最大性能。真有混合 RPO 需求,唯一合规路径是拆成多个独立 CDB,各自配一套 DG。强行在一个 CDB 内混用,只会让高要求 PDB 实际降级,或拖慢低要求 PDB 的事务提交。
真正需要“单 PDB 容灾”的场景,本质是业务隔离诉求没被 CDB 架构满足——这时候该重新评估是否该用多个 CDB,而不是在 DG 上硬凑。











