Salut !
J'ai écrit un petit script pour automatiser mes sauvegardes de bases de données et je vous le fais partager. Je débute dans les scripts, le code n'est peut-être pas propre ni optimisé et toutes les suggestions d'améliorations seront les bienvenues bien-sûr.
Le script effectue un dump des bases indiquées dans sa configuration, il compresse ce dump en tar.bz2, supprime les sauvegardes vieilles de plus de X jours et sauvegarde un mirroir du dossier de sauvegardes sur un serveur ftp.
Pré-requis :
- Etre en root
- Installer lftp
apt-get install lftp
On crée le script dans le dossier de son choix, pour ma part je serai dans /root/scripts, et on sécurise car il contient le mot de passe root MySQL.
cd /root/scripts
touch save_db.sh
chmod 700 save_db.sh
On édite
nano save_db.sh
On colle et on modifie les paramètres de configuration <entre_crochets> (on enlève les crochets bien sûr
):
#!/bin/bash
# Nom du script .. : save_db.sh
# Version ........ : 1.02
# Date ........... : 24/10/2014
# Auteur ........ : ZobraK
# Description : Script de sauvegarde des bases de données mysql
###############################################################
### CONFIGURATION DU SCRIPT ###
###############################################################
## Paramètres de connexion au serveur FTP
#
FTP_HOST='<serveur ftp>'
FTP_USER='<utilisateur ftp>'
FTP_PASSWD='<mot de passe ftp>'
FTP_PORT=<port ftp>
## Paramètres de connexion à la base mysql locale (root)
#
BDD_USER='root'
BDD_PASSWORD='<mot de passe root mysql>'
# Indiquer les bases de données à sauvegarder séparées par un espace
BDD='base1 base2 base3 etc...'
#Dossier de sauvegarde et temps en jours de conservation des sauvegardes (ici 5 jours)
#
BACKUP_FOLDER=</chemin/du/dossier/de/sauvegarde>
TIME_TO_KEEP=5 #jours
###############################################################
### FIN DE CONFIGURATION RIEN A MODIFIER APRES ###
###############################################################
## Fichiers de log (seul LOGFILE sera conservé à la fin du processus)
#
LOGFILE=$BACKUP_FOLDER/save_db.`date +"%Y-%m-%d"`.log
FTP_FILE=$BACKUP_FOLDER/ftp.log
DATE=$(date +%d-%m-%Y-%H-%M)
## On se place dans le dossier de travail
#
if [ ! -d $BACKUP_FOLDER ]; then
mkdir -p $BACKUP_FOLDER > /dev/null 2>&1
fi
cd $BACKUP_FOLDER
touch $LOGFILE
## Ventilation du fichier de logs
#
echo '++++++++++++++++++++++++++++++++++++++++++++++++++++++++' >> $LOGFILE
echo '++++++++++++++++++++++++++++++++++++++++++++++++++++++++' >> $LOGFILE
echo '---- Début de sauvegarde base de données le '$DATE' ----' >> $LOGFILE
echo 'Sauvegarde dans le dossier '$BACKUP_FOLDER >> $LOGFILE
echo 'Base de données sélectionnées : '$BDD >> $LOGFILE
## On sauvegarde avec mysqldump
#
for i in $BDD; do
## Sauvegarde des bases de donnees en fichiers .sql
#
mysqldump --user=$BDD_USER --password=$BDD_PASSWORD $i > ${i}_`date +"%Y-%m-%d"`.sql
## Compression des exports en tar.bz2 (le meilleur taux de compression)
#
echo 'Compression du fichier SQL '$i'.sql' >> $LOGFILE
tar jcf ${i}_`date +"%Y-%m-%d"`.sql.tar.bz2 ${i}_`date +"%Y-%m-%d"`.sql
## Suppression des exports non compresses
#
echo 'Compression Ok! Suppression du fichier non compressé' >> $LOGFILE
rm ${i}_`date +"%Y-%m-%d"`.sql
done
## Sécurisation des archives crées
#
chmod 600 $BACKUP_FOLDER/*
## Supprime les sauvegardes vieilles de plus de TIME_TO_KEEP jours
#
echo 'Nettoyage des archives et fichiers vieux de plus de '$TIME_TO_KEEP' jours' >> $LOGFILE
((TTK = $TIME_TO_KEEP - 1))
find $BACKUP_FOLDER -type f -mtime +$TTK -delete
## Mirroir dossier de travail sur le serveur FTP (avec option -R pour synchronisation montante)
#
echo 'Téléchargement des fichiers sur le serveur FTP '$FTP_HOST >> $LOGFILE
lftp -d -e "mirror -Re $BACKUP_FOLDER /sql; bye" -u $FTP_USER,$FTP_PASSWD -p $FTP_PORT $FTP_HOST 2> $FTP_FILE > /dev/null
echo 'Log de la session FTP :' >> $LOGFILE
cat $FTP_FILE >> $LOGFILE
rm $FTP_FILE
echo '---- Fin de sauvegarde base de données le '$DATE' ----' >> $LOGFILE
echo '++++++++++++++++++++++++++++++++++++++++++++++++++++++++' >> $LOGFILE
echo '++++++++++++++++++++++++++++++++++++++++++++++++++++++++' >> $LOGFILE
Et enfin on ajoute une tâche cron pour l'automatisation de la sauvegarde :
crontab -e
ajouter une ligne :
13 4 * * * /root/scripts/save_db.sh
Dans cet exemple la sauvegarde a lieu tous les jours à 4h13.
Un log des sauvegardes sera écrit dans le dossier du script.
----Edit----
23-10-2014 :
- Remplacement de l'option -R par l'option -Re en paramètre de la commande lftp pour que les fichiers effacés localement soient également supprimés sur le ftp
24-10-2014 :
- Ajout de lignes pour vérifier la présence du dossier de sauvegardes et le créer s'il n'existe pas.
- Fichier de log : Il est désormais créé un fichier de log par sauvegarde, celui-ci est placé dans le dossier de sauvegardes et sera effacé après X jours en même temps que les archives.
- Suppression de la variable $DIR devenue inutile.
------------
Et enfin... pour discuter de ce tuto, poser vos questions etc :
ça se passe ici