searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

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

2024-06-20 03:17:34
38
0

简介

pt-query-digest是一个用于分析 MySQL 慢查询日志的工具。它可以对慢查询日志进行详细的分析,总结出查询的执行情况,包括各种统计信息,如不同查询类型的出现次数、执行时间分布等,帮助数据库管理员更好地了解数据库的负载情况和查询性能,以便进行针对性的优化和改进。

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

1.安装percona-toolkit

#!/bin/bash
#官网下载地址,版本可选:https://www.percona.com/downloads
wget https://downloads.percona.com/downloads/percona-toolkit/3.2.0/binary/tarball/percona-toolkit-3.2.0_x86_64.tar.gz
tar zxf percona-toolkit-3.2.0_x86_64.tar.gz -C /usr/bin
echo 'export PATH=/usr/bin/percona-toolkit-3.2.0/bin:$PATH' >>/etc/profile
source /etc/profile

2.验证一下是否安装完成 pt-query-digest

[root@ECS ~]#which pt-query-digest
/usr/bin/percona-toolkit-3.2.0/bin/pt-query-digest

3.工具安装完成后,进入天翼云控制台下载对应实例慢查询日志到本地服务器

4.慢查询日志上传到服务器后,使用pt-query-digest进行分析

# 直接分析慢查询文件:
pt-query-digest slow.log > file.txt

# 分析最近1小时内的查询:
pt-query-digest --since=1h slow.log > file.txt

# 分析指定时间范围内的查询:
pt-query-digest slow.log --since '2017-08-03 15:30:00' --until '2017-08-04 10:30:00' > file.txt

# 分析binlog:
mysqlbinlog --base64-output=decode-rows -vvv
mysqlbinlog --base64-output=decode-rows -vvv --start-datetime='起始时间' --stop-datetime='结束时间' 1.binlog >1.sql
pt-query-digest --type=binlog mysql-bin000001.sql >file.txt

# 分析general log:
pt-query-digest --type=genlog localhost.log > file.txt

5.查看分析结果,结果分为3个部分

       Overall(总体统计):
提供了一些关于分析的整体信息,如查询的总数、不同类型查询的数量、总执行时间等宏观数据。

360ms user time, 10ms system time, 22.56M rss, 187.09M vsz:该工具执行日志分析的用户时间,系统时间,物理内存占用大小,虚拟内存占用大小
Current date :工具执行时间
Hostname :运行分析工具的主机名    
Files :被分析的文件名
Overall :语句总数量
Time range:日志记录的时间范围
# Attribute          total     min     max     avg     95%  stddev  median
# ============     ======= ======= ======= ======= ======= ======= =======
语句执行时间
# Exec time         
锁占用时间
# Lock time         
发送到客户端的行数
# Rows sent        
select语句扫描行数
# Rows examine     
查询的字符数
# Query size      

       Queries(具体查询):
详细列出了被分析到的各个具体查询语句,以及它们的执行频率、平均执行时间、占总执行时间的比例等具体指标,帮助了解哪些查询是主要的性能关注点。

# Profile
Rank:所有语句的排名,默认按查询时间降序排列,通过--order-by指定
Query ID:语句的ID,(去掉多余空格和文本字符,计算hash值)
Response:总的响应时间
time:该查询在本次分析中总的时间占比
calls:执行次数,即本次分析总共有多少条这种类型的查询语句
R/Call:平均每次执行的响应时间
V/M:响应时间Variance-to-mean的比率
Item:查询对象
# Rank Query ID           Response time  Calls R/Call V/M  Item
# ==== =============================== =============== ===== ====== ===== 
#    1 0x15FA65D8DB4B11C0 1246.6948 41.7%   283 4.4053  0.04 UPDATE
#    2 0x116CC9D48CAFD899  877.6900 29.3%   339 2.5891  0.09 SELECT
#    3 0xD53FB261E6C9C12B  299.4193 10.0%    71 4.2172  0.05 SELECT 
#    4 0xF3DECDC01AF3779A  127.0137  4.2%    46 2.7612  0.04 SELECT 
#    5 0xB558D6F49F185C6F  118.3138  4.0%    49 2.4146  0.05 SELECT 
#    6 0x133B98C8766974A3  97.0805  3.2%    35 2.7737  0.56 SELECT 
#    7 0xFE5BDEA5171D2C01   52.5870  1.8%    22 2.3903  0.04 SELECT 
#    8 0x492DA473109C81AE   43.7895  1.5%    16 2.7368  0.08 SELECT 
#    9 0x01795767187F3AB1  41.3720  1.4%    15 2.7581  1.17 SELECT 
# MISC 0xMISC                            86.7871  2.9%    30 2.8929   0.0 <12 ITEMS>

      Rank Query ID 对应详细的SQL及优化建议

