生产环境中我们时常遇到这样的情况,数据库性能恶劣,需要马上杀掉全部会话,不然数据库就挂起来。我们可以先找show processlist的输出来杀会话,但是比较麻烦。pt-kill为我们解决了杀会话问题。
pt-kill是用来kill MySQL连接的一个工具,在MySQL中因为空闲连接较多导致超过最大连接数,或某个有问题的sql导致mysql负载很高时,需要将其KILL掉来保证服务器正常运行。
pt-kill [OPTIONS] [DSN]
pt-kill杀死MySQL连接。如果没有给出文件,pt-kill连接到MySQL然后从“ SHOW PROCESSLIST ”命令输出中获取查询。否则,就从包含有“ SHOW PROCESSLIST ”输出的一个或者多个文件中读取查询。如果文件是“ - ”,pt-kill从STDIN读取输入。
1、按照用户杀会话
pt-kill --host=localhost --user=root --password=asd] --port=3306 --busy-time 15 --match-user="myuser|perf_stat" --victim all --interval 1 --kill --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log
2、按照会话连接的主机杀会话
pt-kill --host=localhost --user=root --password=asd] --port=3306 --busy-time 15 --match-host="172.26.166.108" --victim all --interval 1 --kill --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log
3、按照command匹配杀会话
pt-kill --host=localhost --user=root --password=ads] --port=3306 --busy-time 15 --match-command="query|Execute" --victim all --interval 1 --kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log
注:测试通过按command来杀掉线程,注意command的内容一定要严格匹配大小写,否则会杀不掉。 注意--match-command多个command之间用 | 分隔,否则会失效。
Query,Sleep,Binlog Dump,Connect,Delayed insert,Execute,Fetch,Init DB,Kill,Prepare,Processlist,Quit,Reset stmt,Table Dump
4、按state杀会话
pt-kill --host=localhost --user=root --password=asd] --port=3306 --busy-time 15 --match-state="Locked | Sending data" --victim all --interval 1 --kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log
注:测试通过按state 来杀掉线程,注意state 的内容一定要严格匹配大小写,否则会杀不掉。注意--match-state多个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)
5、查杀大于30s的会话
pt-kill --host=localhost --user=root --password=asd] --port=3306 --match-db='cctest' --match-command="Query" --busy-time 30 --victims all --interval 10 --daemonize --kill --print --log=/tmp/kill.log
6、按info关键字 kill
pt-kill --host=localhost --user=root --password=asd --port=3306 --busy-time 15 --match-info="SELECT | DELETE" --victim all --interval 1 --kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log
注:测试通过按info来杀掉线程,注意info的内容一定要严格匹配大小写,否则会杀不掉。注意--match-info多个info之间用 | 分隔,否则会失效。
--ignore-info / --match-info
(info可以使用select、update、insert、delete来进行匹配,并可使用"|"进行多项匹配,如"select|SELECT|delete|DELETE|update|UPDATE")
1、拼sql
select concat('KILL ',id,';') from information_schema.processlist into outfile '/tmp/kill.sql'; source /tmp/kill.sql
2、mysqladmin工具
mysqladmin -uroot -pxxx processlist|awk -F "|" '{print $2}'|egrep "[0-9][0-9]*"|xargs -n 1 mysqladmin -uroot -pxxx kill
3、循环kill
for id in `mysqladmin -uroot -pxx processlist|awk -F "|" '{print $2}'|egrep "[0-9][0-9]*"` do mysqladmin -uroot -pxx -hlocalhost kill ${id} done