percona-toolkit 之 【pt-query-digest】介绍

背景:

        作为一个MySQL DBA,分析慢查询是平常主要的工做之一,以前一直使用mysqlsla做为分析慢查询的, 由于简单而且也能知足本身对慢查询分析的要求,对于另外一个工具pt-query-digest并不熟悉,对于pt系列的工具以前也介绍过一些,Percona Toolkit确实厉害,整个全家桶:包含了备份、监控、各类分析工具,以及定制化过的MySQL Server。 如今本文来介绍下如何使用pt-query-digest,也方便本身查阅。html

        不少人都把pt-query-digest做为分析mysql工具的首选,由于它能够从logs、processlist、和tcpdump 来分析MySQL的情况,logs包括slow log、general log、binlog。也能够把分析结果输出到文件中,或则把文件写到表中。分析过程是先对查询语句的条件进行参数化,而后对参数化之后的查询进行分组统计,统计出各查询的执行时间、次数、占比等,能够借助分析结果找出问题进行优化。mysql

使用方法:

下载:

进入到下载页,下载Percona Toolkitgit

使用方法: 

pt-query-digest [OPTIONS] [FILES] [DSN] 

说明:

pt-query-digest分析slow log、general log和binary log,还能够分析来自SHOW PROCESSLIST的查询和来自tcpdump的MySQL协议数据。 默认状况下,查询按fingerprint分组,并按查询时间的降序排列(最慢的查询排在第一位)。 若是未提供文件,则该工具读取STDIN。 可选的DSN用于某些选项,例如--since和--until。github

示例:

1)从slow.log报告最慢的查询正则表达式

pt-query-digest slow.log

2)从host1上的processlist里报告最慢的查询sql

pt-query-digest --processlist h=host1

3)使用tcppdump捕获MySQL协议数据,而后报告最慢的查询shell

tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txt

pt-query-digest --type tcpdump mysql.tcp.txt

4)将查询数据从slow.log保存到host2,以供之后查看和趋势分析数据库

pt-query-digest --review h=host2 --no-report slow.log

描述

pt-query-digest是一种复杂但易于使用的工具,用于分析MySQL查询。它能够分析来自MySQL慢速日志,常规日志和二进制日志的查询(二进制日志必须首先转换为文本,请参阅--type)。默认状况下,该工具报告哪些查询最慢。可使用--group-by、--filter和--embedded-attributes之类的选项来建立更复杂和定制的报告。json

pt-query-digest具备两个功能:查询查看(--review)和查询历史记录(--history)。使用--review选项时,全部查询都将保存到数据库中。当再次使用--review运行该工具时,数据库中标记为已审阅的查询不会打印在报告中,只显示须要审查的新查询。使用--history选项时,每一个查询的指标(查询时间,锁时间等)都保存到数据库中。每次使用--history运行该工具时,都会保存更多的历史数据,这些数据可用于随时间推移趋势和分析查询性能。缓存

属性

若是使用--filter,-ignore-attributes和其余与属性相关的选项时,必须熟悉这些属性,若是不须要自定义能够跳过属性说明。

pt-query-digest处理event,这些event是称为属性的键值对的集合,能识别出大多数属性:Query_time,Lock_time等。若是编写--filter,请务必在使用每一个event以前检查其属性是否已定义,不然过滤器代码可能会因“使用未初始化的值”错误而使工具崩溃。有关常见和--type特定属性的列表:为任何输入转储event属性:

$ pt-query-digest                  \
    slow.log                       \
    --filter 'print Dumper $event' \
    --no-report                    \
    --sample 1

产生不少带有“ attribute => value”对的输出:

$VAR1 = {
  Query_time => '0.033384',
  Rows_examined => '0',
  Rows_sent => '0',
  Thread_id => '10',
  Tmp_table => 'No',
  Tmp_table_on_disk => 'No',
  arg => 'SELECT col FROM tbl WHERE id=5',
  bytes => 103,
  cmd => 'Query',
  db => 'db1',
  fingerprint => 'select col from tbl where id=?',
  host => '',
  pos_in_log => 1334,
  ts => '071218 11:48:27',
  user => '[SQL_SLAVE]'
};

经过编写--filter,能够建立从现有属性派生的新属性。 例如,要建立一个名为Row_ratio的属性以检查Rows_sent与Rows_examined的比率,请指定一个过滤器:

--filter '($event->{Row_ratio} = $event->{Rows_sent} / ($event->{Rows_examined})) && 1'

须要使用&& 1技巧来建立始终为true的有效单行语法,新属性将自动出如今输出中:

