SQLite 带 .db‑shm、.db‑wal 文件备份迁移,热备份
·
Linux 命令行执行(进入 db 所在目录)
sqlite3 your_app.db ".backup backup_$(date +%Y%m%d).db"
.backup 是 SQLite 官方热备份 API,不管 wal/shm,直接生成一个已经合并完毕的独立 db 文件
方案 B:停止服务后,执行 FULL checkpoint
sqlite3 your_app.db "PRAGMA wal_checkpoint(FULL);"
输出类似:0|0|0 代表成功,wal 会被截断清空。 执行完之后,.db‑wal 文件会变得很小 / 0 字节,.db‑shm 可以直接删除。
.db 主数据库,.db‑wal 是写前日志,.db‑shm 是共享内存索引文件
直接复制这三个文件在文件被程序打开时,很容易出现数据库损坏、数据丢失。
有时候GUI界面已经关闭退出了,但`.db‑wal`、`.db‑shm`文件还是可能会残留磁盘。
例如:如果你只是关闭 GUI 窗口,但**ORM / 连接没有执行 close ()**:进程退出由操作系统回收句柄,**不会触发任何 checkpoint**,wal/shm 残留。
FastAPI/GUI 如果开启多线程多连接,只要还有任意一个连接没关闭,就算你关了主连接,PASSIVE 直接跳过合并。
FastAPI 服务停止(systemctl stop):
- 如果 gunicorn/uvicorn 正常优雅关闭,peewee 执行 db.close () → PASSIVE checkpoint;如果有多个 worker 多连接,经常合并失败,wal/shm 留在磁盘。
- 如果 kill‑9 强制杀进程:完全不触发 checkpoint。
什么时候 wal/shm 才会消失?
- 全部进程 / 全部连接全部关闭 + 下次任意进程打开数据库,SQLite 此时才会清理删除
.db‑shm;wal 不一定清空,要看 checkpoint。
现象:你关闭所有 GUI 程序,磁盘还看得到 db‑wal、db‑shm;再打开一次数据库再关闭,shm 才消失,wal 还可能存在。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)