首先还是给出我见过的一些延迟可能:

  • 大事物延迟 延迟略为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 延迟故障一列(无主键)的更多相关文章

  1. mysql主从同步(4)-Slave延迟状态监控

    mysql主从同步(4)-Slave延迟状态监控  转自:http://www.cnblogs.com/kevingrace/p/5685511.html 之前部署了mysql主从同步环境(Mysql ...

  2. 监控Mysql主从环境下Slave延迟状态的操作记录

    在MySQL主从环境下,通常会根据Seconds_Behind_Master的值来判断slave的延迟状态,这么做在大部分情况下尚可接受,但其实是并不够准确的.对于Slave延迟状态的监控,应该考虑多 ...

  3. [MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键

    我们先了解下InnoDB引擎表的一些关键特征: InnoDB引擎表是基于B+树的索引组织表(IOT): 每个表都需要有一个聚集索引(clustered index): 所有的行记录都存储在B+树的叶子 ...

  4. (转)mysql中InnoDB表为什么要建议用自增列做主键

    InnoDB引擎表的特点 1.InnoDB引擎表是基于B+树的索引组织表(IOT) 关于B+树 (图片来源于网上) B+ 树的特点: (1)所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关 ...

  5. Mysql增加主键或者更改表的列为主键的sql语句

                                                                                                        ...

  6. mysql中InnoDB表为什么要建议用自增列做主键

    InnoDB引擎表的特点 1.InnoDB引擎表是基于B+树的索引组织表(IOT) 关于B+树 (图片来源于网上) B+ 树的特点: (1)所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关 ...

  7. mysql新增一列为主键

    mysql新增一列为主键 由于一次疏忽在建表的时候忘记加上主键了, 但是目前来说表里面又有数据了,所以不能删表重建,所以需要新加一列主键 然后我就新加一列,并且为auto_increment,然后设置 ...

  8. MySQL面试题之为什么要为innodb表设置自增列做主键?

    为什么要为innodb表设置自增列做主键? 1.使用自增列做主键,写入顺序是自增的,和B+数叶子节点分裂顺序一致 2.表不指定自增列做主键,同时也没有可以被选为主键的唯一索引,InnoDB就会选择内置 ...

  9. [转载]常见slave 延迟原因以及解决方法

    一  序言在运维线上M-M 架构的MySQL数据库时,接收的比较多关于主备延时的报警: 点击(此处)折叠或打开 check_ins_slave_lag (err_cnt:1)critical-slav ...

随机推荐

  1. 【linux】保存屏幕日志log

    例如: #!/bin/bash #LOG="examples/mnist/lenet_log_mylog" LOG="LOG/log.txt.`date +'%Y-%m- ...

  2. LUA table中函数的调用

    1 lua中函数作为表中元素时有三种定义方式 采用‘:’来定义,实际上隐藏了一个形参的声明,这个形参会截获调用函数时的第一个实参并把它赋值给self 2 调用方式,点号和冒号 functb:hello ...

  3. 2018-2019-2 20165234 《网络对抗技术》 Exp9 Web安全基础

    Exp9 Web安全基础 一. 实践内容 1. 安装JDK.Webgoat 2. SQL注入攻击 数字型注入(Numeric SQL Injection) 日志欺骗(Log Spoofing) 字符串 ...

  4. 2018-2019-2 20165234 《网络对抗技术》 Exp8 网络欺诈防范 Web基础

    Exp8 网络欺诈防范 Web基础 一. 实践内容 1. Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. 2. Web ...

  5. RK3399 删除开机锁屏界面

    CPU:RK3399 系统:Android 7.1 删除开机锁屏界面 diff --git a/frameworks/base/packages/SettingsProvider/res/values ...

  6. latex运算符

    一些小的运算符,可以在数学模式下直接输入,但是有一些运算符需要用控制序列生成:

  7. apk增加系统签名的方法

    1.命令行方法给apk加系统签名在Linux环境:java -Djava.library.path=. -jar signapk.jar platform.x509.pem platform.pk8 ...

  8. 算法习题---3.01猜数字游戏提示(UVa340)

    一.题目 实现一个经典“猜数字”游戏.给定答案序列和用户猜的序列,统计有多少数字位置正确(A),有多少数字在两个序列都出现过但位置不对(B). 输入包含多组数据.每组输入第一行为序列长度n,第二行是答 ...

  9. mybatis/tk mybatis下实体字段是关键字/保留字,执行报错

    实体如下: import com.fasterxml.jackson.annotation.JsonFormat; import com.xxx.web.bean.PagesStatic; impor ...

  10. tk mybatis动态sql中过滤不使用的字段

    实体字段如下 @Data @NoArgsConstructor @AllArgsConstructor @Builder /*** * app图标 */ @JsonFormat public clas ...