自動清理MYSQL的Lock進程的腳本
最近數據庫服務器在某一時段進程數忽然暴增,導致數據庫服務器死掉,根據日志查詢,是由於Mysql大量Lock進程造成服務器進程數過高導致。
遂寫了一個腳本,每分鐘檢查下,如果存在負載過高的情況,就殺掉一些Lock 進程。
以下腳本稍微改下,也可以完成其他的任務。
服務器負載高比較危險,可能會導致整個服務宕掉。雖然殺掉一些進程對某些用戶訪問可能會有一些異常,但總比服務器宕機要好。
cat killmysqlprocess.sh
-------------------------------------------------------------------------------------------------------------
www.2cto.com
#!/bin/bash
#*/1 * * * * /usr/local/src/killmysqlprocess.sh
backdir="/usr/local/logs/"
logfile="cms_mysql_killprocess_$(date +"%Y%m%d").log"
mysqlbindir="/usr/local/mysql/bin/"
#use commond 'vmstat' get proc num
pronum=`vmstat | awk -F" " '{if (NR==3) print $1}' vmstat.tmp`
#if pronum less 20, nothing to do.......... exit
if [ $pronum -lt 20 ]; then
exit
fi
#it's here more than 20,run kill mysql Lock process
${mysqlbindir}mysql -e "show full processlist" > processlist.tmp
#get Lock mysql process id
awk -F" " '/Locked/{print $1}' processlist.tmp >looplock.tmp
sleep 5
www.2cto.com
for line in `cat looplock.tmp`
do
/usr/local/mysql/bin/mysql -e "kill ${line}"
done
rm -f looplock.tmp
#write kill log
echo $(date +"%Y-%m-%d %H:%M:%S") >> ${backdir}${logfile}
cat processlist.tmp >> ${backdir}${logfile}
rm -f processlist.tmp