pt-kill工具 -- 自动kill线上运行时间过长的SQL

 MySQL出现运行时间过长的SQL(慢SQL),会使线上数据库压力倍增,影响业务稳定性及可用性  

背景

生产环境数据库出现运行时间过长的SQL,会影响数据库性能,如果同时出现多个类似SQL,则会影响数据库的可用性,从而导致业务不可用或体验差的情况。 在出现此类SQL的情况下,DBA人工干预需要一定的时间,在此期间如果SQL量比较大,且业务不停请求时,人工干预比较麻烦,无法及时处理。因此需要借助工具进行监控并自动kill超预期执行的SQL。

工具简介

pt-kill的主要使用场景简介如下
  1. 查杀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
  1. 查杀某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
  1. 查杀指定用户的会话
# 只打印-查杀指定用户的会话 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
  1. 杀掉正在进行指定操作的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至业务方
上一篇:【Rust】引用匹配


下一篇:【Python 正则表达式】解析 re.match()