モヒカンSQLをまとめてKILLする

MySQLをハングさせるSELECT系のモヒカンSQLが複数走ってしまった場合、そいつらをまとめてKillするスクリプトです。

400秒以上実行中のものをKILLします。

確認用Bash

desc_long_time_select.sh

#!/bin/sh

CRITERIA="where Time > 400 and INFO is not NULL and INFO NOT LIKE '%insert%' and INFO LIKE '%select%'"
CPU_THR="1.00"
MYSQL_THR="100.0"

#CRITERIA="where Time >= 0"
#CPU_THR="0.00"
#MYSQL_THR="0.0"

mysql -uroot -p{pass} -D{db} -t -e "SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE FROM INFORMATION_SCHEMA.PROCESSLIST ${CRITERIA} ;"

KILLするBash

念のためload1が1以上、MySQLの使用率が100%以上の場合のみ実行にしている。

kill_long_time_select.sh

#!/bin/sh

CRITERIA="where Time > 400 and INFO is not NULL and INFO NOT LIKE '%insert%' and INFO LIKE '%select%'"
CPU_THR="1.00"
MYSQL_THR="100.0"

#CRITERIA="where Time >= 0"
#CPU_THR="0.00"
#MYSQL_THR="0.0"

result=`mysql -uroot -p{pass} -D{db} -e "SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE FROM INFORMATION_SCHEMA.PROCESSLIST ${CRITERIA} ;" | wc -l`

if [ $result -ne 0 ]; then

    date=`date "+%Y%m%d%H%M%S"`
    killlog="/tmp/kill_long_time.log"

    load1=`uptime | grep "load average" | awk '{print $10}' | sed -e 's/,//g'`
    mysql_cpu_usage=`top -b -n 1 -c -d 0 | grep mysql | grep libexec | awk '{print $9}'`

    bool_load1=`echo "${load1} >= ${CPU_THR}" | bc `
    bool_mysql_cpu_usage=`echo "${mysql_cpu_usage} >= ${MYSQL_THR}" | bc `

    if [ $bool_load1 -eq 1 -a $bool_mysql_cpu_usage -eq 1 ]; then

        for ID in `mysql -uroot -p{pass} -D{db} -N -s -e "SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST ${CRITERIA} ;"`
        do
            echo "kill $ID"
            echo $date >> $killlog
            mysql -uroot -p{pass} -D{db} -t -e "SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID = ${ID} \G;" >> $killlog
            mysql -uroot -p{pass} -D{db} -e "KILL ${ID} ;"
        done
    fi
fi