# Row ratio        1.00    0.00      1    0.50      1    0.71    0.50

输出值 

默认的--output是查询分析报告。 --no-report选项控制是否打印此报告。使用--review或--history时,解析全部查询但不显示报告。

报告里的列说明:

Column        Meaning
============  ==========================================================
Rank          查询在分析的整个查询集中的排名
Query ID      查询的指纹(fingerprint)
Response time 总响应时间,占总响应时间的百分比
Calls         执行此查询的次数
R/Call        每次执行的平均响应时间
V/M           响应时间的方差均值比
Item          查询

示例:
# Rank Query ID                           Response time Calls R/Call V/M  
# ==== ================================== ============= ===== ====== =====
#    1 0x95BE8AA82ED172A4ABAFC4ED3B792467 6.0100 100.0%     2 3.0050  0.00 SELECT x

拆分多部分说明报告信息:

# Query 2: 0.01 QPS, 0.02x conc, ID 0xFDEA8D2993C9CAF30x6F7A87D11DDD9CC608CCACD1427CD832 at byte 160665

说明:查询的顺序号、每秒查询量、查询的近似并发度(根据时间隔和总Query_time计算)、查询ID。若是使用--review,则此ID是数据库中查询校验和的十六进制。可使用SELECT ...之类的查询从数据库中选择已审核查询的详细信息:WHERE checksum = 0xFDEA8D2993C9CAF3。

若是想打印出特定查询的每一个样本:去掉查询ID的0x

pt-query-digest test2-slow.log --no-report --output slowlog --filter '$event->{fingerprint} && make_checksum($event->{fingerprint}) eq "6F7A87D11DDD9CC608CCACD1427CD832"'
# Time: 2020-02-28T10:49:34
# User@Host: root[root] @ test2 []
# Thread_id: 19
# Query_time: 3.003152  Lock_time: 0.002218  Rows_sent: 1  Rows_examined: 2
use orchestrator;
select count(*),sleep(3) from cluster_domain_name;

接下来是有关此类查询的指标表:

# Attribute    pct   total     min     max     avg     95%  stddev  median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count         20       1
# Exec time     13      3s      3s      3s      3s      3s       0      3s
# Lock time     33     2ms     2ms     2ms     2ms     2ms       0     2ms
# Rows sent      5       1       1       1       1       1       0       1
# Rows examine  11       2       2       2       2       2       0       2
# Query size    25      49      49      49      49      49       0      49
# Row ratio     11    0.50    0.50    0.50    0.50    0.50       0    0.50

第一行是表的列标题:属性、百分比(总计的百分比),总计、最大、最小、平均、95%的值小于或等于此值、标准误差和中位数都是从第95个百分位数计算得出的。

接下来,将查询有关用户,数据库和时间范围的统计信息:

# Users       1   user1
# Databases   2     db1(1), db2(1)
# Time range 2008-11-26 04:55:18 to 2008-11-27 00:15:15

用户和数据库显示为不一样值的计数。若是只有一个,则会单独显示; 若是有不少,将显示每一个最常出现的频率,而后显示它出现的次数。

而后看执行时间分布:

# Query_time distribution
#   1us
#  10us
# 100us
#   1ms
#  10ms  #####
# 100ms  ####################
#    1s  ##########
#  10s+

执行时间显示时间聚类的分布图。 每一个查询都进入“存储桶”之一,并被计算在内。  第一个存储桶的全部值都在“单个微秒范围”内-小于10us。 第二个是“数十微秒”,从10us到(但不包括)100us; 等等。 能够经过指定--report-histogram更改图表属性,但仅限于基于时间的属性。

而后看表信息:

# Tables
#    SHOW TABLE STATUS LIKE 'table1'\G
#    SHOW CREATE TABLE `table1`\G
# EXPLAIN
SELECT * FROM table1\G

经过给出的信息能够获得表的基本信息,以及其执行计划,对于没法执行的非SELECT查询,该工具会尝试将该查询转换为大体等效的SELECT查询,并将其添加到下面。

QUERY REVIEW

--review是存储全部已分析的查询,能够将元数据添加到查询类别中,例如将其标记为后续跟踪,为查询添加注释或为问题跟踪系统使用问题ID标记它们。能够存储历史数据,例如行数,查询时间以及一般能够在报告中看到的任何内容。

