不能只看Seconds_Behind_Master,因其可能为NULL(复制中断)、长时间卡值(大事务回放中)、并行复制下严重失真,且受网络抖动、锁表等干扰;需结合线程状态、延迟趋势及pt-heartbeat真实端到端延迟综合判断。

直接用 Seconds_Behind_Master 做告警阈值是危险的——它可能为 NULL(复制已中断)、为 0(刚追上但马上卡住),或在并行复制下严重滞后于真实延迟。必须组合判断线程状态 + 延迟值 + 变化趋势,再通过企业微信推送才可靠。
为什么不能只看 Seconds_Behind_Master 的数值?
这个字段不是“当前延迟秒数”的精确快照,而是 SQL 线程重放位置与 IO 线程拉取位置之间的时间差估算值。常见陷阱包括:
-
Seconds_Behind_Master: NULL表示复制中断(Slave_IO_Running或Slave_SQL_Running至少一个不是Yes),但单靠数值判断会完全漏掉 - 大事务回放期间,该值可能长时间卡在某个数字不动,实际延迟早已远超显示值
- MySQL 5.7+ 启用
slave_parallel_workers > 0时,计算逻辑依赖 coordinator 状态,需额外查performance_schema.replication_applier_status_by_coordinator - 网络抖动、短时锁表会导致单次采样突增,误触发告警
Shell 脚本怎么安全获取并判断主从状态?
关键不是“能取到值”,而是“取错时不崩溃、取不到时不静默”。推荐用以下方式写解析逻辑:
- 连接用
--defaults-file=/etc/mysql/monitor.cnf,文件权限设为600,避免密码泄露 - 解析
SHOW SLAVE STATUS\G时不用模糊匹配,改用字段分隔符:awk -F': ' '/^Slave_IO_Running:/ {io=$2} /^Slave_SQL_Running:/ {sql=$2} /^Seconds_Behind_Master:/ {sbm=$2}' - 对
sbm做数字校验:[[ "$sbm" =~ ^[0-9]+$ ]] || sbm=-1,把NULL和空格统一转为-1 - 告警条件必须同时满足:
[[ "$io" == "Yes" && "$sql" == "Yes" && "$sbm" -gt 60 ]],且连续 3 次采样达标才发通知
如何用 curl 发送企业微信文本告警?
企业微信机器人需要 Webhook URL,发送的是 JSON 格式。脚本里加一段即可,注意控制频率避免被限流:
if [[ $alert_count -ge 3 ]]; then
curl -X POST "$WEBHOOK_URL" \
-H 'Content-Type: application/json' \
-d "{\"msgtype\": \"text\", \"text\": {\"content\": \"【MySQL 延迟告警】$HOST 从库延迟 $sbm 秒,IO/SQL 线程均正常。请立即检查。\"}}"
alert_count=0
fi
-
WEBHOOK_URL必须是企业微信后台创建的群机器人地址,结尾带?key=xxx - 别在每轮循环都发——用变量
alert_count计数,连续超标才触发,发完重置 - 内容里明确写出
IO/SQL 线程均正常,避免运维第一眼误判为复制中断
真正要盯住的其实是 pt-heartbeat 的输出
所有基于 SHOW SLAVE STATUS 的轮询,本质都是间接估算。跨机房、大事务、GTID 切换等场景下,Seconds_Behind_Master 失效概率极高。生产环境必须部署 pt-heartbeat:
- 主库上运行
pt-heartbeat --update --host=master --user=root --password=xxx --interval=1 - 从库上执行
pt-heartbeat --monitor --host=slave --master-server-id=1 --interval=5 --threshold=60 - 它的返回值是真实端到端延迟(单位:秒),不依赖 MySQL 内部状态,
NULL就是心跳断了,0就是真正实时 - 企业微信告警应优先采用
pt-heartbeat输出,而不是SHOW SLAVE STATUS
最易被忽略的一点:即使 pt-heartbeat 显示延迟正常,也要定期验证心跳表本身是否被主库 binlog 清理策略误删(比如 expire_logs_days 过小导致 relay log 断链)。监控脚本里加一行 mysql -e "SELECT COUNT(*) FROM percona.heartbeat" 是必要的兜底。



















