MySQL连接线程kill利器之pt-kill

如何每10秒检查一次,杀死指定用户超过100秒的查询?

pt-kill --no-version-check --host 127.0.0.1 --port 3306 --user ‘xxxxxx‘ --password ‘xxxxxx‘ --charset utf8 --match-command Query --match-user 指定的用户名 --busy-time 100 --kill --victims all --interval 10 --print

常用参数说明

    • no-version-check
      不最新检查版本
    • host
      连接数据库的地址
    • port
      连接数据库的端口
    • user
      连接数据库的用户名
    • passowrd
      连接数据库的密码
    • charset
      指定字符集
    • match-command
      指定杀死的查询类型
    • match-user
      指定杀死的用户名,即杀死该用户的查询
    • busy-time
      指定杀死超过多少秒的查询
    • kill
      执行kill命令
    • victims
      表示从匹配的结果中选择,类似SQL中的where部分,all是全部的查询
    • interal
      每隔多少秒检查一次
    • print
      把kill的查询打印出来

pt-kill 常用杀进程参数:

1. 按user kill

/usr/bin/pt-kill --busy-time 15   --match-user="dbUSER1 | dbUSER2,..." --victim all --interval 1 --kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log

注:测试通过按用户来杀线程,注意--match-user多个用户之间用 | 分隔。

2. 按query来源 host kill

/usr/bin/pt-kill --busy-time 15   --match-host="192.168.10.10 | 192.168.10.11" --victim all --interval 1 --kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log

使用 --ignore-host 或 --match-host

注:测试通过按来源host来杀线程,注意--match-host多个host之间用 | 分隔。

3. 按command kill

/usr/bin/pt-kill --busy-time 15   --match-command="query | Execute" --victim all --interval 1 --kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log

/usr/bin/pt-kill --busy-time 15   --ignore-command="sleep | binlogdump" --victim all --interval 1 --kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log

注:测试通过按command来杀掉线程,注意command的内容一定要严格匹配大小写,否则会杀不掉。 注意--match-command多个command之间用 | 分隔,否则会失效。
(command有:Query、Sleep、Binlog Dump、Connect、Delayed insert、Execute、Fetch、Init DB、Kill、Prepare、Processlist、Quit、Reset stmt、Table Dump)

4. 按state kill

/usr/bin/pt-kill --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. 按info关键字 kill

/usr/bin/pt-kill --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"

6. 按访问的dbname kill

/usr/bin/pt-kill --busy-time 15 --match-db="db1 | db2"  --victim all --interval 1 --kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log
 --ignore-db  / --match-db
注:测试通过按db来杀掉线程,注意db的内容一定要严格匹配大小写,否则会杀不掉。注意--match-db多个db之间用 | 分隔,否则会失效。

另: Actions:
--kill                     杀掉连接并且退出
--kill-query           只杀掉连接执行的语句,但是线程不会被终止

具体请参考官网资料:https://www.percona.com/doc/percona-toolkit/2.1/pt-kill.html

时间: 2024-10-12 20:53:33

MySQL连接线程kill利器之pt-kill的相关文章

关于MySQL用户会话及连接线程

0.概念理解:用户会话和连接线程是什么关系? 用户会话和用户连接线程是一一对应的关系,一个会话就一个用户连接线程. 问题描述: 如果系统因为执行了一个非常大的dml或者ddl操作导致系统hang住,我们想断掉这个操作,怎么办? 解决办法: 1.kill thread:杀死用户的会话 但是时间长,效果不佳:前滚+回滚,前提是已经进行了很长时间,回滚就需要更多的时间 2.kill mysqld进程:推荐,用这种杀进程的方式,速度快 kill -9 进程号(ps aux 查看进程号) 数据库先前滚,不

mysql连接卡死,很多线程sleep状态,导致CPU中mysqld占用率极高

关闭所有 .................................. .连接: ##把全部的MySQL连接kill掉for i in $(mysql -uroot -p123456 -Bse "show processlist" | awk '{print $1}');do mysql -uroot -p123456 -e "kill $i";done ##把admin用户的连接kill掉for i in $(mysql -uroot -p123456 -

MySQL连接操作

关闭所有连接: ##把全部的MySQL连接kill掉for i in $(mysql -uroot -p123456 -Bse "show processlist" | awk '{print $1}');do mysql -uroot -p123456 -e "kill $i";done ##把admin用户的连接kill掉for i in $(mysql -uroot -p123456 -se "show processlist" | awk

【MySQL】线程状态详解

前言:我们常用 show processlist 或 show full processlist 查看数据库连接状态,其中比较关注的是 State 列,此列表示该连接此刻所在的状态.那么你真的了解不同 State 值所表示的状态吗?下面我们参考官方文档来一探究竟 . 以MySQL 5.7版本为例 官方文档地址:https://dev.mysql.com/doc/refman/5.7/en/general-thread-states.html 简单翻译下: After create 当线程在创建表

shell命令批量杀死MySQL连接进程

(1)将所有的MySQL连接进程杀掉 for i in `mysql -uroot -pzhangyun -Bse "show processlist" | grep -v "show processlist" | awk '{print $1}'` do mysql -uroot -pzhangyun -e "kill $i" done 注:这里将自身命令的show processlist进程过滤掉 (2)删除指定用户的连接进程 for i i

后台任务利器之Hangfire

后台任务利器之Hangfire 一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的DI管理着生命周期,免去了在NF4.X环境中配置always running的麻烦,真正做到开箱即用. 二.安装 Hangfie官方支持是MsSql和redis,除此之外,可供选择的还有PostgreSql和Mongo.在应用入口项目需要引用Hangfire.AspNetCore和特定持久库,比如使用了MsSql数据库的Hangfi

MYSQL连接相关参数和状态值详解

针对mysql的连接参数和状态值,本文做些介绍和对比 一.MYSQL连接参数变量 1.常用连接数限制参数 show variables like '%connect%'; | max_connect_errors | 999999999 | ##允许单用户连接错误最大值,超过后在不刷新状态的情况下,禁止该用户新连接 | max_connections | 6000 | ##实例最大连接数限制 | max_user_connections | 0 | ##但用户连接最大限制,默认0表示无限制,遵守

批量杀死mysql连接

mysqladmin杀死所有/指定mysql连接 1.批量杀死所有mysql连接 mysqladmin -uroot -pxxx processlist |awk -F '|' '{print $2}' |xargs -n 1 mysqldamin -uroot -pxxx kill 2.批量杀死指定mysql连接 mysqladmin -uroot -pxxx processlist |awk -F '|' '{if ($3 == "Mike") print $2}' |xargs

查看mysql连接状态各类参数

命令: show processlist; 如果是root帐号,你能看到所有用户的当前连接.如果是其它普通帐号,只能看到自己占用的连接. show processlist;只列出前100条,如果想全列出请使用show full processlist; mysql> show processlist; 命令: show status; 命令:show status like '%下面变量%'; Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量. Aborted