要使用此功能,请使用--review选项运行pt-query-digest。它将指纹和其余信息存储到指定的表中。下次使用相同的选项运行它时,它将执行如下操做:

  • 不会显示已审核的查询。若是为review_by列设置了值,则认为该查询已被审核。 (若是想查看已经查看过的查询,请使用--report-all选项。)
  • 已查看但未出如今输出中的查询将致使每一个段落第一行中查询编号序列的空白。--limit指定的值仍然会被接受。所以,若是看了前10名中的全部查询并要求输入前10名,则输出中将看不到任何内容。
  • 若是想查看已经查看过的查询,能够指定--report-all。而后,将看到正常的分析输出,但还将看到执行时间图下方的审阅表中的信息。例如:
    # Review information
    #      comments: really bad IN() subquery, fix soon!
    #    first_seen: 2008-12-01 11:48:57
    #   jira_ticket: 1933
    #     last_seen: 2008-12-18 11:49:07
    #      priority: high
    #   reviewed_by: xaprb
    #   reviewed_on: 2008-12-18 15:03:11

    此元数据颇有用,由于当分析查询时,会将注释直接集成到报告中。

FINGERPRINTS

简而言之就是将将类似的查询分组在一块儿,如:

SELECT name, password FROM user WHERE id='12823';
select name,   password from user
   where id=5;

能够合并当成:

select name, password from user where id=?

参数说明: pt-query-digest --help

  --ask-pass                   FALSE        #链接到MySQL时提示输入密码
  --attribute-aliases          db|Schema    #属性列表|别名等(默认db | Schema)
  --attribute-value-limit      0            #属性值的限制(默认为0)
  --charset                    (No value)   #默认字符集
                                            #逗号分隔的配置文件列表;若是指定,则必须是命令行上的第一个选项
  --config                     /etc/percona-toolkit/percona-toolkit.conf,/etc/percona-toolkit/pt-query-digest.conf,/root/.percona-toolkit.conf,/root/.pt-query-digest.conf
  --continue-on-error          TRUE         #即便有错误也继续解析(默认为是)
  --create-history-table       TRUE         #建立--history表(若是不存在)(默认为yes)
  --create-review-table        TRUE         #建立--review表(若是不存在)(默认为yes)
  --daemonize                  FALSE        #Fork到后台并从shell分离
  --database                   (No value)   #链接到该数据库
  --defaults-file              (No value)   #仅从给定文件读取mysql选项
  --embedded-attributes        (No value)   #两个Perl正则表达式模式,用于捕获查询中嵌入的伪属性
  --expected-range             5,10         #当数量多于或少于预期时解释项目(默认值为5,10)
  --explain                    (No value)   #使用此DSN对示例查询运行EXPLAIN并打印结果
  --filter                     (No value)   #丢弃此Perl代码未返回true的事件
  --group-by                   fingerprint  #要对事件的哪一个属性进行分组(默认fingerprint)
  --help                       TRUE         #显示帮助并退出
  --history                    (No value)   #在给定表中保存每一个查询类的指标。 pt-query-digest将查询指标(查询时间,锁定时间等)保存到此表中,以便您查看查询类如何随时间变化
  --host                       (No value)   #链接到主机
  --ignore-attributes          arg,cmd,insert_id,ip,port,Thread_id,timestamp,exptime,flags,key,res,val,server_id,offset,end_log_pos,Xid  #不要聚合这些属性
  --inherit-attributes         db,ts        #若是丢失,则从具备属性的最后一个事件继承这些属性(默认db,ts)
  --interval                   .1           #轮询show processlist的频率,以秒为单位(默认为.1)
  --iterations                 1            #在收集和报告周期中迭代多少次(默认为1)
  --limit                      95%:20       #将输出限制为给定的百分比或计数(默认为95%:20)
  --log                        (No value)   #守护进程时将全部输出打印到此文件
  --max-hostname-length        10           #将报告中的主机名修剪到此长度。 0 =不修剪主机名(默认为10)
  --max-line-length            74           #将行修剪到此长度。 0 =不修剪线条(默认74)
  --order-by                   Query_time:sum   #按此属性:聚合函数对事件进行排序(默认Query_time:sum)
  --outliers                   Query_time:1:10  #按属性:百分比:计数报告异常值(默认查询时间:1:10)
  --output                     report           #如何格式化和打印查询分析结果(默认report)
  --password                   (No value)       #链接时使用的密码
  --pid                        (No value)       #建立给定的PID文件
  --port                       (No value)       #用于链接的端口号
  --preserve-embedded-numbers  FALSE            #查询时保留数据库/表名中的数字
  --processlist                (No value)       #使用--interval sleep轮询此DSN的进程列表以进行查询
  --progress                   time,30          #将进度报告打印到STDERR(默认时间30)
  --read-timeout               0                #等待的超时时间,等待来自输入的事件; 0表示永远等待(默认值为0)。 可选后缀s =秒,m =分钟,h =小时,d =天; 若是没有后缀,则使用s。
  --report                     TRUE             #打印每一个--group-by属性的查询分析报告(默认为yes)
  --report-all                 FALSE            #报告全部查询,甚至包括已审核的查询
  --report-format              rusage,date,hostname,files,header,profile,query_report,prepared  #打印查询分析报告的这些部分
  --report-histogram           Query_time       #绘制此属性值的分布图(默认Query_time)
  --resume                     (No value)       #若是指定,该工具会将最后一个文件偏移(若是有的话)写入给定的文件名
  --review                     (No value)       #保存查询以供之后查看,而且不报告已查看的
  --run-time                   (No value)       #每一个迭代要运行多长时间。可选后缀s =秒,m =分钟,h =小时,d =天;若是没有后缀,则使用s。
  --run-time-mode              clock            #设置--run-time的值所用的值(默认clock)
  --sample                     (No value)       #过滤掉每一个查询中除前N个事件外的全部事件
  --set-vars                                    #在此以逗号分隔的(变量=值对)列表中设置MySQL变量
  --show-all                                    #显示这些属性的全部值
  --since                      (No value)       #解析仅查询比该值新的查询(自此日期以来解析查询)
  --slave-password             (No value)       #设置用于链接到从的密码
  --slave-user                 (No value)       #设置用于链接到从的用户
  --socket                     (No value)       #用于链接的套接字文件
  --timeline                   FALSE            #显示事件的时间表
  --type                       slowlog          #要解析的输入的类型(默认慢日志)
  --until                      (No value)       #仅解析早于此值的查询(直到此日期为止解析查询)
  --user                       (No value)       #用于登陆的用户(若是不是当前用户)
  --variations                                  #报告这些属性值的变化数量
  --version                    FALSE            #显示版本并退出
  --version-check              TRUE             #检查最新版本的Percona Toolkit,MySQL和其余程序(默认为是)
  --vertical-format            TRUE             #在报告的SQL查询中输出尾随的“ \ G”(默认为是)
  --watch-server               (No value)       #此选项告诉pt-query-digest在解析tcpdump时要监视哪一个服务器IP地址和端口(例如“ 10.0.0.1:3306”)(对于--type tcpdump);其余全部服务器均被忽略
