2

我们正在 SQLite 数据库上执行相当大的事务,这导致 WAL 文件变得非常大。(大型事务有时高达 1GB。)有没有办法在事务中间检查 WAL 文件?当我尝试调用sqlite3_wal_checkpoint()或执行 WAL 检查点 PRAGMA 语句时,两者都返回 SQLITE_BUSY。

4

1 回答 1

5

并不真地。这是事务的全部要点:WAL(或日志文件)保存一旦成功提交就会成为官方的数据。在此之前,如果出现任何问题 - 程序崩溃、计算机重新启动等,WAL 或日志文件允许安全地回滚(撤消)未提交的操作。仅移动此未提交事务的一部分会破坏目的。

请注意,SQLite 文档将检查点定义为将 WAL 文件事务移回数据库。换句话说,检查点从 WAL 中移动一个或多个事务,但不是巨大的未提交事务的一部分。

您的问题有几个可能的解决方案:

  • 避免大量事务——如果可以的话,以较小的块提交。当然,这并不总是可行的,具体取决于您的应用程序。
  • 将旧的日记模式与PRAGMA journal_mode=DELETE. 它比新的 WAL 模式(带有 )稍慢PRAGMA journal_mode=WAL,但根据我的经验,它往往会创建更小的日志文件,并且在事务成功提交时它们会被删除。例如,Android 4.x 仍在使用旧的日志模式——它往往在闪存上运行得更快,并且不会创建巨大的临时文件或日志文件。
于 2013-07-20T07:47:20.757 回答