Inkrementelles Backup in einem Dutzend Zeilen

Was ist für Backups am wichtigsten? Das ist richtig, Reproduzierbarkeit. Machen wir also ein Fahrrad auf dem Knie und auf der Option --link-dest von rsync . Unser Fahrrad wird weder eine komplizierte git-artige restische Datenstruktur haben, noch eine Reihe von Backends wie Duplicity. Aber wir können seine Arbeit aus dem Gedächtnis wiederherstellen, auch unter Stress.


Mit --link-dest Option --link-dest können Sie die vorherige Sicherungsversion angeben, auf der rsync feste Verknüpfungen erstellt, wenn sich die Dateien seit dem letzten Mal nicht geändert haben.


Das heißt, rsync --link-dest=/var/backups/www.1 remote:/var/www /var/backups/www.0 kopiert nur diese Dateien vom Remote-Server in den Ordner /var/backups/www.0 das hat sich geändert, aber für den Rest wird es einen festen Link in /var/backups/www.1 setzen


Jetzt ist der Trick klein: Binden Sie den rsync Aufruf in Code ein, der Backups um eins zurückschiebt, Speicherplatz für ein neues Backup in /var/backups/www.0 und /var/backups/www.9 die letzte Kopie von /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 

Dieser Code benennt /var/backups/www.1 in /var/backups/www.2 und /var/backups/www.0 benennt /var/backups/www.1 .


Es bleibt nur rsync --link-dest=/var/backups/www.1 remote:/var/www /var/backups/www.0 und Optionen nach Belieben hinzuzufügen. Mit der Option --delete die Dateien in der letzten Kopie --delete (dies wird von rsync nicht standardmäßig ausgeführt). Mit der Option -C die Ordner .svn , .svn , patch Artefakte und einige andere häufig verwendete temporäre .svn ignoriert.


Alle zusammen:


 #!/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` 

Außerhalb der Klammern befanden sich Fehlerbehandlung (siehe set -e ) und Benachrichtigungen, und die Anzahl der Kopien kann anpassbar gemacht werden.


Aber es geht!

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


All Articles