有时,在使用Rsnapshot的大型rsync上,我们正在同步的NFS装载会下降。
然后当你运行:
rnsapshot monthly
要恢复它,它将表现得好像这是一个全新的,将monthly.0
旋转到monthly.1
,依此类推
如果出现中断,有没有办法使用rsnapshot monthly
恢复rsync
?这不会启动一个全新的备份吗?
答案是不是真的,但有点。rsnapshot作为批处理作业运行,通常由cron作业触发。它不会将运行之间的任何状态与备份本身分开。如果您的NFS装载在备份过程中丢失,过一段时间后,您将遇到某种IO错误,rsnapshot将放弃并因错误而终止。备份将失败。下次在故障后运行时,它将像从头开始一样启动备份。
但是,如果使用sync_first
配置选项,而不是link_dest
选项,rsnapshot将更好地进行恢复。它将保留已传输的文件,不必再次传输,但必须以通常的rsync
方式再次检查源和目标是否相同。手册页对此提供了一些详细信息。
link_dest
方法的情况并非如此,对于大多数错误,它会删除已完成的工作并重新开始。具体来说,在出现错误link_dest
时,会执行类似这样的"回滚":
ERROR: /usr/bin/rsync returned 255 while processing sam@localhost:..
WARNING: Rolling back "localhost/"
/bin/rm -rf /tmp/rs-test/backups/hourly.0/localhost/
/bin/cp -al /tmp/rs-test/backups/hourly.1/localhost
/tmp/rs-test/backups/hourly.0/localhost
touch /tmp/rs-test/backups/hourly.0/
rm -f /tmp/rs-test/rsnapshot-test.lock
如果您还没有使用它,并且可以使用它(显然有些非UNIX系统不能),请使用sync_first
方法。
我不使用rsnapshot,但我已经在rsync上[在perl]中]编写了自己的等效包装器,并且我进行delta备份,所以我遇到了类似的问题。
要解决创建"伪完整备份"的问题,基本思想是:
while 1
rsnapshot remote_whatever/tmp
if (rsnapshot_was_okay) then
mv remote_whatever/tmp remote_whatever/monthly_whatever
break
endif
end
上述mv
应该是原子的,即使在NFS上也是如此。
我刚刚在这里回答了一个类似的问题:https://serverfault.com/questions/741346/rsync-directory-so-all-changes-appear-atomically/741420#741420有更多详细信息