Backup i odzyskiwanie danych w PostgreSQL

Kacper Sieradziński
Kacper Sieradziński
22 września 2025PostgreSQL4 min czytania

Backup to nie luksus — to ubezpieczenie od katastrofy. Wystarczy jedno DROP DATABASE w złym środowisku albo uszkodzony dysk SSD i cała wiedza firmy może zniknąć w sekundę. Dlatego w PostgreSQL kopia zapasowa to nie opcja, tylko element projektu.

Obraz główny Backup i odzyskiwanie danych w PostgreSQL

Zapisz się na nasz newsletter

Otrzymuj regularne aktualizacje, specjalne oferty i porady od ekspertów, które pomogą Ci osiągnąć więcej w krótszym czasie.

W tym artykule przejdziesz przez pełny proces tworzenia i odzyskiwania danych w PostgreSQL: od pg_dump i pg_restore, przez pg_basebackup i archiwizację WAL, aż po odtwarzanie punktu w czasie (PITR). Zrozumiesz różnicę między backupem logicznym i fizycznym, jak dobrać strategię pod RPO/RTO i jak automatyzować całość, żeby nie skończyć na improwizowanym restore o trzeciej w nocy.

Backup i odzyskiwanie danych w PostgreSQL

Dlaczego backup to nie opcja, tylko obowiązek

Awaria dysku, błąd człowieka, skrypt DDL w złym środowisku, ransomware – to codzienność. Backup PostgreSQL ogranicza skutki zdarzeń i pozwala osiągnąć docelowe RPO/RTO. RPO definiuje maksymalną akceptowalną utratę danych (np. 5 minut), a RTO – czas odtwarzania (np. 30 minut). Te liczby wyznaczają dobór narzędzi i częstotliwość kopii.

Kopie zapasowe PostgreSQL występują w dwóch głównych formach: logiczne (pg_dump/pg_restore) i fizyczne (pg_basebackup + archiwizacja WAL dla PITR PostgreSQL). Logiczne są proste i przenośne, fizyczne dają punkt przywracania w czasie oraz krótsze RTO przy dużych zbiorach. Niezależnie od metody, realną gwarancją są tylko regularne testy przywracania.

Jeśli zaczynasz z PostgreSQL, najpierw poprawnie zainstaluj i skonfiguruj serwer, a dopiero potem projektuj backupy: PostgreSQL: wprowadzenie, instalacja i pierwsza baza danych.

Narzędzia pg_dump i pg_restore

pg_dump tworzy logiczną kopię jednej bazy. Formaty: plain SQL (łatwy do odtworzenia psql), custom -Fc i directory -Fd (kompresja, selektywne odtwarzanie, równoległość). pg_dump nie zapisuje WAL, nie umożliwia przyrostów; każdy dump jest pełny. Globalne obiekty (role, tablespace) zabezpiecz pg_dumpall -g.

pg_restore służy do odtwarzania formatów -Fc/-Fd. Pozwala filtrować obiekty, używać -j do równoległego odtwarzania i wymuszać kolejność. W scenariuszach CI/CD -Fc/-Fd przyspiesza odtwarzanie względem plain SQL. Dla bezpieczeństwa odtwarzaj na pustej bazie z odpowiednimi właścicielami i schematami.

Pamiętaj o rolach i uprawnieniach. Przy odtwarzaniu brakująca rola zablokuje proces, dlatego zabezpieczaj i odtwarzaj też globalne metadane: Użytkownicy, role i uprawnienia w PostgreSQL.

MySQL — Jak zacząć? Darmowy e-book

MySQL — Jak zacząć? Darmowy e-book

Praktyczny przewodnik po świecie SQL. Poznaj typy danych, zapytania SELECT, JOIN, funkcje agregujące i nie tylko.

Tworzenie pełnej i przyrostowej kopii bazy

Pełny backup logiczny: okresowo uruchamiaj pg_dump -Fc dla każdej krytycznej bazy i przechowuj kopie poza hostem. Dla dużych baz używaj -Fd z -j, aby skrócić czas. To proste w użyciu i dobre do migracji między wersjami.

