ORA-12514、ORA-16191及PING[ARC2]心跳失败不直接表明防火墙拦截,但当tnsping和sqlplus连通而DG日志持续报错时,需怀疑防火墙策略性阻断——尤其LNS/RFS动态端口通信、会话老化或状态检测干扰,应结合netstat、tcpdump、conntrack及SQLNET.EXPIRE_TIME等综合验证。

确认心跳是否真被防火墙拦截
ORA-12514、ORA-16191 或 PING[ARC2]: Heartbeat failed to connect to standby 这类错误本身不直接指向防火墙,但当 tnsping 通、sqlplus /@service_name 也通,而 DG 日志里持续报心跳失败时,就要怀疑中间链路被策略性阻断。防火墙常放行基础端口(如 1521),但可能拦截后台进程间通信使用的动态端口(如 RFS/LNS 建立的专用连接)或非标准监听端口。
- 在主库执行:
select process, status, client_process, client_pid from v$managed_standby;—— 若LNS状态为CONNECTED但无实际传输(seq#不变),或备库查不到RFS进程,说明连接建立后很快中断 - 在备库用
netstat -an | grep :1521查看是否有来自主库 IP 的 ESTABLISHED 连接;若只有 TIME_WAIT 或没有记录,大概率是连接被丢弃而非拒绝 - 临时关闭防火墙测试(仅限非生产环境):
systemctl stop firewalld或iptables -F,再观察v$managed_standby是否出现RFS进程并开始接收日志
检查防火墙放行的具体端口和协议
Data Guard 心跳依赖 Oracle Net 的双向通信,不是单靠监听端口就能解决。LNS 和 RFS 进程会使用与监听器不同的源端口发起连接,且可能涉及多个端口范围。不能只开 1521 —— 尤其当使用了非默认监听器端口、或配置了 local_listener/remote_listener 时。
- 主库上查真实监听端口:
lsnrctl status输出中的Listening Endpoints Summary...段,记下所有(DESCRIPTION=(ADDRESS=...))中的端口号(比如 1521、1522、甚至 1530) - 确认
log_archive_dest_2中的SERVICE=xxx对应的tnsnames.ora条目是否用了非标准端口;例如:(PORT=1522)就必须放行 1522,而非默认 1521 - Linux 防火墙需同时放行 TCP 入站(备库收 RFS)和出站(主库发 LNS):常见遗漏是只加了
--dport 1521,却没允许主库向外发起连接的源端口范围(Oracle 默认使用 1024–65535 中的随机高端口) - 企业级防火墙(如 Palo Alto、FortiGate)还可能基于应用识别(App-ID)拦截 Oracle Net 流量,需显式启用
oracle-sqlnet或类似策略
验证网络路径中是否存在状态检测干扰
有状态防火墙(stateful firewall)对长连接空闲超时非常敏感。DG 心跳包并非高频发送,默认间隔约 15 秒(受 log_archive_trace 和底层 TCP keepalive 影响),若防火墙会话老化时间设为 30 秒以下,就可能在两次心跳之间清除连接状态,导致后续数据包被丢弃。
- 在主库和备库分别抓包:
tcpdump -i any port 1521 -w dg-heartbeat.pcap,然后观察 RFS/LNS 连接建立后是否出现大量FIN或RST包,或连接突然消失后重连失败 - 检查防火墙会话超时设置:例如 Linux
conntrack默认 TCP 超时常为 432000 秒(5 天),但某些定制规则可能缩至 60 秒;可临时调高:echo 86400 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established - Oracle 层面可微调 TCP keepalive 行为(非 DG 专属参数),通过
sqlnet.ora加:SQLNET.EXPIRE_TIME=10(单位分钟),让客户端每 10 分钟发 probe,避免被误判为空闲连接
绕过防火墙策略的临时诊断手段
如果无法立刻修改防火墙策略,又急需定位是否为它导致,可用最小化直连方式交叉验证。注意:这不是长期方案,仅用于快速排除。
- 在主库上用
telnet standby_ip 1521测试基础连通性 —— 成功只说明监听器可达,不代表 DG 通信正常 - 改用静态监听注册:在备库
listener.ora中显式添加SID_LIST,确保GLOBAL_DBNAME与DB_UNIQUE_NAME一致,并重启监听器;这样可绕过动态注册失败带来的 ORA-12514 干扰,聚焦网络层 - 用
nc -v standby_ip 1521搭配简单 payload 模拟 LNS 握手(需了解 Oracle TNS 协议头),但更实用的是在主库用strace -e trace=connect,sendto,recvfrom sqlplus /@standby_service观察系统调用是否卡在 send/recv 上 —— 若卡住或返回ECONNREFUSED是端口不通,ETIMEDOUT才更可能是防火墙静默丢包
bytes 列长期为 0,或 v$archive_dest_status 中 STATUS 显示 VALID 但 ERROR 字段为空。这些才是防火墙在背后“呼吸”的痕迹。


















