pt-query-digest(Mysql慢查分析)

背景

pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog、General log、slowlog,也可以通过SHOW PROCESSLIST或者通过tcpdump抓取的MySQL协议数据来进行分析.(前提是我们的慢查设置为输出到文件中,下面会介绍)

写在前面
本文主要摘自https://www.cnblogs.com/liujingyuan789/p/7281070.html 测试和小部分的解释说明是为了方便读者理解
link

Mysql的慢查信息可以存放在mysql.slow_log中和系统文件中(本文重点讨论的内容是后者)

操作

pt-query-digest是一个perl脚本,只需下载并赋权即可执行。
wget percona.com/get/pt-query-digest
chmod u+x pt-query-digest

参数

log_output = FILE + slow_query_log =ON 才能记录到文件

查看存放位置:
show variables like 'slow_query_log_file';  
关于不使用索引的查询是否记录:
show variables like 'log_queries_not_using_indexes';  默认是关闭的
show variables like '%slow%';默认是关闭的
set global slow_query_log=1; 开启记录

设置阈值:
show variables like 'long_query_time'; 
show global variables like 'long_query_time';
修改统计的时长为一秒:
mysql> set global long_query_time=1;  set long_query_time=1  (回话和全局)
模拟慢sql:
执行select sleep(1) as a, 1 as b;

验证

tailf mysqlvms-slow.log
# Time: 2021-01-20T08:02:06.278674Z
# User@Host: msandbox[msandbox] @ localhost []  Id:  1565
# Query_time: 1.000409  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
use tpcc;
SET timestamp=1611129726;
select sleep(1) as a, 1 as b;

使用工具

直接分析慢查询文件:
pt-query-digest  mysqlvms-slow.log

分析指定时间范围内的查询:(我测试的时候,--since时间格式不能写成'2021-01-20 15:30:00' )
pt-query-digest mysqlvms-slow.log  --since '2021-01-20' --until '2021-01-21 15:30:00'

分析指含有select语句的慢查询:
pt-query-digest --filter '$event->{fingerprint} =~ m/^select/i' mysqlvms-slow.log

在这里插入图片描述
总体上看下查询时间分布,那几个#号多的执行时间(红色部分为慢查大于1秒的语句)
本次使用的是./tpcc_start -h192.168.66.133 -P 17261 -d tpcc -u msandbox -p123456 -w 5 -c 5 -r 120 -l 60 - >test0118/tpcc-output-log 进行压测,手动制造慢查(用于实验)

摘录的解读

# Current date: Thu Aug 3 16:24:12 2017 工具执行时间
# Hostname: Test_Server1 运行分析工具的主机名
# Files: slow.log 被分析的文件名
# Overall: 2.92k total, 190 unique, 0.81 QPS, 44.91x concurrency _________
total:语句总数量 
unique:唯一的语句数量:唯一查询数量,即对查询条件进行参数化以后,总共有多少个不同的查询,
QPS
并发数
# Time range: 2017-08-03 15:24:14 to 16:24:11 日志记录的时间范围
# Attribute total min max avg 95% stddev median
属性 总计 最小 最大 平均 95% 标准 中等
# ============ ======= ======= ======= ======= ======= ======= =======
# Exec time 161525s 10s 485s 55s 151s 53s 35s 语句执行时间
# Lock time 1115s 17us 121s 382ms 1ms 6s 247us  锁占用时间
# Rows sent 51.71k 0 23.25k 18.13 0.99 602.10 0 发送到客户端的行数
# Rows examine 2.96G 0 51.26M 1.04M 4.93M 4.87M 0 select语句扫描行数
# Rows affecte 19.70M 0 1.64M 6.91k 0 105.18k 0
# Bytes sent 4.15M 0 1.50M 1.46k 1.78k 39.02k 72.65
# Query size 1.62M 15 5.17k 582.83 3.19k 872.43 202.40 查询的字符数
95%:把所有值从小到大排列,位置位于95%的那个数,这个数一般最具有参考价值。
median:中位数,把所有值从小到大排列,位置位于中间那个数。
 # Profile
