rsync
01/12/2014principe 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.