我有两个关于SQLite VACUUM(可能还有WAL)的问题:
•如果多个进程打开了数据库,那么是否需要最终确定所有进程中的所有SQL语句才能使VACUUM成功?
•为什么VACUUM有时会没有效果(没有回收空格)但是Sqlite会返回SQLITE3_OK?
关于我的问题的更多细节:
我在WAL模式下的数据库由2个进程访问。在某些时候,用户可以选择从数据库中删除数据。因为数据库可以由多个进程打开,所以我删除了记录,然后运行VACUUM来回收磁盘空间(而不是关闭连接并删除文件)。
问题是如果2个进程打开了DB连接,其中一个进程的VACUUM返回OK,但不会真正回收空间。
我认为发生的事情是VACUUM不会成功,直到来自任何进程的任何未完成的SQL语句。问题是我不想让这两个过程相互了解。
我正在考虑从两个进程执行VACUUM,以便最后关闭连接(根据用户请求删除数据),负责空间回收。我也在考虑auto_vacuum(我知道它的局限性,但DELETE在这个数据库上并不常见。
答案 0 :(得分:0)
如果存在打开的事务,或者在运行时有一个或多个活动的SQL语句,则VACUUM将失败。
与任何其他类型的数据库修改一样,可写事务要求没有其他读或写事务处于活动状态;这通常要求重置或最终确定所有陈述。
在WAL模式下,写入事务不会被其他读取事务阻止,但这需要保留旧数据。除真空外,你应该initiate a truncate checkpoint。
处理此问题的最简单方法是根本不运行VACUUM;自由空间将在以后重复使用。