View Code

1,--ask-pass:链接到MySQL时提示输入密码。

2,--attribute-aliases: 默认值:db | Schema。若是event不具备主要属性,则将查找别名属性。 若是找到别名,则会使用别名属性的值建立主要属性,并删除别名属性。

3,--attribute-value-limit:默认值:0,属性的限制值。处理慢查询中的错误,这些错误会致使属性值过大。 若是值大于此值,则使用该查询类别的最后一次看到的值。

4,--charset:链接数据库的默认字符集。

5,--config:逗号分隔的配置文件列表;若是指定,则必须是命令行上的第一个选项。

6,--[no]continue-on-error:即便有错误,也继续解析。 该工具不会永远持续下去:一旦任何过程致使100个错误,它将中止运行,默认yes。

7,--[no]create-history-table:建立--history表(若是不存在),默认yes。

8,--[no]create-review-table:若是--review表不存在,则建立它,默认yes。

9,--daemonize:守护进程执行,fork到后台并从shell分离。

10,--database:链接到该数据库,缩写-D。

11,--defaults-file:从给定文件中读取mysql选项,必须提供绝对路径名,缩写-F。

12,--embedded-attributes:两个Perl正则表达式模式,用于捕获查询中嵌入的伪属性。

13,--expected-range:当数量多于或少于预期时,请说明,默认5,10。

14,--explain:使用此DSN对示例查询运行EXPLAIN并打印结果。

--explain='h=192.168.163.132,u=root,p=root'

15,--filter:过滤器规则,舍弃此Perl代码未返回true的事件。属性的名称能够看文章前面的 “ attribute => value”。

  1. 只返回指定类型的查询,如返回select的查询:
    --filter '$event->{arg} =~ m/^select/i'
    --filter '$event->{fingerprint} =~ m/^select/i'
  2. 只返回指定用户的查询,如返回zhou用户的查询:
    --filter '$event->{user} =~ m/^zhou/i'
    --filter '($event->{user} || "") =~ m/^zhou/i'
  3. 只返回指定IP的查询,如返回192.168.163.111的查询:
    --filter '($event->{host} || $event->{ip} || "") =~ m/^192.168.163.111/i'
  4. 只返回指定DB的查询,如返回zhoujinyi DB的查询:
    --filter '($event->{db} || "") =~ m/^zhoujinyi/i'
  5. 返回指定DB和类型的查询,如返回zhoujinyi DB中的select查询:
    --filter '(($event->{db} || "") =~ m/^mysql/i) && (($event->{fingerprint} || "") =~ m/^select/i)'
  6. ...

