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
微信赞赏
支付宝赞赏