SQLite 中发现一个错误,可能会破坏数据库 16 年

一个备份破坏了它应该保存的内容。

来源:安全实验室新闻频道

一个备份破坏了它应该保存的内容。

几个丢失的数据库页面破坏了整个 VPN 基础设施。 Tailscale 专家花了六个月的时间寻找意外故障的原因,并发现了一个罕见的 SQLite 错误,该错误自 2010 年以来一直未被发现。

Tailscale 在 2025 年 8 月开始的一系列数据库损坏事件后宣布完成调查。为了找到问题,开发人员需要 SQLite 创建者的帮助以及详细记录文件操作的新诊断工具。

Tailscale 基于 WireGuard 协议创建私有的点对点网络,直接连接计算机、服务器、网络存储和其他设备。每个专用网络(该公司称之为尾网)都在多个服务器之一上运行。连接信息存储在 Tailscale 自 2022 年起使用的 SQLite 数据库中。

备份系统每隔几分钟创建一个数据库的完整快照,并将 SQLite 文件上传到 S3 存储。 2025 年 8 月,在准备副本期间,开始定期出现数据损坏的报告。无法找到失败发生的一般条件,而且当时底层代码已经几个月没有改变了。

工程师检查了所有访问SQLite的组件,但初步审计并未揭示原因。该团队始终如一地消除了调用 close() 后的 POSIX 锁违规、内存管理错误以及使用禁用线程安全的多线程数据库。每发现一个新病例后,专家都会扩大诊断范围并收集更多信息。

怀疑逐渐转向SQLite检查点机制。为了加快速度,数据库首先将更改写入称为预写日志或 WAL 的单独预写日志。在检查点期间,累积的页面从日志传输到主数据库文件。