-
Serveur -
Publié le Vendredi 8 mai 2009 à 22 h 50 min -
6 commentaires
Sauvegarde des données, MySQL et notification Twitter
On ne le répétera jamais assez : la sauvegarde de données est cruciale et l’on ne s’en rend compte que trop souvent après la catastrophe. Ma solution consiste à utiliser CRON pour sauvegarder données et bases MySQL et d’être notifié par Twitter une fois la tâche accomplie.
Ce qu’il faut savoir…
Tout d’abord, vous aurez besoin de CRON et cURL installés sur votre serveur. CRON permet d’exécuter un script à intervalles réguliers. Bien que généralement réservé aux serveurs dédiés, il n’est pas impossible qu’une offre moins évoluée propose cette fonctionnalité. cURL va quant à lui nous permettre de communiquer avec Twitter.
Par mesure de sécurité, il est vivement conseillé de disposer de la possibilité de créer des utilisateurs sur votre base MySQL.
Une fois la sauvegarde terminée, un message privé sera envoyé à un compte Twitter. De ce fait, vous aurez besoin de créer un second compte à la charge de ce travail.
Téléchargement
Pour les plus pressés d’entre vous, voici un lien de téléchargement vers le script complet :
Les mains dans le cambouis
Création d’un nouvel utilisateur MySQL
Avant d’entrer dans le vif du sujet, nous allons créer un nouvel utilisateur qui aura comme rôle de sauvegarder nos bases MySQL. Cet utilisateur aura des droits limités, à savoir uniquement la possibilité d’accéder (SELECT) et de bloquer (LOCK TABLES) les tables.
Pour créer un utilisateur, la solution la plus simple consiste à passer par PhpMyAdmin. Commencez par vous rendre dans « Privilèges » sur l’écran principal, puis « Ajouter un utilisateur ».
Entrez un nom d’utilisateur, l’adresse de votre base MySQL (généralement localhost) ainsi qu’un mot de passe. N’attribuez aucune base de données ni aucun droit global pour le moment.
Retournez ensuite dans l’onglet « Privilèges » pour modifier l’utilisateur que vous venez de créer. Sélectionnez le nom de la base de données que vous désirez sauvegarder dans la partie « Privilèges spécifiques à une base de données ». Sur l’écran suivant, sélectionnez les droits SELECT et LOCK TABLES.
Sauvegarde des données et bases MySQL
Nous allons maintenant écrire le Shell script. Pour ceux d’entre vous qui ne connaîtraient pas, il s’agit d’un fichier exécutable contenant une suite de commandes. Créez un nouveau fichier comportant l’extension .sh (backup.sh par exemple).
Un Shell script débute toujours par une ligne appelée shebang. Elle indique à la machine quel interpréteur utiliser (c’est-à-dire quelles commandes pourront être exécutées). Ce sera la première ligne du script :
1 | #!/bin/sh |
Nous allons utiliser plusieurs fois la date du jour, c’est pourquoi il est préférable de la stocker dans une variable plutôt que de la demander à chaque fois au serveur :
3 | Date="`date +%d%m%y`" |
Notez l’utilisation des backquotes. Elles permettent d’éxecuter la commande renseignée à l’intérieur. Ainsi, lorsque le script sera lancé la ligne prendra la forme suivante :
3 | Date="08052009" |
Dans un premier temps, la sauvegarde sera située dans un dossier temporaire portant un nom de la forme Backup-DateDuJour, ainsi :
1 2 3 4 5 6 | #!/bin/sh Date="`date +%d%m%y`" # Création du répertoire de sauvegarde mkdir /home/data/backups/Backup-$Date |
Lors de la création d’un script CRON, il est important de toujours utiliser des chemins absolus (c’est-à-dire complets), car son exécution se fera hors environnement. Les chemins relatifs ont de forte chance de ne pas fonctionner.
À présent, on passe à la sauvegarde de la base MySQL à l’aide de la commande mysqldump.
8 9 | # Sauvegarde de la base MySQL vers le répertoire de sauvegarde mysqldump --host localhost --user backupsql --password=12345 wordpress > /home/data/backups/Backup-$Date/mysqldump-$Date.sql && BackupSQL="Ok" |
La syntaxe de mysqldump est très simple. Les arguments à fournir sont l’hôte où se trouve la base MySQL, le nom d’utilisateur et le mot de passe créé précédemment ainsi que le nom de la base à sauvegarder.
La sauvegarde est ensuite envoyée dans un nouveau fichier mysqldump-$Date.sql grâce à la redirection >. Nous aurons besoin de savoir plus tard si la commande s’est bien déroulée, ce qui justifie la présence de la condition && après la commande. Cela signifie que tout ce qui se situe après la condition sera uniquement exécuté si la commande précédente n’a pas retourné d’erreur. On stocke « Ok » dans la variable BackupSQL si la sauvegarde s’est correctement déroulée.
On compresse ensuite le répertoire où se trouvent les fichiers à sauvegarder, avec la création d’une variable BackupData pour les même raisons que précèdement :
11 12 | # Sauvegarde des données vers le répertoire de sauvegarde tar -cf /home/data/backups/Backup-$Date/datadump-$Date.tar.gz /home/web/wordpress/ && BackupData="Ok" |
Pour faciliter le transfert des sauvegardes, on compresse l’archive contenant les données et la sauvegarde SQL dans un même fichier :
14 15 | # Compression des deux fichiers en un seul tar -cf /home/data/backups/Backup-$Date.tar.gz /home/data/backups/Backup-$Date/ |
On peut désormais supprimer le dossier temporaire :
17 18 | # Suppression des fichier non compressés rm -R /home/data/backups/Backup-$Date |
Envoi de messages privés via Twitter
Envoyer un message privé à notre compte Twitter est une opération très simple à réaliser grâce à l’API de Twitter et cURL.
On utilise une structure conditionnelle en if… else pour vérifier si les variables BackupSQL et BackupData contiennent la chaîne de caractères « Ok » (ce qui signifie que la sauvegarde s’est correctement déroulée) :
20 21 22 23 24 25 26 | # Envoi de message privé via Twitter if [ $BackupSQL = "Ok" -a $BackupData = "Ok" ] then curl --user M2SBackup:123456 -d "text=La sauvegarde du $Date s'est correctement déroulée.&user=MyUser" http://twitter.com/direct_messages/new.xml > /dev/null else curl --user M2SBackup:123456 -d "text=Erreur lors de la sauvegarde du $Date, veuillez examiner la source du problème.&user=MyUser" http://twitter.com/direct_messages/new.xml > /dev/null fi |
La syntaxe de de cURL se résume à entrer le nom d’utilisateur suivi du mot de passe du compte Twitter émetteur (précédé d’un double point). Le message à envoyer se situe après « text= ». N’oubliez pas d’ajouter le destinataire (&user=). La redirection > /dev/null permet de masquer les messages qui pourraient s’afficher à l’écran.
Notre shell script complet a la forme suivante :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #!/bin/sh Date="`date +%d%m%y`" # Création du répertoire de sauvegarde mkdir /home/data/backups/Backup-$Date # Sauvegarde de la base MySQL vers le répertoire de sauvegarde mysqldump --host localhost --user sqlbackup --password=12345 wordpress > /home/data/backups/Backup-$Date/mysqldump-$Date.sql && BackupSQL="Ok" # Sauvegarde des données vers le répertoire de sauvegarde tar -cf /home/data/backups/Backup-$Date/datadump-$Date.tar.gz /home/web/wordpress/ && BackupData="Ok" # Compression des deux fichiers en un seul tar -cf /home/data/backups/Backup-$Date.tar.gz /home/data/backups/Backup-$Date/ # Suppression des fichier non compressés rm -R /home/data/backups/Backup-$Date # Envoi de message privé via Twitter if [ $BackupSQL = "Ok" -a $BackupData = "Ok" ] then curl --user M2SBackup:123456 -d "text=La sauvegarde du $Date s'est correctement déroulée.&user=MyUser" http://twitter.com/direct_messages/new.xml > /dev/null else curl --user M2SBackup:123456 -d "text=Erreur lors de la sauvegarde du $Date, veuillez examiner la source du problème.&user=MyUser" http://twitter.com/direct_messages/new.xml > /dev/null fi |
Configuration de CRON
Pour finir, il faut définir à quelle intervalle de temps notre script sera exécuter par CRON. Si vous avez de la chance, votre hébergeur dispose d’une interface graphique sur leur site Web.
Pour les autres, la commande crontab -e permet d’ajouter un « CRON job » manuellement :
1 | 0 12 * * * /home/scripts/backup.sh |
Les cinq premiers éléments indiquent la fréquence d’exécution. La suite de nombre a pour signification Minute, Heure, Jour du mois, Mois, Jour de la semaine. Ainsi, dans cet exemple, le script sera exécuté toutes les 12 heures.
Améliorations possibles
J’ai volontairement laissé certaines fonctionnalités de côté pour éviter de compliquer les choses comme le chiffrement des archives ou le transfert des archives vers un serveur tiers.
N’hésitez pas à implémenter ces fonctionnalités et de me faire part de vos idées d’amélioration !





Retourner en haut de la page
XHTML



Merci pour ce tuto hyper fourni
Très détaillé, bravo
je crois que sur le crontab il y a une petite erreur :
0 12 * * * /home/scripts/backup.sh
exécute le script tous les jours à 12h,
pour exécuter le script toutes les 12h il s’agit de la ligne suivante:
0 */12 * * * /home/scripts/backup.sh
Merci pour l’information. Je vais regarder ça de plus près, c’est vrai que j’ai plus l’habitude de travailler en jours qu’en heures !
pas bête la notification sous twitter, j’essaie de suite ! merci
Sympa comme idée