Percona Toolkit使用之pt-kill

版权声明:本文为博主原创文章,转载敬请作出引用声明方便相互交流学习! https://blog.csdn.net/sweeper_freedoman/article/details/79838375

     pt-kill的功能是杀死匹配一定条件的MySQL查询。

     用法如下:

pt-kill [OPTIONS] [DSN]

     pt-kill杀死MySQL连接。如果没有给出文件,pt-kill连接到MySQL然后从“ SHOW PROCESSLIST ”命令输出中获取查询。否则,就从包含有“ SHOW PROCESSLIST ”输出的一个或者多个文件中读取查询。如果文件是“ - ”,pt-kill从STDIN读取输入。

     ①kill执行时间超过60s的查询:

pt-kill --busy-time 60 --kill

     ②条件同上,但是只print不kill:

pt-kill --busy-time 60 --print

     ③每10s一次找出和kill所有的睡眠进程:

pt-kill --match-command Sleep --kill --victims all --interval 10

     ④打印所有的登录进程:

pt-kill --match-state login --print --victims all

     ⑤找出刚才进程列表里的哪些查询匹配条件:

mysql -e "SHOW PROCESSLIST" > proclist.txt
pt-kill --test-matching proclist.txt --busy-time 60 --print

     pt-kill从“ SHOW PROCESSLIST ”中捕捉查询,筛选,然后kill或者print。这在一些圈子中也被称为“慢查询狙击手”。这个想法出于找出可能消耗太多资源的查询,然后杀死它们。

     简单起见,我们讨论kill查询的情况,当然它们也可能仅仅被print(或者未来一些其他的动作),依赖于给出的是什么选项。

     pt-kill通常连接到MySQL从“ SHOW PROCESSLIST ”里获取查询。或者,也可以从文件里面读取“ SHOW PROCESSLIST ”输出。在这种情况下,pt-kill不会连接到MySQL,“ --kill ”选项也不会起作用。当读取文件时你需要改用“ --print ”选项。通过使用“ --test-matching ”选项读取文件,允许你捕捉“ SHOW PROCESSLIST ”后再使用pt-kill测试,这确保你的条件匹配kill恰当的查询。有很多特殊的规则需要遵守,例如“不要kill复制线程”,所以请小心翼翼不要去kill重要的活动。

     需要知道的两个重要选项是“ --busy-time ”和“ --victims ”。

     首先,鉴于所有的匹配 / 筛选选项从“ SHOW PROCESSLIST ”里面匹配对应的结果(e.g.“ --match-command ”选项匹配查询里的“ Command ”值),“ Time ”值通过“ --busy-time ”选项匹配。参见“ --interval ”。其次,“ --victims ”控制从每个类别里面匹配的哪些查询会被kill。默认情况下,最长时间值开销的查询(最早的查询)被kill。

     通常你需要至少指定一个match选项,否则不会有查询被匹配到。或者,你可以指定“ --match-all ”选项来匹配没有被“ --ignore ”选项忽略的所有查询。

     通过几个步骤来确定哪些查询被kill(或者print——指定了什么动作)。第一步是把查询分组为类别。“ --group-by ”选项控制分组行为。默认情况下,该选项没有值,所以所有的查询被分组到一个默认的类别。所有类型的匹配和筛选操作(第二步)被应用到每一个类别。因此,你可能需要对查询分组,以匹配 / 筛选一些种类,而不是另外其他。第二步是匹配。匹配意味着过滤,因为如果一个查询不能匹配条件,它将被从自己的类别中移除。第三步是选择倒霉鬼,也就是每个类别中的哪些查询将被kill。第四步也就是最后一步是对所有类别中匹配的所有查询执行一些操作。

     如果只给出“ --kill ”选项,将没有输出。如果只给出“ --print ”选项,将打印出加了时间戳的将被kill的每条查询,如下所示。如果同时给出“ --kill ”和“ --print ”选项,匹配的查询将被kill,并且每个打印一行。

# 2009-07-15T15:04:01 KILL 8 (Query 42 sec) SELECT * FROM huge_table

     以下为个人本地环境的测试数据。

     print执行时间超过11s的查询。

mysql> SHOW FULL PROCESSLIST;
+----+------+---------------------+------+---------+------+------------+-----------------------+
| Id | User | Host                | db   | Command | Time | State      | Info                  |
+----+------+---------------------+------+---------+------+------------+-----------------------+
| 12 | root | localhost           | NULL | Query   |    0 | starting   | SHOW FULL PROCESSLIST |
| 21 | root | 192.168.112.1:60537 | NULL | Query   |    6 | User sleep | DO SLEEP(1111)        |
+----+------+---------------------+------+---------+------+------------+-----------------------+
2 rows in set (0.00 sec)

