web-dev-qa-db-fra.com

Utilisation de rsync pour la sauvegarde incrémentielle

J'héberge une page et j'ai un accès ssh à l'espace Web.

Le site permet la modification par ses utilisateurs. Pour pouvoir revenir à un état plus ancien, j'ai pensé à rsync pour créer une sauvegarde incrémentielle toutes les 30 minutes en utilisant cron pour lancer le script suivant.

#!/bin/bash

# Binaries
RSYNC=`which rsync`
LN=`which ln`
MKDIR=`which mkdir`
#TODO: Is this enough to make the script distro independent?

# Other Variables
source="<username>@<provider>:<workspace path>"
target="<local backup path>"
# Date ...
year=$(date +%Y)
month=$(date +%m)
day=$(date +%d)
# ... and time
hour=$(date +%H)
minute=$(date +%M)

# Prepare directories
$MKDIR -p $target/$year/$month/$day/"$hour"_"$minute"/
# TODO: Why is this necessary? The actual backup won't work without this line
# saying "directory does not exist...".

# Actual backup
$RSYNC -av --delete "$source" "$target/$year/$month/$day/"$hour"_"$minute"/" --link-dest="$target/latest/"
$LN -nsf "$target/$year/$month/$day/"$hour"_"$minute"/" "$target/latest"

# End script
exit 0

Le script semble fonctionner jusqu'à présent, mais le chemin cible a été gonflé à environ trois fois la taille réelle du chemin source au cours des trois derniers jours.

La sauvegarde incrémentielle ne devrait entraîner qu'une légère augmentation, n'est-ce pas?

Qu'est-ce que je fais mal?

Merci d'avance

Markus

2
Markus

Il existe déjà un outil créé à cet effet, basé sur rsync. Cela s'appelle rdiff-backup et je l'ai utilisé plusieurs fois dans le passé pour créer des sauvegardes incrémentielles et il prend en charge la restauration des états précédents. Il peut également être configuré pour nettoyer les anciennes sauvegardes afin que votre répertoire de sauvegarde ne s'agrandisse pas pour toujours.

Pour en savoir plus à ce sujet ici et consulter les exemples d'utilisation sur la page de documentation: http://rdiff-backup.nongnu.org/

1
Niklas

Si votre support de sauvegarde a un format linux, par exemple ext3 ou ext4 (et il le devrait probablement, ou les attributs de fichier ne seront pas sauvegardés), il existe alors une astuce intéressante que vous pouvez faire avec rsync et cp -al pour tirer le meilleur parti d'une fonctionnalité du système de fichiers: vous effectuez une sauvegarde incrémentielle, mais vous créez ensuite des liens physiques vers les fichiers à chaque sauvegarde. Cela signifie que vous ne copiez que les fichiers qui ont été modifiés mais que le support de sauvegarde n’a qu’une copie de chaque fichier, la taille ne gonfle donc pas (je ne peux pas en prendre le crédit; c’était dans un commentaire sur une longue question que je ne pouvais pas commencer à trouver à nouveau.)

Ma sauvegarde (quotidienne) ressemble à quelque chose comme:

DEST=/media/$USER/backups         # the name my backup media is mounted under
rsync -av --progress --delete --exclude ".[!.]*"  ~/ $DEST/current
DATE=`date -I`
mkdir $DEST/$DATE
cp -al $DEST/current/ $DEST/$DATE

cela met à jour "en cours" avec uniquement les fichiers qui ont changé, mais crée un répertoire nommé d'après la date du jour avec des liens physiques vers tous les fichiers. Ainsi, les sauvegardes de chaque jour semblent contenir tous les fichiers in situ, mais il n’ya en fait qu’une copie sur le support de sauvegarde. Ce dernier point est également l’inconvénient: comme il n’ya qu’une copie de chaque fichier, vous devez faire pivoter le support pour obtenir plusieurs copies, mais c’est de toute façon une bonne pratique de sauvegarde.

2
B.Tanner

basé sur B.Tanner answer, il s'agit d'un script qui teste toutes les 60 secondes. Si un fichier a été modifié, une sauvegarde est créée. Vous devez disposer de 2 dossiers backups/OLD et backups/current.

while true  
do 
DEST=/home/$USER/backups         # the name my backup media is mounted under
if [ -n "$(rsync -ai --delete  --exclude ".[!.]*"  $(pwd)/ $DEST/current)" ]; then
    DATE=`date +"%m-%d-%y"`
    TIME=`date +"%T"`
    mkdir -p $DEST/OLD/$DATE
    mkdir $DEST/OLD/$DATE/$TIME
    cp -al $DEST/current/ $DEST/OLD/$DATE/$TIME
    echo "done:$DATE/$TIME"
fi
sleep 60   
done
0
Alice

Le programme rsync a déjà des options de sauvegarde qui font ce que vous voulez.

C’est le script que j’utilise pour les sauvegardes et qui s’exécute en tant que root à 23h45 chaque jour:

#!/bin/bash -e
# This is run as root at the end of the day

(   echo ">>>>>>>>>>>>>>>>>>>>>>>" $(date)
    today=$(date +%Y-%m-%d)
    month=$(date +%Y-%m)
    # USB backups
    cd /media/ray/Backup-Ray
    rsync --archive --one-file-system --delete --backup --backup-dir="../../$today/etc" "/etc/" "mostrecent/etc/"
    rsync --archive --one-file-system --delete --backup --backup-dir="../../$today/home" --exclude=".config/google-chrome/" --exclude=".cache/" --exclude=".local/share/zeitgeist/" --exclude="Downloads/" "/home/" "mostrecent/home/"
    rsync --archive $today/ $month/
    echo "<<<<<<<<<<<<<<<<<<<<<<<" $(date)
) &>>/home/ray/Log/root.out

exit 0

Tous les fichiers modifiés et supprimés sont préservés. Il est facile d'utiliser les outils standard Unix pour examiner et récupérer des fichiers:

$ cd /media/ray/Backup-Ray
$ ls -l {,*}/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14002 Dec  3 21:04 2018-12-16/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14102 Dec 16 09:28 2018-12-17/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14202 Dec 17 20:47 2018-12-20/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14302 Dec 20 15:12 2018-12-25/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14402 Dec 25 21:21 2018-12-26/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14402 Dec 25 21:21 2018-12/home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14452 Dec 26 18:43 /home/ray/public/Log/wait.xhtml
-rw-r--r-- 1 ray ray 14452 Dec 26 18:43 mostrecent/home/ray/public/Log/wait.xhtml

Seul le répertoire "mostrecent" est volumineux.

Le répertoire d'accumulation mensuel (2018-12) contient les modifications les plus récentes apportées au cours du mois. Il n'est pas nécessaire de faire cette étape, mais lorsque je dois économiser de l'espace, cela me permet de supprimer toutes les mises à jour quotidiennes de ce mois (dans un an, je pourrais me soucier de la situation à la fin de décembre, mais pas du tout. comment les choses ont changé au cours du mois.)

Évidemment, vous devrez changer la fréquence, les horodatages, etc., et ajouter votre code de portabilité, mais le même mécanisme devrait faire ce que vous voulez.

0
Ray Butterworth