delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

30 Nov 2024

数据的长期保存

我们每个人每天都在产生各种数据。包括个人笔记、照片等等在内的许多数据, 许多可能不太容易再次获得或制造。今年夏天,我整理了一些自己二十年前刻录的光盘, 这里记录一下长期保存数据的一些原则、需要避免的陷阱,以及确保数据在数十年后仍然可用的最佳实践。

向前兼容数据格式的重要性

试想一下,在二三十年之后打开一张之前的光盘上的内容,你可能会发现一些包含有用信息的文件, 但现时的软件未必能够读取它们,即使你年轻的时候曾经用 UltraEdit 的十六进制编辑功能去操作这些文件, 在上了年纪之后你未必还会有这样的动力。

数据格式的向前兼容性对于数据可用性至关重要,因为没有了能够处理这些数据的软件,事实上可以认为这些数据已经没用了。

从历史的后视镜来看,这样一些软件产生的数据往往会有比较大的在未来无法解析的风险:

  • 专有的、时效性较高的数据格式。例如关系型数据库的二进制格式很可能在升级了几个版本之后就不再支持了。应对的方法是保持运行这样的软件并按部就班地进行升级迁移。
  • 软件保存的个人配置数据。这类数据往往是会逐步更新的,从软件作者的角度,支持数年以前的用户配置更新很可能是得不偿失的。
  • 商业软件对于开放格式的扩展。这类扩展往往依赖于特定的软件供应商,这些供应商可能在一段时间之后走入历史,并在你的存储中留下一些无法打开的文件。
  • 某些非开源,并且由于各种原因未能广泛流行的压缩软件。

有些软件可能依赖特定的硬件,一旦这些硬件停产,这类软件产生的数据往往也就会面临未来无法访问的风险。 不过,现时的硬件大部分可以接入互联网,因此及时将数据导出可以很大程度上避免此类问题的影响。

一些经验

我认为一般人在处理数据时应该遵循以下一些原则:

  1. 保持充分的备份。保持充分的备份。保持充分的备份。
  2. 避免使用「濒危」的格式保存准备长期保存的数据。例如,文字处理软件的供应商可能在一段时间之后走进历史,这些内容在未来可能就无法重新正确渲染了。及时将这些文件的内容导出成例如 PDF/A 这样的开放、长寿的格式,可以有效地避免在未来遭遇这种问题。
  3. 在许可证允许的前提下,将解析文件的软件及操作系统一起备份。许多时候,在未来可能还可以用模拟器来运行这些软件。
  4. 在可能的前提下,考虑使用简单的、容易被机器处理的格式来保存数据。
  5. 将文件的编码转换为最新的 Unicode,并适时修补文件中的错误,同时保存此检查点之前的版本。
  6. 以5-10年为周期审查数据,确保仍然可以有效地打开它们。

需要注意的是,使用开源软件尽管通常能避免许多这类问题,但也并非万事大吉。 有些软件可能由于过时而不再有人维护,例如我以前很喜欢用的一款 CVS 仓库同步工具 CVSup 就属于这种情况,这个软件是用 Modula-3 实现的,而作者为了 CVSup 专门做了一个简化版本的 Modula-3, 而这个简化版本使用了某个早期的 GCC,最终由于年久失修而不再有人维护,现在只剩了一份可用的二进制版本。 尽管 CVS 本身仍然有持续维护的实现,但是使用 CVSup 逐渐变得不再现实。

个人选择的一些文件格式

  • 文本:我现在通常用使用 Unicode 编码的纯文本或是 Markdown 格式来保存文本。对于其中的数学公式,我目前采用的是 TeX 或类似 TeX 的语法。
  • 文档:我目前采用的方法是原始文档和 PDF/A 处理之后的文档各保存一份。后者的主要考虑是一次性的潜在失真换取未来确保能访问大部分内容。
  • 邮件:Maildir
  • 图片:WebP、HEIF、JPEG、PNG。
  • 结构化数据:XML 和 JSON。
  • 表格数据:导出一份 CSV 备用;关系数据库部分使用一个活的 PostgreSQL 实例,并逼迫自己跟随主流版本升级(包括dump/restore),保存数据的文本版本的dump。
  • LDAP数据:导出一份 LDIF 格式做备份。

当然,对于可以发表的有价值的数据,最好的办法还是发表出去。这样一来,其中值得保存的数据如何持久保存就变成别人的问题了。

数据的长期保存是一个需要技术和战略规划的多层次挑战。通过选择合适的格式、采用冗余备份以及开放标准, 可以确保数据在未来几十年内仍然可用。