percona-toolkit之pt-kill 杀掉mysql查询或连接的方法

温以宁
温以宁
发布时间:2026-10-13| 6人浏览过
原创

本文介绍如何使用 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 运维技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。