专业的编程技术博客社区

网站首页 > 博客文章 正文

PT-KILL长尾慢SQL有时失灵?自写脚本更靠谱

baijin 2024-09-11 00:45:10 博客文章 7 ℃ 0 评论

一、概述

PT-KILL是我们在数据库运维过程中常用的一个工具。它主要用于解决长尾慢SQL。长尾慢SQL对数据库的性能影响非常大。但是在项目上我发现有时PT-KILL会失灵,特别是对于那些非常大的慢SQL。所以自己写个脚本更靠谱。下面分享一下这个脚本的具体内容。

二、解决方案

内容描述:

  • 查找超过300s的慢查询会话。
  • kill掉的历史会话保留在文件中

脚本内容:

#!/bin/bash
# 脚本参数定义
MYSQL_USER="root"
MYSQL_PASSWORD="######"
MYSQL_HOST="192.168.209.x"
MYSQL_PORT="3307"
SLOW_QUERY_TIME=3
SLEEP_TIME=10
OUTPUT_FILE="kill_select_slow.txt"

# 无限循环,每隔 10 秒查询一次
while true; do
# 查询执行时间超过 300 秒的 SELECT 会话
slow_queries=$(mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} -h${MYSQL_HOST} -P${MYSQL_PORT} -N -e "SELECT b.ID, b.USER, b.HOST, b.DB, b.COMMAND, TIME_TO_SEC(b.TIME), b.INFO FROM information_schema.PROCESSLIST AS b JOIN information_schema.INNODB_TRX AS a ON a.TRX_MYSQL_THREAD_ID = b.ID WHERE b.COMMAND = 'Query' AND b.INFO LIKE 'SELECT%' AND TIME_TO_SEC(b.TIME) > ${SLOW_QUERY_TIME};")

# 遍历查询到的慢查询会话并 kill 掉
while IFS= read -r line; do
if [ ! -z "$line" ]; then
session_id=$(echo $line | awk '{print $1}')
slow_query=$(echo $line | cut -d ' ' -f 7-)

# kill 慢查询会话
mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} -h${MYSQL_HOST} -P${MYSQL_PORT} -e "KILL $session_id;"

# 将被 kill 的慢 SQL 及会话记录到文件中
echo "$(date) - Killed session: $session_id - SQL: $slow_query" >> "$OUTPUT_FILE"
fi
done <<< "$slow_queries"

# 等待 10 秒后再次查询
sleep $SLEEP_TIME
done

脚本说明:

  • 请将 MYSQL_USER、MYSQL_PASSWORD、MYSQL_HOST 和MYSQL_PORT 替换为您的 MySQL 服务器的实际信息。
  • 为脚本添加执行权限(chmod +x script_name.sh),然后运行它(./script_name.sh)。被 kill 的慢查询会话将被保存在 kill_select_slow.txt 文件中。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表