16,--group-by:对event的哪一个属性进行分组(默认fingerprint)。能够根据查询的任何属性(如user或db)将查询分组为类,默认状况下,这些属性将显示哪些用户和哪些数据库得到的Query_time最多。每一个值在--order-by中的相同位置必须具备对应的值。为方便起见,将值添加到--group-by将自动将值添加到--order-by。如根据db和user分组:

--group-by=db,user

# Report grouped by db
...
# Report grouped by user
...

可选值还有:

  • fingerprint:指纹,将查询抽象为规范形式,而后用于将event分组到一个类中。
  • tables:按表的形式返回报告信息。
  • distill:超级指纹,将查询分解为对它们执行操做的建议。

17,--history:DSN选项,在给定表中保存每一个查询类的指标(查询时间,锁定时间等)。默认表是percona_schema.query_history,指定数据库(D)和表(t)的DSN选项以覆盖默认值。 除非指定了--no-create-history-table,不然将自动建立数据库和表。

--history='h=192.168.163.132,u=root,p=root'

从Percona Toolkit 3.0.11开始,校验和功能已更新为在MD5总和中使用32个字符。 这将致使历史记录表中的校验和字段的值与该工具的早期版本中的值不一样。

只针对slowlog?

18,--host:链接到主机,缩写-h。

19,--ignore-attributes:不要聚合这些属性,默认值:arg, cmd, insert_id, ip, port, Thread_id, timestamp, exptime, flags, key, res, val, server_id, offset, end_log_pos, Xid

20,--inherit-attributes:继承属性,默认值:db,ts。若是缺乏属性,从它们的最后一个event继承这些属性。如一个event的db属性等于“ foo”,而下一个事件没有db属性,则它继承其db属性的“ foo”。

21,--interval:轮询processlist列表的频率,默认为:.1,以秒为单位。

22,--iterations:收集和报告周期中迭代次数,默认为1。若是为0,则迭代到无穷大。每次迭代都运行--run-time的时间。使用--run-time-mode interval时,由--run-time指定的间隔时间决定。

23,--limit:限制显示,默认值:95%:20。将输出限制为给定的百分比或行数。若是参数是整数,则仅报告前N个最差查询。若是参数是%,报告最差查询的百分比。若是百分比后跟冒号和另外一个整数,报告最高百分比或该整数指定的数字,以先到者为准。

24,--log:若是以守护程序方式容许,则将全部输出打印到此文件。

25,--max-hostname-length:将报告中的主机名修剪到此长度,默认10,0为不修剪主机名。

26,--max-line-length:将线修剪到此长度。默认74,0为不修剪线。

27,--order-by:一个用逗号分隔的order-by表达式列表,经过此属性和聚合函数对事件进行排序,默认值:Query_time:sum,也用于--group-by属性。当解析常规日志(--type genlog)时,默认的变为Query_time:cnt。常规日志不会报告查询时间,所以只有cnt聚合才有意义,由于全部查询时间均为零。

#按总的执行时间排序
--order-by=Query_time:sum
#按总的执行次数排序
--order-by=Query_time:cnt

28,--outliers:按照定义的值报告异常值,默认值:Query_time:1:10,语法是用冒号分隔的字符串的逗号分隔列表。 第一个字段是定义异常值的属性。 第二个是与该属性的第95个百分点进行比较的数字。 第三个是可选的,而且与属性的cnt集合进行比较。 无论--limit中指定了什么限制,经过此规范的查询都会添加到报告中。即返回95%栏位的Query_time>=1秒,且执行次数>=10次。最终结果是取limit和outliers的并集,这也就是为何显示指定limit参数,返回的结果并不全知足limit参数,还会返回匹配outliers的结果(好比--limit=1,按照正常会只取1条,可是异常值的也有1条,则就返回2个query)。

--outliers=Query_time:30:1

29,--output:格式化和打印查询分析结果,默认值:report。可选值:

report:标准查询分析报告
slowlog:MySQL慢查询模式
json:json模式
json-anon:json模式,无查询示例
secure-slowlog:MySQL慢查询模式,无查询示例

能够经过指定--no-report禁用整个报告输出,而且能够经过指定--report-format禁用或从新排列其部分。

