Oracle 12c Data Guard在CDB环境中通过备库端ENABLED_PDBS_ON_STANDBY参数控制PDB同步范围,默认值“*”同步所有PDB,显式指定如'pdb1,pdb3'则仅同步所列PDB,该参数仅在备库生效、需重启实例生效,且PDB在备库默认为MOUNTED状态,须手动OPEN READ ONLY方可验证数据同步。
Oracle 12c Data Guard 在 CDB 环境中默认同步整个容器(CDB$ROOT + 所有 PDB),但不能按 PDB 粒度单独开启/关闭同步;真正能控制“哪些 PDB 出现在备库”的,是备库端的 ENABLED_PDBS_ON_STANDBY 参数,且它只影响 PDB 的存在性,不干预日志传输或应用本身。
这个参数决定备库启动后哪些 PDB 会被自动创建并参与日志应用。它只在备库生效,主库设了无效。
ENABLED_PDBS_ON_STANDBY = '*'(默认):主库所有 PDB 都会在备库创建(包括 PDB$SEED 和用户 PDB)ENABLED_PDBS_ON_STANDBY = 'pdb1,pdb3':仅同步指定的 PDB,其余 PDB 在备库不会被创建,也不会接收其归档日志(即使主库有)12.1 和 12.2+ 行为不同,直接影响你是否需要人工干预:
CREATE PLUGGABLE DATABASE ... CREATE_FILE_DEST='...' ENABLE PLUGGABLE DATABASE;,没有同步粒度控制;新 PDB 默认会同步到所有物理备库(除非备库已设 ENABLED_PDBS_ON_STANDBY 排除)CREATE PLUGGABLE DATABASE ... ENABLE PLUGGABLE DATABASE FOR DATA GUARD; 或 DISABLE PLUGGABLE DATABASE FOR DATA GUARD;,可显式声明该 PDB 是否参与 DG 同步DISABLE 仅阻止该 PDB 在备库被创建,不影响 CDB$ROOT 和其他 PDB 的日志传输与应用即使 ENABLED_PDBS_ON_STANDBY 包含某个 PDB,它在备库默认是 MOUNTED 状态,不是 READ ONLY 或 READ WRITE。不手动 ALTER PLUGGABLE DATABASE pdb1 OPEN READ ONLY;,你就看不到数据变化,也无法做业务级验证。
ALTER PLUGGABLE DATABASE ... OPEN 是允许的,但只能开成 READ ONLY(ADG 模式下)或 READ WRITE(快照备库)ALTER PLUGGABLE DATABASE ... RECOVER —— 这个命令不存在,REDO 应用始终是 CDB 级别的主库 v$archive_dest 报 ORA-16494,大概率是 LOG_ARCHIVE_DEST_2 指向的服务名(如 orcldg)实际连到了某个 PDB 而非 CDB$ROOT。
tnsnames.ora 中服务名对应的 SERVICE_NAME:必须是 CDB 全局服务名(如 orcldg),不能是 PDB 服务名(如 pdb1.orcldg)SELECT name, con_id FROM cdb_services WHERE con_id = 1;,确认该服务名绑定的是 CON_ID = 1(即 CDB$ROOT)FAL_CLIENT 和 FAL_SERVER 也必须指向 CDB 级服务名,否则归档缺失检测会失败最关键的细节常被忽略:PDB 同步不是靠“主库开关”,而是靠“备库白名单”+“版本级创建策略”+“TNS 绑定到 CDB$ROOT”。漏掉任一环,都会导致你以为没同步的 PDB 实际在传日志,或你以为同步了的 PDB 根本没出现在备库目录里。