那天早上刚到办公室,就收到监控系统的告警邮件:Oracle Data Guard备库出现17分40秒的延迟。作为DBA,这种告警立即引起了我的警觉。我马上登录备库检查,却发现v$archived_log视图显示归档日志都是正常同步的,这明显与监控告警不符。
我首先查询了v$dataguard_stats视图,这个视图专门用于监控Data Guard的延迟情况。查询结果令人困惑:
sql复制SELECT name, value, time_computed
FROM v$dataguard_stats
WHERE name LIKE '%lag%';
结果显示apply lag值在剧烈波动:前一秒显示"00:00:00"(无延迟),下一秒突然跳到"00:17:40",再查一次又变回"00:00:00"。这种跳跃式的变化显然不正常,因为真实的同步延迟应该是相对稳定的。
提示:正常情况下,apply lag应该是逐渐增加或减少的,不会出现这种毫无规律的剧烈波动。
接下来,我检查了以下几类关键日志:
所有日志均未发现异常,日志传输和应用看起来都很健康。这进一步加深了我的困惑:如果日志传输和应用都正常,为什么会出现这种间歇性的延迟告警?
由于主库是RAC环境,我开始怀疑是否是集群节点间的问题。于是登录到两个RAC节点,分别执行了以下命令检查系统时间:
bash复制date && date +"%s"
结果显示:两个节点的系统时间相差约17分40秒!这正是监控告警中显示的延迟时间。显然,Data Guard计算延迟时使用了不同节点的时间戳,导致了这种异常现象。
要理解这个问题,我们需要了解Data Guard如何计算apply lag:
当RAC节点间时间不同步时:
进一步检查发现,问题节点的NTP服务状态异常:
bash复制systemctl status ntpd
结果显示NTP服务虽然运行,但未能成功同步时间。查看NTP日志发现了同步失败的错误:
bash复制grep -i error /var/log/ntp.log
我们采取了以下步骤修复时间同步问题:
bash复制crsctl stop has
bash复制ntpdate -u ntp.server.com
bash复制systemctl restart ntpd
ntpq -p
bash复制crsctl start has
修复后,我们持续监控v$dataguard_stats视图:
sql复制SELECT name, value
FROM v$dataguard_stats
WHERE name = 'apply lag';
现在apply lag显示稳定,不再出现剧烈波动。同时,我们设置了以下监控SQL,定期记录延迟情况:
sql复制INSERT INTO dg_lag_monitor
SELECT SYSDATE, name, value
FROM v$dataguard_stats
WHERE name LIKE '%lag%';
根据Oracle官方文档,RAC环境对时间同步有严格要求:
我们采用了以下NTP配置最佳实践:
bash复制server ntp1.server.com iburst
server ntp2.server.com iburst
server ntp3.server.com iburst
bash复制tinker panic 0
tos maxdist 30
为了避免类似问题被误判,我们改进了监控策略:
不再单纯依赖apply lag值,而是结合以下指标综合判断:
实现了一个更全面的监控脚本:
bash复制#!/bin/bash
# 检查实际日志差距
LOG_GAP=$(sqlplus -s / as sysdba <<EOF
SELECT MAX(sequence#) -
(SELECT MAX(sequence#)
FROM v\$archived_log
WHERE applied='YES')
FROM v\$archived_log;
EOF)
# 检查系统时间差
TIME_DIFF=$(pdsh -w rac1,rac2 date +%s | awk '{print $2}' | paste -sd- - | bc | tr -d '-')
# 综合判断
if [[ $LOG_GAP -gt 5 ]] && [[ $TIME_DIFF -lt 2 ]]; then
echo "真实延迟告警"
elif [[ $TIME_DIFF -gt 10 ]]; then
echo "时间不同步告警"
fi
这次事件给我们带来了几个重要的经验教训:
时间同步是基础但关键:很多DBA会忽视时间同步这种"基础设施",但它实际上影响着数据库的多个方面。
监控指标需要交叉验证:不能仅凭单一指标判断系统状态,特别是像apply lag这种可能受多种因素影响的指标。
RAC环境需要特别关注节点一致性:除了时间同步外,还应定期检查以下方面:
建立更全面的健康检查机制:我们现在每天都会自动检查:
这次问题的解决过程让我深刻认识到,数据库系统中的很多"异常"现象,其根本原因往往出在最基础的环境配置上。作为DBA,我们不仅需要精通数据库本身的运维,还需要对操作系统、网络等底层环境有足够的了解。