目标
本地 SQLite 存储在大量删除后体积翻倍,但就地 VACUUM 会锁住应用。本配方用 VACUUM INTO 在不锁原库的情况下生成压缩副本,校验完整性后用 mv 原子替换,并在替换前暂停写入,从而安全地回收空间,避免长时间停机。
步骤要点
- 用 VACUUM INTO 生成压缩副本,原库保持可读。
- 对副本执行 PRAGMA integrity_check 校验。
- 在暂停写入的窗口内用 mv 原子替换。
- 确认新文件更小且应用可正常打开。
sqlite3 app.db "VACUUM INTO '/var/data/app.compact.db';"
ls -l app.db app.compact.db
排错提示
- 旧版 SQLite 不支持 VACUUM INTO,需升级或对副本加独占锁。
- 替换操作只对重新打开的文件原子,必须先停写入。
- WAL 模式需先做 checkpoint。
适用边界
- 需要额外的空闲磁盘空间。
- 不能与写入并发执行。