MySQL运维神器pt-kill清理垃圾SQL的完整指南
在日常开发过程中,谁没遇到过这种窘境:业务高峰期突然 CPU 狂飙,大量连接堆积,排查发现是几条失控的慢查询在疯狂占用资源。手动执行show processlist查找线程 ID 再kill?等操作完成,业务可能已经受损。而 Percona Toolkit 中的 pt-kill 工具,正是解决这类问题的 “手术刀”—— 它能自动监控并斩杀符合条件的垃圾 SQL,让数据库重获新生。今天就带大家从基础用法到生产实战,彻底掌握这个运维必备工具!
一、环境准备:权限配置是前提(避坑关键)
在开始使用 pt-kill 前,必须先解决权限问题。很多同学反馈 “命令执行成功却没 kill 掉 SQL”,本质是权限配置不当。
1. 基础权限配置(兼容 MySQL 5.7/8.0)
创建专用运维账号,避免使用 root 账号直接操作:
# 创建dba用户并授权 CREATE USER 'dba'@'localhost' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'Id81Gdac_a'; # 必需权限:PROCESS(查看所有线程)+ SUPER(终止线程,5.7及以下) GRANT PROCESS, SUPER ON *.* TO 'dba'@'localhost'; FLUSH PRIVILEGES;
2. MySQL 8.0 权限优化(推荐方案)
MySQL 8.0 已废弃 SUPER 权限的部分功能,推荐使用细粒度动态权限,更安全可控:
# 8.0专用授权:CONNECTION_ADMIN(替代SUPER的kill权限)+SYSTEM_USER (保护或操作“系统账户”)+ PROCESS(查看线程) GRANT PROCESS, CONNECTION_ADMIN, SYSTEM_USER ON *.* TO 'dba'@'localhost';
注意:PROCESS 权限允许查看所有用户的 SQL 原文,可能泄露敏感信息,建议仅授权给信任的运维人员。
3. 工具安装(CentOS 示例)
若未安装 Percona Toolkit,执行以下命令:
# 下载最新稳定版3.5.4 wget https://downloads.percona.com/downloads/percona-toolkit/3.5.4/binary/redhat/7/x86_64/percona-toolkit-3.5.4-2.el7.x86_64.rpm # 安装依赖并部署 yum install -y percona-toolkit-3.5.4-2.el7.x86_64.rpm # 验证安装 pt-kill --version

二、核心用法:从测试到生产的完整流程
1. 测试模式:只打印不 kill(安全验证)
先验证规则是否正确匹配目标 SQL,避免误杀正常业务:
# 匹配运行超过10秒的查询,仅打印不终止 pt-kill --user=dba --password='Id81Gdac_a' \ --socket=/tmp/mysql.sock \ --busy-time=10 \ # 运行时间阈值(秒) --interval=10 \ # 每隔10秒检查一次 --print # 打印匹配的SQL
测试验证:在 MySQL 中执行select sleep(60);,终端会输出匹配的线程信息。

2. 执行 kill:精准终止垃圾 SQL
确认规则无误后,添加--kill参数执行终止操作:
# kill运行超过10秒的查询,并打印日志 pt-kill --user=dba --password='Id81Gdac_a' \ --socket=/tmp/mysql.sock \ --busy-time=10 \ --kill \ # 终止匹配的SQL --print # 同时打印被kill的SQL
此时再执行select sleep(60);,会被立即终止,客户端提示 “Lost connection”。

3. 后台守护:持续监控(生产环境必备)
让 pt-kill 在后台运行,持续守护数据库:
# 后台运行,日志输出到指定文件 pt-kill --user=dba --password='Id81Gdac_a' \ --socket=/tmp/mysql.sock \ --busy-time=10 \ --kill \ --print \ --daemonize \ # 后台守护进程模式 --log=/data/pt-kill.log # 日志文件路径
4. 进程管理:启停与查看
# 查看后台运行的pt-kill进程 ps -ef | grep pt-kill # 停止进程(替换为实际PID) kill -9 3181

