postgres pitr - ghdrako/doc_snipets GitHub Wiki
- 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.
- 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.
- 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
- Zatrzymaj serwer PostgreSQL na uszkodzonej instancji:
pg_ctl stop -D /var/lib/pgsql/data
Opróżnij katalog danych (lub przygotuj pusty katalog do odtworzenia).
- Skopiuj bazowy backup do katalogu danych:
rsync -a /mnt/backup/base/ /var/lib/pgsql/data/
- 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.