You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用.recover命令恢复损坏SQLite数据库时遭遇内存不足(OOM)错误

ASCII传输导致SQLite数据库损坏的恢复方案

先修复换行符转换问题

ASCII模式传输会把Unix风格的LF换行转成Windows的CRLF,直接破坏二进制数据库结构,先把字节还原:

  • 用二进制编辑器打开损坏的数据库,把所有0D 0A(CRLF)替换成0A(LF);如果你的手机是Windows系统(少见),反过来把0A替换成0D 0A。
  • 用命令行更高效,Linux/macOS下直接跑:
    sed 's/\r$//' corrupted.db > fixed.db
    
    这个命令会去掉每行末尾的CR字符,把被篡改的换行符还原回去。

解决.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先扫一遍数据库,找出未损坏的页范围:
    sqlite3_analyzer corrupted.db > analysis.txt
    
    打开analysis.txt看哪些页是正常的,针对性提取。
  • 手动提取部分数据库页,SQLite默认页大小是4096字节,先提取前1000页试试:
    dd if=corrupted.db of=partial.db bs=4096 count=1000
    
    然后用DB Browser打开partial.db,能恢复多少是多少,逐步增加页数直到出现OOM。

验证恢复结果

把恢复出的SQL文件导入新数据库检查:

sqlite3 new.db < recover.sql

用DB Browser打开new.db,看看记录数、数据内容是否符合你6个月健身数据的预期。

内容的提问来源于stack exchange,提问作者ManiacBegbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:07:10