在日常开发过程中,谁没遇到过这种窘境:业务高峰期突然 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的资料请关注代码网其它相关文章!
发表评论