SQLite3 备份与 sqlite3_backup API:热备、增量思路与跨版本恢复

1 为什么不要 cp 运行中的 db

WAL 模式下,热拷贝文件 可能得到 不一致三元组 (主库、-wal、-shm);即使用 备份 API ,也应理解 一致性快照 由引擎协调。

2 sqlite3_backup 流程(逻辑)

  1. 打开 目标 空库或覆盖策略明确的库;
  2. sqlite3_backup_init(pDest, "main", pSrc, "main")
  3. 循环 sqlite3_backup_step(pBackup, nPage)分页 step 可把备份打散到事件循环,降低长尾阻塞;
  4. sqlite3_backup_finish,检查错误码;失败路径仍要 释放

3 .backup / .restore(交互 sqlite3)

text 复制代码
.backup dest.db

适合运维脚本 sqlite3 main.db ".backup backup.db"(注意引号与路径)。restore 思路对称:从备份文件 attach/导入视版本而定,生产多用 应用侧重新指向备份文件 恢复。

4 增量备份「思路」

SQLite 无通用 binlog;所谓增量通常是:

  • 文件系统级增量 (ZFS/btrfs/块设备快照)叠在 周期全量 之上;
  • 应用层变更日志(CDC)另行存储------已超出 SQLite 内核。

对嵌入式:每日全量热备 + 异地拷贝 往往比过度设计增量更可靠。

5 跨版本恢复注意事项

  • 低版本 sqlite 打开高版本生成的新格式 可能失败;
  • 迁移路径:老版本打开 → VACUUM INTO 或导出 SQL → 新版本导入(以官方迁移指南为准);
  • integrity_check业务冒烟 必经。

6 生产备份策略骨架

  • RPO/RTO 数字写进 Runbook;
  • 备份文件校验 :sha256 + 定期 演练恢复
  • 密钥与 PII :备份副本 加密与权限
  • WAL :热备仍推荐 backup API,不要裸拷。

7 与 GitOps

  • backup.yml 作业:cron + 告警 + 留存周期;
  • Artifact 命名含 SQLite 版本号,便于追溯。

8 错误码与排障(backup_step)

sqlite3_backup_step 返回 SQLITE_BUSYSQLITE_LOCKED 时,勿无限循环硬顶:应 退避 并记录 当前 remaining 页数 (若 API 可查)。返回 SQLITE_OK仍有剩余 时继续 step;DONE 后务必 finish 并检查 目标库 PRAGMA integrity_check 。运维脚本要对 非零退出码 触发告警,而不是「备份文件生成了但为空」。

9 与对象存储、合规

备份上传到 S3 兼容存储 时,开启 服务端加密生命周期策略 (冷存储降本)。个人数据场景注意 GDPR/个人信息保护法 :备份副本 最小权限 + 定期销毁,与业务库同等级审计。

10 与 VACUUM INTO 的协同(发行线)

当目标不仅是 一致副本 还要 收缩文件 时,可在 副库 上先 VACUUM INTO packed.db 再上传对象存储,作为 只读发行 artifact ;主库仍用 backup API 保业务连续。两条链路 不要混用同一文件名,避免演练时覆盖冷备。

总结

热备靠 sqlite3_backup_* ,演练靠 定时 restore 。把「增量」留给 基础设施 ,把「一致」留给 官方 API