【工具】慢日志查看 pt-query-digest.md

pt-query-digest工具可以通过慢查询日志、普通查询日志、binlog对MySQL中的查 询语句进行分析,也可以通过SHOW PROCESSLIST语句输出信息,以及tcpdump 抓取的 MySQL协议数据对MySQL中的查询语句进行分析。

官方文档: https://www.percona.com/doc/percona-toolkit/LATEST/pt-query-digest.html

ps:个人来说还是倾向于将慢日志记录到 slow_log表中去的

解析慢查询日志

pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log > slow_report.log

输出结果分为3部分

第一部分

汇总信息

[root@VM_0_9_centos ~]# more slow_report.log 

# 230ms user time, 20ms system time, 26.35M rss, 220.76M vsz      # CPU和内存使用信息
# Current date: Wed Aug 26 15:44:46 2020                          # 当前时间
# Hostname: VM_0_9_centos                                          # 主机名
# Files: /var/lib/mysql/VM_0_9_centos-slow.log                      # 输入的慢日志路径

## 整个分析结果的汇总信息
# Overall: 258 total, 37 unique, 0.02 QPS, 0.00x concurrency _____________
# Time range: 2020-08-26T11:20:16 to 2020-08-26T15:44:11
# Attribute          total     min     max     avg     95%  stddev  median
# ============     ======= ======= ======= ======= ======= ======= =======
# Exec time             7s   249us      5s    26ms     4ms   311ms   657us
# Lock time          349ms       0   152ms     1ms   348us    12ms   194us
# Rows sent         33.01k       0   9.77k  131.03  755.64  742.92    0.99
# Rows examine      93.32k       0   9.77k  370.38  874.75  775.00   54.21
# Query size        51.71k      15   7.23k  205.23  223.14  615.30  143.84
  • Overall:总共有多少个查询,该例总共有2.58k(2580)个查询。
  • Time range:查询执行的时间范围。注意,MySQL5.7版本中的时间格式不同于之 前的版本。
  • Unique:唯一查询数量,即对查询条件进行参数化以后,总共有多少个不同的查 询。该例为10个。
  • Attribute:如上述代码段所示,表示Attribute列描述的Exec time、Lock time等属性 名称。
* total:表示Attribute列描述的Exec time、Lock time等属性的统计数值。 
* min:表示Attribute列描述的Exec time、Lock time等属性的最小值。 
* max:表示Attribute列描述的Exec time、Lock time等属性的最大值。 
* avg:表示Attribute列描述的Exec time、Lock time等属性的平均值。 
* 95%:表示Attribute列描述的Exec time、Lock time等属性的所有值从小到大排 列,然后取位于95%位置的那个数值(需要重点关注这个值)。 
* stddev:标准偏差,用于数值的分布统计。 
* median:表示Attribute列描述的Exec time、Lock time等属性的中位数,即把所有 值从小到大排列,取位于中间的那个数值

第二部分

对查询进行参数化并分组,然后对各类查询的执行情况进行分析,结果按总执行时间从大到小排列

# Profile
# Rank Query ID                        Response time Calls R/Call V/M   It
# ==== =============================== ============= ===== ====== ===== ==
#    1 0x59A74D08D407B5EDF9A57DD5A4...  5.0003 73.7%     1 5.0003  0.00 SELECT
#    2 0x64EF0EA126730002088884A136...  0.9650 14.2%     2 0.4825  0.01 
#    3 0x5E1B3DE19F673369DCF52FE6A5...  0.3174  4.7%     2 0.1587  0.00 INSERT data_million_a
#    4 0x3992A499999D8F9E3ACC220E0F...  0.1334  2.0%     1 0.1334  0.00 ALTER TABLE dtb_table_size `dtb_table_size`
#    5 0x66CAA645BA3ED5433EADC39CCA...  0.0991  1.5%     2 0.0495  0.08 SELECT data_million_a
# MISC 0xMISC                           0.2735  4.0%   250 0.0011   0.0 <32 ITEMS>
  • Rank:为查询生成的数字编号,表示该分类语句在整个分析结果集中的排名。
  • Query ID:为查询生成的随机字符串ID(根据指纹语句生成的checksum随机字符串)。
  • Response time:该查询的总的响应时间和占所有查询的总的响应时间的百分比。
  • Calls:该查询的执行次数,即本次分析总共有多少条这种类型的查询语句。
  • R/Call:该查询平均每次执行的响应时间。
  • V/M:响应时间的方差与均值的比值。
  • Item:具体的查询语句对象(标准化格式转换的语句形式:去掉了具体的select字段和表名、where条件等)

