Watch at Ease看见世界,读懂生活。

科技 · 实用指南

SQLite 报“database disk image is malformed”?恢复前先保全原件

把 SQLITE_CORRUPT 当作证据保全事件。停止写入,连同 journal/WAL 伴随文件保存数据库,对只读副本做哈希,只向新文件恢复,并在替换前验证约束、总量与应用行为。

SQLite 报“database disk image is malformed”?恢复前先保全原件
原创技术示意图: evidence and working-copy boundary. Watch at Ease

把 SQLITE_CORRUPT 当作证据保全事件。停止写入,连同 journal/WAL 伴随文件保存数据库,对只读副本做哈希,只向新文件恢复,并在替换前验证约束、总量与应用行为。

导入成功只说明 SQL 能执行,不证明每个恢复值都正确。

1. 停止变化并确认准确文件

停止应用及所有可能写数据库的 worker。记录解析后的路径、SQLite 库与 CLI 版本、文件大小、时间戳和第一份完整错误;不要在唯一副本上运行 VACUUM、REINDEX 或写入型 pragma。

若使用 rollback journal 或 WAL,数据库要和匹配的 -journal、-wal、-shm 一起保留。分离热 journal/WAL 会破坏自动恢复并制造误导副本。

2. 建立证据副本与工作副本

对原文件组做哈希并设为只读,所有恢复都用独立工作副本。普通文件复制仅在写入者停止后安全;健康的在线库应使用 SQLite backup API、VACUUM INTO 或 sqlite3_rsync。

保留一组不动的证据,并记录每条命令、工具版本和输出文件名。部分成功的结果绝不能覆盖原件;若怀疑存储或硬件故障,应先保存设备证据。

3. 在副本上诊断,不承诺修好

在工作副本运行 PRAGMA integrity_check,保存所有返回行。它检查底层结构、缺页/重复页和部分约束;外键需另跑 PRAGMA foreign_key_check。

另一副本返回 ok 不能证明原件正常。确认实际打开的文件,并比较 schema、page count 和关键表可读性;把 I/O 错误与 SQLITE_CORRUPT 分开记录。

4. 优先恢复备份,再做抢救

先验证已知良好备份。没有足够备份时,对工作副本运行当前 SQLite CLI 的 .recover,把 SQL 重定向到新文件,再导入另一个新数据库;绝不能覆盖原件。

SQLite 将 recovery 定义为 salvage:已删除行可能重现、值可能改变、约束可能失败、记录可能进入 lost_and_found。.dump 遇损坏会停止,.recover 可能取回更多,但都不保证正确。

5. 回服前验证

对恢复库运行 integrity_check、foreign_key_check,并检查 UNIQUE/CHECK、行数、关系、日期范围、余额和关键总量;审阅 lost_and_found,并与最后良好备份或外部记录比较。

只有应用测试也通过,才在新备份与回滚方案下切换。保留原证据,披露缺失/变更数据,并调查不安全复制、journal 分离、文件系统、越界写或应用内存错误。

SQLite 报“database disk image is malformed”?恢复前先保全原件
原创技术示意图: recovered-file validation and return-to-service boundary. Watch at Ease