有时,在使用Rsnapshot的大型rsync上,我们正在同步的NFS挂载将会丢失。
然后当你跑:
rnsapshot monthly
要恢复它,它的行为就好像这是一个全新的,将monthly.0
转为monthly.1
等等。
如果某些内容被中断,有没有办法使用rsync
恢复rsnapshot monthly
?那不会开始全新的备份吗?
答案 0 :(得分:1)
答案是不是真的,而是。 rsnapshot作为批处理作业运行 - 通常由cron作业触发。除了备份本身之外,它不会在运行之间保持任何状态。如果您的NFS挂载在备份中间消失,过一会儿您将遇到某种IO错误,并且rsnapshot将放弃并因错误而死亡。备份将失败。下次在失败后运行它,它将像从头开始一样启动备份。
但是,如果您使用sync_first
配置选项,不 link_dest
选项,则rsnapshot可以更好地进行恢复。它会将已经传输的文件保留在原位并且不必再次传输它们,但是它必须再次检查源和目标是否以通常的rsync
方式相同。 man page提供了一些详细信息。
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
方法。
答案 1 :(得分:0)
我不使用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有更多细节