一、简介
pt-query-digest是用于分析mysql慢查询日志的工具,它还可以分析来自“SHOW PROCESSLIST”和MySQL的查询 tcpdump中的协议数据。我们可以把分析日志输出到指定的文件中,通过分析日志文件做对应的优化等操作。
二、下载并且安装
- 根据不同的系统安装,我的系统是centos,所以直接选择centos安装,点击下载
- 直接使用yum安装
| > wget https://downloads.percona.com/downloads/percona-toolkit/3.4.0/binary/redhat/7/x86_64/percona-toolkit-3.4.0-3.el7.x86_64.rpm |
| > yum install percona-toolkit-3.4.0-3.el7.x86_64.rpm |
| > wget https://downloads.percona.com/downloads/percona-toolkit/3.4.0/source/debian/percona-toolkit-3.4.0.tar.gz |
| > tar -zxvf percona-toolkit-3.4.0.tar.gz |
| > cd percona-toolkit-3.4.0 |
| > perl Makefile.PL PREFIX=/usr/local/percona-toolkit |
| > make && make install |
三、安装完成
四、分析msql的慢查询日志
- pt-query-digest参数可以使用perldoc命令查看
perldoc /usr/bin/pt-query-digest
pt-query-digest mysql-slow.log > slow_report.log
pt-query-digest mysql-slow.log --since '2022-10-01 00:00:00' --until '2022-11-05 00:00:00' > slow_report_date_20221021-202221105.log
- –since: 表示开始时间
- –until: 表示结束时间
- 分析慢日志,并且保存分析结果到mysql数据表
pt-query-digest --user=root --password=123456 --history h=192.168.33.10,D=local_test_db,t=query_review --create-history-table mysql-slow.log --since '2022-11-01 00:00:00' --until '2022-11-05 00:00:00'
- –user: 数据库用户名
- –password: 数据库密码
- h: 数据库 host
- D: 数据库名
- t: 生成的表名
五、结果分析
第一部分: 总的一个分析概况
- Overall:总共有多少条查询
- Time range:查询执行的时间范围
- unique:唯一查询数量,即对查询条件进行参数化以后,总共有多少个不同的查询
- total:所有查询总计时长
- min:所有查询最小时长
- max:所有查询最大时长
- avg:所有查询平均时长
- 95%:把所有时长值从小到大排列,位置位于 95% 的那个时长数,这个数一般最具有参考价值
- median:中位数,把所有时长值从小到大排列,位置位于中间那个时长数
| |
| |
| |
| 说明: |
| 执行过程中,在用户中所花费的所有时间 |
| 执行过程中,在内核空间中所花费的所有时间 |
| pt-query-digest 进程所分配的内存大小 |
| pt-query-digest 进程所分配的虚拟内存大小 |
| |
| |
| 说明:当前时间 |
| |
| 说明:执行pt-query-digest的主机名 |
| |
| 说明:被分析的文件名称 |
| |
| 说明: |
| total: 语句总数量 |
| unique: 唯一语句数量 |
| QPS: 每秒查询量 |
| concurrency: 查询的并发 |
| |
| |
| 说明:执行过程中日志记录的时间范围 |
| |
| 说明:属性 总计 最小值 最大值 平均值 95% 标准差 中位数 |
| 95%: 把所有时长值从小到大排列,位置位于 95% 的那个时长数,这个数一般最具有参考价值 |
| median: 中位数,把所有时长值从小到大排列,位置位于中间那个时长数 |
| |
| |
| |
| 说明:执行时间 |
| |
| 说明:锁占用时间 |
| |
| 说明:发送到客户端的行数 |
| |
| 说明:扫描的语句行数 |
| |
| 说明:查询的字符数 |
第二部分:分析
- Rank:所有语句的排名,默认按查询时间降序排列,通过 –order-by 指定
- –order-by Query_time:sum :按总的查询时间倒序
- 排序参数介绍:
- sum Sum/total attribute value(默认值)
- min Minimum attribute value(最小值)
- max Maximum attribute value(最小值)
- cnt Frequency/count of the query(按出现sql次数)
- Query ID:语句的 ID(去掉多余空格和文本字符,计算 hash 值)
- Response:总的响应时间
- time:该查询在本次分析中总的时间占比
- Calls:执行次数,即本次分析总共有多少条这种类型的查询语句
- R/Call:平均每次执行的响应时间
- V/M:响应时间 Variance-to-mean 的比率
- Item:查询对象
第三部分:具体的sql统计和分析
- pct:该 sql 语句某执行属性占所有慢查询语句某执行属性的百分比
- total:该 sql 语句某执行属性的所有属性时间。
- Count:sql 语句执行的次数。对应的 pct 表示此 sql 语句执行次数占所有慢查询语句执行次数的 % 比(下图为 69%),对应的 total 表示总共执行了 30988 次。
- Exec time:sql 执行时间
- Lock time:sql 执行期间被锁定的时间
- Rows sent:传输的有效数据,在 select 查询语句中才有值
- Rows examine:总共查询的数据,非目标数据。
- Query_time distribution:查询时间分布
- SQL 语句:下图中为 select sleep(7)\G
| |
| 说明:查询队列1:每秒查询量,查询的并发,队列1的ID值,对应第二部分的Query ID, 221452362表示偏移量(查看方法看下面的“查看偏移”) |
| |
| |
| |
| 说明:sql语句在慢日志文件mysql_slow.log出现的时间范围 |
| |
| 说明:属性 占整个 总数 最小值 最大值 平均值 95% 标准差 中间值 |
| 分析中 |
| 的百分 |
| 比 |
| |
| |
| 说明:执行语句总数量 |
| |
| 说明:执行时间 |
| |
| 说明:锁占用时间 |
| |
| 说明:发送到客户端的行数 |
| |
| 说明:扫描语句的行数 |
| |
| 说明:查询的字符数 |
| |
| |
| 说明:使用的数据主机IP |
| |
| 说明:使用的用户 |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| 说明:查询时间分布 |
| |
| |
| |
| |
| select * from `table_name` where `updated_at` >= '2022-10-15 00:00:40'\G |
| 说明:查询的mysql语句 |
| 第三部分是每一种查询比较慢的 sql 的详细统计结果 |
| pct:该 sql 语句某执行属性占所有慢查询语句某执行属性的百分比 |
| total:该 sql 语句某执行属性的所有属性时间。 |
| Count:sql 语句执行的次数。 |
| Exec time:sql 执行时间 |
| Lock time:sql 执行期间被 |
六 查看偏移
- 可以利用偏移量在慢查询日志文件中到查找到具体的 SQL 语句,查找方法如下:
| [localhost]# tail -c +221452362 ./mysql-slow.log | head |
| t: root[root] @ localhost [] Id: 13704150 |
| # Query_time: 7.058835 Lock_time: 0.000040 Rows_sent: 2 Rows_examined: 1392521 |
| SET timestamp=1665763267; |
| select * from `xxxxxx` where `updated_at` >= '2022-10-15 00:00:40'; |
| # User@Host: root[localhost] @ localhost [] Id: 13704174 |
| # Query_time: 7.445741 Lock_time: 0.000015 Rows_sent: 3 Rows_examined: 2214002 |
| SET timestamp=1665763267; |
| select xxx from table where xxx |
| # Time: 221015 008 |
| # User@Host: root[localhost] @ localhost [] Id: 13704414 |