当前位置: 代码网 > it编程>数据库>Mysql > MySQL运维神器pt-kill清理垃圾SQL的完整指南

MySQL运维神器pt-kill清理垃圾SQL的完整指南

2026年03月26日 Mysql 我要评论
在日常开发过程中,谁没遇到过这种窘境:业务高峰期突然 cpu 狂飙,大量连接堆积,排查发现是几条失控的慢查询在疯狂占用资源。手动执行show processlist查找线程 id 再kill?等操作完

在日常开发过程中,谁没遇到过这种窘境:业务高峰期突然 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 包含sleeporder 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 实时推送。

四、生产环境避坑指南

  1. 权限最小化:优先使用 mysql 8.0 的动态权限,避免授予 super 权限,降低安全风险。
  2. 避免误杀系统线程:pt-kill 默认过滤复制线程等系统线程,但仍建议添加--ignore-user='system user'参数。
  3. 日志轮转:长期运行需配置日志轮转,避免日志文件过大:
# 添加到crontab,每日切割日志 
0 0 * * * mv /data/pt-kill.log /data/pt-kill.log.$(date +%y%m%d) && touch /data/pt-kill.log
  1. 中文乱码处理:若 sql 包含中文字符导致工具失效,修改 pt-kill 脚本头部:
use utf8;
use open ":encoding(utf8)", ":std";
  1. 谨慎使用 --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的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com