数据库

 首页 > 数据库 > MySql > 使用tcpdump排查mysql数据库tps飙升的问题

使用tcpdump排查mysql数据库tps飙升的问题

分享到:
【字体:
导读:
         摘要:上线后习惯性的观察数据库的变化。发现数据库的tps有很大的飙升。不过幸好在双十一的时候在数据库方面做了一些完善,虽然主库的tps有飙升,但是总体load还不是很高。但是问题既然出现了,还是要解决的。...

使用tcpdump排查mysql数据库tps飙升的问题
现象

上线后习惯性的观察数据库的变化。发现数据库的tps有很大的飙升。不过幸好在双十一的时候在数据库方面做了一些完善,虽然主库的tps有飙升,但是总体load还不是很高。但是问题既然出现了,还是要解决的。

排查过程

确定是insert update 还是 delete操作导致tps高?

既然是tps高,那就说明数据库修改的操作多了。到底是insert update操作多了, 还是 delete 操作多了?在天机平台可以很明显的可以看出来。如下图:
tps_tianji

从上图,我们可以很清楚的看出来是update操作多了导致的。

到底是那些update语句导致tps高?

当时程序中并没有记录所有执行的sql语句。因此,没有一个现成的数据文件供分析。Sql语句是通过网络以文本方式传输到mysql服务器端的。因此我们完全可以通过tcpdump这个工具把所有的sql语句捕获到。

首先,为了便于比对,我先把一台服务器上的代码回滚到上线前的版本。

其次,我在两台服务器上同时执行tcpdump命令,以捕获所有执行的sql脚本。这两台服务器分别运行着上线前的旧版本程序和上线后的新版本程序。抓包命令如下:

1
$sudotcpdump -i eth0 -A -s 3000 port 3306 > ~/sql.log

注意,我们在使用tcpdump的时候加了-A参数,这样就可以把sql语句都显示出来了。更多tcpdump使用,可以查看文章 调试利器之tcpdump详解

大约执行1分钟后,同时停止执行。这个时候,sql.log文件中已经包含了这段时间执行的所有sql语句。示例如下:

1
2
$grep'update'./sql.log |head
....5u.vD....update session_tablesetexpire=’2014-12-12 20:01:23’ where sess_id = ‘demostring123’ limit 1

既然我们现在已经有了所有执行的sql语句,我们就可以很容易的通过使用grep, wc 等命令分析出是那些sql语句执行次数猛增了。

使用tcpdump排查mysql数据库tps飙升的问题
分享到:
MySQL · 引擎特性 · InnoDB Adaptive h...
MySQL · 引擎特性 · InnoDB Adaptive hash index介绍 前言 我们知道InnoDB的索引组织结构为Btree。通常情况下,我们需要根据查询条件,从根节点开始寻路到叶子节点,找到满足条件的记录。为了减少寻路开销,InnoDB本身做了几点优化。 首先,对于连续记录扫描,InnoDB在满足比较严格的条件时采用row cache的...
使用MySQL正则表达式 __MySQL必知必会
使用MySQL正则表达式 __MySQL必知必会 正则表达式作用是匹配方本,将一个模式(正则表达式)与一个文本串进行比较。 MySQL用WHERE子句对正则表达式提供了初步的支持,允许你指定用正则表达式过滤SELECT检索出的数据。 MySQL仅支持多数正则表达式实现的一个很小的子集。 ---------------------- 9...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……