<返回更多

分享mysql数据库一款杀会话利器--pt-kill

2019-09-24    
加入收藏

概述

生产环境中我们时常遇到这样的情况,数据库性能恶劣,需要马上杀掉全部会话,不然数据库就挂起来。我们可以先找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读取输入。

分享mysql数据库一款杀会话利器--pt-kill

 


二、实例

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
分享mysql数据库一款杀会话利器--pt-kill

 

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
分享mysql数据库一款杀会话利器--pt-kill

 

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
分享mysql数据库一款杀会话利器--pt-kill

 

2、mysqladmin工具

mysqladmin -uroot -pxxx processlist|awk -F "|" '{print $2}'|egrep "[0-9][0-9]*"|xargs -n 1 mysqladmin -uroot -pxxx kill
分享mysql数据库一款杀会话利器--pt-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
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>