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

  • 大事物延迟 延迟略为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性能调优一】观大局:系统平均负载load average

    要测试linux系统性能及调优,首先要从全局检查linux的平均负载 1.什么是平均负载 load average 系统平均负载,平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数, ...

  2. Asis_2016_b00ks wp

    目录 程序基本信息 程序漏洞 利用思路 exp脚本 参考 程序基本信息 程序漏洞 有一个读入函数,程序的所有输入都靠它读取,这个程序有个很明显的off_by_one漏洞,在输入时多输入一个0字符. 利 ...

  3. 如果项目在IIS发布后,出现System.ComponentModel.Win32Exception: 拒绝访问。

    如果项目在IIS发布后,出现System.ComponentModel.Win32Exception: 拒绝访问. 那么就试试下面的办法. 步骤如下: 应用程序池=>设置应用程序池默认设置 将标 ...

  4. php手记之01-tp5框架安装

    1.1.介绍 在web领域,PHP是所有编程语言中比较受欢迎的一门语言! PHP已经诞生出几十种编程框架!但国内最热门和使用率最好的框架有Thinkphp和Laravel这两款PHP框架! 1.2.为 ...

  5. arcgis python 不知道一个工具怎么用

    完整的工具帮助信息 import arcpy print(arcpy.Usage("Buffer_analysis")) print(arcpy.Usage("MakeF ...

  6. leetcode 143. Reorder List 、86. Partition List

    143. Reorder List https://www.cnblogs.com/grandyang/p/4254860.html 先将list的前半段和后半段分开,然后后半段进行逆序,然后再连接 ...

  7. 小数组的读写和带Buffer的读写哪个快

    定义小数组如果是8192个字节大小和Buffered比较的话 定义小数组会略胜一筹,因为读和写操作的是同一个数组 而Buffered操作的是两个数组

  8. EasyUI动态展示用户信息

    业务需求:用户登录后展示用户名.用户对应的角色.EasyUI只不过是一个前端的框架,封装了一些组件和样式,你可以用jsp直接调后台获取到用户信息展示,但我这里想用html页面,用目前流行的说法:前后端 ...

  9. selenium UI自动化解决验证码的五种方法

    TesseractPy3.py #coding=utf-8 import os import subprocess import traceback import logging from PIL i ...

  10. springboot和solr结合测试使用

    首先新建springboot项目 新建webapp目录 springboot没有webapp目录——手动添加 web.xml <?xml version="1.0" enco ...