Mysql slave 延迟故障一列(无主键)
首先还是给出我见过的一些延迟可能:
- 大事物延迟 延迟略为2*执行时间 状态为:reading event from the relay log
- 大表DDL延迟 延迟略为1*执行时间 状态为:altering table
- 长期未提交的事物延迟,会造成延迟的瞬时增加
- 表上没有主键或者唯一键 状态为:system lock 或者 reading event from the relay log
- innodb层锁造成延迟 状态为:system lock 或者 reading event from the relay log
- 从库参数设置如sync_binlog,sync_relay_log,innodb_flush_log_at_trx_commit等参数
一、故障描述
本案例是一个朋友的,从各方面进行展示故障
按照他的描述是在主库进行了大量形如delete from where col='';的操作,每次delete会删除大量的行。主库删除并不慢,但是从库追不上。
下面是现象:
- 延迟较大且无好转迹象

- 系统整体负载不高但是mysqld进程100%

- 无I/O压力

- 有大事物的存在

这里这个5G是binlog的拷贝。
二、故障初次分析
首先我们要明白没有I/O压力代表了什么,没有I/O压力代表了我们常说的fsync没有压力,对应的不会是下面几个参数的问题:
- sync_binlog
- sync_relay_log
- innodb_flush_log_at_trx_commit
也就是跟I/O相关的调整我们是不需要考虑的。
我们再来看CPU的问题,用top -HU可以看到线程的资源消耗如下:
我们可以清楚的看到某个MySQL线程耗用CPU为100%,因为是5.7我们可以方便的使用语句
select a.thd_id,b.THREAD_OS_ID,a.user ,a.conn_id,b.TYPE,a.source,a.program_name from sys.processlist a,performance_schema.threads b where b.thread_id=a.thd_id;
找到MySQL线程和操作系统的对应关系如下:
我们可以清楚看到是我们的SQL_THREAD,所以我们找到的根源是SQL_THREAD耗用了过多的CPU资源但是I/O并不是问题。
三、故障再次分析
一般来讲我们遇到SQL_THREAD可能伴随着I/O问题,但是这里并没有,所以瓶颈可能在缓存数据的查找方面。我们使用perf进行一下分析排名靠前的如下:
其中btr_search_guess_on_hash适合AHI自适应的hash索引相关的函数,而rec_get_offsets_func是对索引的每个flied进行定位的函数(当然我也没仔细看过源码只是看了一下所在的文件位置和函数描述信息),也就是他们貌似都是二级索引数据的查找有关,我们再来看这个表的表结构如下:
我们发现这个表除了二级索引并没有主键,问题基本已经定位,也就是我开始给除的延迟中的一条:
- 表上没有主键或者唯一键 状态为:system lock 或者 reading event from the relay log
所以原因可能就是,因为没有主键或者唯一键,event回放的时候使用到了二级索引让回放速度慢且进行了大量的内存数据查找造成了CPU 100%而没有I/O的现象。
四、问题解决
也就是对本表加一个自增字段作为主键,速度马上提高了。当然这个解决办法其实我很最早就猜测到了,但是我想尽量找到为什么会这样。perf中的函数具体的逻辑等我学习AHI的在分析。呵呵呵呵!本次分析中唯一的遗憾是没有pstack栈帧,否则会更加清晰和有力。
Mysql slave 延迟故障一列(无主键)的更多相关文章
- mysql主从同步(4)-Slave延迟状态监控
mysql主从同步(4)-Slave延迟状态监控 转自:http://www.cnblogs.com/kevingrace/p/5685511.html 之前部署了mysql主从同步环境(Mysql ...
- 监控Mysql主从环境下Slave延迟状态的操作记录
在MySQL主从环境下,通常会根据Seconds_Behind_Master的值来判断slave的延迟状态,这么做在大部分情况下尚可接受,但其实是并不够准确的.对于Slave延迟状态的监控,应该考虑多 ...
- [MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
我们先了解下InnoDB引擎表的一些关键特征: InnoDB引擎表是基于B+树的索引组织表(IOT): 每个表都需要有一个聚集索引(clustered index): 所有的行记录都存储在B+树的叶子 ...
- (转)mysql中InnoDB表为什么要建议用自增列做主键
InnoDB引擎表的特点 1.InnoDB引擎表是基于B+树的索引组织表(IOT) 关于B+树 (图片来源于网上) B+ 树的特点: (1)所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关 ...
- Mysql增加主键或者更改表的列为主键的sql语句
...
- mysql中InnoDB表为什么要建议用自增列做主键
InnoDB引擎表的特点 1.InnoDB引擎表是基于B+树的索引组织表(IOT) 关于B+树 (图片来源于网上) B+ 树的特点: (1)所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关 ...
- mysql新增一列为主键
mysql新增一列为主键 由于一次疏忽在建表的时候忘记加上主键了, 但是目前来说表里面又有数据了,所以不能删表重建,所以需要新加一列主键 然后我就新加一列,并且为auto_increment,然后设置 ...
- MySQL面试题之为什么要为innodb表设置自增列做主键?
为什么要为innodb表设置自增列做主键? 1.使用自增列做主键,写入顺序是自增的,和B+数叶子节点分裂顺序一致 2.表不指定自增列做主键,同时也没有可以被选为主键的唯一索引,InnoDB就会选择内置 ...
- [转载]常见slave 延迟原因以及解决方法
一 序言在运维线上M-M 架构的MySQL数据库时,接收的比较多关于主备延时的报警: 点击(此处)折叠或打开 check_ins_slave_lag (err_cnt:1)critical-slav ...
随机推荐
- 【转】Linux下软件安装的几种方式
转自Linux下软件安装的几种方式 Linux 系统的/usr目录 Linux 软件安装到哪里合适,目录详解 Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的 /usr:系统 ...
- 黑马vue---33、vue-resource 实现 get, post, jsonp请求
黑马vue---33.vue-resource 实现 get, post, jsonp请求 一.总结 一句话总结: vue-resource使用非常非常非常简单:this.$http.get('htt ...
- sql server management studio 连接时指定非默认端口 ,port
- telnet nmap netstap
yum install nmap [root@10-13-109-236 ~]# nmap localhost Starting Nmap 6.40 ( http://nmap.org ) at 20 ...
- 不建议在for循环中使用”+”进行字符串拼接
https://mp.weixin.qq.com/s/qG6bdhndAip9s-_XM9oP3A 为什么阿里巴巴不建议在for循环中使用”+”进行字符串拼接 互联网后端架构 1周前
- Googletest - Google Testing and Mocking Framework
Googletest - Google Testing and Mocking Framework https://github.com/google/googletest
- Angular 执行 css3 简单的动画
<div class="content"> 内容区域 <button (click)="showAside()">弹出侧边栏</b ...
- alpha测试和beta测试的区别是什么?
1.测试时间不同: Beta测试是软件产品完成了功能测试和系统测试之后,在产品发布之前所进行的软件测试活动,它是技术测试的最后一个阶段. alpha测试简称“α测试”,可以从软件产品编码结束之时开始, ...
- iOS 将一个UIImage缩放到指定Size
这方法挺实用的,直接调用就可以得到想要的size. //将一个UIImage缩放变换到指定Size -(UIImage*) OriginImage:(UIImage *)image scaleToSi ...
- thymeleaf中分类信息使用不同的样式
需求: 相关class类名:S224_on_point url:/notification/list url:/notification/list?type=2 thymeleaf代码如下: < ...


