この記事では、MySQLクエリアクティビティをチェックして長いクエリがサーバーにぶら下がっていないことを確認する簡単なbashスクリプトを構成する方法について説明します。このスクリプトは、長時間実行されるクエリが発生したときに通知を電子メールで送信することもできます。
ほとんどの場合、MySQLデータベースクエリは数秒以内に実行できるはずです。何らかの理由でそれよりも時間がかかる場合は、長時間実行されているMySQLクエリがそのデータベースキューをバックアップし、サーバーの速度が低下する可能性があります。 、そしておそらく不安定になります。
MySQLの使用に関する問題の種類の詳細については、過剰なMySQLアクティビティについて読むことができます。
このスクリプトは、ルートアクセス権を持つVPSまたは専用サーバーホスティングプランでのみ設定できます。
MySQLクエリ監視スクリプトを作成する
- データベースの複雑さ、実行するWebサイトの数、および取得するトラフィックの量に応じて、クエリの実行を許可する最大時間は異なる場合があります。 120秒または2分程度の控えめなものから始めることをお勧めします。アラートが表示された後にサーバーにログインしていて、サーバーがまだ安定しているように見える場合は、トリガーレベルをもっと高いレベルに上げることができます。編集を開始します。 bash MySQLクエリアラートスクリプトの新しいファイル。この場合は、 vimを使用します。 テキストエディタとMySQLMonという新しいファイルの作成 次のコマンドを使用して、ユーザーのホームディレクトリに移動します:
vim /home/userna1/MySQLMon
次に、 iを押します。 挿入を入力するには vimがロードされたらモードにし、次のコードを入力します。
#!/bin/bash trigger=120 activeQcount=`mysql -e "show full processlist;" |
egrep -v "leechprotect|root|Time" | awk -v T=$trigger '{ if ( $6 > T ) print $0}' |
wc -l` if [ $activeQcount -gt 0 ] then echo
"=====================================================================================" >
/tmp/MySQLMon echo "= MySQLMon has found a new query running for longer than 120 seconds (2 mins)"
>> /tmp/MySQLMon echo
"=====================================================================================" >>
/tmp/MySQLMon date >> /tmp/MySQLMon echo "" >> /tmp/MySQLMon mysql -e "show full processlist;"
>> /tmp/MySQLMon echo
"=====================================================================================">>
/tmp/MySQLMon cat /tmp/MySQLMon | awk -v T=$trigger '{ if ( $6 > T ) print $0}' |
mail -s"Caught query running longer than $trigger seconds" [email protected] -- -r
"[email protected]" fi
このコードは最初は少し圧倒されるように見えますが、分解すると非常に単純です。まず、トリガーを宣言します 変数とそれを120に設定します 秒。次に、 activeQcountを設定します 基本的に、トリガーよりも長いクエリを保持する変数 値。次に、 ifのbashを使用します activeQcountかどうかを確認するステートメント 値がゼロを上回っています。これは、設定したトリガーよりも長く実行されているクエリがあることを示しています。 価値。次に、エコーを開始します / tmp / MySQLMonというプレースホルダーファイルにテキストを入力します 、そして最後に猫 それを読み取ってからパイプするプレースホルダーファイル| メールへ 関数の後に使用したい件名、受信者のアドレスが続き、 — -rと入力できます その後に、メッセージの送信元となるメールアドレスを入力します。
- 電子メールアラートを受信すると、次の例のようになります。
======================================================================================
MySQLMon has found a new query running for longer than 120 seconds (2 mins)
=====================================================================================
Tue Dec 4 15:07:42 EST 2012 40901 userna1_phpb1 localhost userna1_phpb1 Query 342
Sending data
INSERT INTO users (userID, name, base64_decode)
=====================================================================================
MySQLMonスクリプトを実行するためのcronジョブの設定
- これで、MySQLクエリ監視bashスクリプトを設定する必要があります。次に、このタスクを実行するためのcronジョブを作成します。 cronジョブに慣れていない場合は、cronジョブの実行方法について読むことができます.5分ごとにcPanelドロップダウンを使用すると、最終的なcronジョブは次のようになります:
*/5 * * * * bash /home/userna1/MySQLMon
これで、bashスクリプトを正常にセットアップして、MySQLクエリを監視し、長時間実行されているクエリをキャッチし、キャッチしたときに電子メールで警告することができます。また、設定された間隔でそのスクリプトを実行するようにcronジョブを設定する方法も知っておく必要があります。これにより、スクリプトは、手動による介入なしに常に実行されます。