# Rank Query ID Response time Calls R/Call V/M Item
Rank:所有语句的排名,默认按查询时间降序排列,通过--order-by指定
Query ID:语句的ID,(去掉多余空格和文本字符,计算hash值)
Response time:响应时间,占所有响应时间的百分比
Calls:查询执行次数
R/Call:平均响应时间
V/M:响应时间Variance-to-mean的比率
Item:查询语句一部分

# Users develop 各个用户执行的次数(占比)
# Query_time distribution  查询时间分布, 长短体现区间占比,本例中1s-10s之间查询数量是10s以上的两倍。

工具参数补充

--create-review-table  当使用--review参数把分析结果输出到表中时,如果没有表就自动创建。
--create-history-table 当使用--history参数把分析结果输出到表中时,如果没有表就自动创建。
--filter 对输入的慢查询按指定的字符串进行匹配过滤后再进行分析。
--limit  限制输出结果百分比或数量,默认值是20,即将最慢的20条语句输出,如果是50%则按总响应时间占比从大到小排序,输出到总和达到50%位置截止。
--host  mysql服务器地址
--user  mysql用户名
--password  mysql用户密码
--history  将分析结果保存到表中,分析结果比较详细,下次再使用--history时,如果存在相同的语句,且查询所在的时间区间和历史表中的不同,则会记录到数据表中.
--review  将分析结果保存到表中,这个分析只是对查询条件进行参数化,一个类型的查询一条记录,比较简单。当下次使用--review时,如果存在相同的语句分析,就不会记录到数据表中。
--output  分析结果输出类型,值可以是report(标准分析报告)、slowlog(Mysql slow log)、json、json-anon,一般使用report,以便于阅读。
--since  从什么时间开始分析,可以是指定的某个”yyyy-mm-dd [hh:mm:ss]”格式的时间点,也可以是简单的一个时间值:s(秒)、h(小时)、m(分钟)、d(天),如12h就表示从12小时前开始统计。
--until  截止时间,配合—since可以分析一段时间内的慢查询。

可能会遇到

[root@mha133 data]# pt-query-digest slow.log 
Can't locate Data/Dumper.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /tools/percona-toolkit-3.1.0/bin/pt-query-digest line 75.
BEGIN failed--compilation aborted at /tools/percona-toolkit-3.1.0/bin/pt-query-digest line 75.

yum -y install perl-Data-Dumper
pt-query-digest slow.log 
Can't locate Digest/MD5.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /tools/percona-toolkit-3.1.0/bin/pt-query-digest line 2470.
BEGIN failed--compilation aborted at /tools/percona-toolkit-3.1.0/bin/pt-query-digest line 2470.

yum -y install perl-Digest-MD5 
 (依赖perl-Digest.noarch 0:1.17-245.el7)

写在最后

把查询保存到query_history表:
pt-query-digest --user=root –password=abc123 --review h=localhost,D=test,t=query_ history --create-review-table slow.log
 
通过tcpdump抓取mysql的tcp协议数据,然后再分析:
tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txt
pt-query-digest --type tcpdump mysql.tcp.txt> slow_report9.log
 
分析binlog:
mysqlbinlog mysql-bin.000001 > mysql-bin000001.sql
pt-query-digest --type=binlog mysql-bin000001.sql > slow10.log
 
分析general log:
pt-query-digest --type=genlog localhost.log > slow11.log
 # 3.5s user time, 60ms system time, 28.96M rss, 209.24M vsz 该工具执行日志分析的用户时间,系统时间,物理内存占用大小,虚拟内存占用大小

本文说明,主要技术内容来自互联网技术大佬的分享,还有一些自我的加工(仅仅起到注释说明的作用)。如有相关疑问,请留言,将确认之后,执行侵权必删

猜你喜欢

转载自blog.csdn.net/baidu_34007305/article/details/112887901