是什么阻止了 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 和共享内存文件仍然存在,即使在关闭浏览器之后也是如此。
奇怪的是,这是有帮助的。我压缩了这三个文件以在本地进行调查,但我预感我删除了原件并再次提取文件。启动应用程序需要几秒钟,多余的文件就这样消失了。同样的事情发生在我的笔记本电脑上,解压后的文件。我 运行 我的机器上的完整性检查和数据库似乎没问题。
这是应用程序的粗略描述,如果它有意义的话。
- EF Core 2.1.14(它使用 SQLite 3.28.0)
- .Net Framework 4.7.1
- 除了一些罕见的与只读访问的短暂重叠,只有一个线程访问数据库
- 整个连接 (DbContext) 最多大约每 2 秒关闭一次
- 共享内存用于
PRAGMA mmap_size = 268435456
(256 MiB)
- 同步模式为
NORMAL
- OS 是 Windows 7
知道是什么导致了这个……怪癖吗?
我暂时切换到日志模式,这有助于报告错误而不是默默地失败。
我遇到的错误是 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 安排碎片整理。
我遇到过三个 WAL 文件在具有相同硬件和软件设置的两台不同机器上增长到 ~3 GB 的巨大大小的案例。数据库文件本身约为 7 GB。在正常运行时,WAL 要么不存在,要么只有几千字节。
我知道只要有一个持续打开的连接,WAL 就会增长是正常的,但即使关闭应用程序也不会摆脱 WAL 文件或共享内存文件。即使重新启动机器,而无需启动我的应用程序,并尝试使用 DB Browser for SQLite 打开数据库也无济于事。启动需要很长时间(我不知道具体多长时间,但肯定超过 5 分钟)然后 WAL 和共享内存文件仍然存在,即使在关闭浏览器之后也是如此。
奇怪的是,这是有帮助的。我压缩了这三个文件以在本地进行调查,但我预感我删除了原件并再次提取文件。启动应用程序需要几秒钟,多余的文件就这样消失了。同样的事情发生在我的笔记本电脑上,解压后的文件。我 运行 我的机器上的完整性检查和数据库似乎没问题。
这是应用程序的粗略描述,如果它有意义的话。
- EF Core 2.1.14(它使用 SQLite 3.28.0)
- .Net Framework 4.7.1
- 除了一些罕见的与只读访问的短暂重叠,只有一个线程访问数据库
- 整个连接 (DbContext) 最多大约每 2 秒关闭一次
- 共享内存用于
PRAGMA mmap_size = 268435456
(256 MiB) - 同步模式为
NORMAL
- OS 是 Windows 7
知道是什么导致了这个……怪癖吗?
我暂时切换到日志模式,这有助于报告错误而不是默默地失败。
我遇到的错误是 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 安排碎片整理。