备份 · 复原
数据湖的备份分为两种。根据丢失的内容来选择。
| 逻辑导出 | 物理备份 | |
|---|---|---|
| 命令 | 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:30 | PostgreSQL 增量 |
postgres-full | 周日 01:00 | PostgreSQL 全量 |
cassandra-diff | 每日 01:20 | Cassandra 增量 |
cassandra-full | 周日 00:10 | Cassandra 全量 |
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 schedule 的 LAST 列为 never 表示尚未运行过(正常),fail (…) 表示最后一次执行出错。SIZE 为 - 的 Cassandra 集合没有大小信息,但不是 0。STATUS 为 error · 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会删除它。
相关文档
- 备份与恢复 — 卷备份、场外复制、灾难恢复场景
pdCLI- 管理控制台 — 备份界面