Mise en place d’une sauvegarde différentielle avec DAR

Sauvegarde différentielle avec DAR

Restons dans la sécurité du serveur Linux, et voyons comment sauvegarder l’ensemble de ses bases de données et une sélection de répertoires automatiquement et de façon différentielle avec DAR.

Sauvegarde différentielle ?

Le principe de la sauvegarde différentielle est simple : lors du premier démarrage, les fichiers désignés sont sauvegardés et un catalogue qui les référence est créé. Les fois suivantes, seules les modifications (ajouts, modifications et suppressions) sont sauvegardées, grâce à une comparaison entre les fichiers et le catalogue. Ainsi, on ne sauvegarde que la différence, d’où le nom.

DAR ?

Sauvegarde différentielle avec DARDAR, pour Disk ARchive, a été implémenté en 2001 pour pallier aux manques de tar, comme le découpage du fichier de sauvegardes en plusieurs fichiers pour les graver sur CD-R par exemple.

Il s’agit d’une solution gratuite de backup, légère, fiable, robuste et qui offre une grande quantité de paramètres.

Les documentations sont à l’ancienne, mais sont complètes, comme la page de manuel ou les tutoriels qui donnent de bonnes bases pour commencer.

Préparatifs

L’installation de DAR dépend de votre système. Vous pouvez par exemple télécharger le RPM et l’installer localement, ou encore utiliser yum ou tout autre gestionnaire de package.

Avec yum, par exemple, il suffit de saisir dans la console :

yum install dar

Pour la méthode que je vais présenter, les scripts qui vont effectuer la sauvegarde doivent se trouver dans un répertoire, et la sauvegarde dans un autre. Libre à vous de choisir les emplacements qui vous conviennent le mieux.

Voici les chemins que je vais utiliser dans l’exemple qui suit :

  • les scripts de sauvegarde sont dans /var/admin_scripts/backup_scripts
  • les archives de la sauvegarde seront dans /var/backups/yyyy-mm où yyyy-mm est l’année et le mois de la sauvegarde.

Pour créer ces dossiers :

mkdir -p /var/admin_scripts/backup_scripts
mkdir -p /var/backups
mkdir -p /var/backups/mysql

Le principe des scripts

Le premier jour de chaque mois, la sauvegarde initiale est effectuée. Les autres jours, seule la différence est archivée.

Les bases de données sont enregistrées (ou dumpées) dans un fichier dans /var/backups/mysql qui est lui-même ajouté à l’archive quotidienne.

Les sauvegardes des mois précédents ne sont pas supprimées automatiquement et doivent l’être manuellement, sous peine de remplir l’espace disque. Ce n’est pas forcément utile, mais avec ce principe, vous serez capable de restaurer des données plus anciennes.
Pensez-donc à bien supprimer les dossiers anciens régulièrement.

Sauvegarde de la base de données

Pour sauvegarder une base de données facilement, une méthode est de récupérer son dump, c’est-à-dire l’ensemble des instructions SQL qui permettent de recréer les tables, les données qu’elles contiennent ainsi que tout ce qui la compose (les compteurs, index, procédures stockées, déclencheurs, …).

Avec MySQL, c’est la bien nommée commande mysqldump qui se charge de cette tâche.
Elle prend en argument le nom de la base de données à sauvegarder ou --all-databases pour toutes les archiver.

Un autre argument est le mot de passe de l’administrateur MySQL. La plupart du temps, il se trouve dans un fichier protégé, qu’il suffit de lire automatiquement au moment opportun.
Par exemple, avec une installation standard de CentOS, ce fichier est /etc/mysql_password. A vous d’adapter ce chemin en fonction de votre système.

Le script suivant démarre le dump de toutes les bases SQL dans le fichier /var/backups/mysql/dump_all_databases.db

#!/bin/sh
 
DIR=/var/backups/mysql
ADMINSCRIPTSDIR=dirname $0
 
mysqldump -uadmin -p`cat /etc/mysql_password` --all-databases > ${DIR}/dump_all_databases.db
 
if [ $? -ne 0 ]; then
        echo "Mysql dump: mysql dump encountered a problem"
        exit 2
