美文网首页
使用 pt-killer 自动 kill 掉慢查询语句

使用 pt-killer 自动 kill 掉慢查询语句

作者: awker | 来源:发表于2019-11-25 01:50 被阅读0次

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

相关文章

网友评论

      本文标题:使用 pt-killer 自动 kill 掉慢查询语句

      本文链接:https://www.haomeiwen.com/subject/syzrwctx.html