percona-toolkit之pt-kill 杀掉mysql查询或连接的方法
本文介绍如何使用 Percona Toolkit 中的 pt-kill 工具自动监控并终止 MySQL 中执行时间过长的查询。涵盖工具安装、核心参数解析(如 --busy-time、--match-info、--victim)、日志记录配置及实战命令示例,帮助 DBA 有效防止慢 SQL 占用系统资源。
什么是 pt-kill
pt-kill 是 Percona Toolkit 套件中的一个实用工具,主要用于从 SHOW PROCESSLIST 中获取满足特定条件的连接或查询,并根据配置执行打印、杀掉(Kill)或其他操作。其核心目的是防止某些长时间运行的查询(特别是复杂的 SELECT 语句)占用过多系统资源,从而影响线上其他业务 SQL 的执行。
安装准备
使用此工具需要先安装 Percona Toolkit。在大多数 Linux 发行版中,可以通过包管理器直接安装:
# Debian/Ubuntu
sudo apt-get install percona-toolkit
# CentOS/RHEL
yum install percona-toolkit
安装完成后,即可通过命令行调用 pt-kill。
核心操作参数详解
pt-kill 提供了丰富的参数来精确控制哪些线程会被处理。以下是最常用的几组参数:
第1步:定义匹配条件
通过指定需要匹配的查询特征,确定目标线程。支持忽略(--ignore-)和匹配(--match-)模式:
- --match-info / --ignore-info:匹配 SQL 语句内容。例如
--match-info "SELECT|select"表示只匹配 SELECT 语句。注意:匹配区分大小写,建议使用正则表达式组合。
- --match-command / --ignore-command:匹配命令类型,如 Query、Sleep、Binlog Dump 等。
- --match-db / --ignore-db:匹配数据库名称。
- --match-user / --ignore-user:匹配连接用户。
第2步:设置超时阈值
定义“过长”的标准,超过该时间的线程将被视为目标:
- --busy-time=N:仅对已运行超过 N 秒的活跃查询生效。
- --idle-time=N:仅对休眠(Sleep)状态超过 N 秒的连接生效。通常需配合
--match-command Sleep使用。
第3步:指定处理动作
pt-kill 支持多种操作方式:
- --print:仅将满足条件的查询信息打印到屏幕,不执行删除操作(常用于测试)。
- --kill-query:终止当前正在执行的语句,但保留连接会话(线程不会断开)。
- --kill:彻底终止整个连接(包括当前语句和后续所有未执行的语句),断开 TCP 连接。
第4步:选择受害者策略(Victims)
当有多个线程同时满足条件时,决定杀哪一个:
- --victims oldest(默认值):只杀掉最老(最先发起)的查询。适用于防止个别长期等待导致的假性慢查询。
- --victims all:杀掉所有满足条件的线程。
- --victims all-but-oldest:杀掉所有满足条件的线程,但保留最老的一个。
第5步:配置检查间隔与日志
- --interval=N:设定
pt-kill扫描 processlist 的频率,默认 5 秒。建议根据业务负载调整,过高会增加 CPU 负担。
- --log-dsn D=db,t=table:将
pt-kill的操作日志记录到指定的数据库中。需配合--create-log-table首次运行以自动建表。
实战案例与配置文件
单行命令示例
以下命令连接到 localhost,查找所有正在运行且超过 10 秒的 SELECT 语句,将其打印出来,并同时杀掉这些查询。若没有日志表则先创建:
pt-kill \
--user=root --password=your_password \
--host=localhost --port=3306 \
--log-dsn D=testdb,t=kill_log --create-log-table \
--busy-time=10 \
--print --kill-query \
--match-info "SELECT|select" \
--victims all
执行逻辑说明:
1. 如果 testdb.kill_log 表不存在,自动创建。
2. 每隔 5 秒(默认)扫描一次 Processlist。
3. 找到已运行 >10s 且语句含 SELECT 的记录。
4. 打印记录到控制台,并执行 Kill Query 操作。
使用配置文件简化参数
对于复杂的参数,可以写入配置文件以提高可读性和复用性。创建 tmp.txt:
host=localhost
user=root
password=your_password
port=3306
busy-time=10
print
kill-query
match-info="SELECT|select"
victims=all
然后运行:
pt-kill --config tmp.txt --log-dsn D=testdb,t=kill_log --create-log-table
注意事项与排错
- 多实例限制:默认情况下,
pt-kill单次启动只能监控一个 MySQL 实例(通过--host指定)。如果需要监控多个实例,需要为每个实例分别启动一个pt-kill进程,或者编写脚本循环调用。
- 权限要求:执行 Kill 操作的用户通常需要
PROCESS权限查看线程,以及Super或Process权限来 Kill 线程(视具体版本和权限模型而定)。
- 安全性提醒:
--kill操作具有破坏性,生产环境建议先用--print确认匹配结果无误后,再切换到--kill-query或--kill。务必开启日志记录功能以便审计。
总结
pt-kill 是 MySQL 性能优化和日常运维中的得力助手,能够自动化释放被长连接或慢查询占用的资源。通过合理配置匹配条件和超时阈值,可以有效避免因少数异常 SQL 拖垮整个数据库实例的风险。以上就是关于 pt-kill 工具的详细内容,更多关于 MySQL 运维技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