30,--password:缩写-p,链接时使用的密码。 若是密码包含逗号,则必须使用反斜杠将其转义

31,--pid:建立给定的PID文件。 若是PID文件已经存在而且包含的PID与当前的PID不一样,则该工具将没法启动。 可是,若是存在PID文件,而且其中包含的PID再也不运行,则该工具将使用当前PID覆盖PID文件。 工具退出后,PID文件将自动删除。

32,--port:缩写-P,用于链接的端口号。

33,--preserve-embedded-numbers:在报告中的样本中,保存数据库/表名称中保留数字。使得SELECT * FROM db1.table2不会变成SELECT * FROM db?.table?。

34,--processlist:轮询此DSN的进程列表以进行分析,并使用--interval sleep间隔:

#间隔1s执行show full processlist 拉取processlist中订阅到的慢查询转存到指定的文件。
pt-query-digest --processlist h=192.168.163.132,u=root,p=root --interval=1 --output=slowlog > /tmp/process.log

配合--run-time使用,能够限制执行时间,到时间(--iterations=1)以后退出而且打印分析。

#间隔1s执行show full processlist,永远运行,每30秒生成一次报告
pt-query-digest --processlist h=192.168.163.132,u=root,p=root --interval=1  --run-time-mode=clock --run-time=30s --iterations=0

35,--progress:打印进度,默认值:time:30。 第一部分能够比例、时间或迭代周期;第二部分指定多长时间更新应打印,百分比,秒,或迭代次数。将进度报告打印到STDERR。

--progress=time,30   按照时间
--progress=percentage,10   按照百分比

36,--read-timeout:读取超时,默认0,不超时。此选项设置等待输入event的最长时间(Reading from STDIN)。 适用于--processlist之外的全部类型的输入。 若是在指定时间后未收到event,脚本将中止读取输入并打印其报告。 若是--iterations为0或大于1,则下一个迭代将开始,不然脚本将退出。

37,--report:打印每一个--group-by属性的查询分析报告(默认为yes)。若是不须要报告(例如,使用--review或--history时),则指定--no-report。

38,--report-all:打印全部查询。

39,--report-format:打印查询分析报告格式,默认:rusage,date,hostname,files,header,profile,query_report,prepared。

SECTION      PRINTS
============ ======================================================
rusage       CPU时间和内存使用状况
date         当前本地时间
hostname     运行pt-query-digest的计算机的主机名
files        输入文件读取/解析
header       整个分析运行的摘要
profile      报告概述
query_report 每一个惟一查询的详细信息
prepared     准备好的陈述

这些部分按指定的顺序打印,若是一块儿指定,则rusage、date、files、和header会分组在一块儿,其余部分由空行分隔。

40,--report-histogram:报告的直方图,默认值:Query_time。绘制该属性值的分布图。基于时间的属性直方图:

# Query_time distribution
#   1us
#  10us
# 100us
#   1ms
#  10ms  ###########################
# 100ms  ########################################################
#    1s  ########
#  10s+

详细说明能够看上面 输出值 部分。

41,--resume:将最后一个文件偏移(若是有的话)写入给定的文件名。 当再次使用该选项的相同值运行时,该工具将从文件中读取最后一个文件偏移,在日志中查找到该位置,而后从该点开始继续解析事件。

42,--review:类型为DSN,保存查询供之后查看,而且不要报告已看的查询。默认表是percona_schema.query_review。指定数据库(D)和表(t)的DSN选项以覆盖默认值。除非指定了--no-create-review-table,不然将自动建立数据库和表。若是该表是手动建立的,则它至少必须包含如下几列。能够出于本身的特殊目的添加更多列,但pt-query-digest不会使用它们。

表结构:

CREATE TABLE IF NOT EXISTS query_review (
   checksum     CHAR(32) NOT NULL PRIMARY KEY,
   fingerprint  TEXT NOT NULL,
   sample       TEXT NOT NULL,
   first_seen   DATETIME,
   last_seen    DATETIME,
   reviewed_by  VARCHAR(20),
   reviewed_on  DATETIME,
   comments     TEXT
)

列说明:

COLUMN       MEANING
===========  ====================================================
checksum     查询指纹的64位校验和
fingerprint  查询的抽象版本;它的主键
sample       查询样本的文本
first_seen   此类查询的最先时间戳
last_seen    此类查询的最近时间戳
reviewed_by  若是设置,此后将跳过查询
reviewed_on  没有赋予任何特殊含义
comments     没有赋予任何特殊含义

