使用tcpdump排查mysql数据库tps飙升的问题
现象 上线后习惯性的观察数据库的变化。发现数据库的tps有很大的飙升。不过幸好在双十一的时候在数据库方面做了一些完善,虽然主库的tps有飙升,但是总体load还不是很高。但是问题既然出现了,还是要解决的。 排查过程 确定是insert update 还是 delete操作
现象
上线后习惯性的观察数据库的变化。发现数据库的tps有很大的飙升。不过幸好在双十一的时候在数据库方面做了一些完善,虽然主库的tps有飙升,但是总体load还不是很高。但是问题既然出现了,还是要解决的。
排查过程
确定是insert update 还是 delete操作导致tps高?
既然是tps高,那就说明数据库修改的操作多了。到底是insert update操作多了, 还是 delete 操作多了?在天机平台可以很明显的可以看出来。如下图:
从上图,我们可以很清楚的看出来是update操作多了导致的。
到底是那些update语句导致tps高?
当时程序中并没有记录所有执行的sql语句。因此,没有一个现成的数据文件供分析。Sql语句是通过网络以文本方式传输到mysql服务器端的。因此我们完全可以通过tcpdump这个工具把所有的sql语句捕获到。
首先,为了便于比对,我先把一台服务器上的代码回滚到上线前的版本。
其次,我在两台服务器上同时执行tcpdump命令,以捕获所有执行的sql脚本。这两台服务器分别运行着上线前的旧版本程序和上线后的新版本程序。抓包命令如下:
$sudo tcpdump -i eth0 -A -s 3000 port 3306 > ~/sql.log
注意,我们在使用tcpdump的时候加了-A参数,这样就可以把sql语句都显示出来了。更多tcpdump使用,可以查看文章 调试利器之tcpdump详解
大约执行1分钟后,同时停止执行。这个时候,sql.log文件中已经包含了这段时间执行的所有sql语句。示例如下:
$grep 'update' ./sql.log | head ....5u.vD....update session_table set expire=’2014-12-12 20:01:23’ where sess_id = ‘demostring123’ limit 1
既然我们现在已经有了所有执行的sql语句,我们就可以很容易的通过使用grep, wc 等命令分析出是那些sql语句执行次数猛增了。
原文地址:使用tcpdump排查mysql数据库tps飙升的问题, 感谢原作者分享。
推荐阅读
-
使用cmd运行mysql数据库的时候,报错:"不是内部命令也不是可有运行的程序"问题的解决办法
-
使用wordpress的$wpdb类读mysql数据库做ajax时出现的问题该如何解决
-
使用JDBC连接Mysql数据库会出现的问题总结
-
eclipse Java web项目数据库由oracle更改为mysql中遇到的问题(使用JPA注解)附上修改过程
-
使用cmd运行mysql数据库的时候,报错:"不是内部命令也不是可有运行的程序"问题的解决办法
-
使用mysqldump对数据库进行备份的乱码问题_MySQL
-
使用mysqldump对数据库进行备份的乱码问题_MySQL
-
使用 PHP + MySQL 处理负载过重的数据库问题思考和总结
-
使用wordpress的$wpdb类读mysql数据库做ajax时出现的问题该如何解决
-
[原]WordPress 3.9使用PostgreSQL数据库问题的解决_MySQL