pt-kill MySQL会话杀灭神器
废话不多说,直接上例子:
pt-kill --host=127.0.0.1 --user=xxx --password=xxxxxx --port=xxxx --busy-time 10 --match-info="SELECT * FROM|DELETE FROM XXX" --victim all --interval 5 \
--daemonize --pid=/tmp/ptkill.pid --log=/tmp/pt-kill.log --kill --print
部分选项释义:
--match-xxx 对应 show processlist 的各个字段:
+---------+-------------+------------------+---------+------------------+--------+---------------------------------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +---------+-------------+------------------+---------+------------------+--------+---------------------------------------------------------------+------------------+
--busy-time 15 匹配已运行超过此时间(秒)的查询。 查询必须处于Command = Query状态。 这与SHOW PROCESSLIST报告的查询的Time值匹配。
--kill-busy-commands --busy-time只匹配Command = Query的连接,但某些慢SQL Command = Execute,此时可使用 --kill-busy-commands=Query,Execute
--match-user="nice|dbuser01|dbuser02" 按照用户杀会话
--match-host="10.10.1.1|10.10.1.2" 按照会话连接的主机杀会话
--match-db="" 按照db匹配杀会话
--match-command="Query|Execute" 按照command匹配杀会话,(Command 取值有:Query, Sleep, Binlog Dump,Connect,Delayed insert,Execute
Fetch,Init DB,Kill,Prepare,Processlist,Quit,Reset stmt,Table Dump)
--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)
--match-info="" 仅匹配 Info 列与此Perl正则表达式匹配的查询。进程列表的 Info列显示正在执行的查询,如果没有执行查询,则显示NULL。
--match-all 匹配所有未被忽略的(--ignore 指定)查询(复制线程除外,除非指定了--replication-threads ),可与 --victim 合用,如:--match-all --victim oldest,只 kill 最老的查询
--victim 【 oldest | all | all-but-oldest 】
- oldest kill 执行时间最长的那一条 SQL
- all kill 所有匹配的 SQL
- all-but-oldest 除执行时间最长的那条SQL外,其他匹配SQL全部 kill (与 oldest 相反)
--print 打印匹配的SQL,不执行 kill 操作
--kill ,kill 连接
--kill-query 仅 kill query ,不断开连接
--daemonize 后台运行
--log ,--daemonize(守护进程)启动时,将所有输出打印到此文件
--pid 创建一个 pid文件
--interval ,check and kill 的频率,单位秒
注意:在匹配杀线程时,内容一定要严格匹配大小写,否则会杀不掉。注意多个匹配之间用 | 分隔,否则会失效。