monによるMySQLのデッドロック検知 〜ロック秒数閾値設定編〜
先日、monでデッドロック検知をする記事を書きました。
ちょっとスクリプトの内容を改修して、
クエリによるロックの秒数が〜秒超えたらアラート検知する
ということをできるようにしました。
基本的な準備とかは↑の記事を参照してください。
ロック検知スクリプトの作成(改修版)
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;
間違ってたら教えて下さい…。