Skip to content

feat(backup): 新增差异备份(differential)模式#88

Merged
Awuqing merged 1 commit into
mainfrom
feat/differential-backup
May 27, 2026
Merged

feat(backup): 新增差异备份(differential)模式#88
Awuqing merged 1 commit into
mainfrom
feat/differential-backup

Conversation

@Awuqing

@Awuqing Awuqing commented May 27, 2026

Copy link
Copy Markdown
Owner

背景

此前所有备份均为全量——每次都打包全部数据。对大目录而言,这意味着重复存储、漫长耗时与高带宽。差异备份是备份工具的核心能力之一,本 PR 为文件备份补齐这一新的备份模式(而非外围功能)。

能力

文件任务可选「差异备份」:仅打包自上次全量以来新增/变更的文件,并记录删除;恢复时自动按「全量 + 差异」链还原到精确状态。

设计(数据安全优先)

风险最高的差异/恢复逻辑被隔离为可单测的纯模块:

  • backup/manifest.go — 全量条目指纹清单(路径/大小/mtime/模式);changedSince 判定新增/变更、deletedPaths 检测删除。纯函数,单测覆盖各分支。
  • FileRunner
    • Run:差异模式下按基线清单过滤,仅写变更条目,并写入删除清单特殊条目 .backupx/deletions.json;全量模式产出完整清单。
    • Restore:先提取,最后统一应用删除(避免误删同批新增);提取与删除共用 resolveWithinParent 路径穿越校验,杜绝逃逸。
  • 全量备份的清单持久化在备份记录上,供后续差异比对。

服务编排

  • 执行器resolveDifferentialBase 解析最近一次「成功、含清单、未超 DiffFullIntervalDays」的全量;命中则转差异并记录基线 ID,否则回退全量(首次/基线过期自动重做全量,限制差异链跨度)。
  • 恢复buildRestoreChain 组装「基线全量 → 差异」链并按序应用;基线缺失/不可用立即报错,杜绝残缺恢复。
  • 保留清理protectDifferentialBases 保护「仍被存活差异依赖的全量」——基线只有在其全部差异都过期后才会被清理,防止删基线导致差异无法恢复

配置与界面

  • 任务新增 backupMode / diffFullIntervalDays;校验差异仅限本机文件任务(远程/非文件给出明确错误)。
  • 前端:文件任务的「备份模式」选择 + 「全量间隔(天)」输入;备份记录列表标注「差异」标签。

测试

  • 单测:清单编解码、changedSince/deletedPaths 各分支、保留链保护三场景
  • 端到端往返:全量 → 改源(变更 a / 删除 b / 新增 d / 未变更 c)→ 差异 → 链式恢复 → 校验结果与改后源一致
  • go test ./... 19 包全绿;tsc --noEmit 通过

范围说明

文件类型备份新增差异模式:仅打包自上次全量以来新增/变更的文件并记录删除,
显著减小备份体积与耗时;恢复时自动按「全量 + 差异」链还原。当前仅本机文件任务支持。

核心引擎:
- backup/manifest.go:全量条目指纹清单(路径/大小/mtime/模式),差异比对与删除检测(纯函数,单测覆盖)
- FileRunner:差异模式按基线清单过滤、写入删除清单特殊条目;恢复提取完成后统一应用删除,复用路径穿越校验杜绝逃逸
- 全量备份产出清单并持久化于备份记录,供后续差异比对

服务编排:
- 执行器解析基线全量(成功、含清单、未超 DiffFullIntervalDays),命中则切换差异、记录基线 ID
- 恢复服务按链(基线全量→差异)依次下载/校验/解压/应用,基线缺失即报错避免残缺恢复
- 保留清理保护「仍被存活差异依赖的全量」,防止删基线导致差异无法恢复

配置与界面:
- 任务新增 backupMode / diffFullIntervalDays;校验差异仅限本机文件任务
- 前端:文件任务的备份模式选择 + 全量间隔输入;备份记录列表标注「差异」

测试:清单/比对/删除单测、差异端到端往返(变更/新增/删除/未变更)、保留链保护单测;go test ./... 全绿
@Awuqing Awuqing merged commit 90b58d5 into main May 27, 2026
6 checks passed
@Awuqing Awuqing deleted the feat/differential-backup branch May 27, 2026 11:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant