使用pt-query-digest分析慢查询日志

介绍

pt-query-digest 属于 Percona Toolkit 工具集中较为常用的工具,用于分析 slow log,可以分析 MySQL 数据库的 binary log 、 general log 日志,同时也可以使用 show processlist 或从 tcpdump 抓取的 MySQL 协议数据来进行分析。

安装

wget https://www.percona.com/downloads/percona-toolkit/3.2.1/binary/redhat/7/x86_64/percona-toolkit-3.2.1-1.el7.x86_64.rpm
yum -y localinstall percona-toolkit-3.2.1-1.el7.x86_64.rpm

sql配置检查

  mysql> show variables;
  +----------------------------------------+--------------------------------------------+
  | Variable_name                          | Value                                      |
  +----------------------------------------+--------------------------------------------+
  | log_slow_admin_statements              | OFF                                        |
  | log_slow_slave_statements              | OFF                                        |
  | slow_launch_time                       | 2                                          |
  | long_query_time                        | 2000                                       |
  | slow_query_log                         | ON                                         |
  | slow_query_log_file                    | /data/mysql/log/mysql-slow.log             |
  | log_queries_not_using_indexes          | ON                                         |
  +----------------------------------------+--------------------------------------------+
  • log_queries_not_using_indexes: 开启会记录没有使用index的SQL语句
  • slow_query_log: 慢日志是否开启
  • long_query_time:慢日志时间

使用

pt-query-digest  --since='2019-02-27 09:30:00'   --until=2019-02-27 09:31:00'   mysql-slow.log  >  mysql-slow-report.log

使用pt-query-digest分析慢查询日志_第1张图片

说明

  • Rank:所有语句的排名,默认按查询时间降序排列
  • Query ID:语句的ID
  • Response:总的响应时间
  • time:该查询在本次分析中总的时间占比
  • calls:执行次数,即本次分析总共有多少条这种类型的查询语句
  • R/Call:平均每次执行的响应时间
  • V/M:响应时间Variance-to-mean的比率

    常用用法

1.直接分析慢查询文件:

pt-query-digest slow.log > slow_report.log

2.分析最近12小时内的查询:

pt-query-digest  --since=12h   slow.log > slow_report2.log

3.分析指定时间范围内的查询:

pt-query-digest slow.log  --since '2017-01-07 09:30:00'   --until '2017-01-07 10:00:00' > slow_report3.log

4.分析指含有select语句的慢查询

pt-query-digest  --filter   '$event->{fingerprint} =~ m/^select/i'   slow.log  > slow_report4.log

5针对某个用户的慢查询

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

6.查询所有全表扫描或full join的慢查询

pt-query-digest  --filter '(($event->{Full_scan} || "") eq "yes") ||(($event->{Full_join} || "") eq "yes")' slow.log  > slow_report6.log

7.把查询保存到query_review表

pt-query-digest  --user=root  -password=abc123  --review h=localhost,D=test,t=query_review  --create-review-table  slow.log

8.分析binlog

mysqlbinlog mysql-bin.000093    > mysql-bin000093.sql
pt-query-digest   --type=binlog  mysql-bin000093.sql  >  slow_report10.log

9.分析general log

pt-query-digest  --type=genlog  localhost.log  > slow_report11.log
  1. 其它
    //指定数据库
    pt-query-digest mysql-slow.log --type=slowlog --filter '($event->{db} || "") =~ m/^database/i'
    //指定用户
    pt-query-digest mysql-slow.log --type=slowlog --filter '($event->{user} || "") =~ m/^user/i'
    //指定IP
    pt-query-digest mysql-slow.log --type=slowlog --filter '($event->{host} || $event->{ip} || "") =~ m/^192.168.1.*/i'
    //分析指定时间范围
    pt-query-digest mysql-slow.log --type=slowlog --since='2023-03-01 15:49:47' --until='2023-03-01 15:52:55'
    pt-query-digest mysql-slow.log --type=slowlog --since='1583048987' --until='1583049175'
    //分析最近10h
    pt-query-digest test2-slow.log --type=slowlog --since='10h'
    //分析指定查询:update
    pt-query-digest test2-slow.log_bak --type=slowlog --filter '$event->{arg} =~ m/^update/i'
    //完全体
    pt-query-digest 
    --user=root #
    --password=root 
    --port=3306 
    --review h=192.168.163.132,D=slow_query_log,t=review //重复的sql只保存一条到review表用来审计
    --history h=192.168.163.132,D=slow_query_log,t=history //每一条sql都会保存到history表
    --limit=0% 
    --filter='($event->{Bytes} = length($event->{arg}) and $event->{hostname}="test2") and ($event->{host} || $event->{ip}) !~ m/^localhost$|^192.168.163.1$/i and $event->{arg} =~ m/^select/i' 
    --since='2020-03-23 12:00:00' --until='2020-03-23 13:00:00'  //各种筛选条件
    /usr/local/mysql/logs/slow.log  //日志路径
    --no-report //结果直接输出到表,不需要打印到终端

你可能感兴趣的:(linux,mysql)