0

0

mysql从库延迟严重怎么办_mysql同步异常分析

P粉602998670

P粉602998670

发布时间:2026-01-25 07:07:20

|

571人浏览过

|

来源于php中文网

原创

主从延迟需先确认是否真延迟:Seconds_Behind_Master仅在SQL和IO线程空闲时准确,为NULL通常表示SQL线程已停止;应检查SHOW SLAVE STATUS中两个Running状态,并比对主从位点定位真实延迟。

mysql从库延迟严重怎么办_mysql同步异常分析

主从延迟怎么看:先确认是不是真延迟

很多情况下所谓“延迟严重”,其实是监控误报或误读 Seconds_Behind_Master。这个值在从库 SQL 线程空闲、IO 线程也空闲时才准确;一旦从库正在执行大事务、或主库写入突增,它可能长时间卡在某个值不动,甚至为 NULL(比如 SQL 线程已停止)。

  • 先执行 SHOW SLAVE STATUS\G,重点看 Slave_IO_RunningSlave_SQL_Running 是否都为 Yes
  • 如果 Seconds_Behind_MasterNULL,大概率是 SQL 线程挂了,不是慢,是停了
  • 对比主库 SHOW MASTER STATUSFile/Position 和从库的 Master_Log_File/Read_Master_Log_Pos(IO 进度)以及 Relay_Master_Log_File/Exec_Master_Log_Pos(SQL 执行到哪),能更准判断是否真落后

SQL 线程卡住:常见原因和快速定位

真正拖慢同步的,90% 是 SQL 线程执行慢,而不是网络或磁盘 IO。MySQL 5.7+ 可以用 performance_schema 查正在执行的复制事件:

SELECT * FROM performance_schema.replication_applier_status_by_worker\G

重点关注 LAST_SEEN_TRANSACTIONLAST_ERROR_NUMBER。常见卡点:

  • Lock wait timeout exceeded:从库有长事务或未提交事务锁表,阻塞了 SQL 线程回放
  • Duplicate entry:主从数据不一致导致唯一键冲突,SQL 线程直接 stop
  • 大事务回放:主库一个 UPDATE 影响 500 万行,从库单线程重放,耗时数小时
  • 从库开了 binlog_format = STATEMENT 但用了非确定函数(如 NOW()UUID()),导致日志无法安全重放

加速同步的实操手段:别只盯着并行复制

开启并行复制(slave_parallel_workers > 0)确实有用,但前提是主库写入本身能按库/表拆分。如果所有写都在一个库一个表,开再多 worker 也没用——全串行。

  • 确认主库 binlog_formatROW(必须,STATEMENT 模式下并行复制基本无效)
  • 设置 slave_parallel_type = LOGICAL_CLOCK(比 DATABASE 更细粒度)
  • 调高 slave_parallel_workers(建议设为 CPU 核数 -1,不要盲目设 64)
  • 临时跳过非关键错误(慎用):SET GLOBAL sql_slave_skip_counter = 1; 或用 gtid_next 跳过指定事务
  • 对已知大事务,可在主库拆成小批量(比如每次 UPDATE ... LIMIT 10000 + SLEEP(0.1)

容易被忽略的底层瓶颈:磁盘和 relay log 配置

很多人查完 SQL 线程、开了并行,延迟还是下不去——这时候要看 I/O。

  • 从库 relay_log 文件默认写在 MySQL 数据目录,如果和 datadir 共用同一块慢盘(尤其是机械盘),relay log 写入 + 回放读取会互相抢占
  • 检查 relay_log_space_limit:设得太小会导致频繁轮转 relay log,触发 fsync,拖慢 SQL 线程
  • sync_relay_log = 1 是安全的,但每写一次 relay log 就刷盘一次;生产环境可考虑设为 10000(每 10000 次写刷一次),代价是 crash 后最多丢 10000 条 relay event
  • 确保从库 innodb_flush_log_at_trx_commit = 1(主库也是),否则主从数据一致性无法保证,加速反而埋雷

真正卡住的时候,往往不是配置没开,而是磁盘扛不住、事务太大、或者从库上跑了备份脚本把 IO 打满了。先看 iostat -x 1,再看 SHOW PROCESSLIST,比改参数管用得多。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

686

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

325

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1159

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

359

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

757

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

577

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

420

2024.04.29

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

45

2026.01.23

热门下载

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

精品课程

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

共48课时 | 1.9万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 810人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号