有时,在使用 Rsnapshot 的大型 rsync 上,我们正在同步的 NFS 挂载会丢失。
然后当你运行:
rnsapshot monthly
要恢复它,它会表现得好像这是一个全新的,旋转monthly.0
到monthly.1
等等。
如果某些事情被打断,有没有办法恢复rsync
使用?rsnapshot monthly
那不会开始一个全新的备份吗?
答案不是真的,而是有点。rsnapshot 作为批处理作业运行 - 通常由 cron 作业触发。除了备份本身之外,它不会在运行之间保留任何状态。如果您的 NFS 挂载在备份过程中消失,一段时间后您会遇到某种 IO 错误,并且 rsnapshot 将放弃并因错误而死。备份将失败。下次运行失败后,它会像从头开始一样开始备份。
但是,如果您使用sync_first
config 选项而不是该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 [in perl] 上编写了我自己的等效包装器,并且我进行了增量备份,所以我遇到了类似的问题。
要解决创建“虚假整体备份”的问题,基本思路是:
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有更多详细信息