mysql> system pt-kill -h192.168.112.129 -P3306 -uroot -p123456 --busy-time=11 --print
# 2018-04-07T00:23:03 KILL 21 (Query 21 sec) DO SLEEP(1111)

     kill执行时间超过11s的查询。

mysql> SHOW FULL PROCESSLIST;
+----+------+---------------------+------+---------+------+------------+-----------------------+
| Id | User | Host                | db   | Command | Time | State      | Info                  |
+----+------+---------------------+------+---------+------+------------+-----------------------+
| 12 | root | localhost           | NULL | Query   |    0 | starting   | SHOW FULL PROCESSLIST |
| 24 | root | 192.168.112.1:60591 | NULL | Query   |   50 | User sleep | DO SLEEP(1111)        |
+----+------+---------------------+------+---------+------+------------+-----------------------+
2 rows in set (0.00 sec)

mysql> system pt-kill -h192.168.112.129 -P3306 -uroot -p123456 --busy-time=11 --kill

^Cmysql> 
mysql> SHOW FULL PROCESSLIST;
+----+------+-----------+------+---------+------+----------+-----------------------+
| Id | User | Host      | db   | Command | Time | State    | Info                  |
+----+------+-----------+------+---------+------+----------+-----------------------+
| 12 | root | localhost | NULL | Query   |    0 | starting | SHOW FULL PROCESSLIST |
+----+------+-----------+------+---------+------+----------+-----------------------+
1 row in set (0.00 sec)

     每隔11s执行kill所有的“Command”条件为“Query”的查询。

mysql> SHOW FULL PROCESSLIST;
+----+------+---------------------+------+---------+------+------------+-----------------------+
| Id | User | Host                | db   | Command | Time | State      | Info                  |
+----+------+---------------------+------+---------+------+------------+-----------------------+
|  3 | root | localhost           | NULL | Query   |    0 | starting   | SHOW FULL PROCESSLIST |
|  4 | root | 192.168.112.1:60861 | NULL | Query   |   54 | User sleep | DO SLEEP(1111)        |
+----+------+---------------------+------+---------+------+------------+-----------------------+
2 rows in set (0.00 sec)

mysql> system pt-kill -h192.168.112.129 -P3306 -uroot -p123456 --match-command=Query --victims=all --interval=11 --kill
^Cmysql> 
mysql> SHOW FULL PROCESSLIST;
+----+------+-----------+------+---------+------+----------+-----------------------+
| Id | User | Host      | db   | Command | Time | State    | Info                  |
+----+------+-----------+------+---------+------+----------+-----------------------+
|  3 | root | localhost | NULL | Query   |    0 | starting | SHOW FULL PROCESSLIST |
+----+------+-----------+------+---------+------+----------+-----------------------+
1 row in set (0.00 sec)

     print所以“State”条件为“User sleep”的查询。

mysql> SHOW FULL PROCESSLIST;
+----+------+---------------------+------+---------+------+------------+-----------------------+
| Id | User | Host                | db   | Command | Time | State      | Info                  |
+----+------+---------------------+------+---------+------+------------+-----------------------+
|  3 | root | localhost           | NULL | Query   |    0 | starting   | SHOW FULL PROCESSLIST |
|  7 | root | 192.168.112.1:60976 | NULL | Query   |   38 | User sleep | DO SLEEP(1111)        |
+----+------+---------------------+------+---------+------+------------+-----------------------+
2 rows in set (0.00 sec)

mysql> system pt-kill -h192.168.112.129 -P3306 -uroot -p123456 --match-state='User sleep' --victims=all --print
# 2018-04-07T00:30:40 KILL 7 (Query 54 sec) DO SLEEP(1111)

     从进程列表文件里找出执行时间超过11s的查询print出来。

mysql> SHOW FULL PROCESSLIST;
+----+------+---------------------+------+---------+------+------------+-----------------------+
| Id | User | Host                | db   | Command | Time | State      | Info                  |
+----+------+---------------------+------+---------+------+------------+-----------------------+
|  3 | root | localhost           | NULL | Query   |    0 | starting   | SHOW FULL PROCESSLIST |
|  7 | root | 192.168.112.1:60976 | NULL | Query   |  120 | User sleep | DO SLEEP(1111)        |
+----+------+---------------------+------+---------+------+------------+-----------------------+
2 rows in set (0.00 sec)

mysql> system mysql -e "SHOW PROCESSLIST" > proclist.txt
mysql> system pt-kill --test-matching=proclist.txt --busy-time=11 --print
# 2018-04-07T00:32:03 KILL 7 (Query 121 sec) DO SLEEP(1111)



参考:

https://www.percona.com/doc/percona-toolkit/LATEST/pt-kill.html

猜你喜欢

转载自blog.csdn.net/sweeper_freedoman/article/details/79838375