PT 系列 00·小谈 pt-kill

pt-kill:

1、官方文档

2、功能概述

3、使用场景

4、常用查杀案例

① 每 10 秒检查一次,发现有 Query 的进程就 kill 掉

② 查杀 select 大于 30s 的连接

③ 查杀某用户大于 10s 的空闲连接

④ 查杀某 IP 来源的连接

⑤ 查杀某访问用户的连接

⑥ 查杀正在 filesort 的 SQL


1、官方文档

Percona 工具包文档

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值