Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Erstellen Sie ein Bash-Skript für die MySQL-Abfrageüberwachung

In diesem Artikel besprechen wir, wie Sie ein einfaches Bash-Skript konfigurieren können, um Ihre MySQL-Abfrageaktivität zu überprüfen und sicherzustellen, dass lange Abfragen nicht auf Ihrem Server hängen bleiben. Dieses Skript kann Ihnen auch eine Benachrichtigung per E-Mail senden, wenn es auf eine lang andauernde Abfrage gestoßen ist.

In den meisten Fällen sollte eine MySQL-Datenbankabfrage innerhalb weniger Sekunden ausgeführt werden können. Wenn es aus irgendeinem Grund länger dauert, besteht die Möglichkeit, dass eine lange laufende MySQL-Abfrage diese Datenbankwarteschlange sichert und dazu führt, dass Ihr Server langsamer wird , und wird möglicherweise instabil.

Weitere Informationen zu Problemen bei der Verwendung von MySQL finden Sie unter Übermäßige MySQL-Aktivität.

Dieses Skript kann nur auf einem VPS- oder dedizierten Server-Hostingplan eingerichtet werden, auf den Sie Root-Zugriff haben.

MySQL-Abfrageüberwachungsskript erstellen

  1. Abhängig von der Komplexität Ihrer Datenbank, wie viele Websites Sie betreiben und wie viel Traffic Sie erhalten, kann die maximale Zeit, die Sie für die Ausführung einer Abfrage zulassen möchten, unterschiedlich sein. Ich würde empfehlen, mit etwas Konservativem um 120 Sekunden oder 2 Minuten zu beginnen, und wenn Sie sich bei Ihrem Server anmelden, nachdem Sie benachrichtigt wurden und es scheint, dass es immer noch stabil läuft, könnten Sie wahrscheinlich den Triggerpegel auf etwas höher erhöhen. Beginnen Sie mit der Bearbeitung eine neue Datei für das Bash-MySQL-Abfrage-Warnskript, in diesem Fall verwende ich vim Texteditor und Erstellen einer neuen Datei namens MySQLMon im Home-Verzeichnis meines Benutzers mit dem folgenden Befehl:vim /home/userna1/MySQLMon Dann sollten Sie i drücken um Einfügen einzugeben Modus, sobald vim geladen ist, und geben Sie den folgenden Code ein:
    #!/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

    Dieser Code kann auf den ersten Blick etwas überwältigend aussehen, aber er ist wirklich ganz einfach. Zuerst deklarieren wir einen Trigger Variable und setze diese auf 120 Sekunden. Dann setzen wir einen activeQcount Variable, um im Grunde alle Abfragen aufzunehmen, die länger als unser Trigger sind Wert.

    Wir verwenden dann eine Bash if Anweisung, um zu überprüfen, ob unser activeQcount Der Wert liegt über null, was darauf hinweist, dass Abfragen länger als unser festgelegter Trigger ausgeführt werden Wert. Als nächstes beginnen wir einfach mit dem Echoing Text in eine Platzhalterdatei namens /tmp/MySQLMon , dann endlich Katze diese Platzhalterdatei, die es nur ausliest und dann leiten wir es weiter | an die Mail Funktion gefolgt von einem Betreff, den wir verwenden möchten, der Adresse des Empfängers, dann können Sie — -r eingeben gefolgt von der E-Mail-Adresse, von der die Nachricht kommen soll.

  2. Wenn Sie eine E-Mail-Benachrichtigung erhalten, sieht sie ungefähr so ​​aus wie in diesem Beispiel:

    ======================================================================================
    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)
    =====================================================================================

Richten Sie einen Cron-Job ein, um das MySQLMon-Skript auszuführen

  1. Jetzt sollten Sie Ihr Bash-Skript für die MySQL-Abfrageüberwachung eingerichtet haben. Als Nächstes möchten Sie einen Cron-Job erstellen, um diese Aufgabe auszuführen. Wenn Sie mit Cron-Jobs nicht vertraut sind, können Sie nachlesen, wie ein Cron-Job ausgeführt wird. Sie können das cPanel-Dropdown-Menü alle 5 Minuten verwenden, wodurch der endgültige Cron-Job wie folgt aussehen sollte:*/5 * * * * bash /home/userna1/MySQLMon

Sie sollten jetzt erfolgreich ein Bash-Skript eingerichtet haben, um Ihre MySQL-Abfragen zu überwachen, um lange laufende Abfragen abzufangen, und Sie per E-Mail zu benachrichtigen, wenn es welche abfängt. Sie sollten auch wissen, wie Sie einen Cron-Job einrichten, um dieses Skript in einem festgelegten Intervall auszuführen, sodass es ohne weiteres manuelles Eingreifen von Ihnen ständig ausgeführt wird.