我们正在 SQLite 数据库上执行相当大的事务,这导致 WAL 文件变得非常大。 (对于大型事务,有时高达 1GB。)有没有办法在事务过程中检查 WAL 文件?当我尝试调用 sqlite3_wal_checkpoint()
或执行 WAL 检查点 PRAGMA 语句时,两者都会返回 SQLITE_BUSY。
最佳答案
不是真的。这就是事务的全部要点:WAL(或日志文件)保存一旦成功提交就会成为正式数据的数据。在此之前,如果出现任何问题 - 程序崩溃、计算机重新启动等,WAL 或日志文件允许安全地回滚(撤消)未提交的操作。仅移动此未提交事务的一部分将达不到目的。
请注意,SQLite 文档将检查点定义为 moving the WAL file transactions back into the database 。换句话说,检查点从 WAL 中移动一个或多个事务,但不是巨大的未提交事务的一部分。
您的问题有几种可能的解决方案:
- 避免巨大的事务 - 如果可以的话,以较小的 block 提交。当然,这并不总是可行,具体取决于您的应用程序。
- 通过
PRAGMA Journal_mode=DELETE
使用旧的日记模式。它比新的 WAL 模式(使用PRAGMAjournal_mode=WAL
)稍慢,但根据我的经验,它往往会创建更小的日志文件,并且当事务成功提交时它们会被删除。例如,Android 4.x 仍在使用旧的日志模式 - 它往往在闪存上运行得更快,并且不会创建巨大的临时或日志文件。
关于c - 可以在事务期间检查 WAL 文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17759706/