postheadericon Bases de données MySQL : backup quotidien

Voici un petit script tout simple qui vous permettra de gérer une sauvegarde quotidienne de vos bases de données MySQL. Il utilise mysqldump, mais sans l’option all-databases. Il génère donc un fichier par base et par jour (plus pratique pour la restauration des backups). La date de chaque backup se trouve dans le nom du fichier et 30 jours d’historique sont conservés. Il est donc possible de récupérer l’état de chaque base de J à J-30 🙂

Mise en garde

Attention, ce script crée un dossier /home/backupsql (paramètre modifiable) dans lequel il crée et il supprime des fichiers. N’utilisez pas ce répertoire pour stocker quoi que ce soit…

Le script

#!/bin/bash

#
# PARAMETRAGE
#

PASSWORD=xxxxxxxx
CHEMINSQL=/var/lib/mysql
CHEMINBACKUPSQL=/home/backupsql

#
# SCRIPT BACKUP MYSQL
#

mkdir -p $CHEMINBACKUPSQL
find $CHEMINBACKUPSQL -mtime +30 -exec rm -f {} \;
for base in `ls $CHEMINSQL/`
do
if [ -d $CHEMINSQL/$base ]
then
mysqldump -u root --password=$PASSWORD $base > $CHEMINBACKUPSQL/`date -I`-$base.sql
fi
done

Appelez le par exemple backup.sh et n’oubliez pas de le mettre en cron (avec l’instruction “sh /chemin/que/vous/voulez/backup.sh“) , une fois par jour (de préférence la nuit lorsque le trafic sur votre serveur est faible voire nul).

Explications

Il n’y a que 3 paramètres à modifier :

PASSWORD=xxxxxxxx
CHEMINSQL=/var/lib/mysql
CHEMINBACKUPSQL=/home/backupsql

PASSWORD est votre mot de passe root MySQL (pas le pass root du serveur). CHEMINSQL est le répertoire dans lequel se trouvent vos bases (probablement /var/lib/mysql). CHEMINBACKUPSQL est évidemment le répertoire dans lequel vous voulez stocker les backups.

Le reste n’est qu’une petite boucle qui va parser le répertoire CHEMINSQL et effectuer un mysqldump sur chaque base trouvée.

Notez la ligne :

find $CHEMINBACKUPSQL -mtime +30 -exec rm -f {} \;

Elle est destinée à effacer tous les fichiers vieux de plus de 30 jours dans le répertoire CHEMINBACKUPSQL, on conserve ainsi 1 mois de sauvegardes. Si vous souhaitez modifier cette période de temps, il suffit de modifier le 30 par le nombre de jours voulu.

8 réponses à to “Bases de données MySQL : backup quotidien”

  • vetdomain:

    Bonjour Nicolas. Je ne comprends pas: les bases mysql, elles sont dans /var/lib/mysql ou dans /home/mysql sur gentoo (ovh release 2) ?

  • Nico:

    Dans /home/mysql (et il y a un lien symbolique de /var/lib/mysql vers /home/mysql).

  • vetdomain:

    donc dans ton script, on aurait pu remplacer pour une Gentoo OVH Release 2: CHEMINSQL=/var/lib/mysql par CHEMINSQL=/home/mysql. J’ai bon ?

  • Nico:

    Tout à fait.

    /var/lib/mysql est d’ailleurs le chemin classique vers les bases de données MySQL. Il se fait simplement que, sur la release OVH, les bases ont été déplacées pour que ces dernières se trouvent sur la “grosse” partition (/home) et non pas sur la partition racine.

  • Benjamin:

    Bonjour Nico,

    Très bon script, vraiment utile merci!
    Juste une question : est-il possible de le modifier afin qu’il ne sauvegarde que les bases qui ont été modifiées par rapport à la veille/dernière sauvegarde ?

  • Nico:

    En l’état, ce n’est pas prévu dans le script. Mais on pourrait imaginer modifier le script et utiliser find pour vérifier si des tables ont été modifiées dans une base depuis la veille. J’imagine que ce serait quelque chose du genre find $CHEMINSQL/$base/* -mtime -1 (<- à tester et compléter, désolé je n'ai pas le temps de faire une réponse plus élaborée).

  • Benjamin:

    Bonjour,

    Je me permet d’apporter une petite modification quant à la suppression des bases de plus de 30 jours.
    En effet, il est préférable rajouter l’option -type f dans la ligne comme ceci:
    find $CHEMINBACKUPSQL -type f -mtime +30 -exec rm -f {} \;

    Ainsi il ne cherchera que les fichiers.
    Sinon le script génère des erreurs quand il essaye de supprimer les répertoires des bases!

  • Nico:

    Merci de votre intervention, c’est toujours sympa de voir des contributions … mais je ne suis pas sûr de vous suivre : le répertoire $CHEMINBACKUPSQL n’est censé contenir que des fichiers, aucun dossier.

Laisser un commentaire