EDIT – 13/05/2013 : v0.3 du script avec prise en compte des suggestions d’améliorations de David M + Trap
EDIT – 06/12/2012 : v0.2 du script avec prise en compte des commentaires de l’article
Un énième script de sauvegarde à plat de bases Mysql sur internet. Celui-ci crée un fichier texte (.sql) par base et compresse le tout ensuite.
J’utilise ce script depuis plus de 3 ans, ça tourne bien et surtout ça dépanne bien !
Attention : ce script est à coupler avec un système de sauvegarde complet et distant…
Préparation
Il faut créer un utilisateur Mysql (appelé dump) avec des droits restreints en lecture sur toutes les bases :
$ mysql -u root -p -e "CREATE USER 'dump'@'localhost' IDENTIFIED BY 'LEMOTDEPASSE';" $ mysql -u root -p -e "GRANT SELECT , SHOW DATABASES , LOCK TABLES , SHOW VIEW ON * . * TO 'dump'@'localhost' IDENTIFIED BY 'LEMOTDEPASSE' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;"
Le script
Copier le contenu du script dans un fichier mysql_dump.sh puis faite un chmod +x mysql_dump.sh afin de le rendre exécutable. Ajouter ensuite ce script dans vos tâches crons pour qu’il s’exécute toutes les nuits (par exemple).
Note : les remarques sont les bienvenus…
#!/bin/bash # Inspiré d'un script trouvé sur phpnews.fr (plus en ligne) # Version 0.3 13/05/2013 # Script sous licence BEERWARE set -eu ## Paramètres USER='dump' PASS='LEMOTDEPASSE' # Répertoire de stockage des sauvegardes DATADIR="/var/backups/mysql" # Répertoire de travail (création/compression) DATATMP=$DATADIR # Nom du dump DATANAME="dump_$(date +%d.%m.%y@%Hh%M)" # Compression COMPRESSIONCMD="tar -czf" COMPRESSIONEXT=".tar.gz" # Rétention / rotation des sauvegardes RETENTION=30 # Exclure des bases EXCLUSIONS='(information_schema|performance_schema)' # Email pour les erreurs (0 pour désactiver EMAIL=0 # Log d'erreur exec 2> ${DATATMP}/error.log ## Début du script ionice -c3 -p$ &>/dev/null renice -n 19 -p $ &>/dev/null function cleanup { if [ "`stat --format %s ${DATATMP}/error.log`" != "0" ] && [ "$EMAIL" != "0" ] ; then cat ${DATATMP}/error.log | mail -s "Backup MySQL $DATANAME - Log error" ${EMAIL} fi } trap cleanup EXIT # On crée sur le disque un répertoire temporaire mkdir -p ${DATATMP}/${DATANAME} # On place dans un tableau le nom de toutes les bases de données du serveur databases="$(mysql -u $USER -p$PASS -Bse 'show databases' | grep -v -E $EXCLUSIONS)" # Pour chacune des bases de données trouvées ... for database in ${databases[@]} do echo "dump : $database" mysqldump -u $USER -p$PASS --quick --add-locks --lock-tables --extended-insert $database > ${DATATMP}/${DATANAME}/${database}.sql done # On tar tous cd ${DATATMP} ${COMPRESSIONCMD} ${DATANAME}${COMPRESSIONEXT} ${DATANAME}/ chmod 600 ${DATANAME}${COMPRESSIONEXT} # On le déplace dans le répertoire if [ "$DATATMP" != "$DATADIR" ] ; then mv ${DATANAME}${COMPRESSIONEXT} ${DATADIR} fi # Lien symbolique sur la dernier version cd ${DATADIR} set +eu unlink last${COMPRESSIONEXT} set -eu ln ${DATANAME}${COMPRESSIONEXT} last${COMPRESSIONEXT} # On supprime le répertoire temporaire rm -rf ${DATATMP}/${DATANAME} echo "Suppression des vieux backup : " find ${DATADIR} -name "*${COMPRESSIONEXT}" -mtime +${RETENTION} -print -exec rm {} \;
Et voici l’antidote (la restauration)
#!/bin/bash
# Script sous licence BEERWARE
set -eu
## Paramètres mysql
USER='root'
PASS='xxxxxxxxxx'
# Répertoire de stockage des sauvegardes (contient des fichier *.sql )
DATADIR="/tmp/dump_11.10.19@02h02"
## Début du script
ionice -c3 -p$$ &>/dev/null
renice -n 19 -p $$ &>/dev/null
dbfiles=`find ${DATADIR} -name "*.sql"`
for dbfile in $dbfiles; do
db=`echo ${dbfile##*/} | cut -d'.' -f1`
echo "Restauration de la base : $db avec le fichier $dbfile"
mysql -u $USER -p$PASS $db < $dbfile
done