注意,fingerprint列是一类查询的主键。 校验和只是该值的加密哈希,它提供了一个较短的值,该值极可能也是惟一的。解析和汇总事件后,表应为每一个fingerprint包含一行。 此选项取决于--group-by(默认fingerprint),不然它将没法正常工做。

43,--run-time:每一个--iterations要运行多长时间。 默认永远运行(CTRL-C中断)。 由于--iterations默认为1,若是指定--run-time,会运行该时间,而后退出。 一块儿指定了这两个选项以执行收集和报告周期。 如使用连续输入(例如STDIN或--processlist)指定--iterations 2 --run-time 1m将致使pt-query-digest运行1分钟(1分钟x2),报告2次,每1分钟间隔一次。

pt-query-digest --processlist='h=192.168.163.132,u=root,p=root' --iterations=2 --run-time=1m

44,--run-time-mode:设置--run-time的模式,默认值:clock。可选值有:

  • clock:指定--run-time的实际时间,期间为每一个--iterations运行该值。
  • event:指定日志时间,日志时间由日志中的时间戳肯定。会记住所看到的第一个时间戳,并将此后的每一个时间戳与第一个时间戳进行比较,以肯定通过了多少日志时间。如看到的第一个时间戳是12:00:00,下一个是12:01:30,则这是1分钟30秒的日志时间。该工具将读取事件,直到日志时间大于或等于指定的--run-time值为止。
  • interval:指定将event划分为多个日志时间并生成报告的日志时间间隔边界。

45,--sample:过滤掉每一个查询中除前N个事件以外的全部事件。 查询是根据--group-by中的第一个值进行过滤的,所以默认状况下,它将按查询指纹进行过滤。 

pt-query-digest --sample 2 --no-report --output slowlog slow.log

--sample 2将容许对每一个指纹进行两次样本查询,与--output slowlog一块儿使用可用于打印查询。 

46,--slave-user:设置用于链接到从的用户。 此参数容许拥有其余用户,该用户在从上具备较少的特权,但必须存在于全部从站上。

47,--slave-password:设置用于链接到从的密码。 能够与–slave-user一块儿使用,而且该用户的密码在全部从上都必须相同。

48,--set-vars:设置MySQL变量,以逗号分隔的 变量=值 对列表。

--set-vars wait_timeout=500

49,--show-all:显示属性的全部值,默认状况下只显示一行中包含的尽量多的属性值。 此选项容许指定将显示全部值的属性(忽略线宽)。 这仅适用于具备字符串值的属性,例如用户,主机,数据库等。能够指定多个属性,以逗号分隔。

50,--since:解析比该值更新的查询。该值能够是几种类型:

1. 具备可选后缀的简单时间值N:N [shmd],s =秒,h =小时,m =分钟,d =天(若是没有后缀,则默认为s)这就像在说“由于N [shmd]以前”

2.带可选小时,分钟,秒的完整日期:YYYY-MM-DD [HH:MM:SS]

3.简短的MySQL风格日期:YYMMDD [HH:MM:SS]

4. MySQL评估的任什么时候间表达式:CURRENT_DATE-间隔7天

若是提供MySQL时间表达式,须要制定DSN来链接MySQL进行计算。须要指定--until参数来限制时间。

51,--until:解析早于此值的查询,--since的类型同样。

52,--socket:指定链接套接字文件。

53,--timeline:为events显示时间线,此选项使pt-query-digest打印另外一种报告:event的时间轴。每一个查询仍根据--group-by进行分组并聚合,随后将按时间顺序打印。时间线报告将打印出每一个类的时间戳,时间间隔,计数和值。若是只须要时间轴报告,则指定--no-report以取消默认查询分析报告。不然,时间轴报告将在响应时间配置文件的末尾打印。如:

#pt-query-digest test2-slow.log --type=slowlog --group-by distill --timeline

# ########################################################################
# distill report
# ########################################################################
# 2020-02-28T13:43:52   00:19   3 SELECT x
# 2020-02-28T13:45:22   00:48   2 SELECT mysql.user
# 2020-02-28T13:46:10   00:31   3 SELECT x
# 2020-02-28T13:47:00    0:00   1 SELECT mysql.user
# 2020-02-28T13:47:06    0:00   1 SELECT x
# 2020-02-28T13:47:10    0:00   1 SELECT mysql.user
# 2020-02-29T08:25:28 08:37:44  82 SELECT user

若是只须要时间轴报告,则指定--no-report以取消默认查询分析报告。不然,时间轴报告将在响应时间配置文件的末尾打印