第三部分

按照语句执行的总时间,从大到小依次打印每条语句的相关统计信息

# Query 1: 0 QPS, 0x concurrency, ID 0x59A74D08D407B5EDF9A57DD5A41825CA at byte 0
# Scores: V/M = 0.00
# Time range: all events occurred at 2020-08-26T11:20:16
# Attribute    pct   total     min     max     avg     95%  stddev  median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count          0       1
# Exec time     73      5s      5s      5s      5s      5s       0      5s
# Lock time      0       0       0       0       0       0       0       0
# Rows sent      0       1       1       1       1       1       0       1
# Rows examine   0       0       0       0       0       0       0       0
# Query size     0      15      15      15      15      15       0      15
# String:
# Hosts        localhost
# Users        root
# Query_time distribution
#   1us
#  10us
# 100us
#   1ms
#  10ms
# 100ms
#    1s  ################################################################
#  10s+
# EXPLAIN /*!50100 PARTITIONS*/
select sleep(5)\G
  • Time range:查询执行的时间范围。注意,MySQL5.7版本中的时间格式不同于之 前的版本。
  • Attribute:如上述代码段所示,表示Attribute列描述的Count、Exec time、Lock time等属性名称。
  • pct:表示该分组语句(这里指上述代码段中“Query 1”代表的分组语句,具体的语 句样本在EXPLAIN ...关键字下面有输出。另外,在上述代码段中,如total、min等计算值
    都是针对该语句分组的,下文中不再赘述)的total值(该分组语句的统计值)与统计样本 中总的所有语句统计值的占比。
  • total:表示Attribute列描述的Count、Exec time、Lock time等属性的统计值。
  • min:表示Attribute列描述的Exec time、Lock time等属性的最小值。
  • max:表示Attribute列描述的Exec time、Lock time等属性的最大值。
  • avg:表示Attribute列描述的Exec time、Lock time等属性的平均值。
  • 95%:表示语句对应的Exec time、Lock time等属性值从大到小排序之后,位于 95%位置的那个数值(需要重点关注这个值)。
  • stddev:标准偏差,用于数值的分布统计。
  • median:代表对应属性值的中位数,将所有值从小到大排列,取位于中间的那个 数值。
  • Databases:库名。
  • Users:各个用户执行的次数(占比)。
  • Query_time distribution:查询时间分布,由“#”字符表示的长短体现了语句执行时 间的占比区间。从上述代码段中可以看到,执行时间在1s左右的查询数量占绝大多数。
  • Tables:使用查询语句中涉及的表生成的用于查询表统计信息和表结构的SQL语 句文本。
  • EXPLAIN:表示查询语句的样本(方便复制出来查看执行计划。注意,该语句不 是随机生成的,而是分组语句中最差的查询SQL语句)

使用示例

最近12小时的查询

pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log --since=12h > slow_report_12h.log

指定时间范围内的查询

pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log --since '2020-08-26 11:30:00' --until '2020-08-26 12:00:00'> slow_report_range.log

分析只是select的慢查询

pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log --filter '$event->{fingerprint} =~ m/^select/i' > slow_report_select.log

针对某个用户的慢查询

pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log --filter '($event->{user} || "") =~ m/^root/i' > slow_report_db.log

查询所有的全表扫描或FULL JOIN的慢查询

pt-query-digest /var/lib/mysql/VM_0_9_centos-slow.log --filter '(($event->{Full_scan} || "") eq "yes") || (($event->{Full_join} || "") eq "yes")' > slow_report_full.log

将查询分析结果保存到query_review表中

会在指定的test库下生成 query_review 表

pt-query-digest  --user=root --password=1122333 --review h=localhost,D=yqtest,t=query_review --create-review-table --no-report /var/lib/mysql/VM_0_9_centos-slow.log

将查询分析结果保存到query_history表中

pt-query-digest --user=root --password=1122333 --history h=localhost,D=yqtest,t=query_history --create-history-table --no-report /var/lib/mysql/VM_0_9_centos-slow.log

你可能感兴趣的:(【工具】慢日志查看 pt-query-digest.md)