最近數(shù)據(jù)庫(kù)服務(wù)器在某一時(shí)段進(jìn)程數(shù)忽然暴增,導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)器死掉,根據(jù)日志查詢,是由于mysql大量Lock進(jìn)程造成服務(wù)器進(jìn)程數(shù)過(guò)高導(dǎo)致。 遂寫(xiě)了一個(gè)腳本,每分鐘檢查下,如果存在負(fù)載過(guò)高的情況,就殺掉一些Lock 進(jìn)程。 以下腳本稍微改下,也可以完成其他的任
最近數(shù)據(jù)庫(kù)服務(wù)器在某一時(shí)段進(jìn)程數(shù)忽然暴增,導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)器死掉,根據(jù)日志查詢,是由于Mysql大量Lock進(jìn)程造成服務(wù)器進(jìn)程數(shù)過(guò)高導(dǎo)致。
遂寫(xiě)了一個(gè)腳本,每分鐘檢查下,如果存在負(fù)載過(guò)高的情況,就殺掉一些Lock 進(jìn)程。
以下腳本稍微改下,也可以完成其他的任務(wù)。
服務(wù)器負(fù)載高比較危險(xiǎn),可能會(huì)導(dǎo)致整個(gè)服務(wù)宕掉。雖然殺掉一些進(jìn)程對(duì)某些用戶訪問(wèn)可能會(huì)有一些異常,但總比服務(wù)器宕機(jī)要好。
cat killmysqlprocess.sh
#!/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
vmstat > vmstat.tmp
pronum=`awk -F” ” ‘{if (NR==3) print $1}’ vmstat.tmp`
rm -f 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
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