实施步骤
PT-Tools安装下载:
Percona Toolkit简称pt⼯具—PT-Tools,是Percona公司开发用于管理MySQL的工具,功能包括检查主从复制的数据⼀致性、检查重复索引、定位IO占⽤⾼的表⽂文件、在线DDL等,DBA熟悉掌握后将极⼤提高⼯作效率。
下载地址:
https://www.percona.com/downloads/percona-toolkit/LATEST/
编译安装:
1.下载解压安装包:
@mysql-01 ~]# mv percona-toolkit-3.3.1_x86_64.tar.gz /opt/src/
@mysql-01 ~]# cd /opt/src/
@mysql-01 src]# tar xf percona-toolkit-3.3.1_x86_64.tar.gz -C /usr/local/
2.添加软链接:
@mysql-01 src]# cd /usr/local/
@mysql-01 local]# ln -s /usr/local/percona-toolkit-3.3.1/ /usr/local/percona-toolkit
3.编译安装:
编译前需要安装如下工具
yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker -y
mysql-01 local]# cd percona-toolkit
percona-toolkit]# perl Makefile.PL
percona-toolkit]# make
percona-toolkit]# make install
4.添加环境变量:
echo "export PATH=$PATH:/usr/local/percona-toolkit/bin/" >> /etc/profile
source /etc/profile
5.安装完成验证:
cd /usr/local/percona-toolkit/bin
查看工具是否都存在
本文章只使用pt-tools其中的一个工具pt-query-digest(慢查询log分析)
分析慢日志:
使用pt-query-digest之前需要mysql获取慢日志信息
设置mysql慢日志相关配置:
1.开启慢查询:
mysql> show variables like "slow_query_log%";
+---------------------+-----------------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /usr/local/mysql/data/mysql-03-slow.log |
+---------------------+-----------------------------------------+
开启慢日志:
临时开启(重启后回滚):set global slow_query_log=1;
永久开启(配置文件中设置):
在mysql配置文件中添加配置:/etc/my.cnf
[mysqld]
slow_query_log=1 #开启慢查询日志
slow_query_log_file=/usr/local/mysql/data/mysql-slow.log #设置日志的存放路径和日志名称
mysql> show variables like "slow_query_log%";
+---------------------+-----------------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /usr/local/mysql/data/mysql-03-slow.log |
+---------------------+-----------------------------------------+
2.设置慢查询阈值(默认10秒,大于10秒会被记录):
mysql> show variables like '%long_query_time%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
set global long_query_time=5;
mysql> show variables like '%long_query_time%';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 5.000000 |
+-----------------+----------+
使用 pt-query-digest 分析慢日志
这里创建了些mysql的慢日志sql(过程省略)
1.分析慢日志把结果输出到一个文件中
pt-query-digest mysql-03-slow.log > 1.txt
2.查看分析结果
#第一部分:
3.8s user time, 30ms system time, 27.73M rss, 190.27M vsz
说明:
执行过程中在用户中所花费的所有时间
执行过程中内核空间中所花费的所有时间
pt-query-digest进程所分配的内存大小
pt-query-digest进程所分配的虚拟内存大小
# Current date: Wed Dec 21 11:22:00 2022
说明:当前日期
# Hostname: mysql-03
说明:执行pt-query-digest的主机名
# Files: mysql-03-slow.log
说明:被分析的文件名
# Overall: 37.99k total, 6 unique, 0.01 QPS, 0.64x concurrency
说明:语句总数量,唯一语句数量,每秒查询量,查询的并发
# Time range: 2022-11-01T22:35:40 to 2022-12-14T09:35:46
说明:慢日志中sql记录的时间范围
# Attribute total min max avg 95% stddev median
说明:属性 总计 最小值 最大值 平均值 95%标准差 中位数
# ============ ======= ======= ======= ======= ======= ======= =======
# Exec time 2348723s 18s 1715s 62s 33s 199s 21s
说明:执行时间
# Lock time 2s 25us 6ms 63us 103us 74us 54us
说明:锁占用时间
# Rows sent 35.87k 0 1 0.97 0.99 0.18 0.99
说明:发送到客户端的行数
# Rows examine 2.66T 8.60M 82.04M 73.35M 79.57M 4.51M 72.18M
说明:扫描的语句行数
# Query size 2.43M 36 1.07k 67.04 118.34 39.24 36.69
说明:查询字符大小
#第二部分(主要):
#第二部分记录了慢sql的排行,可用于分析重点慢sql
# Profile
说明:sql概述
# Rank Query ID Response time Calls R/Call
#Rank:语句排名(查询时间降序排列)
#Query ID:语句ID信息
#Response:此类型语句所有执行时间的总和
#time:此类型语句占全部语句时间的百分比
#Calls:执行次数,在分析文件中一共有多少条此类语句
#R/Call:平均查询时间
# ==== =================================== ================== ===== ======
# 1 0x60E5CB3F6F6B0FC197A0663B62F761E9 1426615.3620 60.7% 1267 1125.9790 42.01 UPDATE cert_info
# 2 0x4D6CAF4FA7338A56BE53899410CC0E87 375083.8371 16.0% 12228 30.6742 0.15 SELECT apply_info
# 3 0xB0F23FF617A3DF431D372298545A726B 258933.8613 11.0% 12229 21.1738 0.10 SELECT apply_info
# 4 0xD885005475BFEC049C00334EAFCC3872 251979.5603 10.7% 12228 20.6068 0.10 SELECT cert_info
# 5 0x18DF1FF7336FD00BB6389CD51E8A0859 36110.6256 1.5% 42 859.7768 27.88 SELECT cert_info
#第三部分(主要):
#第三部分详细记录了语句信息
# Query 1: 0.00 QPS, 0.63x concurrency, ID 0x60E5CB3F6F6B0FC197A0663B62F761E9 at byte 6411180
说明:查询队列1:每秒查询量,查询的并发,队列1的ID值
# Scores: V/M = 42.01
# Time range: 2022-11-01T23:01:06 to 2022-11-28T08:27:03
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 3 1267
# Exec time 60 1426615s 67s 1715s 1126s 1496s 217s 1063s
# Lock time 8 201ms 51us 6ms 158us 925us 366us 66us
# Rows sent 0 0 0 0 0 0 0 0
# Rows examine 3 86.88G 8.60M 74.51M 70.21M 72.18M 3.08M 68.74M
# Query size 5 128.68k 104 104 104 104 0 104
# String:
# Hosts 192.212.139.12 (436/34%)... 2 more
# Users xxx
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms
# 1s
# 10s+ ################################################################
说明:查询时间分布
# Tables
# SHOW TABLE STATUS LIKE 'cert_info'\G
# SHOW CREATE TABLE `cert_info`\G
说明:表名
update cert_info set cert_status = 4 where timestamp(not_after) <= timestamp(NOW()) and cert_status != 3\G
# Converted for EXPLAIN
# EXPLAIN /*!50100 PARTITIONS*/
select cert_status = 4 from cert_info where timestamp(not_after) <= timestamp(NOW()) and cert_status != 3\G
说明:语句详细信息定位具体慢sql语句
#以上就是关键分析内容,通过文件信息获取到问题语句,可以对问题语句进行后续优化处理和提供分析报告
参考文档
https://www.percona.com/doc/percona-toolkit/LATEST/pt-query-digest.html