误删了 278 条 SQLite 记录,这个工具一条不差全找回来了
你的浏览器历史、微信聊天记录、手机 App 缓存——这些数据存在哪里?大概率是 SQLite。
这是世界上用得最广的嵌入式数据库,但它的一个行为知道的人不多:DELETE 操作不删除数据。它只是把磁盘空间标记成"空闲",旧数据留在原地,等哪天被新写入盖过去才算真没。
所以如果你误删了东西,或者在做取证调查,数据很可能还在那里——前提是你有趁手的工具。
三个人都说能做到,但实际效果差了一个数量级。
● ● ●
278 条记录的考试
德国米特韦达应用科学大学的研究者 Dirk Pawlaszczyk 在 2021 年发表了一篇论文:Making the Invisible Visible – Techniques for Recovering Deleted SQLite Data Records。他设计了一个标准的法证测试集:278 条已删除的 SQLite 记录,覆盖了多种删除场景。
然后他让一系列工具去"考试"。结果很刺激:
- 有些商业工具一条都没恢复出来
- 老牌的 undark(C 语言,2004 年起)恢复了约 34.8%
- bring2lite(Python,2019 年 DFRWS 论文)恢复到 52.9%——当时它的论文已经拿了第一
- FQLite:278/278,100%
是的,全部找回来了。
● ● ●
三个工具,三个故事
FQLite:学术论文孵化出的工业级工具
FQLite 是 Pawlaszczyk 团队自己写的工具。Java 写的,带 JavaFX 图形界面,Apache 2.0 协议。
它的核心能力远不止"找删除记录"这么简单:
恢复能力:
- Freelist 页面扫描(已被回收的空间)
- 未分配区域 + 空闲块中的残留数据
- 支持 WAL 归档、Rollback Journal
- 能恢复被 DROP 掉的整个表
- UTF-8 / UTF-16BE / UTF-16LE 全编码支持
取证分析功能:
- BLOB 自动检测和预览(图片、PDF、HEIC 等)
- Google Protobuf、Apple plist、AVRO、Thrift 格式解码
- 集成 Hex 查看器
- Text-to-SQL:内置本地 LLM 支持,用自然语言查询数据库(基于 Llama 3.2 3B)
- Mermaid.js 驱动的 Schema 可视化
- NodeQL 可视化 SQL 构建器
- SQLCipher 加密数据库支持
- CASE/UCO JSON-LD 标准格式导出
从 2021 年第一版到 2026 年 6 月的 4.22 版本,持续迭代了 20+ 个大版本。这在开源取证工具里极其罕见。
bring2lite:曾经的第一,如今已经锈了
bring2lite 是德国研究者 Christian Meng 和 Harald Baier 的工作,发表在 2019 年 DFRWS USA 会议上。
在它自己的测试中(不同数据集),它恢复了约 53%,击败了 8 个竞品——包括若干商业软件。论文里列了 undark、SQLiteRecover、Stellar 等工具,bring2lite 确实在当时是最强的开源方案。
但问题来了:
- 仓库最后一次提交是 2019 年 8 月
- 协议是 CC-BY-NC(非商业使用),不能在商业场景用
- GUI 标注为 "EXPERIMENTAL"
- README 里列了 6 个待修 bug,一个都没改
- 35 个 star,10 个 fork,没有发布过任何 release
它是一篇好论文的实现,但不是一个在维护的软件项目。
sqlite-unhide:只能走半步
sqlite-unhide 是个更小的工具。作者叫 little-brother,俄语背景,写了篇 Habr 文章介绍原理。
关键限制:
- 只支持 UTF-8 编码
- 不恢复 BLOB
- 免费版数据库上限 1MB
- 协议是 "FREEWARE. HOME USE ONLY"
- GitHub 上 5 个 star,3 次 commit,2021 年后没更新
1MB 是什么概念?一个微信聊天记录的 SQLite 文件轻松几十 MB 起步。用它恢复实际数据基本没戏。
● ● ●
技术原理:SQLite 为什么不真删数据
理解这几个工具的差异,需要知道 SQLite 的删除机制。
SQLite 使用 B-tree 页结构存储数据。删除一行记录时:
- 01该记录所在的 cell 被标记为"空闲"
- 02空闲 cell 以链表形式组织(freeblock chain)
- 03被删除页也可能加入 Freelist(整页回收池)
- 04如果启用了 WAL 模式,旧版本数据还留在 WAL 文件中
关键点:标记不等于擦除。 只有两种情况会真正销毁数据——新写入覆盖了那块空间,或者执行了 VACUUM。
FQLite 之所以能做到 100% 恢复率,是因为它全面覆盖了所有残留路径:
| 残留位置 | undark | bring2lite | FQLite |
|---|---|---|---|
| Freelist 页面 | ✅ | ✅ | ✅ |
| 未分配空间 | ❌ | ✅ | ✅ |
| 页面内 freeblock | ✅ | ✅ | ✅ |
| WAL 归档 | ❌ | ✅ | ✅ |
| Rollback Journal | ❌ | ✅ | ✅ |
| DROP TABLE 恢复 | ❌ | ❌ | ✅ |
| UTF-16 编码 | ❌ | ? | ✅ |
| BLOB 推断 | ❌ | ❌ | ✅ |
undark 只覆盖最基础的 Freelist + freeblock,所以只能恢复 34.8%。bring2lite 多扫了 WAL 和 journal,提到 52.9%。FQLite 把所有角落都扫了,还加了 BLOB 推断和模式匹配,一举到 100%。
● ● ●
怎么选
如果你是开发者,误删了数据想恢复:
- FQLite 是唯一正确的选择。 免费、开源、持续维护、100% 恢复率。下载地址:github.com/pawlaszczyk/fqlite
- bring2lite 有学术价值,但代码已经锈了。如果你在读 DFRWS 论文,可以拿来复现实验。
- sqlite-unhide 可以用在嵌入式/资源受限场景(它很小),但 1MB 限制在日常使用中是硬伤。
- undark(github.com/alitrack/undark)是 2004 年的老项目,已被归档,README 中已指向 FQLite。
如果你是取证从业者,FQLite + Sanderson Forensic Browser for SQLite + Magnet AXIOM 是行业标配组合。FQLite 做深度恢复,Sanderson 做可视化查询,AXIOM 做跨应用关联。
SQLite DELETE → 不真删,只标记 → 残留位置:
├─ Freelist 整页 最容易恢复
├─ Freeblock 碎片 部分恢复(前4字节没了)
├─ WAL 归档 最近删除的首选路径
├─ 未分配空间 需要模式匹配
└─ DROP 掉的表 只有 FQLite 能处理
│
▼
FQLite: ████████████████████ 100%
bring2lite: ██████████ 53%
undark: ██████ 35%
sqlite-unhide: █ 有限(免费版 1MB cap)
重要的是,预防比恢复更好。定期备份、启用 WAL 模式配合增量备份、或者用 litereplica 做实时复制——这些做法比指望恢复工具靠谱得多。
但万一你真的需要恢复删除的 SQLite 数据:现在你知道该用什么了。
FQLite 项目: github.com/pawlaszczyk/fqlite
论文: Pawlaszczyk & Hummert (2021). Making the Invisible Visible. IJCFATI 1(1-3), 27-41.
bring2lite 论文: Meng & Baier (2019). bring2lite: A Structural Concept.... DFRWS USA 2019.
undark 归档: github.com/alitrack/undark