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