Administrer un VPS Classic – une tâche cron pour redémarrer MySQL

 

Rappel : j'héberge un site sur un VPS Classic 1 (10 Go d'espace disque / 1Go de RAM) de chez OVH tournant sous Release 3 (CentOS 6.6 – Webmin)

Ca m'arrive de temps à autres : MySQL plante tout seul, ou alors suite à un reboot intempestif du serveur, MySQL n'est pas arrivé à se relancer. Résultat, toutes les données du site sont inaccessibles. Si vous êtes dans le coin pour redémarrer manuellement avec un service mysqld restart, tant mieux. Mais on ne passe pas non plus sa vie à surveiller son serveur.

J'ai donc eu l'idée de faire une tâche cron qui s'en chargerait. Par chance, j'ai trouvé un tuto expliquant comment faire. Sauf que, comme toujours, son auteur n'utilise pas la même distribution Linux (chez lui, le service s'appelle mysql et non mysqld, par exemple… et les répertoires sont différents), pas la même langue (forcément il est anglo-saxons, donc les messages ne sont pas les mêmes, vous verrez que ça des conséquences), etc.

Bref, il a fallu adapter.

Création du script shell

Le tuto d'origine explique comment créer ce fichier en ligne de commande  partir de la console. Bon, moi, j'ai l'habitude de bosser sous Windows, donc j'ai bêtement créé un fichier sous Notepad, je l'ai appelé mysqlfix.sh comme dans le tuto, et j'y ai mis ceci :

#!/bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
if [[ ! "$(/etc/init.d/mysqld status)" =~ "en cours d'exécution..." ]]
then
 echo "MySQL a ete redemarre" | mail -s "Redemarrage de MySQL" monadresse@mail.fr
 sudo service mysqld start
fi

(n'oubliez pas de remplacer monadresse@mail.fr par votre adresse mail, évidemment)

Ensuite, j'ai glissé-déposé le fichier dans le répertoire /root de mon serveur sous WinSCP.

Enfin, j'ai donné à ce fichier les droits d'exécution (par défaut, il ne les a pas). Cette fois-ci avec la console de WinSCP.

chmod +x mysqlfix.sh

Quelques explications : on demande au script de tester le statut de mysqld. S'il est stoppé (donc différent de « en cours d'exécution »), on demande de le redémarrer.

Vous pouvez le faire en ligne de commande (service mysqld status), ce qui vous donnera quelque chose comme :

mysqld (pid 16611) en cours d'exécution…

service-mysqld-status

Evidemment, le pid sera différent après chaque redémarrage. Sur un Linux en anglais, vous aurez plutôt « mysql start/running, process XXX »

 

Test du script

Stoppez MySQL (évitez de le faire à un moment où vous savez que vous aurez beaucoup de monde sur votre site, sinon ils vont être un peu surpris de voir des messages d'erreur du genre « Can't connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock' (2) » ou « impossible de se connecter à la base » si vous avez géré l'erreur)

Dans votre répertoire /root, lancez le script en ligne de commande avec :

sh mysqlfix.sh

La console affiche que le service mysqld a été démarré.

test-script-shell

Et vous recevez (dans un délai variable) un mail de la part du postmaster avec le message qui a été défini juste après le echo.

Si vous lancez la tâche sans avoir au préalable arrêté MySQL, la console affichera seulement /root$ sh mysqlfix.sh (puisque la condition ne sera pas satisfaite)

Création de la tâche cron

Direction Webmin > Système > Tâches cron

Cliquer sur le lien « Créer une nouvelle tâche cron programmée »

« S'exécute en tant que » : cliquez sur le bouton avec les ponts de suspension et choisir root dans le popup.

tache-cron-choix-utilisateur

« Actif ? » : Laisser sur oui.

« Commande » : /root/mysqlfix.sh.

« Entrée de la commande » : j'ai laissé vide.

Dans un 1er temps, je choisis une heure précise d'exécution (2-3 min après l'heure actuelle) afin de pouvoir tester. Ensuite, après un test réussi, je définis ma tâche comme devant s'exécuter toutes les heures.

tache-cron-planification-horaire-precis

Pour mon test, je stoppe à nouveau MySQL en ligne de commande, et j'attends qu'il soit l'heure prévue sur mon serveur (pensez à vérifier qu'il est bien à la même heure que votre PC, sinon vous n'avez pas fini de vous ronger les ongles !)

Avant l'heure d'exécution, je vois que mon site affiche plein de message d'erreur relatif à la base (puisque MySQL est sotppé). Après, tout est redevenu normal.

Dans ma boîte mail, je trouve non pas un, mais deux mails : le même celui que j'avais reçu lors du test manuel, et un autre de Cron ayant pour sujet « /root/mysqlfix.sh #Redémarrage de MySQL s'il est stoppé »

Voilà quoi ressemble la planification d'une tâche toutes les heures (je pense qu'on pouvait également cocher « planification simple » dans le bloc au-dessus)

tache-cron-planification-toutes-les-heures

Ou alors, si vous voulez faire votre planification cron en ligne de commande comme les pros, c'est crontab -e et après je vous laisse vous débrouiller pour la syntaxe…

Sources

How to create a cron job to start MySQL if it stops

How to start-stop MySQL Server on CentOS Server

 

 

Karine SANCHE

Partager cet article