mysqlで実行すると、show engine innodb status
次の行が表示されます---TRANSACTION 17610C9A, ACTIVE 504 sec starting index read
。
キーワードの後の秒数がACTIVE
100を超える場合を監視し、電子メール通知を送信するスクリプトが必要です。
答え1
value=$(show engine innodb status | grep TRANSACTION | grep ACTIVE | \
sed -e 's/.*ACTIVE //' -e 's/\([[:digit:]]\{1,\}\).*/\1/')
if [ "$value" -gt 100 ]
then
send email here
fi
出力に他の行がある可能性があるように聞こえるので、何をgrepする必要があるのかわかりません。 grepの目的は、「ACTIVE NNN」部分を見つける必要がある行だけを含めることです。
sed式は先行部分(. *から「ACTIVE」まで)を削除し、1つ以上の数字と一致し、数字の後のすべての項目を削除します。結果の値が 100 より厳密に大きい場合は、メールを送信してください。
答え2
私は次のことをします:
detected=(
mysql --defaults-extra-file=/etc/mysql/debian.cnf --raw -Be '
show engine innodb status' | perl -ln -0777 -e '
while (/(\*\*\* \(\d+\) TRANSACTION:\s+TRANSACTION \S+ ACTIVE (\d+).*?)(?=\*\*\*)/sg) {
print $1 if $2 > 100;
}'
)
if [ -n "$detected" ]; then
mailx -s "$subject" "$addresses" << EOF
Some transactions took more than 100 seconds:
$detected
EOF
fi
ちなみに、上記の形式は私が見た形式に合わせて調整されており、次のようになります。
*** (1) TRANSACTION:
TRANSACTION AE523D, ACTIVE 0 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 9 lock struct(s), heap size 1248, 4 row lock(s), undo log entries 2
MySQL thread id 40705, OS thread handle 0x7fa6d8197700, query id 5697977 localhost bugs updating
DELETE FROM tokens WHERE token = 'JpLgGK5Ygn'
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 32823 n bits 280 index `PRIMARY` of table `bugs`.`tokens` trx id AE523D lock_mode X locks rec but not gap waiting
Record lock, heap no 212 PHYSICAL RECORD: n_fields 7; compact format; info bits 32
0: len 10; hex 4a704c67474b3559676e; asc JpLgGK5Ygn;;
1: len 6; hex 000000ae523b; asc R;;;
2: len 7; hex 6c0000c01f0572; asc l r;;
3: len 3; hex 80000f; asc ;;
4: len 8; hex 80001255ef969792; asc U ;;
5: len 7; hex 73657373696f6e; asc session;;
6: len 17; hex 6372656174655f6174746163686d656e74; asc create_attachment;;
*** (2) TRANSACTION: