协助rsync每小时/每日/每周备份快照脚本

时间:2012-03-14 14:10:52

标签: bash backup rsync

我一直在使用rsync snapshot script from Mike Rubel的修改版本,并且已经有一些问题调整它来做我想做的事情。他只拍小时快照;我希望通过crontab每小时,每天,每周和每月拍摄快照。

这是我的每小时剧本:

if [ -d $BUP/temp ] ; then
   rm -rf $BUP/temp ;
fi;

rsync -avzO  --delete --exclude-from=$CONFIG/rsync-excludes /home/jwhendy/ $DAT/jwhendy/ ;
rsync -avzO  --delete --exclude=vault* --link-dest=../vault.hourly.0 $DAT/ $BUP/temp ;

if [ -d $BUP/vault.hourly.2 ] ; then    
   rm -rf $BUP/vault.hourly.2 ;
fi;

if [ -d $BUP/vault.hourly.1 ] ; then
   mv $BUP/vault.hourly.1 $BUP/vault.hourly.2 ;
fi;

if [ -d $BUP/vault.hourly.0 ] ; then
   mv $BUP/vault.hourly.0 $BUP/vault.hourly.1 ;
fi;

mv $BUP/temp $BUP/vault.hourly.0 ;

这是每日脚本(每周/每月的脚本几乎相同):

if [ -d $BUP/vault.daily.2 ] ; then    
    rm -rf $BUP/vault.daily.2 ;
fi;

if [ -d $BUP/vault.daily.1 ] ; then
    mv $BUP/vault.daily.1 $BUP/vault.daily.2 ;
fi;

if [ -d $BUP/vault.daily.0 ] ; then
    mv $BUP/vault.daily.0 $BUP/vault.daily.1 ;
fi;

if [ -d $BUP/vault.hourly.2 ] ; then
    cp -al $BUP/vault.hourly.2 $BUP/vault.daily.0 ;
fi;

每小时脚本效果很好。我正在努力的是从每小时过渡 - >每日(和每日 - >每周等)。

目前,如果每小时脚本在一天内运行6次并且每日脚本在此之后运行(“hourly.n”缩写为“hr.n”并且“b_m”代表个人快照):

| hour 1     | hour 2     | hour 3     | hour 4     | hour 5     | end of day    |
|------------+------------+------------+------------+------------+---------------|
| hr.0 (b_0) | hr.0 (b_1) | hr.0 (b_2) | hr.0 (b_3) | hr.0 (b_4) | hr.0 (b_5)    |
|            | hr.1 (b_0) | hr.1 (b_1) | hr.1 (b_2) | hr.1 (b_3) | hr.1 (b_4)    |
|            |            | hr.2 (b_0) | hr.2 (b_1) | hr.2 (b_2) | hr.2 (b_3)    |
|            |            |            |            |            | daily.0 (b_3) |

因为hourly.sh每小时点击一次。如果它存在,我们可以看到daily.0是第一次用b_3创建的,我丢失了b_0,b_1和b_2。在删除它之前,我宁愿每小时进行一次增量转储每小时2次。这样,在任何给定的时间我都会有每小时0,1和2,而每日0将包含最新版本的hourly.2,然后才会被删除。

希望这是有道理的。

我尝试过cp -al $BUP/hourly.2 $BUP/daily.0 ;行并将其放入每小时脚本中。我遇到了三个问题:

  • 它似乎比单独使用rsync脚本要花费更长的时间,即使它在技术上 只是复制一些硬链接
  • 因为这些是硬链接,所以第一次备份将是我的情况下的全尺寸(~20GB);后续运行应该生成更新文件大小的快照(它确实如此)。我希望最大的快照能够逐步进一步向树中移动(最终每月一次)。这条cp -al行似乎在每日都保持稳定。它永远不会回到每日.1等等(这可能是对du如何运作的误解。
  • 我无法弄清楚如何不破坏备份链,这会迫使必须重新创建一个新的快照(完整的20GB)。换句话说,hourly.2继续倾销到daily.0 ...但最终mv $BUP/daily.0 $BUP/daily.1将使daily.0不再存在。因此,必须在下次hourly.sh运行时从头开始重新创建。

无论如何,希望很清楚我正在努力实现的目标。我希望协助将每个脚本(每小时,每天,每周)转换到下一个“桶”(每日,每周,每月),而不必破坏硬链接。

我也希望不会丢失重要的快照,如上表所示。

非常感谢任何建议。

1 个答案:

答案 0 :(得分:2)

好的,我对硬链接做了一个测试,这就是我发生的事情:

➜  rsync -az0 /home/jan/tmp/Source /home/jan/tmp/Dir1
➜  rsync -az0 /home/jan/tmp/Source /home/jan/tmp/Dir2 --link-dest=/home/jan/tmp/Dir1
➜  du -hs /home/jan/tmp/Source
124M    /home/jan/tmp/Source
➜  du -hs /home/jan/tmp/Dir1
124M    /home/jan/tmp/Dir1
➜  du -hs /home/jan/tmp/Dir2
124M    /home/jan/tmp/Dir2

您可以看到文件的所有硬链接确实相同。这意味着,每个备份本身就是一个“完整”备份,如果你只在那个备份上执行“du”,它就会为你提供完整的文件大小。

➜  du -hs /home/jan/tmp/Dir1 /home/jan/tmp/Dir2
124M    /home/jan/tmp/Dir1
0   /home/jan/tmp/Dir2

但是,如果你对它们进行“du”(比如上面的第6个命令),它将识别硬链接,并为之前遇到的所有硬链接显示“零”大小。但是,这仅取决于参数的顺序,而不取决于哪个硬链接是“第一个”:

➜  du -hs /home/jan/tmp/Dir2 /home/jan/tmp/Dir1
124M    /home/jan/tmp/Dir2
0   /home/jan/tmp/Dir1

针对您的实际问题:

而不是执行cp -al $BUP/hourly.2 $BUP/daily.0然后删除hourly.2无论如何,你不能只做mv $BUP/hourly.2 $BUP/daily.0会更快?