使用Time Machine迁移数据导致的OneDrive数据丢失问题

前一段时间,我将我使用的云存储从自托管的NextCloud切换到了OneDrive。就在前两天,我在使用Time Machine在两个macOS设备之间迁移数据时,OneDrive中大量的数据丢失,原本25G的数据仅剩下了3个G。

本文记录了该问题发生的过程,问题发生后的解决方案及可能导致这个问题的原因。

过程

我使用的macOS版本为10.14.5 (18F132) ,OneDrive客户端版本为19.062.0331.0010。

我的OneDrive上大约存储了23G的数据,为了节省硬盘空间,大部分的文件都使用文件随选释放了本地空间,只有少量数据存储在本地的磁盘上。

两天之前我购买了2019款MacBook Pro,并使用Time Machine迁移了旧设备的数据。迁移完成后,OneDrive一直处于正在同步状态,我认为是在进行重建索引一类的操作,所以没有特别在意。期间我收到了如下图所示的来自OneDrive的邮件,提示我从OneDrive删除了大量文件。

然而我检查了回收站之后发现回收站中最新的文件是我当天下午删除的一个文件夹,我以为是那个文件夹里的文件较多引起的误报,所以也没有特别在意。

过了大约一小时,同步终于完成了,然而历史操作里有大量的“已从OneDrive删除”的记录,我这时开始感到事情有些不太对劲了。检查文件夹之后发现,所有我使用文件随选释放的文件被从OneDrive云端删除,只留下空的文件夹。

我按照邮件中的指示检查了回收站,但是其中并没有那些丢失的文件。更糟糕的是,由于这些文件已经在本地被释放,所以Time Machine中也没有他们的备份。也就是说,这些文件在问题发生时仅存储在OneDrive上,而他们已经被删除了且无法从回收站找回。

解决方案

万幸的是,虽然这些文件没有出现在回收站中,但是OneDrive高级版提供了“还原OneDrive”的功能,可以将OneDrive的云端还原到之前某一时间点的状态。选择一个问题发生之前的时间点,并点击还原即可,还原文件需要花费一段时间。

不过这个功能需要Office365订阅,如果没有订阅Office365且不想订阅的话,可以使用Office365家庭版的一个月免费试用,记得在开始扣费之前取消订阅。

分析

通过现象很容易推测出,这些使用文件随选释放的文件在使用Time Machine备份及恢复的过程中丢失了某些元数据,导致这些文件被OneDrive客户端视为已从本地删除,因此删除了OneDrive云端上的副本。

文件随选(File On-demand)是一个近期才在macOS上推出的功能,仅支持macOS Mojave以上,且文件系统必须为APFS。然而Time Machine的备份磁盘使用的是HFS+文件系统。最初,我猜测文件随选功能使用了某些仅有APFS支持的特性,导致在使用HFS+的Time Machine中丢失了一些元数据。

为此我做了一个实验,我在OneDrive文件夹中创建了三个文件,分别设置为”保持在本地“,”本地可用“和“仅在线”三种状态,使用xattr命令观察其扩展属性。

从图中可以看出,“仅在线”的文件相比其他文件多了com.apple.metadata.com_apple_backup_excludeItem属性。也就是说,并非因为HFS+不支持某种属性而丢失了数据,而是这些文件根本就没有被备份到Time Machine中。因此,对于被迁移到新设备上的OneDrive客户端来说,这些文件就是被视为从本地删除了,因而连带着删除了OneDrive云端的副本。

总结

虽然这次事件只是虚惊一场,但是OneDrive团队对此负有不可推卸的责任。即使不能在技术角度规避这个问题,也应当在客户端或帮助文档的明显位置提示潜在的风险。

对于用户来说,即使云存储的可靠性比本地硬盘高很多,我们仍然应当意识到过于依赖云存储服务所隐含的风险。对于重要文件,无论任何情况下都应该保持有多份可用的备份,以防万一。

Show CommentsClose Comments

Leave a comment