oracle 19c data guard在混合云容灾中需主备库版本/补丁/db_unique_name/密码文件严格一致,网络须低延迟双向路由(如oci vcn+fastconnect),禁用公网裸连,必须使用dgmgrl创建data guard组并启用force logging,否则同步失败。
oracle 19c data guard 在混合云容灾中不是“开箱即用”的同步方案,它要求主库与备库之间具备低延迟、高可靠、双向可路由的网络通路,且必须严格对齐数据库版本、补丁级别、db_unique_name 和密码文件一致性。直接跨公网裸连基本不可行,oci 侧必须使用 vcn 内部地址 + 显式路由控制,本地侧需通过 fastconnect 或 expressroute 接入 oci hub vcn。
确保主库与备库的 Oracle 版本和补丁完全一致
19c 的 Data Guard 组(Data Guard Group)模型对版本兼容性极其敏感:主库是 19.22.0.0.0,备库不能是 19.21.0.0.0,哪怕只差一个 RU(Release Update)也会在 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE 阶段报 ORA-16778: unable to convert standby database to physical standby。
实操建议:
- 在 OCI 中创建备用数据库前,先用
opatch lsinventory -detail检查主库补丁清单,再在 OCI 控制台选择“相同数据库主目录”或手动创建同版本主目录 - 避免使用
DBCA图形界面自动拉取补丁——它可能跳过关键 Data Guard 相关修复;优先用opatch apply手动打全量 RU - 确认
v$database.open_mode和v$database.database_role在主备库启动后均为READ WRITE和PRIMARY/PHYSICAL STANDBY,否则DGMGRL无法注册
配置 OCI 路由表与本地网络打通(非仅防火墙放行)
常见错误是只在 Azure/OCI 安全组里开放 1521 端口,却忽略底层路由。Data Guard 日志传输依赖持续 TCP 连接,一旦中间 NVA(如 Azure 防火墙)未配置静态路由,LGWR 进程会卡在 WAITING FOR REDO 状态,V$MANAGED_STANDBY 中 PROCESS 列显示 ARCH 而非 LGWR。
关键配置点:
- OCI 侧路由表必须添加条目:
目标网段 = 本地数据库子网(如 192.168.10.0/24)→下一跳类型 = Virtual Device→下一跳 IP = NVA 公共 IP(如 10.0.0.5) - 本地侧路由器需反向添加指向 OCI 数据库子网(如
10.42.1.0/24)的静态路由,下一跳为 ExpressRoute 网关接口 - 禁用 OCI VCN 的“默认互联网网关”对数据库子网的关联——Data Guard 流量严禁经公网绕行
密码文件与 remote_login_passwordfile 必须同步启用
OCI 上创建的备用数据库默认不带密码文件,而 Data Guard 启动日志传输时,LGWR 需用 SYS 权限连接远端实例。若只复制了 orapw$ORACLE_SID 但没设 remote_login_passwordfile=EXCLUSIVE,会报 ORA-01017: invalid username/password,且 DGMGRL SHOW DATABASE VERBOSITY 不提示具体失败原因。
正确步骤:
- 主库执行:
SELECT file_name FROM v$passwordfile_info;获取 ASM 中密码文件路径 - 用
asmcmd cp导出到本地文件系统,再用scp复制到 OCI 备库主机的$ORACLE_HOME/dbs/下,并重命名为orapw<db_unique_name></db_unique_name>(注意大小写) - 在备库
init.ora或 SPFILE 中显式设置:remote_login_passwordfile=EXCLUSIVE,然后重启实例 - 验证:
sqlplus / as sysdba登录备库后执行SELECT * FROM v$pwfile_users;,确保SYS行的SYSDBA列为TRUE
使用 DGMGRL 创建 Data Guard 组而非旧版关联
19c 及以上必须用 Data Guard 组(DATAGUARD CONFIGURATION),旧版 ADD DATABASE AS CONNECT IDENTIFIER 语法在 OCI 控制台已弃用,强行使用会导致后续添加第二个备库时报 ORA-16664: unable to retrieve the result from a database。
最小可行命令流:
connect sys/oracle@primary_db CREATE CONFIGURATION 'AZURE_TO_OCI_DG' AS PRIMARY DATABASE IS 'PRIMARY_DB' CONNECT IDENTIFIER IS primary_db; ADD DATABASE 'STANDBY_OCI' AS CONNECT IDENTIFIER IS standby_oci MAINTAINED AS PHYSICAL; ENABLE CONFIGURATION;
注意点:
-
CONNECT IDENTIFIER必须是tnsnames.ora中定义的完整别名,且该别名解析的地址必须是 OCI VCN 内网 IP(如10.42.1.10),不能是公网域名 - 执行前确保主库已开启强制日志模式:
ALTER DATABASE FORCE LOGGING;,否则ENABLE CONFIGURATION会卡住 -
DGMGRL的SHOW CONFIGURATION输出中,所有数据库状态必须为SUCCESS,若出现WARNING,重点检查LogXptMode是否为ASYNC(跨云推荐)或SYNC(仅限同城低延迟)
最易被忽略的是远端同步(Far Sync)实例的控制文件路径权限——即使 control_files 参数写对了,若 /u01/app/oracle/oradata/fstor/controlfs/ 目录属主不是 oracle:oinstall,备库启动时会静默失败,alert.log 里只有一行 ORA-00210: cannot open the specified control file,没有更深层线索。











