Script shell de sauvegarde quotidienne des bases de données MySQL

Voilà un script qui permet de faire une sauvegarde de l’intégralité des bases de données visibles par un utilisateurs MySQL. Le mieux étant, si on a plusieurs BDD sur le même serveur MySQL, de créer un utilisateur n’ayant que les droits de SELECT et de LOCK TABLES sur ces différentes bases de données. C’est en tout cas ce que j’ai fait, et je pense que ça rajoute un cran de sécurité.

Voilà le script, qu’il vous faudra personnaliser avec les instructions en haut :

#!/bin/bash

#User Variables
DATE=/bin/date;
NOW=`$DATE '+%Y-%m'-%d_04_30`
MYSQLUSER=monuserlogin
MYSQLPWD=monpass
MYSQLHOST=bddhost #par exemple, localhost
MYSQLBACKUPDIR=/chemin_du_repertoire_de_sauvegarde

MK=/bin/mkdir;
RM=/bin/rm;
GREP=/bin/grep;
MYSQL=/usr/bin/mysql;
TAR=/bin/tar;
MYSQLDUMP=/usr/bin/mysqldump;

#$MK $MYSQLBACKUPDIR

for i in $(echo 'SHOW DATABASES;' | $MYSQL -u$MYSQLUSER -p$MYSQLPWD -h$MYSQLHOST|$GREP -v '^Database$');
do
        $MYSQLDUMP -u$MYSQLUSER -p$MYSQLPWD -h$MYSQLHOST -Q -c -C --add-drop-table --add-locks --quick --lock-tables $i > $MYSQLBACKUPDIR/$i.$NOW.sql;
        $TAR -czf $MYSQLBACKUPDIR/$i.$NOW.0.tgz $MYSQLBACKUPDIR/$i.$NOW.sql;
done;

$RM -f $MYSQLBACKUPDIR/*7.tgz
for f in $MYSQLBACKUPDIR/*.6.tgz;do mv $f ${f/.6.tgz/.7.tgz};done
for f in $MYSQLBACKUPDIR/*.5.tgz;do mv $f ${f/.5.tgz/.6.tgz};done
for f in $MYSQLBACKUPDIR/*.4.tgz;do mv $f ${f/.4.tgz/.5.tgz};done
for f in $MYSQLBACKUPDIR/*.3.tgz;do mv $f ${f/.3.tgz/.4.tgz};done
for f in $MYSQLBACKUPDIR/*.2.tgz;do mv $f ${f/.2.tgz/.3.tgz};done
for f in $MYSQLBACKUPDIR/*.1.tgz;do mv $f ${f/.1.tgz/.2.tgz};done
for f in $MYSQLBACKUPDIR/*.0.tgz;do mv $f ${f/.0.tgz/.1.tgz};done
$RM $MYSQLBACKUPDIR/*.sql

L’avantage de ce script est qu’il ne laisse que 7 versions de sauvegardes de bases de données, toutes en gzip. Donc si vous exécutez le script tous les jours, vous aurez ainsi une sauvegarde pour les 7 derniers jours.

Ensuite, le mieux est de mettre ce script dans une tâche cron (je l’ai mis au beau milieu de la nuit, pour déranger le moins possible le serveur), et de relancer le cron pour qu’il prenne la nouvelle instruction en compte.

5 réflexions sur « Script shell de sauvegarde quotidienne des bases de données MySQL »

  1. Je me permet une petite « optimisation » (surtout pour la flexibilité) pour la fin du scritpt :

    BACKUP=7
    i=$(($BACKUP-1))
    j=$BACKUP

    $RM -f $MYSQLBACKUPDIR/*$BACKUP.tgz

    while [ $i -gt 0 ]; do
    for f in $MYSQLBACKUPDIR/*.$i.tgz;do
    mv $f ${f/.$i.tgz/.$j.tgz};
    done
    j=$(($j-1))
    i=$(($i-1))
    done

    $RM $MYSQLBACKUPDIR/*.sql

  2. (double post pour correction…)

    Je me permet une petite « optimisation » (surtout pour la flexibilité) pour la fin du scritpt :

    BACKUP=7
    i=$(($BACKUP-1))
    j=$BACKUP

    $RM -f $MYSQLBACKUPDIR/*$BACKUP.tgz

    while [ $i -ge 0 ]; do
    for f in $MYSQLBACKUPDIR/*.$i.tgz;do
    mv $f ${f/.$i.tgz/.$j.tgz};
    done
    j=$(($j-1))
    i=$(($i-1))
    done

    $RM $MYSQLBACKUPDIR/*.sql

  3. @Tym: Merci pour l’amélioration 🙂

    Je me disais aussi que de lister tous les trucs c’était pourrave, mais je n’avais pas le niveau de faire la boucle while + le for + le mv, même si c’est beaucoup plus propre.

    Par contre, quelle est la différence entre le -gt et le -ge ?

  4. @Louis:

    cf. « man test » : -gt c’est « greater than », -ge « greater or equal ». Sans ma correction le fichier « *.0.tgz » n’aurait jamais été atteint.
    les « [ ] » sont en fait un raccourci pour la commande « test ». Si c’est un sujet qui t’intéresse fais moi signe (tu as mon mail…), j’ai de bonnes bases en bash (et je suis partageur :)) et c’est un outil merveilleux !

    J’en profite pour te féliciter pour ton blog, j’adore tes articles !

Les commentaires sont fermés.