0%

慢日志分析工具mysqldumpslow的使用

mysqldumpslow是mysql自带的一个慢日志分析工具。
如果执行这个命令提示不存在时,可使用find / -name mysqldumpslow命令查找一下,然后将其添加到PATH中。

1
ln -s /www/server/mysql/bin/mysqldumpslow  /usr/local/bin/mysqldumpslow

宝塔中Mysql的慢日志默认存放在:/www/server/data/mysql-slow.log
可以将慢日志复制到测试机上分析。

参数

1
2
3
4
5
6
7
8
9
10
11
-s 是什么方式排序
c:访问计数
l:锁定时间
r:返回记录
al:平均锁定时间
ar:平均访问记录数
at:平均查询时间

-t 是top n的意思,即返回前面多少条分析结果

-g 可以跟上正则匹配模式,大小写不敏感。

分析示例

1、获取10条执行时间最长的sql语句

1
mysqldumpslow -s t -t 10 /www/server/data/mysql-slow.log

其中-s t表示按查询总时长排序,即下面结果中Time=6.83s (567s)中的567s排序

1
2
Count: 83  Time=6.83s (567s)  Lock=0.00s (0s)  Rows=264498.0 (21953330), 2users@localhost
SELECT /*!N SQL_NO_CACHE */ * FROM `ssp_ads_fail_log`

返回结果解析:
Count: 83 说明执行了83次
Time=6.83s (567s) 说明最大时间是6.83s,总共花费时间567s
Lock=0.00s (0s) 说明查询不锁表
Rows=264498.0 (21953330) 说明单次返回的结果数是264498条记录,总共查询了264498x83条

2、获取10条查询记录数最多的sql语句

1
mysqldumpslow -s r -t 10 /www/server/data/mysql-slow.log

3、查询10条执行时间最长且包含left join的sql语句

1
mysqldumpslow -s t -t 10 -g "left join" /www/server/data/mysql-slow.log

4、获取10条执行时间最长且不合并分析结果的sql语句

1
mysqldumpslow -a -s t -t 10 /www/server/data/mysql-slow.log

其中-a说明不合并类似的SQL语句,显示具体的SQL语句中的数字和字符串。
因为在mysqldumpslow统计中,如下两种查询默认是同一种类型的语句,

1
2
SELECT * FROM sms_send WHERE service_id=10 GROUP BY content LIMIT 0, 1000;
SELECT * FROM sms_send WHERE service_id=20 GROUP BY content LIMIT 10000, 1000;

会合并显示分析结果:

1
2
Count: 2  Time=2.79s (5s)  Lock=0.00s (0s)  Rows=1.0 (2), vgos_dba[vgos_dba]@[10.130.229.196]
SELECT * FROM sms_send WHERE service_id=N GROUP BY content LIMIT N, N;

5、获取平均访问记录数最多的10条sql语句

1
mysqldumpslow -s ar -t 10 /www/server/data/mysql-slow.log

常见问题

1、如下执行查询后,提示:

1
2
Reading mysql slow query log from /www/server/data/mysql-slow.log
Died at /usr/local/bin/mysqldumpslow line 161, <> chunk 7354.

说明要分析的sql日志太大了,请拆分后再分析。
拆分的命令为:

1
tail -100000 /www/server/data/mysql-slow.log>mysql-slow.20191121.log

参考:
https://www.jianshu.com/p/eb2e2c84330f
https://www.jianshu.com/p/eb2e2c84330f
https://www.cnblogs.com/phpper/p/6685540.html