Sichern & Wiederherstellen
Die Sicherung des Data Lake gibt es in zwei Arten. Je nachdem, was verloren wurde, wird die passende gewählt.
| Logischer Dump | Physische Sicherung | |
|---|---|---|
| Befehl | pd backup (ohne Argumente) | pd backup run … sowie der täglich vom Scheduler gestartete Job |
| Was | PostgreSQL-Benutzerdatenbank als SQL-Datei (pg_dump) | Bei PostgreSQL pgBackRest, bei Aster TSDB Medusa – die Datendateien selbst |
| Wohin | /data1/pp-data/postgres/dump/<db>-YYYYmmdd_HHMMSS.sql | /data1/pp-backup/ (pgbackrest/ · medusa/) + Protokoll history.jsonl |
| Wiederherstellen | pd recover <파일> — eine pp-DB | pd backup restore … — das gesamte Datenverzeichnis |
| Voll / diff · Point-in-Time-Recovery | Nein (immer vollständig) | Ja. Bei PostgreSQL --target für Point-in-Time-Recovery (PITR) |
Die Backups, die der Scheduler nachts erstellt, und die, die der Bediener über pd backup run auslöst, verwenden dasselbe Toolkit (plantpulse-backup) und landen im selben history.jsonl. Auch der Sicherungsbildschirm in der Verwaltungskonsole ruft dieselben Befehle auf.
Die maßgebliche Quelle für den Sicherungszeitplan ist die Tabelle backup_schedule der datalake-DB; gelesen und ausgeführt wird sie vom
Quartz-Scheduler in plantpulse-datalake-admin-api (läuft nur auf dem Master).
Unit-Dateien liegen zwar im Image bei, aber keine einzige ist installiert — PID 1 im Container ist
nicht systemd, sondern bash, daher können sie von vornherein nicht laufen. Der Versuch, sie über systemctl list-timers zu prüfen,
liefert nur «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"}
Änderungen nimmt man über pd backup schedule set --job <잡> --cron "<Quartz cron>" oder den Sicherungsbildschirm der Verwaltungskonsole vor. cron nutzt das Quartz-Format (Sekunde Minute Stunde Tag Monat Wochentag), also sechs Felder.
Automatische Sicherung — bereits aktiviert
| Job | Wann | Was |
|---|---|---|
postgres-diff | täglich 01:30 | PostgreSQL-Differenz |
postgres-full | Sonntag 01:00 | PostgreSQL-Vollsicherung |
cassandra-diff | täglich 01:20 | Aster-TSDB-Differenz |
cassandra-full | Sonntag 00:10 | Aster-TSDB-Vollsicherung |
purge | Sonntag 03:00 | Bereinigung gemäß Aufbewahrungsrichtlinie |
docker exec plantpulse-datalake pd backup schedule # 일정 · 마지막 결과 · 다음 실행
docker exec plantpulse-datalake pd backup list # 세트 목록
docker exec plantpulse-datalake pd backup status # 지금 도는 것이 있나
Wenn die Spalte LAST in pd backup schedule den Wert never hat, wurde noch nie ausgeführt (normal); bei fail (…) liegt ein Fehler der letzten Ausführung vor. Eine Aster-TSDB-Gruppe mit - bei SIZE hat keine Größeninformation, ist aber nicht 0. Gruppen mit error bzw. incomplete bei STATUS werden nicht wiederhergestellt.
Zeitplan ändern
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 # 전부 기본으로
Der Kalender verwendet systemd-Syntax — *-*-* 02:45:00 (täglich 02:45), Sun *-*-* 01:00:00 (Sonntag 01:00), Mon..Fri *-*-* 23:30:00 (Werktage). Falsche Ausdrücke werden bei der Validierung abgewiesen, es wird nichts geschrieben. Die Auswahl bleibt in /data1/pp-data/backup/schedule.json erhalten und wird auch nach einem Container-Neustart bei jedem Start erneut angewendet.
Der globale Schalter gewinnt. Wird in der Sidecar PP_BACKUP_SCHEDULE_ENABLED=false gesetzt, protokolliert der Scheduler für alle Jobs nur «skipped», egal was pro Job aktiviert ist.
Vor größeren Arbeiten – ein weiterer Zeitpunkt
Vor großen Schritten wie Upgrade, Wiederherstellung oder Konfigurationsänderung wird ein zusätzlicher «jetzt»-Zeitpunkt gesichert.
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 사본 하나
Es läuft nur einer gleichzeitig — wenn bereits einer läuft, wird mit Exit 3 abgelehnt. Selbst wenn das Tool mit 0 endet, gilt die Sicherung als fail, wenn das Repository nicht gewachsen ist.
Wiederherstellung — mit physischer Sicherung
Letztes Mittel. Alle Schreibvorgänge nach dieser Sicherung gehen verloren. Dieses Verb erzwingt den Ablauf — ohne --yes wird die Aufforderung ausgegeben, --dry-run auszuführen.
# 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
- Point-in-Time-Recovery (PITR) — nur bei PostgreSQL kann eine Uhrzeit wie
--target "2026-09-04 12:00:00"angegeben werden. Nach Einspielen der Sicherung werden die WAL-Dateien bis zu diesem Zeitpunkt repliziert. Bei Aster TSDB führt--targetzu Exit 2. - Die Wiederherstellung von Aster TSDB stoppt und startet Aster TSDB selbst durch Medusa; wird eine Diff-Sicherung gewählt, wird auch die referenzierte Vollsicherung mit eingespielt.
- Läuft nicht auf Workern. Wiederherstellung ist Sache des Masters; Worker folgen ihm.
Wiederherstellung — mit logischem Dump
Eine pp-Datenbank wird auf den Zeitpunkt des logischen Dumps zurückgesetzt. Das ist nicht umkehrbar und es gibt keinen Trockenlauf — sobald der Dateiname übergeben wird, wird DROP DATABASE "pp" ausgeführt.
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
Der Ablauf entspricht Schritt 3 bis 6 der physischen Wiederherstellung (Dienst zuerst stoppen, nach Abschluss wieder starten). Dumps anderer Datenbanken (temporal · hive · kestra) landen ebenfalls in pp — für diese DBs ist die physische Sicherung die richtige Wahl.
Nicht empfohlen
--dry-runnicht ohne--yesausführen. Eine Wiederherstellung, deren Plan man nicht gesehen hat, ist eine Wiederherstellung, bei der man nicht weiß, «auf welchen Zeitpunkt stellt man zurück».- Nicht über einem laufenden Dienst wiederherstellen. Ein Verbundener Dienst hält an einer getrennten Sitzung fest und erzeugt Fehler.
- Sperrdatei (
/data1/pp-backup/pd-backup.lock) nicht manuell löschen. Eine Sperre eines toten Prozesses wird vonpdals frei gelesen. - Dumps nicht in
/data1/pp-tempkopieren.pd cleanentfernt sie.
Verwandte Dokumente
- Sichern und Wiederherstellen — Volume-Backups, Offsite-Replikation, Disaster-Recovery-Szenarien
pdCLI- Verwaltungskonsole — Sicherungsbildschirm