三、进阶技巧:精准过滤与个性化配置
1. 按用户 / 数据库过滤(避免误杀核心业务)
# 只kill来自maria用户、运行超过10秒的查询 pt-kill --user=dba --password='Id81Gdac_a' \ --socket=/tmp/mysql.sock \ --match-user='maria' \ # 匹配指定用户 --busy-time=10 \ --kill --print # 只kill特定数据库的慢查询(例如test库) pt-kill --user=dba --password='Id81Gdac_a' \ --socket=/tmp/mysql.sock \ --match-db='test' \ # 匹配指定数据库 --busy-time=10 \ --kill --print
2. 按 SQL 内容匹配(精准斩杀特定类型 SQL)
使用正则表达式匹配 SQL 关键词,比如只 kill 包含sleep或order by rand()的低效查询:
pt-kill --user=dba --password='Id81Gdac_a' \ --socket=/tmp/mysql.sock \ --match-info='(?i-xsm:sleep|order by rand)' \ # 不区分大小写匹配 --busy-time=5 \ --kill --print
3. 报警增强:慢 SQL 实时通知(重构版功能)
原生 pt-kill 仅支持日志输出,推荐使用 PHP 重构版(支持邮件 / 微信报警):
# 下载重构版pt-kill(含报警功能) wget https://github.com/hcymysql/pt-kill/archive/refs/heads/master.zip unzip master.zip && cd pt-kill-master # 安装依赖 yum install -y php-process php php-mysql # 带微信报警的后台运行示例 php pt-kill.php -u dba -p 'Id81Gdac_a' \ -h localhost -P 3306 \ -B 10 \ # 超时阈值(秒) --match-info='select|alter' \ --kill --weixin --daemon 1
需提前配置微信 / 邮件参数(参考脚本内说明),实现慢 SQL 实时推送。
四、生产环境避坑指南
- 权限最小化:优先使用 MySQL 8.0 的动态权限,避免授予 SUPER 权限,降低安全风险。
- 避免误杀系统线程:pt-kill 默认过滤复制线程等系统线程,但仍建议添加
--ignore-user='system user'参数。 - 日志轮转:长期运行需配置日志轮转,避免日志文件过大:
# 添加到crontab,每日切割日志 0 0 * * * mv /data/pt-kill.log /data/pt-kill.log.$(date +%Y%m%d) && touch /data/pt-kill.log
- 中文乱码处理:若 SQL 包含中文字符导致工具失效,修改 pt-kill 脚本头部:
use utf8; use open ":encoding(utf8)", ":std";
- 谨慎使用 --victims=all:默认只 kill 最旧的慢查询(
--victims=oldest),使用all会终止所有匹配查询,需评估业务影响。
结语
pt-kill 作为 MySQL 运维的 “救火神器”,核心价值在于快速止损,但更重要的是通过日志分析慢 SQL 根源,从优化 SQL、添加索引等角度彻底解决问题。如果大家在使用中遇到权限报错、匹配规则失效等问题,欢迎在评论区交流,我会第一时间回复!
最后附上工具官方文档:https://docs.percona.com/percona-toolkit/pt-kill.html
以上就是MySQL运维神器pt-kill清理垃圾SQL的完整指南的详细内容,更多关于MySQL pt-kill清理垃圾SQL的资料请关注脚本之家其它相关文章!
相关文章
mysql installer community 8.0.12.0安装图文教程
这篇文章主要为大家详细介绍了mysql installer community 8.0.12.0安装图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-08-08
mysql 5.7.18 安装配置方法图文教程(CentOS7)
这篇文章主要为大家详细介绍了CentOS 7下mysql 5.7.18 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-04-04
解决MySQL:Invalid GIS data provided to&nbs
这篇文章主要介绍了解决MySQL:Invalid GIS data provided to function st_geometryfromtext问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-06-06
MySQL 5.6.51 解压版(zip版)安装配置图文方法
这两天刚试用了一下MySQL5.6.51,感觉还不错,有兄弟戏称是一个高富帅版本。现将MySQL5.6.51 zip解压版本的安装配置过程记录如下,希望能给需要安装该版本的朋友一点参考作用2015-08-08
MySQL 8 中的保留关键字陷阱之当表名“lead”引发 SQL 语法错误的解
文章主要讨论了在MySQL 8.0.12及以上版本中,由于将"LEAD"列为保留关键字,导致使用未加引号的表名"lead"时会引发SQL语法错误的问题,文章分析了问题的根本原因,并提出了三种解决方案,感兴趣的朋友跟随小编一起看看吧2025-12-12


最新评论