sql >> データベース >  >> RDS >> Mysql

MySQLクエリ監視bashスクリプトを作成する

    この記事では、MySQLクエリアクティビティをチェックして長いクエリがサーバーにぶら下がっていないことを確認する簡単なbashスクリプトを構成する方法について説明します。このスクリプトは、長時間実行されるクエリが発生したときに通知を電子メールで送信することもできます。

    ほとんどの場合、MySQLデータベースクエリは数秒以内に実行できるはずです。何らかの理由でそれよりも時間がかかる場合は、長時間実行されているMySQLクエリがそのデータベースキューをバックアップし、サーバーの速度が低下する可能性があります。 、そしておそらく不安定になります。

    MySQLの使用に関する問題の種類の詳細については、過剰なMySQLアクティビティについて読むことができます。

    このスクリプトは、ルートアクセス権を持つVPSまたは専用サーバーホスティングプランでのみ設定できます。

    MySQLクエリ監視スクリプトを作成する

    1. データベースの複雑さ、実行する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と入力できます その後に、メッセージの送信元となるメールアドレスを入力します。

    2. 電子メールアラートを受信すると、次の例のようになります。

      ======================================================================================
      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ジョブの設定

    1. これで、MySQLクエリ監視bashスクリプトを設定する必要があります。次に、このタスクを実行するためのcronジョブを作成します。 cronジョブに慣れていない場合は、cronジョブの実行方法について読むことができます.5分ごとにcPanelドロップダウンを使用すると、最終的なcronジョブは次のようになります:*/5 * * * * bash /home/userna1/MySQLMon

    これで、bashスクリプトを正常にセットアップして、MySQLクエリを監視し、長時間実行されているクエリをキャッチし、キャッチしたときに電子メールで警告することができます。また、設定された間隔でそのスクリプトを実行するようにcronジョブを設定する方法も知っておく必要があります。これにより、スクリプトは、手動による介入なしに常に実行されます。


    1. 'where value in ...'句でパラメータを使用する方法は?

    2. R12のORA-2000111g(FND_HISTOGRAM_COLS)のスキーマ統計を収集します

    3. この休止状態のテンプレートbulkUpdateが機能しない理由

    4. SQLServerのGROUPINGおよびGROUPING_ID関数について