バックアップ・リストア
データレイクのバックアップは2種類です。失ったものに応じて選びます。
| 論理ダンプ | 物理バックアップ | |
|---|---|---|
| コマンド | pd backup(引数なし) | pd backup run …、およびスケジューラが毎日実行するジョブ |
| 対象 | PostgreSQL ユーザー DB を SQL ファイルに(pg_dump) | PostgreSQL は pgBackRest、Aster TSDB は Medusa がデータファイル自体を |
| 保存先 | /data1/pp-data/postgres/dump/<db>-YYYYmmdd_HHMMSS.sql | /data1/pp-backup/(pgbackrest/・medusa/)+ 記録 history.jsonl |
| 戻し方 | pd recover <파일> — pp DB 1つ | pd backup restore … — データディレクトリ全体 |
| full / diff・時点復元 | なし(常に全体) | あり。PostgreSQL は --target で時点復元(PITR) |
スケジューラが夜間に取得するバックアップと、オペレータが pd backup run で取得するバックアップは同じツールキット(plantpulse-backup)を通り、同じ history.jsonl に残ります。管理コンソールのバックアップ画面も同じコマンドを呼び出します。
バックアップスケジュールの正本は datalake DB の backup_schedule テーブルであり、それを読み込んで実行するのは
plantpulse-datalake-admin-api 内のQuartz スケジューラです(マスターでのみ動作します)。
ユニットファイルはイメージに含まれていますが、インストールされているものは一切ありません — コンテナの PID 1 が
systemd ではなく bash であるため、そもそも動作できません。systemctl list-timers で確認しようとすると
«System has not been booted with systemd» と表示されるだけです。
docker exec plantpulse-datalake pd backup schedule --json | head -c 400
# "manager":"quartz","systemctl_present":false,"unit_dir":null,
# "scheduler":{"name":"plantpulse-datalake-admin-api","kind":"quartz","runs_on":"MASTER"}
変更する箇所は pd backup schedule set --job <잡> --cron "<Quartz cron>" または管理コンソールの
バックアップ画面です。cron は Quartz 形式(秒 分 時 日 月 曜日)なので6つのフィールドです。
自動バックアップ — すでに有効です
| ジョブ | いつ | 何を |
|---|---|---|
postgres-diff | 毎日 01:30 | PostgreSQL 差分 |
postgres-full | 日曜日 01:00 | PostgreSQL 全体 |
cassandra-diff | 毎日 01:20 | Aster TSDB 差分 |
cassandra-full | 日曜日 00:10 | Aster TSDB 全体 |
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 が - である Aster TSDB セットはサイズ情報がないだけで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 に残り、コンテナを再作成しても毎回起動時に再適用されます。
グローバルスイッチが優先されます。 サイドカーに PP_BACKUP_SCHEDULE_ENABLED=false を書くと、ジョブ単位で何を有効にしてもスケジューラは «skipped» と記録するだけで終わります。
大規模作業の前に — 今の時点をもう1つ
アップグレード・リストア・設定変更などの大規模作業の直前に、「今この瞬間」をもう1つ残します。
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 사본 하나
一度に1つだけ実行されます — 実行中なら 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 をその時点まで再生します。Aster TSDB に--targetを与えると exit 2。 - Aster TSDB のリストアは Medusa が Aster TSDB を自ら停止・起動し、diff セットを選ぶとそれが参照する full も一緒に展開されます。
- ワーカーでは動作しません。 リストアはマスターの仕事で、ワーカーはそれに追従します。
リストア — 論理ダンプから
pp データベース1つだけを論理ダンプ時点に戻します。元に戻せずドライランもありません — ファイル名を渡した瞬間 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 に入ります — それらの DB は物理バックアップが適切です。
しないでください
--dry-runなしで--yesを実行しないでください。 計画を目で確認していないリストアは「どの時点に戻るか」を知らないリストアです。- 稼働中のサービスの上でリストアしないでください。 接続していたサービスは切断されたセッションを掴んだままエラーを吐き続けます。
- ロックファイル(
/data1/pp-backup/pd-backup.lock)を手で削除しないでください。 死んだ pid のロックはpdが free として読み取ります。 - ダンプを
/data1/pp-tempにコピーして置かないでください。pd cleanが削除します。
関連文書
- バックアップおよび復旧 — ボリュームバックアップ、オフサイトレプリケーション、災害復旧シナリオ
pdCLI- 管理コンソール — バックアップ画面