Skip to content

SQLite:备份、锁等待与恢复练习 ​

备份、检查与锁故障 ​

前置是主文件、WAL、连接及事务。适用 SQLite 3.37+ 3.x 和 CPython 3.12+,核对 2026-10-17。本轮命令全部未执行;以下是维护方法和预期,不是恢复成功证据。

在线备份与恢复边界 ​

SQLite backup API 为活动数据库生成一致性快照,CLI .backup 和 Python Connection.backup 都是可考虑的接口。直接复制活动主文件可能漏掉 WAL 的已提交页;分别复制 db 和 wal 也不能自动得到同一时刻状态。备份不是只做一次复制,还要选择新位置恢复、核对完整性和业务结果。官方备份 API

本例 backup 会创建新目标,不覆盖旧文件;源可能在备份期间被其他连接写入,API 处理页面复制与并发协调,但文件系统空间、锁和 I/O 错误仍会失败。目标中只包含数据库内容,不包含业务附件、密钥、应用配置或异机灾备策略。加密也不是 SQLite 核心默认能力,不能把文件复制当成安全传输。

独立副本校验 ​

SQLite integrity_check 返回 ok 表示结构检查未发现相关问题,不证明金额正确,也不代替 foreign_key_check。读者恢复时可只读打开 ledger-copy.db,用相同 GROUP BY 结果与源的同一业务时点对照,再检查主键唯一性和总额。不要覆盖正在使用的源文件来“试验恢复”。官方 PRAGMA

逻辑 .dump 可用于审阅 SQL,但它与 CSV 的能力不同:CSV 通常不携带表约束、索引和事务意图,导回前需明确列、NULL 表示、编码及目标表结构。旧手册 .output backup.sql 会覆盖输出,最后 .output stdout 才恢复终端显示。练习:只比行数是否够?解答:不够,两个错误金额也能保持相同行数,应比较确定顺序的业务字段或聚合校验值。

SQLITE_BUSY 与长事务 ​

SQLite SQLITE_BUSY 通常表示其他连接占用所需锁,database is locked 需要从连接和事务生命周期排查。先确认哪个进程持有文件、事务是否忘记结束、写事务内是否做了外部等待。busy_timeout 或 connect(timeout=2) 只提供有限等待。不要在未知事务状态中无条件重试并重复写业务数据。

WAL 膨胀常与长读快照阻挡 checkpoint 有关,应先结束不必要的读事务,再选择合适检查点策略;删除 -wal 文件会破坏恢复所需状态。生产调查还要记录磁盘空间、目录权限、SQLite 版本和实际 journal_mode。锁诊断不等于为了修复去禁用事务。

文件错误与维护练习 ​

SQLite no such table 首先核对绝对路径、mode=rw 与 sqlite_schema,避免把误创建空文件当成迁移丢失。readonly database 可能是文件或目录不可写;disk I/O error 要调查底层存储而非反复清库。共享同一连接到多个线程也需要遵守驱动限制,关闭 check_same_thread 不会自动给业务事务加锁。

练习:备份成功但附件丢失属于何种失败?参考答案:数据库快照与完整应用恢复边界不同,必须额外制定附件及配置备份清单。更深入的故障注入、跨平台锁行为、断电恢复和容量基准本轮均未测,不写成已通过。

复习与阶段实践 ​

本篇适用 SQLite 3.37+ 3.x、CPython 3.12+,核对 2026-10-17。先学文件与连接以及机制。所有实践本轮未执行;答案用于理论自检,不充当产品验证。

先独立回答 ​

  1. 为什么普通 INTEGER 列与 STRICT INTEGER 的保证不同?
  2. 为什么 WAL 不等于多个写者同时执行?
  3. 两条 CLI 命令之间能否天然共享一个事务?
  4. 为什么同请求号不同金额应拒绝,而非直接忽略?
  5. 为什么备份行数一致不等于恢复正确?

SQLite 复习题关注类型亲和、单写者、事务所有权和恢复边界。作答时必须写出场景:普通表还是 STRICT、同连接还是不同连接、在线主文件还是一致性快照,不能只背“支持事务”。

阶段综合实践 ​

SQLite 阶段实践要求读者绘制账本的状态转移:空库 → r1 插入 → r1 重放 → r1 异参数拒绝 → 备份 → 独立只读核对。为每一步写出预期 JSON、退出码、记录数与总分;再设计第二个连接持有写事务的情况,说明有限等待失败后为何要整体重试。

交付物应是过程表、源码阅读注释和结果差异记录,不应只贴一次成功截图。教学项目源码见完整 CLI。本轮禁止执行示例,因此这里只提交理论设计;未来实际结果必须另列环境与证据。

参考解答 ​

SQLite 单写者答案是写事务串行取得资格,WAL 使读者保留快照与写者并行,但不能突破该约束。类型亲和是转换偏好,STRICT 增加存储类型约束,业务的正金额仍靠 CHECK。两个进程各自有连接,事务不会因为命令相邻就自动跨进程延续。

同请求号异参数代表调用方可能把一次请求身份误用于另一次业务,静默忽略会隐藏丢单;因此比较原参数。正确恢复还应确认表结构、索引、外键、业务总额及附件边界。备份 API 生成快照后仍需要恢复演练,不能只凭文件存在宣称可恢复。

后续能力边界 ​

通过本课应能说明何时选择文件库、如何绑定参数、为何缩短事务和怎样定义备份。官方延伸资料:事务隔离、查询计划。加密扩展、多进程压力、崩溃实验、FTS、空间索引和生产容量不在本轮验证范围,不能由静态解析推导其运行正确性。

继续阅读