最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Oracle 12c Data Guard如何处理CDB与PDB同步
时间:2026-08-08 09:39:48 编辑:袖梨 来源:一聚教程网
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 的存在性,不干预日志传输或应用本身。
ENABLED_PDBS_ON_STANDBY 参数必须在备库设置
这个参数决定备库启动后哪些 PDB 会被自动创建并参与日志应用。它只在备库生效,主库设了无效。
-
ENABLED_PDBS_ON_STANDBY = '*'(默认):主库所有 PDB 都会在备库创建(包括 PDB$SEED 和用户 PDB) -
ENABLED_PDBS_ON_STANDBY = 'pdb1,pdb3':仅同步指定的 PDB,其余 PDB 在备库不会被创建,也不会接收其归档日志(即使主库有) - 该参数值不支持通配符或正则,必须显式列出 PDB 名(大小写敏感)
- 修改后需重启备库(或至少重启实例+mount)才能生效
主库创建新 PDB 时,同步行为取决于 Oracle 版本
12.1 和 12.2+ 行为不同,直接影响你是否需要人工干预:
- Oracle 12.1:创建 PDB 时只能指定
CREATE PLUGGABLE DATABASE ... CREATE_FILE_DEST='...' ENABLE PLUGGABLE DATABASE;,没有同步粒度控制;新 PDB 默认会同步到所有物理备库(除非备库已设ENABLED_PDBS_ON_STANDBY排除) - Oracle 12.2+:支持
CREATE PLUGGABLE DATABASE ... ENABLE PLUGGABLE DATABASE FOR DATA GUARD;或DISABLE PLUGGABLE DATABASE FOR DATA GUARD;,可显式声明该 PDB 是否参与 DG 同步 - 注意:
DISABLE仅阻止该 PDB 在备库被创建,不影响 CDB$ROOT 和其他 PDB 的日志传输与应用
备库上 PDB 不 open ≠ 没同步,但 open 是验证前提
即使 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 级别的 - 验证同步是否生效,必须在对应 PDB 内执行 DML(如插入一行)+ 切归档 + 查备库该 PDB 中的数据
常见错误:ORA-16494 和 TNS 配置错位
主库 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 根本没出现在备库目录里。