我们正在SQLite数据库上执行相当大的事务,导致WAL文件变得非常大。 (对于大型事务,有时最高可达1GB。)有没有办法在事务中间检查WAL文件?当我尝试调用sqlite3_wal_checkpoint()
或执行WAL检查点PRAGMA语句时,都返回SQLITE_BUSY。
答案 0 :(得分:4)
不是真的。这是交易的全部要点:WAL(或日志文件)保留一旦成功提交就会成为官方数据。在此之前,如果出现任何问题 - 程序崩溃,计算机重启等,WAL或日志文件允许安全回滚(撤消)未提交的操作。仅移动此未提交事务的一部分将失败该目的。
请注意,SQLite文档将检查点定义为moving the WAL file transactions back into the database。换句话说,检查点从WAL移动一个或多个事务,但不是巨大的未提交事务的一部分。
您的问题可能解决方案很少:
PRAGMA journal_mode=DELETE
的旧日记模式。它比新的WAL模式(PRAGMA journal_mode=WAL
)略慢,但根据我的经验,它往往会创建更小的日志文件,并在事务成功提交时被删除。例如,Android 4.x仍在使用旧的日记模式 - 它在Flash上运行速度更快,并且不会创建大量的临时或日志文件。