Broker无法忽略网络抖动报警,因其仅暴露SQL*Net层的ORA-12545/ORA-12170等底层连接错误;真正需调整的是REOPEN=60、SQLNET超时参数及RAC的GLOBAL_DBNAME+SCAN规范配置,而非试图静音Broker。

Broker 无法“忽略”网络抖动报警,它只反映底层连接状态;所谓“忽略”实际是调整检测灵敏度或屏蔽误报源。
为什么 ORA-12545 / ORA-12170 报警不能直接关闭
这些不是 Broker 自己生成的告警,而是 SQL*Net 层在尝试连接 FAL_SERVER、LOG_ARCHIVE_DEST_n 或监听器时触发的底层错误。Broker 只是把它们暴露为 STATUS = WARNING 或 ORA-16792。试图用 DGMGRL 命令“静音”这类错误注定失败——没有对应参数,也没有配置开关。
真正要做的,是让这些连接在短暂抖动后能自动恢复,而不是立刻报错挂起。
- 检查
V$DATAGUARD_CONFIG和V$ARCHIVE_DEST_STATUS,确认报错项是否真为网络问题(如ERROR = ORA-12170),而非 DNS 解析失败、监听未注册、GLOBAL_DBNAME拼写错误等静态配置问题 - 若日志中反复出现
FAL[server]: Failed to connect to primary,说明 FAL 进程已退出,Broker 不会重启它——这不是“报警”,是功能中断 - Broker 的
SHOW DATABASE VERBOSE输出里若显示Transport Lag持续增长,但Apply Lag正常,大概率是归档传输卡在 RFS 阶段,和 FAL 无关
REOPEN 参数才是控制重试节奏的关键
LOG_ARCHIVE_DEST_n 上的 REOPEN 决定了 ARCH 或 LGWR 进程在传输失败后等待多久再发起下一次尝试。它不控制 FAL,但控制主库发日志的频率,间接影响抖动窗口内能否“错过一次失败就恢复”。
- 默认值是 300 秒,对网络抖动太保守;生产环境建议设为
REOPEN=60(单位秒),既避免频繁冲击监听器,又能在 1–2 分钟内恢复 - 必须配合
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)使用,否则角色切换后该设置不生效 - 修改后需执行
ALTER SYSTEM ARCHIVE LOG CURRENT手动触发一次归档,验证新参数是否被读取(查V$ARCHIVE_DEST_STATUS的REOPEN_SECS列) - 不要设成
REOPEN=5:短间隔+高并发可能压垮备库监听器,尤其 RAC 环境下多个实例同时重试
RAC 环境下 SCAN + DGMGRL 的组合最容易引发误报
RAC 备库若未按规范配置 GLOBAL_DBNAME = <db_unique_name>_DGMGRL,Broker 会尝试连接第一个节点 VIP,一旦该节点临时不可达(如 CRS 资源漂移中),就报 ORA-12545,但其实 SCAN 本身是通的。
- 每个 RAC 节点的
listener.ora必须包含独立的SID_DESC,且GLOBAL_DBNAME严格匹配DB_UNIQUE_NAME加上_DGMGRL后缀(如stddb_DGMGRL) -
tnsnames.ora中备库条目必须用 SCAN 地址,且显式启用重试:(RETRY_COUNT=3)(RETRY_DELAY=15)(Oracle 19c+ 客户端才支持) - 执行
lsnrctl status时,输出里必须看到Service "stddb_DGMGRL"状态为READY,且有多个实例注册,不能只有 1 个 - Broker 启动前,先在所有节点运行
srvctl add database -d stddb -o $ORACLE_HOME -r PHYSICAL_STANDBY -s MOUNT,否则 CRS 不识别该库,Broker 查不到实例状态
最易被忽略的一点:Broker 的“健康判断”完全依赖 SQL*Net 连接结果,它不区分“100ms 网络延迟”和“监听器宕机”。所以所谓“忽略抖动”,本质是让网络层自己扛住抖动——这靠的是 sqlnet.ora 里的 SQLNET.OUTBOUND_CONNECT_TIMEOUT=30 和 SQLNET.RECV_TIMEOUT=60,而不是 Broker 配置。


















