跳到主要内容

备份 · 复原

数据湖的备份分为两种。根据丢失的内容来选择。

逻辑导出物理备份
命令pd backup (无参数)pd backup run … 和每日运行的 systemd 定时器
备份内容将 PostgreSQL 用户数据库导出为 SQL 文件(pg_dump)PostgreSQL 使用 pgBackRest,Cassandra 使用 Medusa 备份数据文件本身
存储位置/data1/pp-data/postgres/dump/<db>-YYYYmmdd_HHMMSS.sql/data1/pp-backup/ (pgbackrest/ · medusa/) + 日志 history.jsonl
恢复方式pd recover <파일> — 单个 pp 数据库pd backup restore … — 整个数据目录
全量/增量 · 时间点恢复无(始终全量)有。PostgreSQL 支持 --target 进行时间点恢复(PITR)

定时器每晚生成的备份与运维人员通过 pd backup run 生成的备份经过相同的工具链(plantpulse-backup),保存到相同的 history.jsonl 中。管理控制台的备份界面也调用相同的命令。

自动备份 — 已默认启用

任务执行时间备份内容
postgres-diff每日 01:30PostgreSQL 增量
postgres-full周日 01:00PostgreSQL 全量
cassandra-diff每日 01:20Cassandra 增量
cassandra-full周日 00:10Cassandra 全量
purge周日 03:00根据保留策略清理
docker exec plantpulse-datalake pd backup schedule # 일정 · 마지막 결과 · 다음 실행
docker exec plantpulse-datalake pd backup list # 세트 목록
docker exec plantpulse-datalake pd backup status # 지금 도는 것이 있나

pd backup scheduleLAST 列为 never 表示尚未运行过(正常),fail (…) 表示最后一次执行出错。SIZE- 的 Cassandra 集合没有大小信息,但不是 0。STATUSerror · incomplete 的集合不可用于恢复。

修改计划

docker exec plantpulse-datalake pd backup schedule set --job postgres-diff --calendar "*-*-* 02:45:00"
docker exec plantpulse-datalake pd backup schedule set --job purge --enabled false
docker exec plantpulse-datalake pd backup schedule reset --job postgres-diff # 그 잡만 기본으로
docker exec plantpulse-datalake pd backup schedule reset # 전부 기본으로

日历采用 systemd 语法 — *-*-* 02:45:00(每日 02:45)、Sun *-*-* 01:00:00(周日 01:00)、Mon..Fri *-*-* 23:30:00(工作日)。无效表达式在验证时会被拒绝。选择项保存在 /data1/pp-data/backup/schedule.json 中,即使重建容器也会在每次启动时重新应用。

全局开关优先级最高。 在 sidecar 中配置 PP_BACKUP_SCHEDULE_ENABLED=false 会导致定时器仅记录为「skipped」,即使单个任务已启用。

大型操作前 — 额外保存当前时间点

在升级 · 恢复 · 更改配置等大型操作之前,额外保存「当前时刻」的备份。

docker exec plantpulse-datalake pd backup run --engine postgres --type diff
docker exec plantpulse-datalake pd backup run --engine cassandra --type full
docker exec plantpulse-datalake pd backup # 그리고 SQL 사본 하나

一次只支持一个操作 — 如果已有备份在运行,将以 exit 3 拒绝。即使工具以 0 结束,如果存储库未增长,也会判定为 fail

复原 — 使用物理备份

这是最后的手段。 该备份集合之后的所有写入操作都会丢失。该命令强制执行特定流程 — 不带 --yes 执行会被拒绝,要求执行 --dry-run

# 1. 세트 고르기 — STATUS 가 ok 인 것만
docker exec plantpulse-datalake pd backup list

# 2. 드라이런 — 전제조건 일곱과 «정확히 무슨 명령이 무엇을 덮어쓸지». 아무것도 안 건드린다
docker exec plantpulse-datalake pd backup restore --engine postgres --set 20260903-013040F_20260904-135107D --dry-run
# preconditions (all pass - ready) 가 나올 때까지 실행하지 않는다

# 3. pp 를 쓰는 서비스를 역순으로 내린다 — storage 는 둔다 (PostgreSQL 은 이 동사가 스스로 멈추고 띄운다)
docker exec plantpulse-datalake pd stop admin-api
docker exec plantpulse-datalake pd stop data-gateway
docker exec plantpulse-datalake pd stop workflow
docker exec plantpulse-datalake pd stop cep
docker exec plantpulse-datalake pd stop timeseries

# 4. 실행
docker exec plantpulse-datalake pd backup restore --engine postgres --set 20260903-013040F_20260904-135107D --yes

# 5. 끝 줄 "done in NNs - restart the dependent services" 를 보고
docker exec plantpulse-datalake pd restart

# 6. 확인
docker exec plantpulse-datalake pd status # 0 STOPPED
docker exec plantpulse-datalake pd backup status # 락이 free
  • 时间点恢复(PITR) — 仅 PostgreSQL 支持像 --target "2026-09-04 12:00:00" 这样指定时间戳。在部署该集合后,将 WAL 重放到指定时间。对 Cassandra 使用 --target 将返回 exit 2。
  • Cassandra 恢复由 Medusa 自动停止和启动 Cassandra,如果选择增量集合,也会安装其引用的全量集合。
  • 不在 worker 上运行。 恢复是 master 的职责,worker 会跟随 master 恢复。

复原 — 使用逻辑导出

pp单个数据库恢复到逻辑导出的时间点。无法回滚,也不提供试运行 — 传入文件名后立即执行 DROP DATABASE "pp"

ls -l /data1/pp-data/postgres/dump/ # 날짜와 크기를 먼저 눈으로
docker exec -it plantpulse-datalake pd recover # 목록을 찍고 파일 이름을 묻는다 (Ctrl+C 취소)
docker exec plantpulse-datalake pd recover pp-20260904_131500.sql

操作流程与物理恢复的第 3 ~ 6 步相同(先停止服务,完成后再启动)。即使导入其他数据库(temporal · hive · kestra)的导出文件,也会进入 pp — 这些数据库应使用物理备份。

禁止操作

  • 不要在没有 --dry-run 的情况下执行 --yes 未通过目视确认恢复计划的恢复是「不知道恢复到哪个时间点」的恢复。
  • 不要在正在运行的服务上执行恢复。 连接的服务会保持断开的会话并抛出错误。
  • 不要手动删除锁文件(/data1/pp-backup/pd-backup.lock)。 死掉的进程锁会由 pd 读取为 free。
  • 不要将导出文件复制到 /data1/pp-temp pd clean 会删除它。

相关文档