Script shell de sauvegarde des bases de données MySQL

La stratégie de sauvegarde des informations est primordiale. On a tendance à la négliger et on y pense après la première perte d'information. Voici en détail mon script de sauvegarde de mes bases de données MySQL.

La sauvegarde d'une base de donnée avec MySQL est relativement simple avec la commande 'mysqldump'. Faire un script qui sauvegarde tous les jours une base ne pose pas de problème, mais faire un script qui sauvegarde toutes les bases est déjà plus contraignant.  Il faut maintenir à jour la liste des bases à sauver et s'il y a bien un truc qu'on oublie une fois que c'est en place, ce sont les outils de sauvegarde qui sont en place.

Cela peut devenir très simple si vous utilisez MySQL grâce à la requête 'show databases' qui retourne la liste de toutes les bases existantes sur votre serveur MySQL.
Il ne reste plus qu'a boucler sur le résultat pour construire en dynamique la commande 'mysqldump'.  Il faudra juste penser a exclure les bases 'information_schema', 'mysql' et 'Database' qui sont utilisées en interne par le serveur MySQL et qui n'ont pas vraiment besoin d'être sauvegarder.

Pour faire mes sauvegardes, j'ai créé un utilisateur spéciale, qui n'a que les droits 'Select' et 'Lock Tabe' sur toutes les bases. 'Lock table' est nécessaire à l'exécution d'un dump.

 
#!/bin/bash
 
#date du jour
DATE=`date +%y_%m_%d`
 
#liste des dossier
LISTEBDD=$( echo 'show databases' | mysql -usaveLogin -psavePassword )
 
#on boucle sur chaque dossier (for découpe automatiquement par l'espace)
for SQL in $LISTEBDD
 
do
 
if [ $SQL != "information_schema" ] && [ $SQL != "mysql" ] && [ $SQL != "Database" ]; then
 
#echo $SQL
mysqldump -usaveLogin -psavePassword $SQL | gzip > /home/backup/sql/$SQL"_mysql_"$DATE.sql.gz
 
fi
 
done

Et voilà! Un dump de chaque base de donnée sera mis dans le dossier /home/backup/sql
Il ne reste plus qu'a appelé le script via un cron:
 

 
 > crontab -e

Ajouter la ligne suivante pour une sauvegarde journalière à minuit une.
 

 
01 00 * * * sh /root/backup_mysql.sh

 

Au cas où, voici la ligne de commande qui permet de remettre un dump dans mysql. Vous noterez que l'on n'utilise pas la commande 'mysqldump'.
 

 
 > mysql -usaveLogin -psavePassword maBaseDeDonnee < mondump.sql

 

Bien entendu pensez à remplacer saveLogin, savePassword et éventuellement le chemin où stocker vos fichiers.
Il ne reste plus qu'a copier les fichiers sur une autre machine, mais ce sera le sujet d'un prochain article.

Il y a 4 commentaires

  • Mika06-06-2012 17:33:17

    Merci! C'est parfait!

  • Psaac01-22-2013 21:47:39

    Nickel ! Tout ce dont j'avais besoin.

  • kopo05-20-2013 22:21:00

    moi je le fais comme ceci en "cronnant" directement la commande :

    /usr/bin/mysqldump --extended-insert --complete-insert --host=localhost --user=monLoginRoot --password=MonPwd --all-databases | gzip > /backup/db/all-databases_`date +\%d-\%m-\%Y`.sql.gz

  • leeroy07-02-2013 23:51:09

    Je ne comprends pas bien, quand j'utilise le terminal, y compris avec la solution courte de kopo tout va bien.
    Dès que je lance le .sh avec cronnix ou en crontab avec la commande sh /var/mysql/bbdd.sh ou direct avec /var/mysql/bbdd.command, le script ne s'exécute plus ?

    Une idée ?
    Merci.