v$dataguard_stats的transport lag和apply lag不可信,因其60秒心跳更新且网络抖动时严重滞后;应实时查v$managed_standby中lgwr status是否active、rfs是否writing,并比对v$archived_log三组序列差值,超50需干预,同时用tcpping验证tcp通道质量、检查tcp_rmem配置及mrp0状态。

V$DATAGUARD_STATS 里的 transport lag 和 apply lag 数值不可信,跨地域场景下它们默认每 60 秒心跳更新一次,网络抖动时严重滞后,不能用于定位真实延迟点。
查 LGWR 实时发送状态,别等 AWR
AWR 报告在跨地域链路中完全失效:它不采集 LGWR 网络发送耗时、TCP 重传、ACK 延迟等关键指标,log file parallel write 只反映本地磁盘写入,和网络传输无关。
- 直接连主库查
V$MANAGED_STANDBY:重点看PROCESS='LGWR'的STATUS是否为ACTIVE,以及SEQ#是否追平V$LOG_HISTORY最新序列 - 同时查
PROCESS='RFS'的STATUS—— 若是IDLE或长期CONNECTED但无WRITING,说明备库监听未响应或中间链路中断 - 用
SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE DEST_ID=1 AND ARCHIVED='YES'(主库已归档)和DEST_ID=2 AND APPLIED='YES'(备库已应用)做差值,>50 就必须干预
用 tcpping 验证真实 TCP 通道质量
ping 测的是 ICMP,而 DG 走的是 Oracle 封装在 TCP 上的私有协议(端口通常是 1521),ICMP 通 ≠ TCP SYN 通 ≠ DG 通。
- 在主库执行:
tcpping -x 5 1521,关注平均响应时间和丢包率;若平均 > 基线 RTT 的 2 倍,或丢包 ≥ 1%,调大NET_TIMEOUT没用 - 检查 OS 层 TCP 参数是否生效:
sysctl net.ipv4.tcp_window_scaling和net.ipv4.tcp_timestamps必须为 1 -
cat /proc/sys/net/ipv4/tcp_rmem输出第三项(max)应 ≥ 估算带宽时延积(BDP)× 1.2;例如 100Mbps + 50ms RTT → BDP ≈ 625KB,tcp_rmem至少设为"4096 262144 800000"
禁用 _tcp_fast_open 并确认传输模式参数
Oracle 12c+ 默认启用 _tcp_fast_open=TRUE,但在跨地域高延迟链路上,某些 Linux 内核(如 4.15–5.4)与 DG 的 LNS 重传逻辑冲突,触发大量假超时 ORA-16198。
- 临时禁用:
alter system set "_tcp_fast_open"=false scope=spfile;,重启主库生效 - 确认
LOG_ARCHIVE_DEST_2含完整 LGWR 异步参数:LGWR ASYNC NOAFFIRM NET_TIMEOUT=30 REOPEN=60;NET_TIMEOUT太大会放大重传窗口,太小则频繁断开重连 - 避免在 RAC 环境下只改一个实例的参数,必须所有节点同步;否则部分 LGWR 进程仍走默认配置,造成传输不均衡
备库 I/O 和 MRP 是隐藏瓶颈
跨地域时 transport lag 往往先于 apply lag 暴露问题,但一旦 transport lag ≈ apply lag,说明日志已到备库,卡点转移到应用层。
- 查
V$MANAGED_STANDBY中PROCESS='MRP0'的STATUS:若长期APPLYING_LOG但SEQUENCE#不涨,大概率是 I/O 瓶颈 - 备库
DB_RECOVERY_FILE_DEST和DB_CREATE_FILE_DEST必须指向本地高性能存储,禁用 NFS 或低 IOPS 云盘;STANDBY_FILE_MANAGEMENT=AUTO会额外触发字典查询,拖慢 MRP,非必要时设为MANUAL - 如果
V$SESSION_WAIT中event长期为db file sequential read或log file sync,且wait_time> 10ms,说明备库 redo 日志路径或归档路径落在慢盘上
NET_TIMEOUT 或等 AWR 报告就能看清的。跨地域链路下,tcpping 结果、tcp_rmem 配置、MRP0 状态这三者必须同时验证,缺一不可。











