본문으로 건너뛰기

백업 · 복원

데이터레이크의 백업은 두 종류입니다. 무엇을 잃었느냐에 따라 고릅니다.

논리 덤프물리 백업
명령pd backup (인자 없이)pd backup run …, 그리고 매일 도는 systemd 타이머
무엇을PostgreSQL 사용자 DB 를 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 DB 하나pd backup restore … — 데이터 디렉터리 전체
full / diff · 시점 복구없음(항상 전체)있음. 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 에 남아 컨테이너를 다시 만들어도 매 기동 때 다시 적용됩니다.

전역 스위치가 이깁니다. 사이드카에 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 를 스스로 멈추고 띄우며, diff 세트를 고르면 그것이 참조하는 full 까지 같이 깔립니다.
  • 워커에서는 돌지 않습니다. 복원은 마스터의 일이고 워커는 그것을 따라갑니다.

복원 — 논리 덤프로

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 에 들어갑니다 — 그 DB 들은 물리 백업이 맞습니다.

하지 마세요

  • --dry-run 없이 --yes 를 치지 마세요. 계획을 눈으로 보지 않은 복원은 «어느 시점으로 돌아가나» 를 모르는 복원입니다.
  • 살아 있는 서비스 위에서 복원하지 마세요. 붙어 있던 서비스는 끊긴 세션을 붙들고 오류를 뿜습니다.
  • 락 파일(/data1/pp-backup/pd-backup.lock)을 손으로 지우지 마세요. 죽은 pid 의 락은 pd 가 free 로 읽습니다.
  • 덤프를 /data1/pp-temp 에 복사해 두지 마세요. pd clean 이 지웁니다.

관련 문서