fi
 
exit 0

Dans cet exemple, ce script doit être nommé /var/admin_scripts/backup_scripts/dump_mysql.sh, il sera appelé automatiquement par les scripts de sauvegarde.

Configuration de DAR

La commande DAR va être appelée de deux façons différentes : d’une part pour faire la sauvegarde complète, d’autre part pour archiver la différence. Dans les deux cas, des paramètres de sauvegarde seront communs. Pour cela, DAR propose d’écrire toutes les options communes aux deux modes dans un fichier de configuration :

-m 256
--gzip=4
--slice 4000M
--empty-dir
--fs-root /
--noconf
 
--exclude "*.dar"
--exclude-compression "*.mp3"
--exclude-compression "*.avi" 
--exclude-compression "*.mpg" 
--exclude-compression "*.mpeg"
--exclude-compression "*.divx"
--exclude-compression "*.rm"
--exclude-compression "*.wmv"
--exclude-compression "*.wma"
--exclude-compression "*.asf"
--exclude-compression "*.ra"
--exclude-compression "*.gif"
--exclude-compression "*.jpg" 
--exclude-compression "*.jpeg"
--exclude-compression "*.png"
--exclude-compression "*.zip"
--exclude-compression "*.dar"
--exclude-compression "*.tgz"
--exclude-compression "*.gzip"
--exclude-compression "*.bzip"
--exclude-compression "*.bzip2"
--exclude-compression "*.rar"
--exclude-compression "*.gz"
--exclude-compression "*.rpm"
--exclude-compression "*.iso"
--exclude-compression "*.bz2"
--exclude-compression "*.flac"
--exclude-compression "*.ogv"
--exclude-compression "*.oga"
--exclude-compression "*.ogx"
--exclude-compression "*.ogg"
 
--go-into var/www
--go-into var/backups/mysql
 
-P var/www/tmp
 
-P var/www/*/httpdocs/temp

Toujours dans le cadre de cet exemple, ce fichier doit être /var/admin_scripts/backup_scripts/common.dcf (dcf comme DAR Configuration File).

Voilà une explication des paramètres principaux, pour que vous puissiez les personnaliser :

  • -m 256 : les fichiers de moins de 256 ko ne sont pas compressés pour gagner en performance et en temps de sauvegarde, le gain étant minime pour ces fichiers
  • -gzip 4 : les fichiers sont compressés avec gzip, avec un niveau moyen pour un bon équilibre entre espace occupé par les archives et le temps de sauvegarde
  • --slice 4000M : les archives sont découpées en fichiers de 4 Go
  • --fs-root / : le dossier racine / est considéré comme la racine de la sauvegarde. C’est le plus simple.
  • --exclude "*.dar" : évite de sauvegarder les fichiers de… sauvegarde, au cas où
  • --exclude-compression "*.jpg" : évite d’appliquer une compression inutile aux fichiers qui sont déjà compressés, comme les JPEG, les MP3, … Cette option permet de gagner du temps
  • --go-into var/www : définit un dossier à sauvegarder. Plusieurs lignes commençant par –go-into peuvent être ajoutées
  • -P var/www/tmp : exclue le dossier de la sauvegarde. Il est également possible d’utiliser les jokers (comme * ou ?) dans le chemin à exclure, comme dans : -P var/www/*/httpdocs/temp

Sauvegarde initiale

La sauvegarde initiale est démarrée le premier de chaque mois.

Le script crée un dump de toutes les bases de données en utilisant le script dump_mysql.sh, puis lance la sauvegarde selon la configuration du fichier common.dcf. Enfin l’archive est testée pour être sûr qu’elle ne contient pas d’erreur.

#!/bin/sh
 
DIR=/var/backups/
ADMINSCRIPTSDIR=dirname $0
MONTHDIR=${DIR}/`/bin/date '+%Y-%m'`
FILE=${MONTHDIR}/`/bin/date -I`_data
 
date
 
# Sauvegarde la base de donnees
sh ${ADMINSCRIPTSDIR}/dump_mysql.sh
if [ $? -ne 0 ]; then
        echo "Backup full: MySQL dump script encountered a problem"
        exit 5
