mysql主从复制中如何监控IO线程_mysql同步状态分析

7次阅读

IO线程是否运行需查SHOW SLAVE STATUSG中Slave_IO_Running值,仅Yes/No两种状态;为No表示彻底失败,常见原因包括网络不通、配置错误、权限不足、log_bin未开启、server_id重复或防火墙拦截。

mysql主从复制中如何监控IO线程_mysql同步状态分析

怎么看 IO 线程是否在运行

直接查 SHOW SLAVE STATUSG,重点看 Slave_IO_Running 字段。它只有两个合法值:YesNo,没有中间状态。如果显示 No,说明 IO 线程根本没起来,不是卡住、不是延迟,是彻底失败。

常见原因包括:

  • 主库网络不通(从库连不上主库的 3306 端口
  • CHANGE REPLICATION SOURCE TO 里配错了 SOURCE_HOSTSOURCE_USER 权限不足(该用户必须有 REPLICATION SLAVE 权限)
  • 主库没开 log_bin,或从库的 server_id 和主库重复
  • 主库防火墙拦截了 binlog dump 请求,或者云厂商安全组没放行

IO 线程报错时怎么定位具体问题

SHOW SLAVE STATUSSlave_IO_State 是空字符串或停留在 Connecting to master,基本就是连接层失败;如果出现类似 Error connecting to master 'repl@10.0.1.100:3306' - retry-time: 60 retries: 1 的提示,就去检查 Last_IO_Error 字段。

典型错误和应对方式:

  • access denied for user 'repl'@'x.x.x.x' (using password: YES) → 主库上执行 SHOW GRANTS FOR 'repl'@'%';,确认权限和 host 匹配
  • Could not find first log file name in binary log index file → 从库配置的 SOURCE_LOG_FILE 在主库上已不存在,需重新 CHANGE REPLICATION SOURCE TO 指向当前有效的 binlog 文件
  • got fatal error 1236 from master when reading data from binary log → 多半是主库 binlog 被清理过,从库要重做同步

只靠 Seconds_Behind_Master 判断同步是否健康?不行

这个值为 0 只代表 sql 线程追上了 IO 线程读到的位置,并不保证 IO 线程还在工作。比如 IO 线程崩溃后停止拉日志,SQL 线程把已缓存的 relay log 全执行完,Seconds_Behind_Master 就会变成 0,但实际早已不同步。

真正可靠的组合判断是:

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes
  • Seconds_Behind_Master 数值稳定(不是忽高忽低)
  • Retrieved_Gtid_SetExecuted_Gtid_Set 相等(GTID 模式下)

建议写个简单脚本定期查这三个字段,而不是只盯一个 Seconds_Behind_Master

监控 IO 线程不能只看 mysql 内部状态

MySQL 层面一切正常,不代表网络链路真的可靠。IO 线程可能处于“假活”状态:TCP 连接未断,但主库 binlog dump 线程已卡死或被 kill,从库收不到新事件

更稳妥的做法是交叉验证:

  • 在主库执行 SHOW PROCEsslIST,找状态为 Binlog Dump GTIDBinlog Dump 的线程,确认它存在且 Time 值持续增长
  • tcpdump 抓从库到主库 3306 端口的包,看是否有持续的 binlog 数据流(注意别在生产高峰跑)
  • 对比主从的 SHOW MASTER STATUSSHOW SLAVE STATUS 中的 binlog 文件名和位置偏移,手动算差值

IO 线程的“活着”只是最低门槛,真正难的是确认它是否在**有效工作**——这需要跳出 MySQL,结合网络、系统、主库状态一起看。

text=ZqhQzanResources