先直言不讳地说一句,可能会让不少DBA感到失望:AWR报告本身,其实对Data Guard传输延迟的定位帮助非常有限。它并不采集LGWR的网络发送耗时,不记录TCP重传,也不统计ACK延迟。如果有人指望仅靠AWR来诊断“传输慢”的问题,大概率会走偏——真正的瓶颈往往藏匿在它完全无法触及的地方。

为什么不能依赖 AWR 中的 log file parallel write?
这个等待事件,本质上只反映LGWR将redo从log_buffer写入本地磁盘日志文件所耗费的时间。它与网络传输几乎没有直接关联——平均2ms并不代表DG传输快;飙升至15ms也不一定说明网络拥堵,可能仅仅是主库的归档路径落在一块性能较差的磁盘上。
但实际情况是,不少DBA依然容易陷入这个误区:
- 看到
log file parallel write正常,就忽视了V$ARCHIVED_LOG中APPLIED_TIME与COMPLETION_TIME的差值已超过5分钟 - 依赖AWR的“Top 5 Timed Foreground Events”来排查瓶颈,然而LGWR的网络行为根本不会出现在这里
- 在RAC环境下只盯着某个实例的AWR,其他节点的传输延迟完全被忽略
哪些 AWR 指标能提供间接参考?
当然,AWR并非毫无价值。它能提供一些“侧面线索”,前提是你要学会交叉验证:
DB Time突然攀升,同时log file sync等待占比急剧增加?这可能意味着主库提交过于频繁,导致LGWR发送压力增大——尤其是启用了SYNC模式的场景。- 关注Report Summary中的
Redo Generated Per Sec(位于Instance Activity Stats内)。如果持续超过10MB/s,就需要对照网络带宽:至少要满足Redo Generated Per Sec × 8 ÷ 0.7(注意单位换算并保留冗余)。 Physical Reads/Sec或者db file scattered read的平均等待时间超过10ms且占比很高?这多半说明备库的I/O存在瓶颈,导致MRP应用速度变慢。此时V$DATAGUARD_STATS中的apply lag会逐渐增大,但transport lag可能依然接近0。
特别需要提醒的是:V$DATAGUARD_STATS中的transport lag和apply lag只是估算值,心跳间隔默认为60秒。一旦跨越公网链路或网络出现抖动,它的数值会严重滞后,根本不适合用于秒级诊断。
真正值得查阅的三个实时视图,比 AWR 实用十倍
所有传输卡点都隐藏在内存视图中,需要连接主备库实时查询:
V$MANAGED_STANDBY:这是唯一能清晰看到LGWR和RFS当前状态的地方。重点关注PROCESS='LGWR'那行,STATUS必须为ACTIVE才表示正在发送日志;同时对比SEQ#是否已追上V$LOG_HISTORY的最新序列。RFS端,STATUS为WRITING才说明正在接收。V$ARCHIVED_LOG:核心是对比三组序列号——主库已归档的(MAX(SEQUENCE#) WHERE DEST_ID=1 AND ARCHIVED='YES')、备库已收到的(MAX(SEQUENCE#) WHERE DEST_ID=2 AND ARCHIVED='YES')、备库已应用的(MAX(SEQUENCE#) WHERE APPLIED='YES')。三者之间的差值一旦超过30,就需要立即干预。V$DATAGUARD_PROCESS:确认MRP进程是否存在,状态是否为APPLYING_LOG。如果CPU占用很高但APPLIED_TIME纹丝不动,那么很可能是因为备库的redo日志路径I/O太慢,或者STANDBY_FILE_MANAGEMENT=AUTO引发了字典争用。
网络层必须补充的两个步骤,AWR 完全无法覆盖
AWR不涉及网络协议栈,但DG传输卡在这一层的情况其实最为常见:
- 首先在主库执行
tnsping STANDBY,确认监听通畅。然后运行ping -s 1472 standby_ip(避免IP分片),观察丢包率和RTT的波动。一旦出现高延迟或丢包,LGWR的NET_TIMEOUT就会触发重试,导致吞吐量瞬间下降。 - 更彻底的做法:使用
tcpdump -i any host standby_ip and port 1521 -w dg.pcap抓包。过滤出tcp.analysis.retransmission确认是否存在重传,再检查tcp.time_delta是否稳定——超过100ms就属于异常。
坦诚地说,SDU和TCP缓冲区等参数调得再好,如果底层网络丢包率超过0.1%,所有优化都是徒劳。而AWR中连一个丢包的数字都看不到。
复杂之处在于:传输延迟从来不是单点问题。你可能调优了主库LOG_ARCHIVE_DEST_2的ASYNC=256K和NET_TIMEOUT=30,却发现备库DB_RECOVERY_FILE_DEST空间只剩5%,导致RFS写归档失败,日志全部堆积在主库的SRL中。这类跨组件的依赖关系,AWR根本无法为你建模。
