MySQL – Sauvegarde de base MySQL par FTP

Script de sauvegarde de base MySQL par FTPMySQL

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 »

glpi

  • 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 :

ftpglpi

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 :

ftpglpi2

Dans les fichiers de logs nous observons les opérations :

ftpglpi3Nous 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 :

ftpglpi4

Après modifications sur le FreeFTPd, il peut être nécessaire de relancer le service.

ftpglpi5

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.