修复前先保留证据
损坏调查经常破坏证据。运行修复命令前,先复制数据库文件,包括 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,监控磁盘空间,并为关键数据库安排完整性检查。要测试恢复流程,而不只是备份。