1 序言
我电脑上有超过 2T 的数据需要备份,但是这么多数据使用 windows 文件历史记录来做多版本备份实在太消耗空间了。我用 FreeFileSync 镜像同步一份数据到移动硬盘来作为单版本备份使用,为了节约移动硬盘空间,删除文件的方式使用“永久”。有一天,我修改了电脑上 500GB 的文件,并且把他们移动到了另外一个文件夹,然后打开 FreeFileSync 开始镜像同步。在 FreeFileSync 漫长的拷贝数据的过程中,我随手点开移动硬盘的属性页面,发现了一件很奇怪的事情:移动硬盘已用空间大小怎么少了500GB?经过一番检查,我发现 FreeFileSync 居然是先把目标文件夹原来目录中的文件给删除了,然后才是拷贝新增的数据到新的文件夹。所以在镜像同步的过程中,我居然一个版本的备份数据都不存在!拷贝 500GB 的文件可是需要 60 分钟啊,这 60 分钟的过程中,我的数据居然没有备份的保护!本来以为同步一下能提升数据安全性,没想到在同步的过程中,数据居然变得更加不安全了!
2 测试结果
根据我对一堆同步软件的测试结果,它们默认都会先移除掉目标目录下的文件,然后才是把新的文件拷贝过去。如果你移动了一堆的文件,会导致在同步的过程中,目标目录下面的文件不完整,此时如果源目录所在的硬盘发生故障,所有数据都会丢失。
许多软件有一个使用“回收站”存放被删除的文件的选项,但是“回收站”满了的时候,它们会静悄悄地把文件永久删除了,非常不可控。所以 "回收站" 并不是解决方案。
有些同步软件有 “历史版本” 的功能,但是用同步软件本来就只想要一个版本,如果要历史版本,为什么不直接用 windows 自带的 “文件历史记录” 呢?
软件 | 长路径 | 原子性同步 | 价格 |
FreeFileSync 11.17 | ✓ | 需要手动模拟 | 免费 |
AllwaySync 21.1.5 | ✓ | ✗ | 免费但是限制文件数量 |
Microsoft SyncToy 2.1 | ✗ | ✗ | 免费 |
DirSync Pro 1.54b1 | ✓ | ✗ | 免费 |
Syncovery 9.46k build 358 | ✓ | 可以调整参数变成先拷贝文件,然后删除文件 | 收费 |
⭐️ FileGee 免费版 11.0.9 | ✓ | ✗ 不管是"镜像同步"还是"增量备份",都没法正确做单版本备份。 | 免费 |
长路径:windows 上的历史遗留问题,很多软件没法处理 > 260 路径长度的文件。如果备份/同步软件不支持长路径,那在备份/同步的时候,会丢失一部分数据。
原子性同步:保证只有新版本的数据同步完成之后,老版本的同步数据才会被自动删除掉。也就是这篇文章讲的内容。
3 DIY 一个靠谱的方案
FreeFileSync 默认的"镜像同步",并且设置 "永久" 删除文件也是不安全的,但是可以通过调整选项,让它变得安全。
注意它的设置中的 "无风险的文件复制" 功能只对于文件名不变,单纯修改了文件内容有效。如果你像我一样改了文件内容,然后改了下文件名,那这个选项是没法保护你的备份数据的。
需要按照下图的方式设置,才能安全同步数据。
上面的设置的工作原理:镜像同步的时候,被删除和修改的文件先移动到历史版本文件夹,然后在任务成功完成的时候,自动执行一个命令,删除历史文件夹里面的内容。注意,失败或者任务中断的时候,命令不会执行,所以历史版本是安全的。同时日志也放到了目标磁盘下,如果源硬盘同步到一半的时候坏掉,可以根据日志手动回滚这次失败的同步。
3.1 在成功时执行的命令
(1) 如果直接从资源管理器里面拷贝路径,获得的是下面的以盘符开头的路径。
"E:\Revisions-freefilesync\atomic mirror"
(2) 但是重新插上移动硬盘后,盘符可能会变化,所以不能使用盘符,需要使用 volume GUID。
在"命令提示符"执行下面的命令,在输出结果的最后几行,会显示盘符和 volume GUID 的映射关系。
mountvol.exe
(3) 然后可以拼接出下面这种以 volume GUID 开头的文件路径
"\\?\Volume{576f2736-1404-46b6-b46e-cf34cc7260f0}\Revisions-freefilesync\atomic mirror"
(4) 把上面的路径放到 rmdir 命令的参数里面,就是完整的命令了。把类似下面的结果直接贴到上图中的 “在成功时” 执行的命令后面的框里就行了。
rmdir /s /q "\\?\Volume{576f2736-1404-46b6-b46e-cf34cc7260f0}\Revisions-freefilesync\atomic mirror"
4 了解更多
- 不同电子设备之间传输和备份文件的方案 这个博客里面写了详细的测试过程和结果