Mysql
 sql >> Base de données >  >> RDS >> Mysql

Créer un script bash de surveillance des requêtes MySQL

Dans cet article, nous verrons comment vous pouvez configurer un simple script bash pour vérifier votre activité de requête MySQL afin de vous assurer que de longues requêtes ne sont pas suspendues sur votre serveur. Ce script sera également en mesure de vous envoyer un e-mail lorsqu'il rencontrera une requête de longue durée.

Dans la plupart des cas, une requête de base de données MySQL devrait pouvoir s'exécuter en quelques secondes, si pour une raison quelconque cela prend plus de temps que cela, il pourrait y avoir une possibilité qu'une requête MySQL longue sauvegarde cette file d'attente de base de données et entraîne le ralentissement de votre serveur , et éventuellement devenir instable.

Pour plus d'informations sur les types de problèmes d'utilisation de MySQL, vous pouvez lire sur l'activité excessive de MySQL.

Ce script ne peut être configuré que sur un VPS ou un plan d'hébergement de serveur dédié auquel vous avez un accès root.

Créer un script de surveillance des requêtes MySQL

  1. En fonction de la complexité de votre base de données, du nombre de sites Web que vous gérez et du volume de trafic que vous obtenez, la durée maximale pendant laquelle vous souhaitez autoriser l'exécution d'une requête peut être différente. Je recommanderais de commencer avec quelque chose de conservateur d'environ 120 secondes ou 2 minutes, et si vous vous connectez à votre serveur après avoir été alerté et qu'il semble toujours fonctionner de manière stable, vous pourriez probablement augmenter le niveau de déclenchement à quelque chose de plus élevé. Commencer l'édition un nouveau fichier pour le script bash d'alerte de requête MySQL, dans ce cas j'utiliserai le vim éditeur de texte et création d'un nouveau fichier appelé MySQLMon dans le répertoire personnel de mon utilisateur avec la commande suivante :vim /home/userna1/MySQLMon Ensuite, vous voudrez appuyer sur i pour saisir Insérer mode une fois vim chargé et entrez le code suivant :
    #!/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

    Ce code peut sembler un peu écrasant au début, mais décomposé, il est vraiment très simple. Nous déclarons d'abord un déclencheur variable et en la réglant sur 120 secondes. Ensuite, nous définissons un activeQcount variable pour contenir essentiellement toutes les requêtes plus longues que notre déclencheur valeur.

    Nous utilisons ensuite un bash if déclaration pour vérifier si notre activeQcount la valeur est supérieure à zéro, indiquant que certaines requêtes s'exécutent plus longtemps que notre déclencheur défini valeur. Ensuite, nous commençons simplement à faire écho texte dans un fichier d'espace réservé appelé /tmp/MySQLMon , puis finalement on chat ce fichier d'espace réservé qui le lit simplement, puis nous le dirigeons | au courrier fonction suivie d'un sujet que nous aimerions utiliser, l'adresse du destinataire, puis vous pouvez entrer — -r suivi de l'adresse e-mail d'où vous souhaitez que le message provienne.

  2. Lorsque vous recevez une alerte par e-mail, elle ressemble beaucoup à cet exemple :

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

Configurer la tâche cron pour exécuter le script MySQLMon

  1. Vous devriez maintenant avoir configuré votre script bash de surveillance des requêtes MySQL. Ensuite, vous devrez créer une tâche cron pour exécuter cette tâche. Si vous n'êtes pas familiarisé avec les tâches cron, vous pouvez lire comment exécuter une tâche cron. Vous pouvez utiliser le menu déroulant cPanel toutes les 5 minutes, ce qui devrait donner à la tâche cron finale l'aspect suivant :*/5 * * * * bash /home/userna1/MySQLMon

Vous devriez maintenant avoir configuré avec succès un script bash pour surveiller vos requêtes MySQL afin de détecter celles qui durent longtemps et de vous alerter par e-mail lorsqu'il en détecte. Vous devez également savoir comment configurer une tâche cron pour exécuter ce script à un intervalle défini afin qu'il s'exécute en permanence sans autre intervention manuelle de votre part.