MySQL · 2016-10-29 0

Percona-Toolkit系列之pt-kill杀会话利器

1.pt-kill

生产环境中我们时常遇到这样的情况,数据库性能恶劣,需要马上杀掉全部会话,不然数据库就挂起来。我们可以先找show processlist的输出来杀会话,但是比较麻烦。pt-kill为我们解决了杀会话问题。

2常用杀会话场景

2.1按照用户杀会话

pt-kill --host=192.168.56.103 --user=root --password=111111 --port=3306 --busy-time 15   --match-user="nice|dbuser01|dbuser02" --victim all --interval 1 --kill  --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log

2.2按照会话连接的主机杀会话

pt-kill --host=192.168.56.103 --user=root --password=111111 --port=3306 --busy-time 15   --match-host="192.168.56.1 | 192.168.56.103" --victim all --interval 1 --kill  --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log

2.3. 按照command匹配杀会话

pt-kill --host=192.168.56.103 --user=root --password=111111 --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

2.4按state杀会话

pt-kill --host=192.168.56.103 --user=root --password=111111 --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)

2.5 按info关键字 kill

pt-kill --host=192.168.56.103 --user=root --password=111111 --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”)

2.6按访问的dbname kill

pt-kill --host=192.168.56.103 --user=root --password=111111 --port=3306 --busy-time 15 --match-db="db1 | db2"  --victim all --interval 1 --kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log

注:测试通过按db来杀掉线程,注意db的内容一定要严格匹配大小写,否则会杀不掉。注意–match-db多个db之间用 | 分隔,否则会失效

2.7杀掉全部外部连接

2.7.1拼sql

root@localhost [(none)] 08:06:24>>> select concat('KILL ',id,';') from information_schema.processlist into outfile '/tmp/kill.sql';
Query OK, 4 rows affected (0.00 sec)

root@localhost [(none)] 08:06:44>>>source /tmp/kill.sql
ERROR 1094 (HY000): Unknown thread id: 1
Query OK, 0 rows affected (0.00 sec)

ERROR 1317 (70100): Query execution was interrupted
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    34
Current database: *** NONE ***

Query OK, 0 rows affected (0.00 sec)

2.7.2 mysqladmin工具

mysqladmin -uroot -p111111 -h192.168.56.103 processlist|awk -F "|" '{print $2}'|egrep "[0-9][0-9]*"|xargs -n 1 mysqladmin -uroot -p111111 -h192.168.56.103 kill

2.7.3 循环一把

for id in `mysqladmin -uroot -p111111 -h192.168.56.103 processlist|awk -F "|" '{print $2}'|egrep "[0-9][0-9]*"`
do
   mysqladmin -uroot -p111111 -h192.168.56.103 kill ${id}
done