rsync

01/12/2014

principe de rsync

Pour des raisons de sécurité, se placer sur le serveur qui contiendra les sauvegardes et se connecter à l'autre en ssh.

la copie se fait de gauche à droite:
si un fichier est modifé a gauche il est envoyé à droite.
si un fichier est supprimé a gauche il n'est pas supprimé à droite. (pour supprimer il faut ajouter --delete ou --delete-after)
ajouter --partial pour pouvoir reprendre un transfert qui a coupé
ajouter --progress pour afficher la progression du transfert
ou -P pour faire --partial et --progress d'un coup
-n pour faire des tests, car ça n'execute pas de transfert ni de delete
exemple :

rsync -az 'test_prod@test.fr:/home/sql/project_prod_*.sql' /home/test/save/

exclure
--exclude permet d'exclure un path ou un fichier
--delete-excluded permet de supprimer les fichiers qui trainerait si ils avaient déjà été transférés.

rsync -az --exclude file1.txt --exclude dir3/file4.txt test_prod@project.fr:/home/sql/ /home/test/save/ 

sauvegarde journalière avec hardlink pour déduplication

ajouter l'option --link-dest et spécifier le dossier du précédent backup pour que les hardlinks se fassent

exemple complet

mkdir /root/rsynctest
cd /root/rsynctest/

# create test files to sync
mkdir work
head -c 100M  work/a.txt

# folder to store backups
mkdir /root/rsynctest/backup

# first full backup
rsync -avzP /root/rsynctest/work/ /root/rsynctest/backup/A

# the second day : full backup with hardlink generation to reduce storage usage
rsync -avzP --link-dest=/root/rsynctest/backup/A /root/rsynctest/work/ /root/rsynctest/backup/B

# confirm storage usage :
du -hs /root/rsynctest/work /root/rsynctest/backup/*
100Mo /root/rsynctest/work
100Mo /root/rsynctest/backup/A
8K /root/rsynctest/backup/B

# note that calling du on a specific backup will still print its full size (or use du -l on last command)
du -hs /root/rsynctest/backup/B
100Mo

sauvegarde décrémentale

En lançant cette commande chaque jours :
Un dossier 'principal' sera tenu à jour et sera un mirroir parfait du serveur initial. (les fichiers sont mis à jour et supprimés si nécéssaire)
grace aux paramètres : --backup et --backup-dir, Un nouveau dossier "poubelle" (nommé par ex "2019-09-02") sera créé avec les fichiers modifié et/ou supprimés ce jour.
l'arborescence dans ce dossier est conservée.

rsync -aqzP -e "ssh -p 22" --backup --backup-dir=/root/savedisk/2I/backup-date +\%d/home/ --delete --delete-excluded --exclude site/web/uploads/tmp --exclude gextra_prod/logs --exclude site/log --exclude .vscode-server-insiders --exclude app/logs --exclude app/cache root@gextra.net:/home/ /root/savedisk/2I/principal/home/

récupérer les données du jour actuel

copier simplement le dossier principal

récupérer les données d'un jour précédent (compliqué)

copier le dossier principal, puis copier les données depuis chaque dossier 'poubelle' du plus récent au ancien.
Exemple on a fait des actions tous les jours, et aujourd'hui nous sommes le 2019-09-06 et on veut récupérer l'état dans lequel on se trouvait le 2019-09-02. Par exemple on veut retrouver le fichier A (v1)
2019-09-02 create A (v1) => A (v1) est copié dans le dossier principal
2019-09-03 update A (v2) => A (v2) est à nouveau copié dans le dossier principal, A (v1) se trouve maintenant dans la corbeille '2019-09-03'
2019-09-04 delete A => A se trouve maintenant dans la corbeille '2019-09-04' et est supprimé du dossier 'principal'
2019-09-05 create A (v3) => A (v2) se trouve toujours dans la corbeille '2019-09-04' et A (v3) se trouve dans le dossier 'principal'
En copiant les dossiers principal puis 5, puis 4, puis 3, puis 2 on retrouve bien le fichier A (v1)
PS : les fichiers qui ont été modifié/créés/supprimés après le 2019-09-02 sont présent et polluent la restoration.