是什么阻止了 SQLite WAL 文件被清除?

What could be preventing SQLite WAL files from being cleared?

我遇到过三个 WAL 文件在具有相同硬件和软件设置的两台不同机器上增长到 ~3 GB 的巨大大小的案例。数据库文件本身约为 7 GB。在正常运行时,WAL 要么不存在,要么只有几千字节。

我知道只要有一个持续打开的连接,WAL 就会增长是正常的,但即使关闭应用程序也不会摆脱 WAL 文件或共享内存文件。即使重新启动机器,而无需启动我的应用程序,并尝试使用 DB Browser for SQLite 打开数据库也无济于事。启动需要很长时间(我不知道具体多长时间,但肯定超过 5 分钟)然后 WAL 和共享内存文件仍然存在,即使在关闭浏览器之后也是如此。

奇怪的是,这是有帮助的。我压缩了这三个文件以在本地进行调查,但我预感我删除了原件并再次提取文件。启动应用程序需要几秒钟,多余的文件就这样消失了。同样的事情发生在我的笔记本电脑上,解压后的文件。我 运行 我的机器上的完整性检查和数据库似乎没问题。

这是应用程序的粗略描述,如果它有意义的话。

知道是什么导致了这个……怪癖吗?

我暂时切换到日志模式,这有助于报告错误而不是默默地失败。

我遇到的错误是 SQLITE_IOERR_WRITE. After more digging, it turned out the root Windows error causing all this was 665 - hitting into an NTFS file system limitation. An answer here 然后我找到了真正的原因:数据库的极端文件碎片。

复制文件减少了碎片,这就是为什么我提到的奇怪的修复,复制文件,暂时有效。实际修复是使用 Sysinternals 的 Contig 安排碎片整理。