pt-kill:
① 每 10 秒检查一次,发现有 Query 的进程就 kill 掉
1、官方文档
2、功能概述
pt-kill 是用来杀死符合特定条件的 MySQL 连接。
3、使用场景
在 MySQL 中因为空闲连接较多导致超过最大连接数时;某些有问题的 SQL 导致 MySQL 负载很高,主从延迟;需要将其 kill 掉来保证 MySQL 的正常运行。
这个工具在实际业务环境中实用性很高,当 MySQL 连接出现异常后快速恢复业务,我们这里主要用来防止某些 select 操作时间过长,从而影响其它线上的 SQL。
4、常用查杀案例
重要参数:
- --host: 连接的数据库主机,默认为 localhost;
- --port: 连接的数据库端口号;
- --user: 连接的数据库用户;
- --password: 连接的数据库用户对应的密码;
- --interval: 多久运行一次,单位可以是 s/m/h/d 等(默认单位是 s,默认值为 30s),可以根据实际情况调节;
- --victims: 默认是 oldest,只杀最古老的查询(这是防止被查杀的是不是真的长时间运行的查询,这种匹配按时间查询,杀死一个时间最长的);
- --victims all: 杀掉所有满足的线程;
- --victims all-but-oldest: 杀掉所有,但最长的保留不杀;
- --print: 打印出将要被杀掉的连接;
- --kill: 杀掉连接并且退出;
- --kill-query: 之杀掉连接执行的语句,但是线程不会被终止;
- --busy-time: 批次查询已经运行的时间,超过这个时间的线程,必须在 --match-command='Query' 时才有效;
- --idle-time: 杀掉 Sleep 了多少时间的连接线程,必须在 --match-command='Sleep' 时才有效;
- --match-command: 匹配当前连接的命令,对应 show processlist 捕获的 Command 对应值(可选值:Query、Sleep、Binlog Dump、Connect、Delayed insert、Execute、Fetch、Init DB、Kill、Prepare、Processlist、Quit、Reset stmt、Table Dump);
- --match-info: 正则匹配正则运行的 SQL,区分大小写;
- --match-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-user: 匹配当前连接的命令,对应 show processlist 捕获的 User 对应值;
- --match-host: 匹配当前连接的命令,对应 show processlist 捕获的 Host 对应值;
- --run-time: 设置运行时间, 如果不指定,将会一直运行下去;
- --daemonize: 放在后台以守护进程的形式运行;
- --log: 守护进程将所有的输出打印到指定的文件(绝对路径),必须在 --daemonize 守护进程运行的时候;
① 每 10 秒检查一次,发现有 Query 的进程就 kill 掉
# 只打印,不杀死
$ /home/mysql/percona-toolkit-3.0.8/bin/pt-kill --host=127.0.0.1 --port=3306 --user=root --password=root_pwd --match-db='db_name' --match-command='Query' --victims all --interval 10 --daemonize --print --log=/tmp/pt_info.log
# 执行查杀操作
$ /home/mysql/percona-toolkit-3.0.8/bin/pt-kill --host=127.0.0.1 --port=3306 --user=root --password=root_pwd --match-db='db_name' --match-command='Query' --victims all --interval 10 --daemonize --kill --log=/tmp/pt_kill.log
② 查杀 select 大于 30s 的连接
# 只打印,不杀死
$ /home/mysql/percona-toolkit-3.0.8/bin/pt-kill --host=127.0.0.1 --port=3306 --user=root --password=root_pwd --match-db='db_name' --match-info 'select|SELECT' --match-command='Query' --busy-time 30 --victims all --interval 10 --daemonize --print --log=/tmp/pt_select_info.log
# 执行查杀操作
$ /home/mysql/percona-toolkit-3.0.8/bin/pt-kill --host=127.0.0.1 --port=3306 --user=root --password=root_pwd --match-db='db_name' --match-info 'select|SELECT' --match-command='Query' --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_select_kill.log
③ 查杀某用户大于 10s 的空闲连接
# 只打印,不杀死
$ /home/mysql/percona-toolkit-3.0.8/bin/pt-kill --host=127.0.0.1 --port=3306 --user=root --password=root_pwd --match-db='db_name' --match-user "db_user" --match-command='Sleep' --idle-time 10 --victims all --interval 10 --daemonize --print --log=/tmp/pt_select_info.log
# 执行查杀操作
$ /home/mysql/percona-toolkit-3.0.8/bin/pt-kill --host=127.0.0.1 --port=3306 --user=root --password=root_pwd --match-db='db_name' --match-user "db_user" --match-command='Sleep' --idle-time 10 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_select_kill.log
④ 查杀某 IP 来源的连接
# 只打印,不杀死
$ /home/mysql/percona-toolkit-3.0.8/bin/pt-kill --host=127.0.0.1 --port=3306 --user=root --password=root_pwd --match-db='db_name' --match-host "10.210.32.78" --victims all --interval 10 --daemonize --print --log=/tmp/pt_ip_info.log
# 执行查杀操作
$ /home/mysql/percona-toolkit-3.0.8/bin/pt-kill --host=127.0.0.1 --port=3306 --user=root --password=root_pwd --match-db='db_name' --match-host "10.210.32.78" --victims all --interval 10 --daemonize --kill --log=/tmp/pt_ip_kill.log
⑤ 查杀某访问用户的连接
# 只打印,不杀死
$ /home/mysql/percona-toolkit-3.0.8/bin/pt-kill --host=127.0.0.1 --port=3306 --user=root --password=root_pwd --match-db='db_name' --match-user "db_user" --victims all --interval 10 --daemonize --print --log=/tmp/pt_user_info.log
# 执行查杀操作
$ /home/mysql/percona-toolkit-3.0.8/bin/pt-kill --host=127.0.0.1 --port=3306 --user=root --password=root_pwd --match-db='db_name' --match-user "db_user" --victims all --interval 10 --daemonize --kill --log=/tmp/pt_user_kill.log
⑥ 查杀正在 filesort 的 SQL
# 只打印,不杀死
$ /home/mysql/percona-toolkit-3.0.8/bin/pt-kill --host=127.0.0.1 --port=3306 --user=root --password=root_pwd --match-db='db_name' --match-command='Query' --match-state "Sorting result" --run-time 1 --busy-time 30 --victims all --interval 10 --daemonize --print --log=/tmp/pt_filesort_info.log
# 执行查杀操作
$ /home/mysql/percona-toolkit-3.0.8/bin/pt-kill --host=127.0.0.1 --port=3306 --user=root --password=root_pwd --match-db='db_name' --match-command='Query' --match-state "Sorting result" --run-time 1 --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_filesort_kill.log
# 只打印,不杀死
$ /home/mysql/percona-toolkit-3.0.8/bin/pt-kill --host=127.0.0.1 --port=3306 --user=root --password=root_pwd --match-db='db_name' --match-command='Query' --match-state "Creating sort index" --run-time 1 --busy-time 30 --victims all --interval 10 --daemonize --print --log=/tmp/pt_filesort_info.log
# 执行查杀操作
$ /home/mysql/percona-toolkit-3.0.8/bin/pt-kill --host=127.0.0.1 --port=3306 --user=root --password=root_pwd --match-db='db_name' --match-command='Query' --match-state "Creating sort index" --run-time 1 --busy-time 30 --victims all --interval 10 --daemonize --kill --log=/tmp/pt_filesort_kill.log