如何在MySQL中监控主从同步延迟并排查原因

轻明大大_4384

轻明大大_4384

2026-09-27

182人浏览

原创

seconds_behind_master仅为估算值,不可直接信任;其值受主从时钟同步、io/sql线程状态、大事务、gtid模式及并行复制等影响严重失真,真实延迟需结合pt-heartbeat心跳差、relay_master_log_file与master日志位置比对、以及slave_io_running/slave_sql_running状态交叉验证。

如何在mysql中监控主从同步延迟并排查原因

Seconds_Behind_Master 显示为 0 不代表没延迟,显示为 71 也不一定真卡了 71 秒——它只是个估算值,受时间同步、线程状态、事务依赖等多因素干扰。监控必须结合多维度指标,排查要分段定位到 IO 或 SQL 线程。

怎么看 Seconds_Behind_Master 才不被“骗”

这个字段是 MySQL 自己算出来的:用当前时间减去 relay log 中最后一条事件的 original_commit_timestamp(MySQL 5.7+),再减去主从服务器时间差。但它只在 Slave_IO_Running=Yes 且 Slave_SQL_Running=Yes 时才有效;一旦其中任一线程停了,它就变成 NULL。

常见误导场景:

  • 从库 NTP 时间校正后未重启 IO 线程,Seconds_Behind_Master 会在 0 和固定值(如 71)之间规律跳变——这不是数据库卡住,是时间差参与计算后出错
  • 主库刚执行完一个大 DDL,从库 SQL Thread 正在等 MDL 锁,但 Seconds_Behind_Master 可能仍显示 0(因为还没开始回放该事件)
  • 网络抖动导致 IO Thread 暂停拉日志,Seconds_Behind_Master 会滞涨甚至归零(因无新事件可比对)

实操建议:

  • 别只盯一个数字,每次执行 SHOW SLAVE STATUS\G 时,同步看这三行:Slave_IO_State、Slave_SQL_Running_State、Seconds_Behind_Master
  • 用脚本高频采样(比如每秒一次,持续 5 分钟),观察是否规律跳变——跳变大概率是时间不同步,不是性能问题
  • 确认主从系统时间是否一致:date 对比,或用 ntpstat 检查同步状态

怎么快速区分是 IO 延迟还是 SQL 延迟

主从复制有三个关键位置:主库 binlog 末尾、从库 relay log 末尾、从库已执行到的位置。延迟只可能卡在这两段链路上:binlog → relay log(IO 阶段),或 relay log → 数据库(SQL 阶段)。

判断依据:

  • Slave_IO_State: Waiting for master to send event 且 Seconds_Behind_Master 持续增长 → IO 线程没收到新日志,查网络、主库 dump 线程、主库 binlog 写入压力
  • Slave_SQL_Running_State: Reading event from the relay log 或 Waiting for dependent transaction to commit → SQL 线程在回放,但慢,重点查从库负载、大事务、锁等待、并行复制是否启用
  • Relay_Master_Log_File 落后于 Master_Log_File → IO 拉取滞后;Exec_Master_Log_Pos 落后于 Read_Master_Log_Pos → SQL 回放滞后

实操命令:

mysql -e "SHOW SLAVE STATUS\G" | grep -E "(Slave_IO_State|Slave_SQL_Running_State|Relay_Master_Log_File|Master_Log_File|Read_Master_Log_Pos|Exec_Master_Log_Pos|Seconds_Behind_Master)"

如果 Read_Master_Log_Pos == Exec_Master_Log_Pos 但 Seconds_Behind_Master > 0,基本可断定是时间不同步或事务依赖阻塞(如 logical_clock 并行模式下等待前置事务提交)。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

为什么开了并行复制,SQL Thread 还是单线程跑

MySQL 的并行复制不是默认开启的,也不是开了就一定生效。它依赖两个关键配置同时满足:

  • slave_parallel_type=LOGICAL_CLOCK(MySQL 5.7+ 推荐),不能是 database(旧版按库并发,效果差)
  • slave_parallel_workers > 0(比如设为 4 或 8),且 slave_parallel_workers 是动态变量,但必须在 STOP SLAVE 后设置才生效

容易踩的坑:

  • 改完变量没 STOP SLAVE; START SLAVE;,配置不生效
  • 用了 STATEMENT 格式 binlog,LOGICAL_CLOCK 并行无法识别事务冲突关系,退化为单线程
  • 主库事务写入太“串行”(比如所有更新都集中在同一张表、同一行),从库并行线程实际无事可做

验证是否真并发:

SHOW PROCESSLIST;

能看到多个 Worker 线程(如 Worker 1, Worker 2),且状态不是 Waiting for an event from Coordinator,才算真正跑起来了。

心跳表比 Seconds_Behind_Master 更靠谱吗

pt-heartbeat 这类工具通过在主库定时写入时间戳记录、从库读取并计算差值,绕过了 MySQL 自身时间估算逻辑,确实更稳定。但它引入了额外组件和写入开销,且只能反映“最后一条心跳记录”的延迟,无法反映当前正在回放的事务阻塞情况。

适用场景:

  • 需要长期、平滑、抗干扰的延迟监控(比如接入 Prometheus 告警)
  • 主从时间不同步频繁,Seconds_Behind_Master 失效严重
  • 想对比不同从库之间的相对延迟(比如多从库读写分离选路)

注意点:

  • 心跳表必须建在主库上,且主库写入不能被过滤(replicate-ignore-db 等规则会拦掉心跳)
  • 心跳频率不宜过密(如 1 秒一次),否则增加主库压力;也不宜过疏(如 30 秒一次),错过短时尖峰延迟
  • 它测的是“端到端延迟”,包含网络传输 + SQL 回放,但无法告诉你卡在哪一环——仍需配合 SHOW SLAVE STATUS 定位

真正难的不是发现延迟,而是判断它是否业务可接受、是否正在恶化、以及是否掩盖了更深层的问题(比如从库磁盘 IOPS 饱和、主库 binlog 写满导致 IO 线程假死)。盯着一个数字调参,不如先看三分钟 SHOW PROCESSLIST 和 iostat -x 1。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

1993

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1239

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

715

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2632

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

4348

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1019

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

4611

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4142

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

5354

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 176人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 279人学习