【发布时间】:2017-09-14 21:08:51
【问题描述】:
我有两个关于 SQLite VACUUM(可能还有 WAL)的问题:
• 如果多个进程都打开了 DB,是否需要完成所有进程中的所有 SQL 语句才能使 VACUUM 成功?
• 为什么 VACUUM 有时没有效果(没有回收空间)但 Sqlite 返回 SQLITE3_OK?
关于我的问题的更多细节:
我有 2 个进程访问的 WAL 模式下的数据库。在某些时候,用户可以选择从数据库中删除数据。因为数据库可以被多个进程打开,所以我删除了记录,然后运行 VACUUM 来回收磁盘空间(而不是关闭连接并删除文件)。
问题是,如果 2 个进程打开了 DB 连接,则其中一个进程的 VACUUM 返回 OK,但并没有真正回收空间。
我认为会发生的情况是 VACUUM 不会成功,除非任何进程有任何未完成的 SQL 语句。问题是我不想让这两个进程相互了解。
我正在考虑从两个进程中执行 VACUUM,以便最后关闭连接的那个(根据用户请求删除数据)负责空间回收。我也在考虑使用 auto_vacuum(我知道它的局限性,但 DELETE 在这个数据库上并不是很频繁。
【问题讨论】:
标签: sqlite