Script shell de sauvegarde quotidienne des bases de données MySQL
Voilà un script qui m’a été fourni par @iBrianSND de ASMforum, et modifié sur la fin par mes soins (sur le mv, lui ayant préféré l’option rename). Ce script 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.
Vous serez peut-être intéressé :
5 commentaires à Script shell de sauvegarde quotidienne des bases de données MySQL
Laisser un commentaire
- 07 February 2012Surfer anonymement sur le web pour contourner la censure politique(3) Comments
- 06 February 2012SoundCloud : en quel langage est codé le service ?(2) Comments
- 05 February 2012Glype : un proxy en PHP(0) Comments
- 05 February 2012Google serait en train de tester une box de divertissement : Ã quand la Xbox de Google ?(0) Comments
- 05 February 2012AMD et ARM pourraient s'allier pour contrer la puissance d'Intel(0) Comments
- 04 February 2012Suppression des polices provenant de GoogleFonts sur mon blog(6) Comments
- 29 January 2012Pas de loi de Moore dans les cartes graphiques depuis plusieurs années(2) Comments
- 29 January 2012Rénovation des structures de chauffage urbain à Paris(6) Comments
- 28 January 2012Etat des lieux de ma dépendance à Google(9) Comments
- 28 January 2012Désactiver l'accélération de la souris sous Mac OS(4) Comments
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
(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
@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 ?
@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.
) et c’est un outil merveilleux !
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
J’en profite pour te féliciter pour ton blog, j’adore tes articles !
[...] la lignée du script de sauvegarde quotidienne des bases de données, je me suis dis qu’il serait bon également de sauvegarder les fichiers associés au [...]