postgres pitr - ghdrako/doc_snipets GitHub Wiki

  1. Przygotowanie: konfiguracja ciągłej archiwizacji WAL

W pliku postgresql.conf ustaw:

# 1. Poziom WAL
wal_level = replica               # co najmniej replica; logical jeśli potrzebujesz logical decoding

# 2. Archiwizacja
archive_mode = on                 # włącz archiwizację WAL
archive_command = 'test ! -f /mnt/backup/wal/%f && cp %p /mnt/backup/wal/%f'
                                  # kopiuj każdy segment do katalogu kopii
archive_timeout = 300             # wymuś archiwizację co 5 minut, nawet jeśli segment nie jest pełny

# 3. Bezpieczeństwo i wydajność
full_page_writes = on             # zabezpiecza przed partial writes
wal_compression = on              # zmniejsza rozmiar przesyłanych plików kosztem CPU
checkpoint_timeout = 5min         # co ile robić checkpoint
checkpoint_completion_target = 0.7
max_wal_size = 1GB
Uwaga: jeśli masz wersję ≥12, zostaw wszystkie te ustawienia w postgresql.conf; w starszych (≤11) plik recovery.conf zawierałby restore/replica-settings, ale od PG12 korzystamy z sygnałowych plików (standby.signal, recovery.signal) i wpisów w postgresql.conf zamiast osobnego recovery.conf.
  1. Wykonanie bazowego backupu (Base Backup)

Przed rozpoczęciem archiwizacji musisz zrobić snapshot konsystentny z WAL. Najłatwiej:

pg_basebackup \
  -h localhost -D /mnt/backup/base \
  -U repl_user -Fp -Xs -P
  • -Fp — backup “plain” (plikowy)
  • -Xs — włącz archiwizację WAL w trakcie backupu
  • -P — pokazuj postęp To utworzy kopię katalogu danych wraz z oznaczonym punktem startu archiwizacji WAL.
  1. Monitorowanie i utrzymanie archiwów
  • Regularnie sprawdzaj, czy w katalogu /mnt/backup/wal/ pojawiają się pliki .history i segmenty WAL.
  • Dopilnuj, by dysk na archiwach nie zapełnił się – usuń stare pliki po eksploracji punktu przywrócenia lub timeline.

Scenariusz awaryjny: odtwarzanie bazy do wybranego punktu

Przygotowanie katalogu do odtwarzania

  1. Zatrzymaj serwer PostgreSQL na uszkodzonej instancji:
pg_ctl stop -D /var/lib/pgsql/data

Opróżnij katalog danych (lub przygotuj pusty katalog do odtworzenia).

  1. Skopiuj bazowy backup do katalogu danych:
    rsync -a /mnt/backup/base/ /var/lib/pgsql/data/
  1. Konfiguracja odtwarzania

Do katalogu data/ dodaj plik recovery.signal (PG12+) lub, w starszych wersjach, plik recovery.conf z zawartością:

# recovery.conf (PG≤11); w PG12+ wpisujesz restore_command w postgresql.conf i tworysz recovery.signal
restore_command = 'cp /mnt/backup/wal/%f %p'
                                   # jak pobrać każdy brakujący WAL
recovery_target_time = '2025-05-14 10:23:45'
                                   # do której chwili odtwarzamy
recovery_target_timeline = 'latest'
                                   # której linii czasu użyć
recovery_end_command = '/usr/local/bin/after_recovery.sh'
                                   # opcjonalnie: skrypt po zakończeniu recovery
  • Uruchomienie odtwarzania
pg_ctl start -D /var/lib/pgsql/data

Serwer będzie odtwarzał dane z base backup, a następnie kolejno ściągał segmenty WAL z /mnt/backup/wal zgodnie z restore_command.

Po dojściu do recovery_target_time (lub końca archiwum, jeśli nie podano limitu) PostgreSQL zakończy proces recovery i — w zależności od wersji — albo automatycznie wystartuje jako zwykły serwer (PG12+), albo wymaga ręcznego usunięcia pliku recovery.conf i restartu (PG≤11).

Weryfikacja po odtworzeniu

  • Sprawdź logi (pg_log/), czy nie było błędów podczas odtwarzania WAL.
    • Zwróć uwagę na komunikat „database system is ready to accept connections”.
  • Zaloguj się i zweryfikuj integralność danych, np. najbardziej krytyczne tabele/aplikacje.

Podsumowanie

  • Konfiguracja: włącz wal_level, archiwizację (archive_mode/command/timeout), zabezpieczenia (full_page_writes, wal_compression).
  • Base backup: pg_basebackup … -Xs przed startem archiwizacji.
  • Archiwizacja WAL: dbaj o disk space, monitoruj /mnt/backup/wal.
  • Recovery: użyj restore_command, ustaw recovery_target_*, uruchom serwer w trybie recovery.
  • Weryfikacja: sprawdź logi, testuj aplikacje. Dzięki temu masz pełne PITR: możliwe zarówno odtworzenie ostatniego stanu, jak i cofnięcie do dowolnego momentu w przeszłości. Jeśli coś się wykrzaczy – masz kopię bazowego backupu i wszystkie segmenty WAL potrzebne do przywrócenia!

ChatGPT może popełniać błędy. Sprawdź ważne informacje. Zobacz Preferencje dotyczące plików cookie.