备份是一份恢复契约:理解 FishMem Desktop 快照

备份是一份恢复契约:理解 FishMem Desktop 快照
2026年8月9日产品阅读约 11 分钟

可迁移的桌面快照必须保留什么、哪些内容可以重建,以及恢复过程如何避免残留半成品状态。

备份不是点击“导出”后得到的那个文件。备份是一项经过验证的承诺:设备损坏、升级出错或误替换之后,用户仍能恢复自己真正关心的状态。对本地记忆系统而言,这远不止界面当前显示的几行数据。

FishMem Desktop 把备份定义为带版本的命名空间快照。规范记录及其历史随快照迁移;搜索索引和其他投影明确标记为可重建,而不会被抬升为来源真相。

先说结论

  • 备份包含规范记忆、历史、图状态、文档、日志事件与操作身份。
  • 向量和 sidecar 投影在恢复后重建,避免把某台设备上的索引当作权威。
  • Desktop 会在删除当前数据前验证完整快照。
  • 如果替换开始后恢复失败,Desktop 会清理部分导入,并尝试恢复操作前快照。
  • 只有语义索引就绪且真实召回操作通过,恢复才算完成。

先定义哪些状态必须活下来

第一项设计决定不是文件格式,而是哪类数据可以重新生成、哪类绝对不能。这个答案应写进格式契约,而不是留在某位工程师的经验里。

数据可迁移的权威恢复行为
记忆内容与作用域规范记录保留稳定 ID、时间、有效期与删除状态
纠正与审计不可变历史和事件随记录一起恢复,使旧决策仍可解释
实体与关联规范图记录提交前验证内部引用
来源文档带版本的来源内容和描述先恢复来源家族,再重建检索
向量、全文索引、sidecar 视图派生投影从规范内容重建并核验

为什么复制 SQLite 文件不是产品恢复契约

直接复制数据库对紧急取证可能有用,但它把恢复绑定到某个 schema 版本、某种存储引擎和某个进程时刻。复制可能撞上正在进行的写入,也可能漏掉数据库之外的来源对象。产品级备份需要位于这些实现细节之上的稳定、可验证表示。

FishMem 快照包含格式版本和来源命名空间身份。导出会把文档来源装入可迁移形式,并声明向量与 sidecar 状态需要重建。导入可以把快照绑定到另一个空命名空间,同时保留规范身份和历史。

导出应当简单、可预测、原子化

Desktop 让用户选择保存位置,通过引擎导出默认命名空间,先写临时 JSON 文件,再原子重命名为最终文件。最终文件使用受限权限。序列化中途崩溃时,磁盘上应当保留旧文件或没有最终文件,而不是留下一个看起来可用的半截备份。

当前恢复入口对文件设有 512 MB 安全上限。这是一道保护栏,不代表任何 512 MB 快照都能瞬间恢复。大型本地资料库仍需要足够磁盘、时间和模型资源来重建语义投影。

接触当前数据之前完成全部验证

恢复具有破坏性,因此 Desktop 服务契约要求明确输入 RESTORE 确认。在清理现有数据前,主进程会确认所选路径是上限以内的普通 JSON 文件,并针对目标命名空间解析完整可迁移快照。

验证不能停在“JSON 能解析”。它需要检查格式版本、记录形状、命名空间重绑定、稳定身份和内部引用。如果一条历史记录指向不存在的记忆,替换开始前就应失败。

恢复是一台状态机,不是一条数据库语句

  1. 解析并验证传入快照。
  2. 把当前命名空间导出成内存中的回滚快照。
  3. 清理当前命名空间。
  4. 使用唯一幂等身份导入所选快照。
  5. 重建必要投影并核对数量。
  6. 返回导入的记忆、文档和向量统计。

如果导入或投影重建失败,Desktop 会清除部分目标,再导入操作前保存的快照。如果主恢复和回滚都失败,它会返回聚合错误,而不是声称其中一个资料库健康。

回滚可以降低风险,但不能替代独立备份。断电、磁盘损坏或文件系统错误可能同时中断主恢复与本地回滚。

“记录已恢复”和“召回已就绪”是两个状态

语义检索依赖本地多语言嵌入模型和兼容的索引身份。在新设备上,模型可能仍在下载;模型或索引版本改变后,向量可能需要全部重建。Desktop 因此公开就绪错误,而不会悄悄降级为质量不同的远程路径或纯关键词路径。

界面至少应区分:

  • 快照验证完成;
  • 规范记录恢复完成;
  • 文档恢复完成;
  • 语义索引正在重建;
  • 搜索已经就绪;
  • 恢复失败,且回滚成功或失败。

用用户旅程测试恢复

对比 JSON 数量是必要条件,但远远不够。发布演练应从已经安装的应用开始,验证用户实际依赖的行为:

  1. 新增一条带作用域记忆和一个来源文档;
  2. 更新记忆并确认历史存在;
  3. 把备份导出到用户选择的位置;
  4. 改变或删除本地状态;
  5. 恢复备份;
  6. 等待本地模型和索引就绪;
  7. 通过安装包内 CLI 完成搜索、读取、更新、历史与删除;
  8. 重启应用,再做一次召回检查。

这条路径证明 UI、主进程、服务层、SQLite、本地嵌入运行时和 CLI 对恢复后的状态达成一致。窗口能重新打开,只能证明 Electron 启动了。

运维检查清单

  • 至少保留一份不在被保护设备上的备份。
  • 记录创建快照的 FishMem Desktop 版本。
  • 格式或 schema 改变后测试恢复,而不只是测试导出。
  • 不要手工修改快照中的 ID 和引用。
  • 判断搜索质量前等待语义索引就绪。
  • 恢复后检查一组已知记忆和文档引用。

当前契约没有承诺什么

Desktop 快照不是连续复制、云同步、多设备合并,也不能防御已经被攻破的操作系统。Desktop 仍是单机本地权威,备份由用户拥有。需要共享运营、托管恢复、组织与后台 worker 的团队,应评估 Cloud 或自托管服务。

延伸阅读

继续阅读