背景
生产环境数据库出现运行时间过长的SQL,会影响数据库性能,如果同时出现多个类似SQL,则会影响数据库的可用性,从而导致业务不可用或体验差的情况。
在出现此类SQL的情况下,DBA人工干预需要一定的时间,在此期间如果SQL量比较大,且业务不停请求时,人工干预比较麻烦,无法及时处理。因此需要借助工具进行监控并自动kill超预期执行的SQL。
安装
https://www.percona.com/downloads/percona-toolkit/LATEST/
yum install percona-toolkit-3.5.2-2.el7.x86_64.rpm -y
参数
重要参数说明
1.匹配processlist的查杀线程或者会话的重要参数
举几个匹配例子如下:
(1)按照命令command查杀线程
--match-command多个command之间用 | 分隔,否则会失效。
command类型:Query、Sleep、Binlog Dump、Connect、Delayed insert、Execute、Fetch、Init DB、Kill、Prepare、Processlist、Quit、Reset stmt、Table Dump
(2)按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
注意state 的内容一定要严格匹配大小写,否则会杀不掉。注意--match-state多个state之间用 | 分隔,否则会失效。
(3)按info关键字来查杀线程
测试通过按info来杀掉线程,注意info的内容一定要严格匹配大小写,否则会杀不掉。注意--match-info多个info之间用 | 分隔,否则会失效。
--ignore-info 不匹配
--match-info 匹配
info可以使用select、update、insert、delete来进行匹配,并可使用"|"进行多项匹配,如"select|SELECT|delete|DELETE|update|UPDATE"
(4)按照访问来源host/ip查杀线程
--ignore-host/--match-host
(5)按照DB来查杀线程
--ignore-db/--match-db
(6)按照数据库用户
--ignore-user/--match-user
2.行为参数
Action:
--kill 杀掉连接并且退出
--kill-query 只杀掉连接执行的语句,但是线程不会被终止
--print 打印满足条件的语句
3.其它重要参数
--interval 运行检查query的间隔,
--victim 有三种情况:
oldest (默认值),只杀最老的查询(最先发起的最长时间) 。这是防止被查杀是不是真的长时间运行的查询,他们只是长期等待 。这种种匹配按时间查询,杀死一个时间最高值 。
all 杀掉所有满足的线程
all-but-oldest 杀死所有,但最长的保留不杀
--busy-time 批次查询已运行的时间超过这个时间的线程;
--idle-time 杀掉sleep 了多少时间的连接线程,必须在--match-command sleep时才有效
使用方法
pt-kill的主要使用场景简介如下
- 查杀select大于30s的会话
# 只打印-查杀select大于30s的会话
pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-info "select|SELECT" --busy-time 30 --victims all --interval 10 --daemonize --print --log=/tmp/pt_select.log
# 执行杀操作-查杀select大于30s的会话
pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-info "select|SELECT" --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_select_kill.log
- 查杀某IP来源的会话
# 只打印-查杀某IP来源的会话
pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-host "192.168.65.129" --busy-time 30 --victims all --interval 10 --daemonize --print --log=/tmp/pt_select.log
# 执行杀操作-查杀某IP来源的会话
pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-host "192.168.65.129" --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_select_kill.log
- 查杀指定用户的会话
# 只打印-查杀指定用户的会话
pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-user "u2" --busy-time 30 --victims all --interval 10 --daemonize --print --log=/tmp/pt_select.log
# 执行杀操作-查杀指定用户的会话
pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-user "u2" --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_select_kill.log
- 杀掉正在进行指定操作的sql
# 只打印-杀掉正在进行filesort的sql
pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-command Query --match-state "Sorting result" --run-time 1 --busy-time 30 --victims all --interval 10 --daemonize --print --log=/tmp/pt_select.log
# 执行杀操作-杀掉正在进行filesort的sql
pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-command Query --match-state "Sorting result" --run-time 1 --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_select_kill.log
# 只打印
pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-command Query --match-state "Creating sort index" --run-time 1 --busy-time 30 --victims all --interval 10 --daemonize --print --log=/tmp/pt_select.log
# 执行杀操作
pt-kill --host=127.0.0.1 --port=3306 --user=root --password=rootpwd --match-db='machine' --match-command Query --match-state "Creating sort index" --run-time 1 --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_select_kill.log
部署计划
对线上MySQL数据库部署pt-kill工具,并每分钟运行kill超过30s的SQL,并将查杀结果记录在日志中,定期推送kill的SQL至业务方