← 中文资源

简体中文版本

安全地离线压缩 SQLite

用 VACUUM INTO 回收 SQLite 空间,再原子替换文件,避免阻塞在线应用。

阅读英文原文

目标

本地 SQLite 存储在大量删除后体积翻倍,但就地 VACUUM 会锁住应用。本配方用 VACUUM INTO 在不锁原库的情况下生成压缩副本,校验完整性后用 mv 原子替换,并在替换前暂停写入,从而安全地回收空间,避免长时间停机。

步骤要点

  1. 用 VACUUM INTO 生成压缩副本,原库保持可读。
  2. 对副本执行 PRAGMA integrity_check 校验。
  3. 在暂停写入的窗口内用 mv 原子替换。
  4. 确认新文件更小且应用可正常打开。
sqlite3 app.db "VACUUM INTO '/var/data/app.compact.db';"
ls -l app.db app.compact.db

排错提示

  • 旧版 SQLite 不支持 VACUUM INTO,需升级或对副本加独占锁。
  • 替换操作只对重新打开的文件原子,必须先停写入。
  • WAL 模式需先做 checkpoint。

适用边界

  • 需要额外的空闲磁盘空间。
  • 不能与写入并发执行。