rea-reverse

使用 REA 检查 SQLite 数据库快照

基于 REA 6.8.0发布者 rea-reverse更新于 约 2 分钟读完
本页目录

拿到一个 SQLite 文件时,先弄清有哪些表和字段,再决定是否读取数据。REA 的 inspect-sqlite-database 可以检查数据库快照,并对指定普通表的列做有限抽样。第一步是准备一致的副本:对正在写入的数据库直接复制文件,不一定能得到完整状态。

本文在 macOS 上实测 REA 6.8.0,使用 Node 的 SQLite 3.54.0,运行时为 Node 26.12.1。示例中的设备名称都是虚构数据;结论以这次测试为准,不代表所有版本的行为。

REA 6.8.0 要求 Node 22.x 不低于 22.23.4、Node 24.x 不低于 24.22.1,或者 Node 26.12.1 及更高版本。安装前可用 node --version 检查。

1. 准备快照并记录哈希

对运行中的数据库,优先使用应用提供的备份方法或 SQLite 备份 API。只复制主文件可能遗漏 WAL 中已经提交的更改;分别复制数据库和 WAL,也不等于获得原子快照。无法取得一致副本时,不要把结果当作完整数据库状态。

下面建立一个随后关闭的演示数据库:

sqlite3 inventory.sqlite <<'SQL'
CREATE TABLE devices (id INTEGER PRIMARY KEY, name TEXT NOT NULL, status TEXT);
INSERT INTO devices VALUES (1,'sensor-a','active'),(2,'sensor-b','offline'),(3,'sensor-c','active');
CREATE INDEX idx_devices_status ON devices(status);
CREATE VIEW active_devices AS SELECT id,name FROM devices WHERE status='active';
SQL
shasum -a 256 inventory.sqlite

本次文件为 12,288 字节,SHA-256 为 82f820488f97f10ea4b3ecc343deb870c87de301cda30c004f7dc27fd7137ecc。SQLite 版本和创建过程会影响文件字节,你得到的哈希不一定相同;应记录自己快照的哈希。

2. 先看结构清单

rea inspect-sqlite-database inventory.sqlite --format json

结果的 normalized_result.schema 显示 scope: inventory、completeness: complete,列出了三个字段的普通表 devices、索引 idx_devices_status 和视图 active_devices。但 columns_completeness 是 not_requested:清单并没有展开每个字段的定义。

我们还对这个一次性样本执行了 sqlite3 inventory.sqlite '.schema',确认三个 CREATE 语句与建表步骤一致。不要因此直接用 SQLite 打开来源不明的在线生产库。

3. 指定表和列,读取少量数据

rea inspect-sqlite-database inventory.sqlite \
  --table devices --column name --column status --row-limit 2 --format json

这次结果包含三个字段的定义,以及以下两行。这里为方便阅读只展示文本值:

sensor-a  active
sensor-b  offline
returned_rows: 2
truncated: true
order: unspecified

样本实际有三行,因此 truncated: true 不应忽略。结果明确写着顺序未指定;再次运行不保证一定返回同样两行。JSON 保留了值的类型,文本还包括字节表示和编码,但这不是数据库页内偏移级别的取证记录。

可以按需要的顺序重复 --column。不指定 --table 时使用 --column,本次得到 columns requires an explicit table selection。把视图 active_devices 作为表选择也会失败:行抽样需要精确的普通表名。视图可以出现在结构清单中,但不会因此被执行。

4. 判断结果的范围

结果包含输入 SHA-256、提供者版本、证据 ID 和限制说明。我们检查后样本文件的 SHA-256 没有改变。REA 说明它在私有副本上检查;这次样本结果并不能证明对任何活动数据库都能取得一致快照。

该命令读取快照中有效数据库和 WAL 的已提交状态,不负责恢复已删除记录、读取未提交或无效的 WAL 尾部、解密数据库,也不做完整性检查。它不会执行视图、触发器或虚拟表及影子表的行查询。需要完整、有序的查询或完整性调查时,应在受控副本上使用相应的 SQLite 工作流。

下一步