percona-toolkit 安装
# yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
# yum install percona-toolkit
pt-killer 使用示例
# pt-kill --no-version-check --host=10.0.0.1 --port=3306 --user=root --password=xxxxxx --busy-time=15 --ignore-self --interval 2 --print
# pt-kill --no-version-check --host=10.0.0.1 --port=3306 --user=root --password=xxxxxx --busy-time=15 --ignore-self --interval 2 --kill
# pt-kill --no-version-check --host=10.0.0.1 --port=3306 --user=root --password=xxxxxx --busy-time=15 --ignore-self --interval 2 --daemonize --log=/data/percona-toolkit/pt-kill.log --kill
# pt-kill --no-version-check --host=10.0.0.1 --port=3306 --user=root --ask-pass --busy-time=15 --ignore-self --interval 2 --daemonize --log=/data/percona-toolkit/pt-kill.log --match-command Query --victims all --print --kill
参数说明:
- --no-version-check:执行 pt-kill 时,不检查 pt-kill 是否有新版本
- --host:mysql server 的地址
- --port:mysql server 的端口
- --user:mysql server 的用户
- --ask-pass:执行 pt-kill 时会提示输入 mysql server 的密码,避免密码出现在 linux history 里
- --password:mysql server 的密码,密码会出现在 linux history 里,有安全风险
- --busy-time: SHOW PROCESSLIST 输出的结果中 Command=Query 超过 15 秒的语句
- --ignore-self :忽略 pt-kill 自己的连接
- --interval:多长时间 pt-kill 执行一次 SHOW PROCESSLIST 检查查询结果,默认 30 秒。只指定了 --busy-time 时,默认为 --busy-time 值的一半。同时指定了 --busy-time 和 --interval 时,以 --interval 的值为准
- --print:单独使用时,只会打印 kill 掉了哪些SQL语句的连接,而不会真正执行 kill 命令。和 --kill 同时使用时,kill 掉连接的同时也会打印 kill 掉了哪些连接
- --kill:单独使用时,会 kill 掉满足条件的SQL语句的连接。和 --print 同时使用时,kill 掉连接的同时也会打印 kill 掉了哪些连接
- --daemonize:后台运行 pt-kill
- --log:后台运行 pt-kill 时,打印日志到某个文件里面
- --match-command:匹配的命令。可以指定 Query、Sleep、Binlog Dump、Connect、Delayed insert、Execute、Fetch、Init DB、Kill、Prepare、Processlist、Quit、Reset stmt、Table Dump 这些命令
- --victims:控制哪些匹配的连接会被 kill 掉。oldest:时间最长的连接。all:所有的连接。all-but-oldest:除了时间最长的连接
监控 /data/percona-toolkit/pt-kill.log 并发送邮件告警
# cat pt-kill-sendmail.py
# coding: utf-8
import tailer
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
def sendmailx(log):
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
from_addr = 'foobar@qq.com'
password = 'xxxxxx'
to_addr = ['foo@qq.com', 'bar@163.com']
smtp_server = 'smtp.qq.com'
msg = MIMEText(log, 'plain', 'utf-8')
msg['From'] = _format_addr('foobar <%s>' % from_addr)
msg['To'] = ", ".join(to_addr)
msg['Subject'] = Header('慢查询 pt-kill 日志,请关注', 'utf-8').encode()
# server = smtplib.SMTP_SSL(smtp_server, 465)
server = smtplib.SMTP(smtp_server, 587)
server.set_debuglevel(0)
server.starttls()
server.login(from_addr, password)
server.sendmail(from_addr, to_addr, msg.as_string())
server.quit()
if __name__ == '__main__':
for line in tailer.follow(open('/data/percona-toolkit/pt-kill.log')):
sendmailx(line)
// 运行脚本
# nohup python /data/percona-toolkit/pt-kill-sendmail.py > /tmp/pt-kill-sendmail.log 2>&1 &
结果参考:

参考文档:https://www.percona.com/doc/percona-toolkit/LATEST/pt-kill.html
网友评论