mysql-replication-lag

MySQL 主从复制延迟的定位与修复

现象

SHOW REPLICA STATUS 的 Seconds_Behind_Source 持续增大,只读副本数据落后,读请求看到旧数据。严重时 relay log 堆积、磁盘上涨。

快速定位

SHOW REPLICA STATUS\G
SHOW PROCESSLIST;
SHOW ENGINE INNODB STATUS\G
SELECT * FROM performance_schema.replication_applier_status_by_worker;
mysqlbinlog --base64-output=DECODE-ROWS -v relay-bin.000001 | tail -50
iostat -x 1 5

常见根因

  1. 大事务/大表 DDL,单线程回放跟不上。
  2. 表没有主键,行级回放退化为全表扫描。
  3. 副本磁盘/CPU 不足或 I/O 饱和。
  4. 副本上有长查询,与回放争抢资源。
  5. 网络延迟或主库写入突增。
  6. 并行复制未开启或参数不合理。

修复

相关命令

读完自测

合上页面,先回答,再展开对照。

  1. 如何区分 IO 线程延迟和 SQL 线程回放延迟?
  2. 哪些写入模式容易造成复制延迟?
  3. 修复复制延迟的常用手段有哪些?
答案
  1. 看 SHOW REPLICA STATUS 中复制线程状态和 relay log 是否堆积,结合 replication_applier_status_by_worker 判断回放是否跟不上。
  2. 大事务、大表 DDL、无主键表导致行级回放退化为全表扫描,以及主库写入突增。
  3. 补主键、拆分大事务、开启并行复制并调 worker 数、提升副本磁盘/CPU、减少副本重查询,并监控 Seconds_Behind_Source 与 relay log 大小。