# Time range: 2024-05-17T15:51:48 to 2024-05-17T17:39:59
# Attribute    pct   total     min     max     avg     95%  stddev  median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count         33    6929
# Exec time     35  23673s      1s      8s      3s      5s      1s      4s
# Lock time     44     23s     1ms   206ms     3ms    13ms     8ms     1ms
# Rows sent     17  12.71k       0       5    1.88    4.96    1.72    0.99
# Rows examine   0  37.98k       0      18    5.61   11.95    4.53    4.96
# Bytes sent     1 794.04k      87     168  117.35  166.51   28.55  107.34
# Query size    24   6.88M   1.02k   1.02k   1.02k 1012.63       0 1012.63
# Bytes receiv   0       0       0       0       0       0       0       0
# Created tmp    0       0       0       0       0       0       0       0
# Created tmp   43 196.23k      29      29      29      29       0      29
# Errno          0       0       0       0       0       0       0       0
# Read first    40 148.87k      22      22      22      22       0      22
# Read key      42 301.76M  44.57k  44.64k  44.60k  44.45k       0  44.45k
# Read last      0       0       0       0       0       0       0       0
# Read next     40   2.36G 357.13k 357.25k 357.19k 345.04k       0 345.04k
# Read prev      0       0       0       0       0       0       0       0
# Read rnd       0       0       0       0       0       0       0       0
# Read rnd nex  48   4.68G 706.53k 709.98k 707.64k 683.15k       0 683.15k
# Sort merge p  59  13.53k       2       2       2       2       0       2
# Sort range c   0       0       0       0       0       0       0       0
# Sort rows     36   2.52M     371     393  381.51  381.65    8.88  381.65
# Sort scan co  62  33.83k       5       5       5       5       0       5
# String:
# Databases    bid
# End          2024-05-17... (1/0%), 2024-05-17... (1/0%)... 6927 more
# Hosts        192.168.200.120
# Start        2024-05-17... (1/0%), 2024-05-17... (1/0%)... 6927 more
# Users        jstcc_bid
# Query_time distribution
#   1us
#  10us
# 100us
#   1ms
#  10ms
# 100ms
#    1s  ################################################################
#  10s+
# Tables
#    SHOW TABLE STATUS FROM `bid` LIKE 'v_pending_item'\G
#    SHOW CREATE TABLE `bid`.`v_pending_item`\G
#    SHOW TABLE STATUS FROM `bid` LIKE 'v_user_edit_project'\G
#    SHOW CREATE TABLE `bid`.`v_user_edit_project`\G
#    SHOW TABLE STATUS FROM `bid` LIKE 't_user_permission_depart'\G
#    SHOW CREATE TABLE `bid`.`t_user_permission_depart`\G
#    SHOW TABLE STATUS FROM `bid` LIKE 'v_user_edit_permission'\G
#    SHOW CREATE TABLE `bid`.`v_user_edit_permission`\G
# EXPLAIN /*!50100 PARTITIONS*/
SELECT
        type,
        IFNULL( COUNT( ttt.type ), 0 ) countNum
        FROM(

        select * from
        (
            SELECT
            DISTINCT
            t.*
            FROM
            table1 t
            LEFT JOIN (
                SELECT DISTINCT
                v.project_id
                FROM
                table2 v
 where 1 = 1
        order by tt.orderNum asc , tt.time desc

        ) ttt
        GROUP BY ttt.type\G

到这里pt-query-digest工具就介绍完了。分析慢查询只是问题的开始,如何优化慢查询才是重点,下一篇将详细说明慢SQL该如何进行优化。

 

0条评论
0 / 1000
DBM
8文章数
0粉丝数
DBM
8 文章 | 0 粉丝
原创

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

2024-06-20 03:17:34
38
0

简介

pt-query-digest是一个用于分析 MySQL 慢查询日志的工具。它可以对慢查询日志进行详细的分析,总结出查询的执行情况,包括各种统计信息,如不同查询类型的出现次数、执行时间分布等,帮助数据库管理员更好地了解数据库的负载情况和查询性能,以便进行针对性的优化和改进。

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

1.安装percona-toolkit

#!/bin/bash
#官网下载地址,版本可选:https://www.percona.com/downloads
wget https://downloads.percona.com/downloads/percona-toolkit/3.2.0/binary/tarball/percona-toolkit-3.2.0_x86_64.tar.gz
tar zxf percona-toolkit-3.2.0_x86_64.tar.gz -C /usr/bin
echo 'export PATH=/usr/bin/percona-toolkit-3.2.0/bin:$PATH' >>/etc/profile
source /etc/profile

2.验证一下是否安装完成 pt-query-digest

[root@ECS ~]#which pt-query-digest
/usr/bin/percona-toolkit-3.2.0/bin/pt-query-digest

3.工具安装完成后,进入天翼云控制台下载对应实例慢查询日志到本地服务器

4.慢查询日志上传到服务器后,使用pt-query-digest进行分析

# 直接分析慢查询文件:
pt-query-digest slow.log > file.txt

# 分析最近1小时内的查询:
pt-query-digest --since=1h slow.log > file.txt

# 分析指定时间范围内的查询:
pt-query-digest slow.log --since '2017-08-03 15:30:00' --until '2017-08-04 10:30:00' > file.txt

# 分析binlog:
mysqlbinlog --base64-output=decode-rows -vvv
mysqlbinlog --base64-output=decode-rows -vvv --start-datetime='起始时间' --stop-datetime='结束时间' 1.binlog >1.sql
pt-query-digest --type=binlog mysql-bin000001.sql >file.txt

# 分析general log:
pt-query-digest --type=genlog localhost.log > file.txt

5.查看分析结果,结果分为3个部分

       Overall(总体统计):
提供了一些关于分析的整体信息,如查询的总数、不同类型查询的数量、总执行时间等宏观数据。

360ms user time, 10ms system time, 22.56M rss, 187.09M vsz:该工具执行日志分析的用户时间,系统时间,物理内存占用大小,虚拟内存占用大小
Current date :工具执行时间
Hostname :运行分析工具的主机名    
Files :被分析的文件名
Overall :语句总数量
Time range:日志记录的时间范围
# Attribute          total     min     max     avg     95%  stddev  median
# ============     ======= ======= ======= ======= ======= ======= =======
语句执行时间
# Exec time         
锁占用时间
# Lock time         
发送到客户端的行数
# Rows sent        
select语句扫描行数
# Rows examine     
查询的字符数
# Query size      

       Queries(具体查询):
详细列出了被分析到的各个具体查询语句,以及它们的执行频率、平均执行时间、占总执行时间的比例等具体指标,帮助了解哪些查询是主要的性能关注点。

# Profile
Rank:所有语句的排名,默认按查询时间降序排列,通过--order-by指定
Query ID:语句的ID,(去掉多余空格和文本字符,计算hash值)
Response:总的响应时间
time:该查询在本次分析中总的时间占比
calls:执行次数,即本次分析总共有多少条这种类型的查询语句
R/Call:平均每次执行的响应时间
V/M:响应时间Variance-to-mean的比率
Item:查询对象
# Rank Query ID           Response time  Calls R/Call V/M  Item
# ==== =============================== =============== ===== ====== ===== 
#    1 0x15FA65D8DB4B11C0 1246.6948 41.7%   283 4.4053  0.04 UPDATE
#    2 0x116CC9D48CAFD899  877.6900 29.3%   339 2.5891  0.09 SELECT
#    3 0xD53FB261E6C9C12B  299.4193 10.0%    71 4.2172  0.05 SELECT 
#    4 0xF3DECDC01AF3779A  127.0137  4.2%    46 2.7612  0.04 SELECT 
#    5 0xB558D6F49F185C6F  118.3138  4.0%    49 2.4146  0.05 SELECT 
#    6 0x133B98C8766974A3  97.0805  3.2%    35 2.7737  0.56 SELECT 
#    7 0xFE5BDEA5171D2C01   52.5870  1.8%    22 2.3903  0.04 SELECT 
#    8 0x492DA473109C81AE   43.7895  1.5%    16 2.7368  0.08 SELECT 
#    9 0x01795767187F3AB1  41.3720  1.4%    15 2.7581  1.17 SELECT 
# MISC 0xMISC                            86.7871  2.9%    30 2.8929   0.0 <12 ITEMS>

      Rank Query ID 对应详细的SQL及优化建议

# Time range: 2024-05-17T15:51:48 to 2024-05-17T17:39:59
# Attribute    pct   total     min     max     avg     95%  stddev  median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count         33    6929
# Exec time     35  23673s      1s      8s      3s      5s      1s      4s
# Lock time     44     23s     1ms   206ms     3ms    13ms     8ms     1ms
# Rows sent     17  12.71k       0       5    1.88    4.96    1.72    0.99
# Rows examine   0  37.98k       0      18    5.61   11.95    4.53    4.96
# Bytes sent     1 794.04k      87     168  117.35  166.51   28.55  107.34
# Query size    24   6.88M   1.02k   1.02k   1.02k 1012.63       0 1012.63
# Bytes receiv   0       0       0       0       0       0       0       0
# Created tmp    0       0       0       0       0       0       0       0
# Created tmp   43 196.23k      29      29      29      29       0      29
# Errno          0       0       0       0       0       0       0       0
# Read first    40 148.87k      22      22      22      22       0      22
# Read key      42 301.76M  44.57k  44.64k  44.60k  44.45k       0  44.45k
# Read last      0       0       0       0       0       0       0       0
# Read next     40   2.36G 357.13k 357.25k 357.19k 345.04k       0 345.04k
# Read prev      0       0       0       0       0       0       0       0
# Read rnd       0       0       0       0       0       0       0       0
# Read rnd nex  48   4.68G 706.53k 709.98k 707.64k 683.15k       0 683.15k
# Sort merge p  59  13.53k       2       2       2       2       0       2
# Sort range c   0       0       0       0       0       0       0       0
# Sort rows     36   2.52M     371     393  381.51  381.65    8.88  381.65
# Sort scan co  62  33.83k       5       5       5       5       0       5
# String:
# Databases    bid
# End          2024-05-17... (1/0%), 2024-05-17... (1/0%)... 6927 more
# Hosts        192.168.200.120
# Start        2024-05-17... (1/0%), 2024-05-17... (1/0%)... 6927 more
# Users        jstcc_bid
# Query_time distribution
#   1us
#  10us
# 100us
#   1ms
#  10ms
# 100ms
#    1s  ################################################################
#  10s+
# Tables
#    SHOW TABLE STATUS FROM `bid` LIKE 'v_pending_item'\G
#    SHOW CREATE TABLE `bid`.`v_pending_item`\G
#    SHOW TABLE STATUS FROM `bid` LIKE 'v_user_edit_project'\G
#    SHOW CREATE TABLE `bid`.`v_user_edit_project`\G
#    SHOW TABLE STATUS FROM `bid` LIKE 't_user_permission_depart'\G
#    SHOW CREATE TABLE `bid`.`t_user_permission_depart`\G
#    SHOW TABLE STATUS FROM `bid` LIKE 'v_user_edit_permission'\G
#    SHOW CREATE TABLE `bid`.`v_user_edit_permission`\G
# EXPLAIN /*!50100 PARTITIONS*/
SELECT
        type,
        IFNULL( COUNT( ttt.type ), 0 ) countNum
        FROM(

        select * from
        (
            SELECT
            DISTINCT
            t.*
            FROM
            table1 t
            LEFT JOIN (
                SELECT DISTINCT
                v.project_id
                FROM
                table2 v
 where 1 = 1
        order by tt.orderNum asc , tt.time desc

        ) ttt
        GROUP BY ttt.type\G

到这里pt-query-digest工具就介绍完了。分析慢查询只是问题的开始,如何优化慢查询才是重点,下一篇将详细说明慢SQL该如何进行优化。

 

文章来自个人专栏
Percona Toolkit
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0