Pełny backup fizyczny: pg_basebackup tworzy spójny obraz całego klastra (wszystkie bazy) i może dołączyć WAL (-X stream). W połączeniu z archiwizacją WAL uzyskujesz PITR PostgreSQL, czyli możliwość odtwarzania do wybranego punktu w czasie. PostgreSQL nie ma natywnego „przyrostowego dumpa”; przyrost realizuje się przez ciągłe archiwizowanie WAL. Warto użyć slotu replikacji, by kontrolować retencję WAL.

SQL
1 2 -- Zapewnij utrzymanie WAL dla archiwizacji/backupów fizycznych: SELECT pg_create_physical_replication_slot('bkp_slot');

Automatyzacja kopii zapasowych

Harmonogram backupów dostosuj do RPO/RTO: np. pg_dump -Fc co noc, pg_basebackup co tydzień, a WAL archiwizuj ciągle (archive_mode=on, archive_command). W cronie typowo: pełny dump o 02:00, czyszczenie retencji co noc, weryfikacja checksum i raport z wielkości kopii. Trzymaj kopie w niezależnej lokalizacji (offsite/obiektowe storage).

Monitoruj strumień WAL (wielkość, opóźnienia), wolne miejsce i sukces archiwizacji. Po zakończeniu dumpa warto wymusić rotację WAL, aby nie czekać na naturalny rollover i mieć spójny punkt przywracania.

SQL
1 2 -- Wymuś rotację WAL po wykonaniu dumpa (ułatwia archiwizację): SELECT pg_switch_wal();

Odtwarzanie danych i testy przywracania

Odtwarzanie danych PostgreSQL z pg_dump: utwórz rolę właściciela, stwórz pustą bazę, odtwórz pg_restore -C/-d postgres lub -d nowa_baza. Weryfikuj logi na błędy DDL/ACL. Dla formatów -Fd użyj -j, aby skrócić RTO. Po odtworzeniu uruchom sanity checks (liczebności, sumy kontrolne aplikacyjne).

PITR PostgreSQL: zatrzymaj usługę, przywróć katalog z base backupu, skonfiguruj restore_command do pobierania WAL, utwórz recovery.signal i ustaw recovery_target_time lub recovery_target_lsn (w postgresql.conf/auto.conf). Uruchom serwer i obserwuj replay WAL. Gdy osiągnie punkt przywracania, serwer przejdzie do trybu produkcyjnego. Regularnie ćwicz odtwarzanie na środowisku testowym, mierz RTO i weryfikuj, że osiągasz wymagane RPO.

SQL
1 2 3 -- Weryfikacja statusu po starcie instancji testowej: SELECT pg_is_in_recovery() AS in_recovery, pg_last_wal_replay_lsn() AS last_replay_lsn;

Jeśli Twoje transakcje mają specyficzne wymagania spójności, rozumienie izolacji pomoże interpretować stan po odtworzeniu: Transakcje i poziomy izolacji w SQL.

Strategie backupu w środowisku produkcyjnym

Dla większości systemów łącz logikę i fizykę: codzienny pg_dump -Fc (łatwa migracja, szybkie odtwarzanie pojedynczych obiektów) + ciągła archiwizacja WAL i okresowy pg_basebackup pod PITR. Replikacja strumieniowa z hot standby obniża RTO dla awarii węzła, ale nie zastępuje kopii zapasowych (propaguje błędy logiczne). Zdefiniuj retencję kopii i WAL na podstawie regulacji i kosztów przechowywania.

Projektuj pod RPO/RTO, stosuj zasadę 3-2-1, szyfruj kopie (na poziomie narzędzia, storage lub systemu plików) i regularnie testuj przywracanie. Przy dużych wolumenach i partycjach rozważ selektywne dumpy po schematach/tabelach oraz backup fizyczny na poziomie klastra; więcej o podziale danych: Partycjonowanie i sharding w PostgreSQL: podstawy.

Kurs SkumajBazy — Czas w końcu nauczyć się SQLa

Kurs SkumajBazy — Czas w końcu nauczyć się SQLa

Kompleksowy kurs SQL dla programistów, analityków i wszystkich, którzy chcą efektywnie pracować z danymi. Od podstaw do zaawansowanych zapytań.