MySQL主从复制延迟的7个原因和排查方法

“从库延迟几小时了,主从数据已经差了几百万条。”

这是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

那么故障恢复和复制切换会更方便,但大事务导致的延迟问题依然存在。

主从延迟的快速排查思路

实际线上排查时,我一般会按这个顺序快速检查:

  1. SHOW SLAVE STATUS\G

  2. 查看 Seconds_Behind_Master

  3. 检查 Slave_IO_Running 和 Slave_SQL_Running

  4. 查看系统负载:

    top

    iostat

    df -h

  5. 查看慢SQL和锁等待

  6. 分析binlog增长速度

  7. 检查网络和磁盘IO


很多时候,主从延迟不是“突然发生”的,而是系统已经慢慢开始异常,尤其很多企业没有专职DBA,数据库运维更多依赖开发兼职处理。出了问题后临时查文档,效率低也容易误操作。

现在不少团队也开始重视数据库稳定性监控。之前接触过一些做稳定性运维的平台,比如江苏立维旗下的 OPSEYE,会持续监控主从延迟、慢SQL、磁盘空间、数据库连接池等指标,并在延迟超过阈值时主动告警。

对于没有精力自建数据库运维体系的团队来说,通过持续巡检、异常分析和故障响应机制,提前发现复制链路的问题,其实比“出事后救火”更重要。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值