千家信息网

mysql常见slave延迟原因有哪些

发表于:2025-11-12 作者:千家信息网编辑
千家信息网最后更新 2025年11月12日,这篇文章主要介绍了mysql常见slave延迟原因有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一 序言在运维线上M-M 架构的
千家信息网最后更新 2025年11月12日mysql常见slave延迟原因有哪些

这篇文章主要介绍了mysql常见slave延迟原因有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

一 序言

在运维线上M-M 架构的MySQL数据库时,接收的比较多关于主备延时的报警:

  1. check_ins_slave_lag (err_cnt:1)critical-slavelag on ins:3306=39438

相信slave 延迟是MySQL dba 遇到的一个老生长谈的问题了。先来分析一下slave延迟带来的风险

1. 异常情况下,主从HA无法切换。HA 软件需要检查数据的一致性,延迟时,主备不一致。

2. 备库复制hang会导致备份失败(flush tables with read lock会900s超时)

3. 以 slave 为基准进行的备份,数据不是最新的,而是延迟。

二 如何解决

面对此类问题我们如何解决 ,如何规避?分析一下导致备库延迟的几种原因

1. ROW模式无主键、无索引或索引区分度不高.有如下特征

a. show slave status 显示position一直没有变

b. show open tables 显示某个表一直是 in_use 为 1

c. show create table 查看表结构可以看到无主键,或者无任何索引,或者索引区分度很差。

解决方法:

a. 找到表区分度比较高的几个字段, 可以使用这个方法判断:

select count(*) from xx;

select count(*) from (select distinct xx from xxx) t;

如果2个查询count(*)的结果差不多,说明可以对这些字段加索引

b. 备库stop slave;

可能会执行比较久,因为需要回滚事务。

c. 备库

set sql_log_bin=0;

alter table xx add key xx(xx);

老的版本slave应用binlog时只会选择第一个索引,需要把新加的索引放在最前面,可以先把老的索引删掉,建新的索引,再把老的索引建上。可以放到一个sql中执行。

d. 备库start slave

如果是innodb,可以通过show innodb status来查看 rows_inserted,updated,deleted,selected这几个指标来判断。

如果每秒修改的记录数比较多,说明复制正在以比较快的速度执行。

2 MIXED模式无索引或SQL慢

在从库上show full processlist 查看到正在执行的SQL。

解决方法:

a. SQL比较简单, 则检查是否缺少索引,并添加索引。

b. 另一类是 insert into select from的语句,如果select 里包含group by,多表关联,可能效率会比较低。

这类可以到主库把binlog_format改成row。

3 主库上有大事务,导致从库延时

现象解析binlog 发现类似于下图的情况看

解决方法:

与开发沟通,增加缓存,异步写入数据库,减少直接对db的大量写入。

4. 主库写入频繁,从库压力跟不上导致延时

此类原因的主要现象是数据库的 IUD 操作非常多,slave由于sql_thread单线程的原因追不上主库。

解决方法:

a 升级从库的硬件配置,比如ssd,fio.

b 使用@丁奇的预热工具-relay fetch

在备库sql线程执行更新之前,预先将相应的数据加载到内存中,并不能提高sql_thread线程执行sql的能力,也不能加快io_thread线程读取日志的速度。

c 使用多线程复制 阿里MySQL团队实现的方案--基于行的并行复制。

该方案允许对同一张表进行修改的两个事务并行执行,只要这两个事务修改了表中的不同的行。这个方案可以达到事务间更高的并发度,但是局限是必须使用Row格式的binlog。因为只有使用 Row格式的binlog才可以知道一个事务所修改的行的范围,而使用Statement格式的binlog只能知道修改的表对象。

5. 数据库中存在大量myisam表,在备份的时候导致slave 延迟

由于xtrabackup 工具备份到最后会执行flash tables with read lock ,对数据库进行锁表以便进行一致性备份,然后对于myisam表 锁,会阻碍salve_sql_thread 停滞运行进而导致hang

该问题目前的比较好的解决方式是修改表结构为innodb存储引擎的表。

三 拓展阅读

[1] 怎样解决MySQL数据库主从复制延迟的问题

[2] 三种MySQL并行复制方案的分析

[3] 一种MySQL主从同步加速方案-改进

[4] MySQL多线程同步MySQL-Transfer介绍


6、如何确认真正延迟多少?
seconds_bebind_master这个参数不准,有时显示为0,但是有数据延迟的情况,在stop slave和start slave后,数据就同步过来了,因为slave有时候检测网络正常失败,可以使用脚本来实现监控,在salve和master节点分别部署。
先在两个节点都创建监控表

  1. #filename: run_mysql_replication_heartbeat.py

  2. #encoding=gbk

  3. import datetime,time

  4. import os,sys

  5. from public import db

  6. import db_conf

  7. source_folder = db_conf.SOURCE_FOLDER

  8. def init_eviroment_path():

  9. print sys.path

  10. python_path = (source_folder)

  11. for i in python_path:

  12. if i not in sys.path:

  13. sys.path.append(i)

  14. print sys.path

  15. def main():

  16. conn, cursor = db.GetMysqlCursor('update')

  17. cursor.execute("insert into heartbeat (master_datetime,slave_datetime) values(now(),sysdate())")

  18. cursor.close()

  19. conn.close()

  20. if __name__ == '__main__':

  21. init_eviroment_path()

  22. os.system("title MySQL Replication心跳")

  23. count = 1

  24. while True:

  25. main()

  26. print "(%d)%s"%(count,datetime.datetime.now())

  27. count+=1

  28. time.sleep(60)

修改master端的binlog模式为statement(默认为mix)

所以这么修改是因为必须是statement的SQL语句同步模式才行,否则mix下有可能是ROW的结果数据同步模式就不行,这个我也是通过master>show binlog events才找到这个原因。

如果要立刻看到结果,只要把master端的时间修改一下,例如提前一个小时,执行:

insert into heartbeat (master_datetime,slave_datetime) values(now(),sysdate())在slave上就可以看到类似如下结果:

感谢你能够认真阅读完这篇文章,希望小编分享的"mysql常见slave延迟原因有哪些"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

数据 索引 延迟 原因 事务 数据库 线程 备份 方案 方法 模式 同步 篇文章 结果 问题 一致 两个 主从 情况 格式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 sip语音服务器 网络安全等级评估规范 中兴服务器系统 方舟进化手游怎么玩服务器 电厂网络安全攻防演练 数据库不挂科百度网盘链接 攻击阿里云无防护服务器 深圳市兆比特网络技术有限公司 清远数据链软件开发供应商家 软件开发用不到算法 网络安全与执法类公务员近视 化饭圈乱象会网络安全 怎么在服务器上创建管理员 大兴安岭网络安全宣传视频 服务器托管机柜 台湾服务器电子厂供应链 宜章app软件开发工资 网络安全人工智能发展前景 利用知识图谱整合数据库 上海好的软件开发收费 4g模块的数据如何发到服务器 中国发布网络安全产业白皮书 知网数据库如何对大学收费 药物安全性警戒数据库 如何获取网站数据库地址 软件开发中设计流程是什么 超南润网络技术 郑州企业软件开发哪家实惠 软件开发公司资质分几个等级 打电话中断显示无法连接服务器
0