fi
 
date
echo "SQL dump finished"
 
if [ ! -d $MONTHDIR ]; then
        mkdir $MONTHDIR
        if [ $? -ne 0 ]; then
                echo "Backup full: can not create month backup dir ($MONTHDIR)"
                exit 2
        fi
fi
 
# Sauvegarde les dossiers et les fichiers decrits dans le fichier de configuration
/usr/bin/dar -B ${ADMINSCRIPTSDIR}/common.dcf -c $FILE > /dev/null
 
# Teste la sauvegarde
/usr/bin/dar -t $FILE > /dev/null
 
if [ $? -ne 0 ]; then
        echo "Backup full: Archive created but test FAILED"
        exit 3
fi
 
date
echo "dar finished"
 
exit 0

Copiez ce script dans le fichier /var/admin_scripts/backup_scripts/backup_initial.sh

Sauvegarde différentielle

La sauvegarde différentielle est lancée tous les jours, sauf le premier du mois.

Le script crée aussi le dump de la base, crée la sauvegarde différentielle et la vérifie.

#!/bin/sh
 
DIR=/var/backups/
ADMINSCRIPTSDIR=dirname $0
MONTHDIR=${DIR}/`/bin/date '+%Y-%m'`
FILE=${MONTHDIR}/`/bin/date -I`_diff
PREV=`/bin/ls -tr1 $MONTHDIR/*.dar | tail -n 1`
 
date
 
# On teste que la sauvegarde complete a deja ete demarree
if [ ! -d $MONTHDIR ]; then
        echo "Backup diff: month backup dir does not exist ($MONTHDIR). Full backup has never been performed."
        exit 2
fi
 
# Sauvegarde la base de donnees
sh ${ADMINSCRIPTSDIR}/dump_mysql.sh
if [ $? -ne 0 ]; then
        echo "Backup full: MySQL dump script encountered a problem"
        exit 5
fi
 
date
echo "SQL dump finished"
 
# Sauvegarde les dossiers et les fichiers decrits dans le fichier de configuration
/usr/bin/dar -B ${ADMINSCRIPTSDIR}/common.dcf -c $FILE -A ${PREV%%.*} > /dev/null
 
# Teste la sauvegarde
/usr/bin/dar -t $FILE > /dev/null
 
if [ $? -ne 0 ]; then
        echo "Backup diff: Archive created but test FAILED"
        exit 3
fi
 
date
echo "dar finished"
 
exit 0

Copiez ce script dans le fichier /var/admin_scripts/backup_scripts/backup_diff.sh

Planification

Pour planifier les deux scripts, modifiez le fichier /etc/crontab et ajoutez ces deux lignes :

05 2 1 * * /var/admin_scripts/backup_scripts/backup_initial.sh
05 2 2-31 * * /var/admin_scripts/backup_scripts/backup_diff.sh

La première ligne démarre la sauvegarde initiale à 02h05 le premier de chaque mois.
La seconde ligne démarre la sauvegarde différentielle à 02h05 du 2 au 31 de chaque mois.

Restauration d’un ou plusieurs fichiers

Sauvegarder c’est bien, mais en cas de problème il faudra bien restaurer.

Cette commande sert à restaurer un fichier ou un dossier en particulier :

dar -R /tmp/ -x /var/backups/2013-05/2013-05-29_diff -g var/www/monfichier.txt

Cette commande restaure le fichier monfichier.txt qui date du 29 mai dans /tmp. Une fois extrait, il ne vous reste qu’à replacer le fichier dans le répertoire approprié.

Notez-bien que si le fichier n’a pas été modifié juste avant la sauvegarde différentielle, il ne se trouve pas dans cette archive. Il faudra alors remonter dans les archives pour le retrouver.

Restauration complète

Après une réinstallation, vous aurez besoin de restaurer toute la sauvegarde. Pour cela, il suffit de parcourir toutes les archives pour en extraire les fichiers. Pour simplifier le travail, un script s’impose :

#!/bin/sh
 
DIR=/var/backups
ADMINSCRIPTSDIR=dirname $0
 
