サーバごとおちるような案件があったので
参照系クエリでスロークエリ 20秒 以上のものを
SQL が改善されるまでの間 kill することにした。
すぐに SQL を直せよという話だが、
あまりにもひどい SQL だったので修正までに時間がかかり
kill しないとサーバごと落ちる。
たぶん、mysql を再起動するよりはまし
あまりこういったものは使いたくないがいたしかたない。
#!/bin/sh
PASSWORD=password//mysqlのrootパスワード
DBNAME=hogedb//該当DB名
while true;
do
SEARCH_MYSQL_THREAD=`/usr/bin/mysqladmin processlist -u root -p$PASSWORD | awk 'BEGIN { FS="|"; } /$DBNAME/ && /Query/ && /Sending data/' | sort -nrk 12 | head -n 1 | awk '{print $2 ,$12}'`
MYSQL_THREAD_ID=`echo $SEARCH_MYSQL_THREAD | cut -d\ -f1`
MYSQL_SLOW_QUERY_TIME=`echo $SEARCH_MYSQL_THREAD | cut -d\ -f2`
if echo $MYSQL_SLOW_QUERY_TIME | grep -E '^[0-9]+$' >/dev/null 2>&1; then
if [ $MYSQL_SLOW_QUERY_TIME -gt 20 ]; then
/usr/bin/mysqladmin kill $MYSQL_THREAD_ID -u root -p$PASSWORD
echo "mysql thread $MYSQL_THREAD_ID killed!!" | mail -s $0 root
fi
fi
# デバッグ用
# echo $MYSQL_THREAD_ID
# echo $MYSQL_SLOW_QUERY_TIME
# echo "-------------"
unset SEARCH_MYSQL_THREAD
unset MYSQL_THREAD_ID
unset MYSQL_SLOW_QUERY_TIME
sleep 2
done起動方法
nohup /root/mysqlkillprocesslist.sh > out.log 2> err.log < /dev/null &
SQLが改善するまでの間デーモンのように動かしておく。
nohup してるのでログアウトしても OK
ps aux|grep mysqlkillprocesslist.sh
root 25369 0.0 0.0 63860 1096 pts/0 SN 22:45 0:00 /bin/sh /root/mysqlkillprocesslist.sh
root 26547 0.0 0.0 65404 824 pts/0 S+ 22:46 0:00 grep mysqlkillprocesslist.sh
必要なくなったら
kill -9 プロセスIDで終了させる。
つまらないものを作ってしまった。
もうこの案件のSQLはみたくない。

関連する記事
0 コメント:
コメントを投稿