SQLITE数据库WAL文件大小持续增长

Obl*_*ion 10 sqlite wal

我正在连续写入一个数据库文件,该文件的 PRAGMAjournal_mode=WAL,PRAGMAjournal_size_limit=0。我的 C++ 程序有两个线程,一个读取器(以 15 秒间隔查询)和一个写入器(以 5 秒间隔插入)。

每 3 分钟,我都会暂停插入,以从编写器线程运行 sqlite3_wal_checkpoint_v2(),模式参数为 SQLITE_CHECKPOINT_RESTART。为了确保此时没有正在进行任何活动的读取操作,我设置了一个即将发生检查点的标志,并在运行检查点之前等待读取器完成(连接仍然打开)。检查点完成后,我再次向读者表明可以恢复查询。

sqlite3_wal_checkpoint_v2()返回SQLITE_OK,并且pnLog和Ckpt相等(大约4000),表明完整的wal文件已与主数据库文件同步。所以接下来的编写应该根据文档从头开始。然而,这似乎并没有发生,因为后续写入会导致 WAL 文件无限增长,最终达到一些 GB。

我做了一些搜索,发现读者可能会因开放事务而导致检查点失败。然而,我使用的唯一读取器是在检查点开始之前结束其事务。还有什么可能阻止 WAL 文件不增长?

fed*_*ino 6

这作为答案为时已晚,但可能对其他人有用。

根据SQLite 文档,您的期望应该是正确的,但是如果您阅读这篇SO 文章,在未最终确定的语句的情况下也会出现问题。因此,如果您只是sqlite3_reset()声明,那么数据库可能看起来很忙或因检查点而被锁定。请注意,较高水平的SQLITE_CHECKPOINT_values.

此外,SQLITE_CHECKPOINT_TRUNCATE如果检出操作成功,该值会将-wal文件截断为零长度。这可以帮助您检查所有页面是否已插入数据库中。

另一个关于-wal文件由于未最终声明而变得越来越大的讨论是这样的