V$ARCHIVE_DEST_STATUS视图可查传输延迟与错误:TRANSMIT_TIME>2秒表网络或主库I/O延迟,APPLY_TIME显著大于TRANSMIT_TIME则问题在备库;STATUS为ERROR或INACTIVE时ERROR列显示具体报错,FAILURE_COUNT递增提示间歇性丢包。
查 V$ARCHIVE_DEST_STATUS 看传输延迟和错误计数
oracle data guard 的网络质量异常,最直接的线索就藏在 v$archive_dest_status 视图里。重点盯住 value 列为 transmit_time 和 apply_time 的行,它们分别代表归档日志从主库发出到被备库接收、再到实际应用的时间(单位:秒)。如果 transmit_time 持续 > 2 秒,基本可判定是网络或主库 i/o 延迟;若 apply_time 显著大于 transmit_time,问题大概率在备库端。
同时检查 ERROR、STATUS 和 FAILURE_COUNT 字段:STATUS 为 ERROR 或 INACTIVE 时,ERROR 列会显示类似 ORA-12543: TNS:destination host unreachable 或 ORA-12170: TNS:Connect timeout occurred 的报错,说明底层 TCP 连接已中断;FAILURE_COUNT 不断递增则提示间歇性丢包或防火墙重置连接。
执行示例:
SELECT DEST_ID, STATUS, ERROR, TRANSMIT_TIME, APPLY_TIME, FAILURE_COUNT FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID IN (2);
用 tnsping 和 sqlplus 验证网络连通性与响应抖动
tnsping 只能验证 TNS 解析和基础 TCP 可达性,不能反映真实 Oracle 通信负载下的表现。它默认只发 3 个 ICMP 风格探测包,且不走 SQL*Net 协议栈,容易误判——比如防火墙放行了 ICMP 但拦截了 1521 端口,tnsping 仍显示成功。
更可靠的方式是用 sqlplus 模拟轻量级连接并测量 RTT:
- 在主库执行:
sqlplus /@standby_db "SELECT SYSDATE FROM DUAL;",观察是否超时(建议加TIMEOUT=5参数) - 反复执行 10–20 次,记录每次耗时;若标准差 > 300ms 或出现
ORA-12170,说明存在明显抖动或丢包 - 注意:确保测试用户具备
CREATE SESSION权限,且监听器未启用INBOUND_CONNECT_TIMEOUT限制
抓包分析丢包位置:主库 LGWR 进程 vs 备库 MRP0 进程
Data Guard 日志传输由主库 LGWR 进程发起,通过 TCP 发送 redo 数据块;备库 MRP0 进程负责接收并写入 standby redo log。丢包可能发生在任一环节,不能只看网络设备。
典型抓包位置与判断依据:
- 在主库网卡抓包:
tcpdump -i eth0 'host <standby_ip> and port 1521' -w dg_out.pcap</standby_ip>,过滤出大量重传([TCP Retransmission])或重复 ACK,说明主库发包失败或路径丢包 - 在备库网卡抓包:
tcpdump -i eth0 'host <primary_ip> and port 1521' -w dg_in.pcap</primary_ip>,若收到数据但MRP0进程无写入动作(查V$MANAGED_STANDBY中PROCESS=MRP0 的STATUS为WAIT_FOR_LOG),可能是内核缓冲区溢出或进程卡顿 - 关键指标:Wireshark 中查看 TCP Stream Graph → Round Trip Time Graph,RTT 突然跳升 > 500ms 且伴随窗口缩小,基本锁定网络层问题
调整 LOG_ARCHIVE_DEST_2 的网络参数降低延迟敏感度
默认配置下,Data Guard 对单次网络延迟极其敏感,一次超时就触发重试并计入 FAILURE_COUNT,容易掩盖真实问题。可通过以下参数缓解误报:
-
NET_TIMEOUT=30:将单次 TCP 写超时从默认 30 秒改为 30 秒(注意不是增大,而是显式设定,避免某些版本取隐式值) -
REOPEN=60:连接中断后等待 60 秒再重试,防止高频闪断引发雪崩式重连 -
DELAY=0:禁用人为延迟(某些旧文档建议设为非零值,实测反而加剧累积延迟) - 必须配合
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)使用,否则参数不生效
修改后需执行:ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby_db ... VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)' SCOPE=BOTH;
真正影响传输稳定性的,往往不是带宽,而是 TCP 重传率和往返抖动。很多“网络慢”的案例,最后发现是交换机 QoS 策略对小包优先级设得太低,或者虚拟化环境中 vNIC 驱动版本过旧导致 checksum offload 异常。