if [ $# -ne 2 ]; then
echo "Missing parameters: $0 <month to restore> <where to restore>"
echo "For example: $0 '2013-05' /tmp/restore_dir/"
exit 1
fi
 
MONTHDIR=${DIR}/$1
if [ ! -d "$MONTHDIR" ]; then
echo "The month directory does not exist"
exit 2
fi
 
RESTOREDIR=$2
if [ ! -d "$RESTOREDIR" ]; then
echo "The restore directory does not exist"
exit 3
fi
 
echo "Starting initial backup restoration..."
date
FULL=`/bin/ls -tr1 $MONTHDIR/*_data.*.dar|/usr/bin/tail -n 1`
/usr/bin/dar -R $RESTOREDIR -x ${FULL%%.*}
echo "Finished, starting diff restoration..."
date
 
for file in $MONTHDIR/*_diff.*.dar; do
 /usr/bin/dar -w -R $RESTOREDIR -x "${file%%.*}"
done
echo "Finished"
date

Avec ce script, nommé restore_full.sh, il suffit de copier le dossier mensuel des archives dans /var/backups, pour avoir par exemple /var/backups/2013-05/ contenant des fichiers dar puis de lancer la commande :

sh restore_full.sh <mois à restaurer> <dossier de restauration>

Par exemple :

sh restore_full.sh 2013-05 /tmp/restored/

Avec cette commande, les dossiers sont restaurés dans /tmp/restored/ en conservant bien sûr l’arborescence. Vous devez alors les déplacer, ce qui est utile si vous devez faire du tri.
Vous pouvez également les restaurer directement dans /.

Ensuite les bases de données doivent être restaurées, avec cette commande :

mysql -uadmin -p`cat /etc/mysql_password` < /var/backups/mysql/dump_all_databases.db

Limitation

Cette méthode de sauvegarde locale est pratique mais présente un inconvénient.

En effet, elle permet de copier les fichiers importants et les bases de données pour les récupérer en cas de fausse manipulation. Ainsi vous pourrez récupérer des fichiers qui datent de quelques jours, si, par exemple, vous les avez supprimés ou modifiés.

En revanche, en cas de problème sur le serveur (destruction, panne du disque dur, vol, …), les archives du backup vont être perdues en même temps que les données elles-mêmes.

Pour résoudre ce problème, il existe plusieurs solutions.

Copie vers un disque dur externe ou un partage réseau

Vous pouvez copier les fichiers sur un autre ordinateur du réseau ou un disque dur externe. Dans ces deux cas, il suffit de monter le partage, et de changer le chemin du répertoire de destination des fichiers archive dans les scripts de sauvegarde.

Par exemple, pour réaliser le montage d’un disque dur externe vers /mnt/backups/ :

mount /dev/sdd1 /mnt/backups/

Changez ensuite le répertoire de destination, en modifiant les scripts pour avoir :

DIR=/mnt/backups/

Copie vers un répertoire FTP

Vous avez également la possibilité de copier les fichiers de sauvegarde sur un FTP. Nous verrons prochainement comment utiliser simplement FTP en ligne de commande, et donc dans les scripts.

Copie vers un stockage externe

Vous pouvez aussi envoyer les archives sur un stockage en ligne (par exemple, un cloud ou tout autre service de stockage de fichiers du même style), en modifiant les scripts de sauvegarde pour démarrer la copie dans la foulée, en utilisant les recommandations de votre fournisseur.

Le mot de la fin

Le backup différentiel est une solution souple, flexible, open source, gratuite et robuste.

Vous pouvez l’adapter à vos besoins. Dans les scripts de cet article, la sauvegarde initiale est mensuelle, mais vous pouvez aussi bien conserver un mois complet et le mois en cours.

Un dernier conseil : conservez bien les scripts de côté, notamment celui de restauration. Vous éviterez ainsi de le chercher en cas de besoin (et quelquefois, d’urgence).

Cet article vous a été utile ? Partage it !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Si vous le souhaitez, renseignez le champ 'Nom' de cette façon : 'VotreNom@VotreMotClef' pour obtenir une ancre optimisée pour les moteurs de recherche.