3

如果使用预写日志记录的 SQLite 数据库被未检查点的事务中断(由于电源故障或其他原因),然后在缺少临时 -wal 文件的情况下重新打开,数据库是否会干净地打开到上一个检查点时的状态,还是会以某种方式损坏?

我们正在尝试让 SQLite 与 iCloud 一起工作(是的,我们知道你不应该这样做,但我们还制作了一个 Windows 和一个 Android 应用程序,并且需要一个跨平台的数据库解决方案),我们认为 WAL 提供避免维护我们数据库的两个副本的潜在方法 - 我们将 -wal 文件保存在 iCloud 之外,但将主数据库存储在其中,从而避免 iCloud 备份回滚日志(或备份数据库中途-没有这些日志的交易)。

4

3 回答 3

4

文件格式文档提到了“热 WAL 文件”,但这仅适用于未提交的数据。

数据库文件本身不包含有关-wal文件中已提交数据的任何信息,即检查点之前的事务通常根本不会改变主数据库文件。因此,删除-wal文件只会将数据库恢复到上次检查点之后的状态(已过时,但一致);以后提交的所有事务都将丢失。

于 2013-07-31T19:17:36.587 回答
1

请参阅 SQLite 的预写日志的“检查点”部分。据我了解,WAL 文件中的数据根本不会被提交。

换句话说,您会丢失 .WAL 文件中尚未提交的数据,但主数据库本身应该完全没问题。

于 2013-07-31T16:44:16.290 回答
0

在检查点操作期间删除 WAL 文件时,可能会导致数据库损坏。如果未完成 db 修改,则需要 WAL 文件来完成更改,否则 db 文件处于临时状态。
DB 和 WAL 文件创建了 db 状态的完整图片。https://www.sqlite.org/howtocorrupt.html#delhotjrnl
中还明确指出“ SQLite 必须查看日志文件才能从崩溃或电源故障中恢复。”

于 2015-03-03T07:59:57.643 回答