Script de sauvegarde de base MySQL par FTP
Contexte : Dans le cadre d’un projet de serveur GLPI pour la gestion des travaux et incidents informatiques ainsi que pour l’inventaire du parc, j’utilise un script shell pour sauvegarder quotidiennement mes bases de données MySQL ainsi que les documents (généralement les pièces-jointes) stockés sur le serveur.
Le script est lancé en tâche « cron » : il est exécuté de manière automatique régulièrement (l’équivalent du planificateur de tâche de Windows).
1- La tâche « cron »
Le script est donc lancé en tache cron tout les jours à 1h du matin.
La tache cron est situé dans le répertoire /var/spool/cron/crontabs/ défini avec le nom de l’utilisateur qui exécute cette tache (ici « root »).
crontab -e
Puis
# m h dom mon dow command 0 1 * * * /cron/backup-mysql-ftp.sh >> /cron/save-mysql.log
On renseigne ici a quel périodicité la tache doit s’exécuté ainsi que le chemin vers la commande et l’enregistrement de logs.
Notre commande ce trouve donc dans le répertoire /cron et s’appelle « backup-mysql-ftp.sh ». Les logs sont eux enregistrés dans le fichier « save-mysql.log ».
2- Le script shell
Le script sauvegarde GLPI en deux parties :
- Les bases de données (MySQL Dumps) : Les BDD comportant toutes les données de GLPI.
- Le dossier contenant les fichiers de GLPI : documents, pièce jointe, …
Le script utilise « yafc » pour la partie FTP. Si le client yafc n’est pas installé :
sudo apt-get install yafc
Voici le contenu du script shell « backup-mysql-ftp.sh » :
#!/bin/bash #Backup mysql par ftp Mysql_User="user" Mysql_Paswd="motdepasse" Mysql_host="localhost" # Emplacemment des différents programmes MYSQL="$(which mysql)" MYSQLDUMP="$(which mysqldump)" CHOWN="$(which chown)" CHMOD="$(which chmod)" GZIP="$(which gzip)" # Emplacement du dossier de backup local DEST="/home/archives/backup/" #Répertoire où stocker les dumps mysql DEST_mysql="$DEST/mysql" #Date du jour NOW="$(date +"%d-%m-%Y")" # Databases a ne pas sauvegarder, séparer par des espaces IGGY="information_schema mysql" # On initialise les variables FILE="" DBS="" #on crée le répertoire [ ! -d $DEST_mysql ] && mkdir -p $DEST_mysql || : #On limite l’accès à root uniquement (optionnel, seul root pourra dump les bases !) #$CHOWN 0.0 -R $DEST_mysql #$CHMOD 0600 $DEST_mysql # On liste les bases de données DBS="$($MYSQL -u $Mysql_User -h $Mysql_host -p$Mysql_Paswd -Bse 'show databases')" for db in $DBS do skipdb=-1 if [ "$IGGY" != "" ]; then for i in $IGGY do [ "$db" == "$i" ] && skipdb=1 || : done fi if [ "$skipdb" == "-1" ] ; then FILE="$DEST_mysql/$db.$NOW.gz" # On boucle, on dump toutes les bases et on les compresses $MYSQLDUMP -u $Mysql_User -h $Mysql_host -p$Mysql_Paswd $db | $GZIP -9 > $FILE fi done #On compresse le dossier contenant les fichiers de GLPI tar –cvf /home/archives/backup/mysql/backup_files.tar /var/lib/glpi/files #BACKUP des bases mysql par FTP #nombre de jour de backup à conserver j=7 j_a_delete=$(date +%d-%m-%Y --date "$j days ago") ## Répertoires de backup pour le ftp DIR_BACKUP_mysql=$DEST_mysql DIR_DIST_BACKUP_mysql='/BACKUP/mysql/' #Configuration de la connexion ftp loginftp="user" motdepassftp="motdepasse" host_ftp="server" ## Upload sur le ftp yafc $loginftp:$motdepassftp@$host_ftp <<** cd $DIR_DIST_BACKUP_mysql lcd $DIR_BACKUP_mysql mkdir $NOW cd $NOW put -r * cd .. rm -r $j_a_delete bye ** #On delete tout cd $DEST_mysql rm -r * ~
Pour rendre le script exécutable au niveau des droits :
chmod +x /cron/backup-mysql-ftp.sh
La commande utilise des variables pour se connecter sur la base MySQL (login:motdepasse@localhost) puis sur le serveur FTP (login:motdepasse@server). Il convient donc que ces comptes existent sur ces deux serveurs, nous allons voir dans la suite pour la partie FTP.
3- FTP
Sur le serveur Windows le logiciel « free FTPd » permet d’uploader les sauvegardes.
Les sauvegardes sont envoyées dans le répertoire « e :FTP/nomdel’utilisateur/BACKUP/mysql »
- Dans le cadre orange : Le fichier « backup_files.tar » représente la sauvegarde compressé du dossier contenant les documents GLPI.
- Dans le cadre rouge : Les 4 bases de données du serveur MySQL compressés.
Pour ajouter un utilisateur autorisé a utilisé le FTP :
Le serveur FTP filtre également les adresses IP qui tentent de se connecter. Seules les adresses autorisées peuvent y accéder. Pensez-donc a rajouté l’adresse de votre serveur :
Dans les fichiers de logs nous observons les opérations :
Nous voyons que la tache cron fonctionne : elle se connecte, upload les sauvegardes puis supprime celles de plus de 7 jours.
Voici ce que donne les logs si vous n’autoriser pas votre serveur sur le FTP :
Après modifications sur le FreeFTPd, il peut être nécessaire de relancer le service.
3- La restauration des bases de données
Pour la suite nous verrons le script shell pour la restauration des bases MySQL dans un autre article à venir prochainement.
Comments (0)