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。先学文件与连接以及机制。所有实践本轮未执行;答案用于理论自检,不充当产品验证。
先独立回答
- 为什么普通 INTEGER 列与 STRICT INTEGER 的保证不同?
- 为什么 WAL 不等于多个写者同时执行?
- 两条 CLI 命令之间能否天然共享一个事务?
- 为什么同请求号不同金额应拒绝,而非直接忽略?
- 为什么备份行数一致不等于恢复正确?
SQLite 复习题关注类型亲和、单写者、事务所有权和恢复边界。作答时必须写出场景:普通表还是 STRICT、同连接还是不同连接、在线主文件还是一致性快照,不能只背“支持事务”。
阶段综合实践
SQLite 阶段实践要求读者绘制账本的状态转移:空库 → r1 插入 → r1 重放 → r1 异参数拒绝 → 备份 → 独立只读核对。为每一步写出预期 JSON、退出码、记录数与总分;再设计第二个连接持有写事务的情况,说明有限等待失败后为何要整体重试。
交付物应是过程表、源码阅读注释和结果差异记录,不应只贴一次成功截图。教学项目源码见完整 CLI。本轮禁止执行示例,因此这里只提交理论设计;未来实际结果必须另列环境与证据。
参考解答
SQLite 单写者答案是写事务串行取得资格,WAL 使读者保留快照与写者并行,但不能突破该约束。类型亲和是转换偏好,STRICT 增加存储类型约束,业务的正金额仍靠 CHECK。两个进程各自有连接,事务不会因为命令相邻就自动跨进程延续。
同请求号异参数代表调用方可能把一次请求身份误用于另一次业务,静默忽略会隐藏丢单;因此比较原参数。正确恢复还应确认表结构、索引、外键、业务总额及附件边界。备份 API 生成快照后仍需要恢复演练,不能只凭文件存在宣称可恢复。
后续能力边界
通过本课应能说明何时选择文件库、如何绑定参数、为何缩短事务和怎样定义备份。官方延伸资料:事务隔离、查询计划。加密扩展、多进程压力、崩溃实验、FTS、空间索引和生产容量不在本轮验证范围,不能由静态解析推导其运行正确性。
继续阅读
- 知识专题
- 应用实践
- 知识专题