使用.recover命令恢复损坏SQLite数据库时遭遇内存不足(OOM)错误
ASCII传输导致SQLite数据库损坏的恢复方案
先修复换行符转换问题
ASCII模式传输会把Unix风格的LF换行转成Windows的CRLF,直接破坏二进制数据库结构,先把字节还原:
- 用二进制编辑器打开损坏的数据库,把所有
0D 0A(CRLF)替换成0A(LF);如果你的手机是Windows系统(少见),反过来把0A替换成0D 0A。 - 用命令行更高效,Linux/macOS下直接跑:
这个命令会去掉每行末尾的CR字符,把被篡改的换行符还原回去。sed 's/\r$//' corrupted.db > fixed.db
解决.recover命令内存不足的问题
直接跑.recover会把整个数据库加载到内存,23MB按理说不该OOM,但可能损坏导致内存溢出,拆分操作就行:
- 先尝试读出数据库里的表名(损坏不严重的话能拿到):
sqlite3 corrupted.db "pragma table_list;" - 然后指定只恢复你需要的健身数据相关表,比如
workouts、exercise_log(根据实际表名调整):
逐个表恢复,内存占用会大幅降低。sqlite3 corrupted.db ".recover workouts exercise_log" > recover.sql
低内存环境下的应急恢复
如果还是OOM,试试轻量分析和部分提取:
- 用
sqlite3_analyzer先扫一遍数据库,找出未损坏的页范围:
打开analysis.txt看哪些页是正常的,针对性提取。sqlite3_analyzer corrupted.db > analysis.txt - 手动提取部分数据库页,SQLite默认页大小是4096字节,先提取前1000页试试:
然后用DB Browser打开partial.db,能恢复多少是多少,逐步增加页数直到出现OOM。dd if=corrupted.db of=partial.db bs=4096 count=1000
验证恢复结果
把恢复出的SQL文件导入新数据库检查:
sqlite3 new.db < recover.sql
用DB Browser打开new.db,看看记录数、数据内容是否符合你6个月健身数据的预期。
内容的提问来源于stack exchange,提问作者ManiacBegbie
相关产品推荐
相关产品推荐

