Sauvegarde incrémentale en une douzaine de lignes

Qu'est-ce qui est le plus important pour les sauvegardes? C'est vrai, la reproductibilité. --link-dest donc un vélo sur le genou et sur l'option --link-dest de rsync . Notre vélo n'aura pas de structure de données restituée comme un git, ni un tas de backends comme la duplicité. Mais nous pouvons restaurer son travail de mémoire, même sous stress.


L'option --link-dest vous permet de spécifier la version de sauvegarde précédente sur laquelle rsync mettra des liens durs si les fichiers n'ont pas changé depuis la dernière fois.


Autrement dit, rsync --link-dest=/var/backups/www.1 remote:/var/www /var/backups/www.0 copie uniquement ces fichiers du serveur distant dans le dossier /var/backups/www.0 qui ont changé, mais pour le reste, il mettra un lien dur dans /var/backups/www.1


Maintenant, l'astuce est petite: encapsulez l'appel rsync dans du code qui décale les sauvegardes d'une /var/backups/www.0 et libère de l'espace pour une nouvelle sauvegarde dans /var/backups/www.0 , et supprime également la dernière copie de / /var/backups/www.9 .


 #  find /var/www/backups/ -maxdepth 1 -type d -name '*.[0-9]'| sort -rn| while read dir do #     this=`expr match "$dir" '.*\([0-9]\)'`; #   1,  ,      10  let next=($this+1)%$10; basedirname=${dir%.[0-9]} if [ $next -eq 0 ] ; then rm -rf $dir else mv $dir $basedirname.$next fi done 

Ce code renommera /var/backups/www.1 en /var/backups/www.2 et /var/backups/www.0 renommera /var/backups/www.1 .


Il ne reste plus qu'à exécuter rsync --link-dest=/var/backups/www.1 remote:/var/www /var/backups/www.0 , en ajoutant des options à votre goût. Ainsi, l'option --delete supprime les fichiers de la dernière copie ( rsync ne le fait pas par défaut), l'option -C ignore les dossiers .svn , .git , les artefacts de patch et certains autres types courants de fichiers temporaires.


Tous ensemble:


 #!/bin/bash FROM=$1 #  TO=$2 #  LINKTO=--link-dest=$TO/`basename $FROM`.1 #   OPTS="-Ca --delete" #    rsync NUMBER_OF_BACKUPS=10 #     #    ,       # dir.1, dir.2, dir.3     dir.9 find $TO -maxdepth 1 -type d -name '*.[0-9]'| sort -rn| while read dir do this=`expr match "$dir" '.*\([0-9]\)'`; let next=($this+1)%$NUMBER_OF_BACKUPS; basedirname=${dir%.[0-9]} if [ $next -eq 0 ] ; then rm -rf $dir else mv $dir $basedirname.$next fi done #  ,  rsync rsync $OPTS $LINKTO $FROM/ $TO/`basename $FROM.0` 

En dehors des crochets se trouvait la gestion des erreurs (voir set -e ) et les notifications, et le nombre de copies peut être personnalisé.


Mais ça marche!

Source: https://habr.com/ru/post/fr475510/


All Articles