54,--type:要解析的输入的日志类型。容许的类型是:

  • binlog:二进制日志,解析一个二进制日志文件,该文件首先使用mysqlbinlog转换为文本。
    mysqlbinlog mysql-bin.000441> mysql-bin.000001.txt
    pt-query-digest --type binlog mysql-bin.000001.txt
  • genlog:解析MySQL general log 文件。 general log 缺乏不少“属性”,如Query_time,因此默认把 --order-by 更改成Query_time:cnt。
  • slowlog:解析MySQL格式的慢查询文件。
  • tcpdump:检查网络数据包并解码MySQL客户端协议,从中分析查询和响应。它不会监视网络,只解析tcpdump的输出。使用如下参数来格式化输入:-x -n -q -tttt。如:
    tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 \
      > mysql.tcp.txt
    
    pt-query-digest --type tcpdump mysql.tcp.txt

    自行选择其余tcpdump参数(例如-s,-c和-i)。结果如:

    2009-04-12 09:50:16.804849 IP 127.0.0.1.42167
           > 127.0.0.1.3306: tcp 37
        0x0000:  4508 0059 6eb2 4000 4006 cde2 7f00 0001
        0x0010:  ....

    注意:tcpdump的-c选项能够在捕获必定数量的数据包后中止!这对于测试tcpdump命令很是有用。请注意,tcpdump没法捕获Unix套接字上的流量。 

    tcpdump -i any -s 65535 -x -n -q -tttt \
       'port 3306 and tcp[1] & 7 == 2 and tcp[3] & 7 == 2'

    在tcpdump输出中会自动检测在端口3306上运行的全部MySQL服务器。所以,若是tcpdump out包含来自端口3306上多个服务器的数据包(例如10.0.0.1:330六、10.0.0.2:3306等),则来自全部这些服务器的全部数据包/查询将被一块儿分析,就像它们是一台服务器。若是要分析未在端口3306上运行的MySQL服务器的流量,请参阅--watch-server。

    另请注意,在解析tcpdump输出时,pt-query-digest可能没法报告数据库中的查询。仅在新客户端的初始链接事件中或执行<USE db>时发现数据库。若是tcpdump输出中都不包含这些内容,则pt-query-digest没法发现数据库。

  • rawlog:不是MySQL日志,而是简单的文本文件,每行只有一条SQL语句,例如:
    SELECT c FROM t WHERE id=1
    /* Hello, world! */ SELECT * FROM t2 LIMIT 1
    INSERT INTO t (a, b) VALUES ('foo', 'bar')
    INSERT INTO t SELECT * FROM monkeys

    因为rawlog没有任何指标,所以pt-query-digest的许多功能都没法使用。当惟一可用的信息是查询列表时,按计数对查询进行排名,如经过轮询SHOW PROCESSLIST进行。

55,--user:缩写-u,链接用户。

56,--variations:报告这些属性值的变化数量。显示一个类在一个属性中有多少个不一样的值。 此选项的一般值为arg,它显示该类中有多少个不一样的查询。 这对于肯定查询的可缓存性颇有用。

57,--watch-server:针对--type tcpdump使用,在解析tcpdump时要监视哪一个服务器IP地址和端口(如“ 10.0.0.1:3306”),全部其余服务器都将被忽略。 若是未指定,则经过使用端口3306或“mysql”查找任何IP地址来监视全部服务器。若是要监视混合服务器,其中一些服务器在标准端口3306上运行,而另外一些服务器在非标准端口上运行,则须要为非标准端口服务器建立单独的tcpdump输出,而后为每一个服务器指定此选项。

58,--version:显示版本并退出。

59,--[no]version-check:是否检查最新版本,默认检查。

60,--[no]vertical-format:是否垂直格式,报告的SQL查询中输出尾随的“ G”。

DSN选项

用于建立DSN, DSN选项以逗号分隔,每一个选项都相似于option = value。 区分大小写,不能有空格,而且若是值包含空格,则必须将其引发来。各个选项说明以下:

  1. A:默认字符集
  2. D:链接到MySQL时要使用的默认数据库。
  3. F:从给定文件中读取默认选项。
  4. h:链接到主机的地址。
  5. p:链接使用的密码,若是密码包含逗号,则必须使用反斜杠将其转义。
  6. P:用于链接的端口号。
  7. S:链接的套接字文件。
  8. t:指定--review或--history表名。
  9. u:链接的用户。

总结

本文介绍了pt-query-digest的使用、各个模式、参数的说明,更多具体的信息能够见官网说明。关于一些平常的使用方法还没说明,因为篇幅的问题,将放到下一篇文章里说明。

相关文章
相关标签/搜索