十几行增量备份

备份最重要的是什么? 是的,可重复性。 因此,让我们在膝盖上和rsync--link-dest选项上骑自行车。 我们的自行车不会有像git这样的复杂Restic数据结构,也不会有像双重性这样的后端。 但是即使压力很大,我们也可以从记忆中恢复他的工作。


--link-dest选项允许您指定以前的备份版本,如果自上次以来文件未更改,则rsync将在其上放置硬链接


也就是说, rsync --link-dest=/var/backups/www.1 remote:/var/www /var/backups/www.0仅将那些文件从远程服务器复制到/var/backups/www.0文件夹发生了变化,但其余的将在/var/backups/www.1中添加硬链接


现在的窍门很小:将rsync调用包装在代码中,该代码将备份后退一/var/backups/www.0 ,并为/var/backups/www.0的新备份腾出空间,并在/var/backups/www.0时还删除了/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 

此代码会将/var/backups/www.1重命名为/var/backups/www.2/var/backups/www.0重命名/var/backups/www.1


仅需运行rsync --link-dest=/var/backups/www.1 remote:/var/www /var/backups/www.0 ,即可添加选项。 因此,--delete选项删除最后一个副本中的文件( rsync默认情况下不执行此操作),- -C选项忽略.svn.git文件夹, patch工件和某些其他常见类型的临时文件。


一起:


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

括号之外是错误处理(请参阅set -e )和通知,并且副本数量可以定制。


但这有效!

Source: https://habr.com/ru/post/zh-CN475510/


All Articles