FAT47の底辺インフラ議事録

学んだことのメモ帳です

monによるMySQLのデッドロック検知 〜ロック秒数閾値設定編〜

先日、monでデッドロック検知をする記事を書きました。

monによるMySQLのデッドロック検知とロギング


ちょっとスクリプトの内容を改修して、
クエリによるロックの秒数が〜秒超えたらアラート検知する

ということをできるようにしました。
基本的な準備とかは↑の記事を参照してください。

ロック検知スクリプトの作成(改修版)

vim /usr/local/sbin/mysql_lock_check.sh
#!/bin/sh

#--------------------#
# Define ENV         #
#--------------------#
export PATH=$PATH:/usr/local/mysql/bin:/usr/bin/mysql
HOST=`hostname`
LOCK_SECOND=2 #ロックを検知する秒数
MYSQL_USER=ユーザ名 #MySQLのユーザ名
MYSQL_PASSWORD=パスワード #MySQLパスワード

#--------------------#
# DIR & FILE         #
#--------------------#
NAME=`basename $0 .sh`
PIDFILE=`dirname $0`/$NAME.pid
MYSQL_DIR='/data/mysql'

if [ -f "$PIDFILE" ]
then
    echo 2
    exit 2;
fi

echo $$ > $PIDFILE

CNT=`mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} -e 'select p_w.TIME seconds from information_schema.INNODB_LOCK_WAITS w,information_schema.INNODB_LOCKS l,information_schema.INNODB_TRX t_b,information_schema.INNODB_TRX t_w,information_schema.PROCESSLIST p_b,information_schema.PROCESSLIST p_w where w.blocking_lock_id = l.lock_id and w.blocking_trx_id = t_b.trx_id and w.requesting_trx_id = t_w.trx_id and t_b.trx_mysql_thread_id = p_b.ID and t_w.trx_mysql_thread_id = p_w.ID \G' | grep "second" | awk -F" " '{ print $2 }' | sort -n | tail -n1`
if [ "${CNT}" != "" ]; then
   if [ "${CNT}" -ge ${LOCK_SECOND} ]; then
        rm $PIDFILE
        echo `date` >> ${MYSQL_DIR}/${HOST}_innodb_lock.log
        mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} -e 'select t_b.trx_mysql_thread_id blocking_id,t_w.trx_mysql_thread_id requesting_id,p_b.HOST blocking_host,p_w.HOST requesting_host,l.lock_table lock_table,l.lock_index lock_index,l.lock_mode lock_mode,p_w.TIME seconds,p_b.INFO blocking_info,p_w.INFO requesting_info from information_schema.INNODB_LOCK_WAITS w,information_schema.INNODB_LOCKS l,information_schema.INNODB_TRX t_b,information_schema.INNODB_TRX t_w,information_schema.PROCESSLIST p_b,information_schema.PROCESSLIST p_w where w.blocking_lock_id = l.lock_id and w.blocking_trx_id = t_b.trx_id and w.requesting_trx_id = t_w.trx_id and t_b.trx_mysql_thread_id = p_b.ID and t_w.trx_mysql_thread_id = p_w.ID order by requesting_id,blocking_id \G' >> ${MYSQL_DIR}/${HOST}_innodb_lock.log
        echo 1
        exit 1;
    fi
fi
rm $PIDFILE
echo 0
exit 0;


間違ってたら教えて下さい…。