Current user: root@localhost
SSL: Not in use
Server version: 8.0.18 MySQL Community Server - GPL
Protocol version: 10
Connection: Localhost via UNIX socket

要使用工具包,需要先安装percona-toolkit工具包,可以登录Percona官网进行下载:
https://www.percona.com/software/database-tools/percona-toolkit


工具包提供了两种方式:
percona-toolkit-3.3.0_x86_64.tar.gzpercona-toolkit-3.3.0-1.el7.x86_64.rpm
可以下载rpm包,或是二进制压缩包,个人推荐是二进制包,路径可灵活放置,可以跟MySQL软件放在一起,便于管理;
根据平台和方式进行下载即可。
我下载的是二进制压缩包,解压之后在bin目录下即可可执行脚本。

我把该工具包放在了目录下,/mysql/tools/toolskit/bin。
为了方便使用,我在MySQL用户登录的.bash_profile文件中增加了工具包的路径,这样就可以不用每次输入完整路径来使用各个工具了。
mysql@Tdongkf[11:14:12]:~$cat .bash_profile |grep PATHPATH=$MYSQL_HOME/bin:/mysql/tools/toolkit/bin:$PATHexport PATH TERM EDITOR TEMP
生产环境中我们时常遇到这样的情况,可能数据库性能恶劣,需要马上杀掉全部会话,不然数据库就挂起来;可能因为空闲连接较多导致超过最大连接数、某个有问题的sql导致mysql负载很高时,都需要将一些连接kill掉,如果通过show processlist的输出来杀会话,但是比较麻烦。pt-kill为我们解决了管理会话问题的简单的方式。
pt-kill是从show processlist 中获取满足条件的连接或者从包含show processlist的文件中读取满足条件的连接并打印或者杀掉或者执行其他操作,这个工具在工作中实用性很高,当服务器连接出现异常后第一想到的就是pt-kill,自己写一个脚本也可以,但是功能还是没有pt-kill强大。
使用工具包之前,可能会提示缺少某些依赖,我们可以提前安装下如下的依赖包:
yum install perl-DBD-MySQLyum install perl-Digest-MD5yum install perl-devel
pt-kill使用范例:
Usage: pt-kill [OPTIONS] [DSN]示例:pt-kill --host=127.0.0.1--user=root --password=root1234 --port=3306 --busy-time=10 --print --match-info "SELECT|select" --victims all
对所有查询时间超过10秒的SELECT语句进行print显示出来,如果需要kill,则将--print 替换为--kill 即可。pt-kill 默认检查间隔为5秒。
常用参数:
--daemonize 放在后台以守护进程的形式运行;--interval 多久运行一次,单位可以是s,m,h,d等,默认是s。默认30s,有点长,可以根据实际情况来调节--victims 默认是oldest,只杀最久的查询。这是防止被查杀是不是真的长时间运行的查询,他们只是长期等待。这种匹配按时间查询,杀死一个时间最高值。all 杀掉所有满足的线程all-but-oldest 杀死所有,但连接时间最长的保留不杀。--busy-time 批次查询已运行的时间超过这个时间的线程;--idle-time 杀掉sleep 了多少时间的连接线程,必须在--match-command sleep时才有效–busy-time 批次查询已运行的时间超过这个时间的线程;–idle-time 杀掉sleep了多少时间的连接线程,必须在--match-command sleep时才有效–match-command 匹配当前连接的命令,command有:Query、Sleep、Binlog Dump、Connect、Delayed insert、Execute、Fetch、Init DB、Kill、Prepare、Processlist、Quit、Reset stmt、Table Dump--match-state 根据状态进行匹配,state类型有:Locked、login、copy to tmp table、Copying to tmp table、Copying to tmp table on disk、Creating tmp table、executing、Reading from net、Sending data、Sorting for order、Sorting result、Table lock、Updating--match-info 区分大小写的,匹配SELECT也就意味着对select无法匹配,因此使用"SELECT|select"包含大小写,info可以使用select、update、insert、delete来进行匹配,并可使用"|"进行多项匹配,如"select|SELECT|delete|DELETE|update|UPDATE"
Action:
--kill为杀掉相关线程id--kill-query为杀掉相关SQL保留线程id--print 打印出来kill掉的连接id
风险提示:
在使用之前,请记得:
阅读官方文档;
查阅该工具的bug list;
在测试环境进行测试验证;
备份生产数据库并验证备份;
1. 每10秒检查一次,发现有 Query 的进程就给杀掉
# 只打印pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr --match-db='dongkf' --match-command="Query" --busy-time 30 --victims all --interval 10 --daemonize --print --log=/tmp/pt_print.log# 执行killpt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr --match-db='dongkf' --match-command="Query" --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_kill.log
2.查杀select大于30s的会话
# 只打印pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr --match-db='dongkf' --match-info "select|SELECT" --busy-time 30 --victims all --daemonize --print --log=/tmp/pt_print.log# 执行killpt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr --match-db='dongkf' --match-info "select|SELECT" --busy-time 30 --victims all --daemonize --kill --log=/tmp/pt_kill.log
3.查杀某IP来源的会话
# 只打印pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr --match-db='dongkf' --match-host "192.168.65.129" --busy-time 30 --victims all --daemonize --print --log=/tmp/pt_print.log# 执行killpt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr --match-db='dongkf' --match-host "192.168.65.129" --busy-time 30 --victims all --daemonize --kill --log=/tmp/pt_kill.log
4.查杀访问某用户的会话
# 只打印pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr pwd --match-db='dongkf' --match-user "u2" --busy-time 30 --victims all --daemonize --print --log=/tmp/pt_print.log# 执行killpt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr pwd --match-db='dongkf' --match-user "u2" --busy-time 30 --victims all --daemonize --kill --log=/tmp/pt_kill.log
5.杀掉正在进行filesort的sql
# 只打印pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr pwd --match-db='dongkf' --match-command Query --match-state "Sorting result" --run-time 1 --busy-time 30 --victims all --daemonize --print --log=/tmp/pt_print.log# 执行killpt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr pwd --match-db='dongkf' --match-command Query --match-state "Sorting result" --run-time 1 --busy-time 30 --victims all --daemonize --kill --log=/tmp/pt_kill.log
6.杀掉正在进行Creating sort index的sql
# 只打印pt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr --match-db='dongkf' --match-command Query --match-state "Creating sort index" --run-time 10 --busy-time 30 --victims all --daemonize --print --log=/tmp/pt_print.log# 执行killpt-kill --host=10.1.12.117 --port=3306 --user=dbmgr --password=dbmgr --match-db='dongkf' --match-command Query --match-state "Creating sort index" --run-time 10 --busy-time 30 --victims all --daemonize --kill --log=/tmp/pt_kill.log
如果想缩短输入命令的长度,也可以将常用命令的选项写入到配置文件中,简化命令:
pt-kill --config ptcon.cnf --match-info "SELECT|select" --victims all####查看配置文件内容:cat ptcon.cnfhost=127.0.0.1user=dbmgrpassword=dbmgrport=3306busy-time=30
pt-kill工具为我们提供了众多的参数和选项来进行数据库会话的管理,通过这些参数组合,我们可以方便的管理数据库上的不同会话,大大方便了DBA的工作。
下期我们在介绍下Percona-Toolkit工具包里的其它工具。相信,你会爱上这个便捷的工具包的。

完
=end=





