Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL pt-kill清理垃圾SQL

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

作者:·云扬·

在日常开发过程中,谁没遇到过这种窘境:业务高峰期突然 CPU 狂飙,大量连接堆积,排查发现是几条失控的慢查询在疯狂占用资源,Percona Toolkit 中的 pt-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的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文