對於死結,MySQL並沒有提供提供直接的變數來表示。對於5.5版本之後的performance_shcema可以提供鎖的詳細資料(但我們還是5.0呢),對於InnoDB內建的監控器 Innodb_lock_monitor 其輸出總是輸出到錯誤記錄檔中,不方便進行對比。
我監控採用的是zabbix,採用agent 被動方式向zabbix server傳送資料。指令碼為shell,採用show innodb status 重新導向
核心代碼:
檢測是否為新的死結資訊:
New_deadlock() {
new_line_tile=$(grep -n "LATEST DETECTED DEADLOCK" $1 | cut -d ':' -f 1)
new_line_time=$(echo "$new_line_tile + 2" | bc)
last_dect_time="$(head -n $new_line_time $1 | tail -n 1) ###截取死結發生的時間戳記
[ -e $2 ] || cp $1 $2 #拿這次輸出資訊,和上次輸出資訊對比;如果是第一次檢測,將這次輸出資訊cp作為上次輸出資訊
old_line_tile=$(grep -n "LATEST DETECTED DEADLOCK" $2 | cut -d ':' -f 1)
if [ -z $old_line_tile ];then
echo 1
mv $1 $2 ##判斷上次輸出是否為死結,不是的話,直接返回1 表明最近一次是新的死結。並將 此次輸出資訊重新命名
exit 1
else ##否則對比兩次的時間戳記
old_line_time=$(echo "$old_line_tile + 2" | bc)
old_last_dect_time="$(head -n $old_line_time $2 | tail -n 1)"
mv $1 $2 #輸出資訊為下一次檢測做準備
if [ "$last_dect_time" = "$old_last_dect_time" ];then
echo 0
else
cp $1 /tmp/$1_detail #已判定為死結,需要保留作案資訊
echo 1
fi
fi
}
deadlock_check() {
case $1 in
1)
$MYSQL_BIN -u $user -p$password -S $SOC1 -e "show engine innodb status\G" > /tmp/innodb_status_1_$dthm
have_dead_lock=$(grep -c "LATEST DETECTED DEADLOCK" /tmp/innodb_status_1_$dthm)
#判斷這次檢測是否包含死結資訊,包含的話 讓 New_dead_lock 做死結對比否則 返回0
if [ $have_dead_lock -gt 0 ];then
New_deadlock /tmp/innodb_status_1_$dthm /tmp/innodb_status_1_$dt
else
echo 0
fi;;
2)
$MYSQL_BIN -u $user -p$password -S $SOC2 -e "show engine innodb status\G" > /tmp/innodb_status_2_$dthm
have_dead_lock=$(grep -c "LATEST DETECTED DEADLOCK" /tmp/innodb_status_2_$dthm)
if [ $have_dead_lock -gt 0 ];then
New_deadlock /tmp/innodb_status_2_$dthm /tmp/innodb_status_2_$dt
else
echo 0
fi;;
3)
$MYSQL_BIN -u $user -p$password -S $SOC3 -e "show engine innodb status\G" > /tmp/innodb_status_3_$dthm
have_dead_lock=$(grep -c "LATEST DETECTED DEADLOCK" /tmp/innodb_status_3_$dthm)
if [ $have_dead_lock -gt 0 ];then
New_deadlock /tmp/innodb_status_3_$dthm /tmp/innodb_status_3_$dt
else
echo 0
fi;;
4)
$MYSQL_BIN -u $user -p$password -S $SOC4 -e "show engine innodb status\G" > /tmp/innodb_status_4_$dthm
have_dead_lock=$(grep -c "LATEST DETECTED DEADLOCK" /tmp/innodb_status_4_$dthm)
if [ $have_dead_lock -gt 0 ];then
New_deadlock /tmp/innodb_status_4_$dthm /tmp/innodb_status_4_$dt
else
echo 0
fi;;
*)
echo $ERROR
exit 1;;
esac
}
case $1中的變數是針對不同機器上多個執行個體的情況,傳送socket參數。