Oracle 12c混合架构下PDB容灾必须启用ENABLED_PDBS_ON_STANDBY并由Broker统一管控,否则远程克隆的PDB因元数据、服务名、日志流不同步而无法OPEN;克隆仅复制文件与XML,不传递归档、不注册服务、不同步PDB$SEED,导致RECOVERY_STATUS为DISABLED且MRP不应用日志;DBID不一致使RECOVER失败,且备库忽略未显式启用的PDB;监听必须静态注册_DGMGRL服务名,TNS需匹配,验证须查V$PDBS、DBA_PDB_HISTORY及V$ARCHIVE_DEST_STATUS三处状态。
oracle 12c混合架构(rac主库 + 单实例备库)下,pdb级别容灾不能靠“手动克隆+日志追加”实现——必须启用enabled_pdbs_on_standby并走broker统一管控,否则pdb元数据、服务名、监听注册全部不同步,alter pluggable database open read only会直接报ora-65086或ora-65113。
为什么远程克隆PDB到备库后无法正常打开
远程克隆(CREATE PLUGGABLE DATABASE ... FROM ...@dblink)只复制数据文件和XML描述,不传递归档日志流、不注册服务、不同步PDB$SEED状态。备库上克隆出的PDB处于MOUNTED状态,但V$PDBS.RECOVERY_STATUS为DISABLED,MRP进程根本不会为其应用日志。
- 克隆PDB的
DBID与主库不一致,导致RECOVER PLUGGABLE DATABASE失败 - 备库未启用
ENABLED_PDBS_ON_STANDBY,新PDB在备库上默认被忽略,V$ARCHIVED_LOG里查不到对应CON_ID的日志记录 - 克隆时未指定
FILE_NAME_CONVERT,数据文件路径与主库冲突,ALTER DATABASE OPEN报ORA-01157
必须用Broker配置且ENABLED_PDBS_ON_STANDBY不能设为空
Broker是唯一能协调RAC多节点日志流向单实例备库的机制。它把所有PDB的归档请求统一绑定到LOG_ARCHIVE_DEST_2,并确保DB_UNIQUE_NAME在LOG_ARCHIVE_CONFIG中双向声明。一旦漏掉ENABLED_PDBS_ON_STANDBY,哪怕只建一个PDB,备库也收不到其重做流。
- 该参数值必须为
*(全同步)或显式列出PDB名(如'PDB1,PDB2'),不能是空字符串或NULL - 修改需在主备库均执行:
ALTER SYSTEM SET ENABLED_PDBS_ON_STANDBY='*' SCOPE=BOTH; - 修改后必须重启备库MRP进程:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;→ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
混合架构下监听与TNS必须匹配_DGMGRL服务名
RAC主库每个节点监听器必须静态注册GLOBAL_DBNAME = ,否则Broker连接时触发ORA-12154——这不是tnsnames.ora写错,而是dgmgrl底层调用数据库启动时强制查找这个服务名。
- 检查命令:
lsnrctl status | grep -A2 "Service.*_DGMGRL" - 单实例备库监听器也要配同样
GLOBAL_DBNAME,哪怕只有一个实例 - TNS别名中的
CONNECT IDENTIFIER必须指向这个_DGMGRL服务,不是普通SERVICE_NAME
验证PDB是否真正进入日志同步链路
不能只看V$ARCHIVED_LOG,要确认PDB级日志接收状态。关键指标只有三个:
-
SELECT CON_ID, NAME, RECOVERY_STATUS FROM V$PDBS WHERE RECOVERY_STATUS != 'ENABLED';—— 结果集必须为空 -
SELECT PDB_NAME, STATUS FROM DBA_PDB_HISTORY WHERE OPERATION='CREATE' AND STATUS='COMPLETED';—— 主库创建PDB后,备库该视图应有对应记录 -
SELECT DEST_ID, STATUS, ERROR FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID=2 AND STATUS!='VALID';—— 若有ERROR,基本是LOG_ARCHIVE_DEST_2路径权限或网络问题
最易被忽略的是:RAC主库所有节点的spfile里log_archive_dest_2必须完全一致,Broker不会帮你校验这点,但只要有一个节点没生效,就会间歇性出现ORA-16789。











