dka*_*ich 2 c database memory sqlite sqlite-journal-mode
我们正在 SQLite 数据库上执行相当大的事务,这导致 WAL 文件变得非常大。(对于大型事务,有时高达 1GB。)有没有办法在事务过程中检查 WAL 文件?当我尝试调用sqlite3_wal_checkpoint()或执行 WAL 检查点 PRAGMA 语句时,两者都返回 SQLITE_BUSY。
并不真地。这就是事务的全部要点:WAL(或日志文件)保存一旦成功提交就会成为正式数据的数据。在此之前,如果出现任何问题 - 程序崩溃、计算机重新启动等,WAL 或日志文件允许安全地回滚(撤消)未提交的操作。仅移动此未提交事务的一部分将达不到目的。
请注意,SQLite 文档将检查点定义为将 WAL 文件事务移回数据库。换句话说,检查点从 WAL 中移动一个或多个事务,但不是巨大的未提交事务的一部分。
您的问题有几种可能的解决方案:
PRAGMA journal_mode=DELETE. 它比新的 WAL 模式(使用 )稍慢PRAGMA journal_mode=WAL,但根据我的经验,它往往会创建更小的日志文件,并且当事务成功提交时它们会被删除。例如,Android 4.x 仍然使用旧的日志模式 - 它往往在闪存上运行得更快,并且不会创建巨大的临时或日志文件。