← 中文资源

简体中文版本

SQLite — database disk image is malformed

用完整性检查诊断 SQLite 损坏,保留文件,通过 .recover 或导出恢复数据,并修复磁盘或生命周期根因。

阅读英文原文

修复前先保留证据

损坏调查经常破坏证据。运行修复命令前,先复制数据库文件,包括 WAL 和共享内存文件。然后在副本上运行 PRAGMA integrity_check 并记录输出。如果应用仍打开数据库,先停止写入。

cp app.db app.db.corrupt
sqlite3 app.db 'PRAGMA integrity_check;'

恢复到新文件

如果有经过验证的备份,恢复并补回缺失部分。否则使用 sqlite3 app.db ".recover" | sqlite3 recovered.db 把可读行抢救到新数据库。比较计数和关键记录;恢复的数据可能缺少损坏页。修复期间绝不要让应用指向损坏文件。

修复根因

损坏是不安全写入生命周期的症状。检查磁盘空间、供电稳定性,以及数据库是否位于 NFS 或 SMB 上。不使用备份 API 直接复制运行中的数据库,会产生不一致文件。使用 SQLite 备份 API 或停止进程。在同样损坏的文件系统上恢复,数据库会再次损坏。

验证与预防

对恢复文件运行完整性检查,测试应用读写,并保留损坏副本直到事故关闭。启用 WAL 和 busy timeout,监控磁盘空间,并为关键数据库安排完整性检查。要测试恢复流程,而不只是备份。