“从库延迟几小时了,主从数据已经差了几百万条。”
这是MySQL运维中很常见的一类问题。很多线上事故并不是数据库直接宕机,而是主从复制已经严重延迟,但业务侧还没有第一时间发现。
一旦主从延迟持续扩大,最直接的问题就是读写分离开始出现异常。用户刚提交的数据查不到、订单状态不同步、库存更新延迟,严重时甚至会导致主库故障后,从库无法及时切换。
而且主从延迟往往不是单一问题,它背后可能涉及:
SQL性能
磁盘IO
网络
大事务
锁等待
复制模式
硬件配置
针对这个问题,我整理了生产环境里最常见的7类主从延迟原因,以及对应的排查方法。
在排查之前,通常先执行:
SHOW SLAVE STATUS\G
重点关注:
Seconds_Behind_Master Slave_IO_Running Slave_SQL_Running
不过需要注意的是,Seconds_Behind_Master 并不一定完全准确。在大事务执行、SQL线程阻塞等场景下,它可能出现“显示正常但实际已经严重延迟”的情况。很多生产环境会结合 pt-heartbeat 等工具监控真实复制延迟。
原因1:从库硬件配置明显低于主库
很多团队会默认认为“从库压力不大”,于是主库使用高配SSD和高IO实例,而从库却使用低规格云主机。
事实上,从库不仅承担复制,还可能承担读流量、报表分析、备份等任务。当主库写入量增大时,从库同样需要执行这些SQL。如果CPU、内存或者磁盘IO能力不足,relay log就会不断堆积。
排查时要重点对比:
CPU核数
内存大小
磁盘类型(SSD/HDD)
云盘IOPS
如果主从配置差距过大,复制延迟通常很难彻底解决。
原因2:从库存在慢查询或MDL锁等待
很多业务会把报表、统计任务放到从库执行,但如果这些SQL本身存在:
全表扫描
大范围JOIN
临时表
filesort
就会大量占用资源,影响SQL线程执行relay log。
这时候可以执行:
SHOW PROCESSLIST;
查看是否存在长时间运行的SELECT。同时建议开启慢查询日志,分析慢SQL并优化索引。
线上还有一种特别常见但容易忽略的问题:DDL导致的MDL锁阻塞
例如主库执行:
ALTER TABLE order_info ADD COLUMN ext_info varchar(255);
从库SQL线程可能会等待 metadata lock,导致复制长时间卡住。这类问题CPU延迟会快速增长。
原因3:主库写入压力过大,binlog生成太快
如果主库持续:
高频UPDATE
批量INSERT
大量DELETE
binlog会快速增长。
现在生产环境大多使用:
binlog_format=ROW
在 row-based replication 模式下,大量行级变更会明显增加从库回放压力。
如果从库SQL线程处理速度跟不上,延迟就会持续扩大。
这种情况通常需要结合:
主库QPS
binlog增长速度
从库apply速度
一起分析。
原因4:大事务导致复制线程长时间阻塞
这是线上最容易造成“延迟尖刺”的原因之一。
MySQL复制是以事务为单位回放的,一个事务没有执行完,后面的事务就无法继续执行。
比如执行:
DELETE FROM order_log WHERE create_time < '2025-01-01';
一次影响几百万行。
那么这个事务在从库也必须完整执行完,期间整个SQL线程都会被阻塞。
很多生产环境里看到“延迟突然从几秒变成几十分钟”,本质上往往就是大事务导致。
解决思路通常是:
分批处理
小事务提交
避免超大批量操作
原因5:主从网络出现抖动或带宽不足
虽然大多数复制延迟不是网络导致,但如果跨地域部署、专线抖动、带宽不足、网络丢包,都会影响IO线程拉取binlog。
遇到这种情况可以重点观察:
Master_Log_File Read_Master_Log_Pos
如果长时间不变化,可能说明IO线程拉取binlog存在问题。
同时建议结合:
ping
traceroute
iperf
测试网络质量。
原因6:relay log异常或磁盘空间不足
正常情况下,relay log会自动清理。但如果:SQL线程卡住、延迟持续扩大relay log无法消费,relay log会不断堆积。
如果磁盘空间被占满,复制线程就可能直接中断。
排查时建议检查:
df -h
以及MySQL错误日志。
此外,磁盘IO异常、非正常宕机等情况,也可能导致relay log文件损坏。
原因7:未开启并行复制,SQL线程处理能力不足
很多人以为MySQL一直都是单线程复制,其实从MySQL 5.6开始已经支持并行复制,但早期能力相对有限。
真正适合高并发场景的,是MySQL 5.7之后基于:
slave_parallel_type=LOGICAL_CLOCK
的并行复制模式。
可以检查:
SHOW VARIABLES LIKE 'slave_parallel_workers';
如果值仍然是0或者1,说明复制并行度可能不足。
通常可以根据业务情况调整为4~8甚至更高。
如果业务已经开启GTID模式:
gtid_mode=ON
那么故障恢复和复制切换会更方便,但大事务导致的延迟问题依然存在。
主从延迟的快速排查思路
实际线上排查时,我一般会按这个顺序快速检查:
SHOW SLAVE STATUS\G查看
Seconds_Behind_Master检查
Slave_IO_Running和Slave_SQL_Running查看系统负载:
topiostatdf -h查看慢SQL和锁等待
分析binlog增长速度
检查网络和磁盘IO
很多时候,主从延迟不是“突然发生”的,而是系统已经慢慢开始异常,尤其很多企业没有专职DBA,数据库运维更多依赖开发兼职处理。出了问题后临时查文档,效率低也容易误操作。
现在不少团队也开始重视数据库稳定性监控。之前接触过一些做稳定性运维的平台,比如江苏立维旗下的 OPSEYE,会持续监控主从延迟、慢SQL、磁盘空间、数据库连接池等指标,并在延迟超过阈值时主动告警。
对于没有精力自建数据库运维体系的团队来说,通过持续巡检、异常分析和故障响应机制,提前发现复制链路的问题,其实比“出事后救火”更重要。

1413

被折叠的 条评论
为什么被折叠?



