SQLite 备份和迁移,两步别搞反

SQLite 有个让人放松的特点:整个数据库就是一个文件。但也正因为这样,很多人直接把文件复制走当备份,然后在某天发现复制出来的那份是坏的。SQLite 数据怎么备份和迁移,关键是别在别人正在写的时候动那个文件。

一、先给结论

备份和迁移用的是同一个前提:你要拿到的是一份一致的快照,不是一份时间点混乱的文件。

服务在跑的时候直接复制,可能只复制到已提交的一部分页。文件看着在,打开却报损坏。所以顺序是先保证一致性,再谈搬运。

这个问题在小项目里特别容易被忽略,因为数据量小、复制得快,出问题的概率看着不高。但「概率不高」和「不会发生」是两回事,一旦发生在你自己身上就是全部。

所以我建议把备份当成一个固定动作,而不是出事前的临时操作。

二、第一步:把备份和迁移分成两件事

很多人把这两个动作混在一起做,结果出问题时不知道是哪一步错了。

备份是「留一份现在的样子」,迁移是「让它在另一台机器上跑起来」。备份的目标是能恢复,迁移的目标是能启动。

具体动作:先定下备份放哪、留几份,再去想迁移。顺序反了,迁移过程中出错就没有退路。

三、SQLite 数据怎么备份和迁移:先拿一份一致快照

不要用文件复制命令去拿运行中的数据库。

SQLite 提供了在线的备份接口,能在服务运行的同时导出一份一致的数据;命令行工具也有对应的导出方式。这些方式会正确处理正在进行的写入。

具体动作:把备份写成一条固定命令,别每次手动敲。手动做事迟早会漏。

规则细节上,以 SQLite 官方文档的口径为准,不同版本的参数名有变化,不要照搬旧教程。

四、第三步:迁移前先在目标机器上还原一次

这是最容易被跳过的一步:备份文件生成出来,从来没人试着还原过。

做法很简单,在目标机器上把备份还原成一个临时库,跑几条查询确认数据在。只有还原成功过的备份才叫备份。

具体动作:在目标机器上还原一次,并连上你的程序跑一遍最常用的那条查询。

五、第四步:迁移时先停写,再换文件

切到新机器的那一刻,必须保证老机器不再写。

做法是先停掉写入入口,确认没有正在进行的事务,再复制文件过去。带写入状态的文件搬走,新老两边都会有问题。

具体动作:写一个停机检查清单,包含「确认无进行中的写事务」这一条。

六、第五步:留下回退的路,并检查两个常见卡点

切换之后老文件不要马上删。

如果新机器上启动失败,你需要能立刻切回去。删除这一步留到最后确认无问题之后再做。

具体动作:迁移完成后保留原文件一段时间,确认稳定了再清理。磁盘便宜,返工很贵。

另外两个卡点提前说一下。一是备份文件大小跟原文件差很多,可能是用了逻辑导出而不是物理快照,两者结果不同,看你需要哪种。

二是迁移后发现自增 ID 或时间字段对不上,多半是导出时用了带时区差异的方式,或者程序里有依赖本地时间的逻辑。

常见问题

Q:SQLite 能不能直接复制文件做备份?

A:服务停止、确认没有写入时可以直接复制。服务在跑的时候要用数据库提供的备份方式,否则拿到的可能是不完整的文件。

Q:备份多久做一次合适?

A:取决于你能接受丢多少数据。先想清楚这个容忍度,再倒推频率,而不是照搬别人的周期。

Q:迁移到新机器后程序连不上,先查什么?

A:先查文件路径和权限,再查驱动版本。路径写错和权限不足是这类问题里最常见的两个原因。

相关阅读


本文作者西米,37 岁程序员,一个人加五个 AI 员工在跑一家公司。踩过的坑和真实账本都写在公众号「西米分享」。

完整代码、踩坑清单与最新进展,都在公众号。

📱 关注公众号「西米分享」