Blog JSystems - uwalniamy wiedzę!

Szukaj

PostgreSQL

Kopie przyrostowe i różnicowe w PostgreSQL - jak je robić

W skrócie

  • Pełny backup dużej bazy codziennie zajmuje za dużo miejsca i czasu, choć zmienia się w niej tylko ułamek danych.
  • Kopia pełna zapisuje wszystko za każdym razem, bo sama z siebie nie wie, które strony zmieniły się od ostatniego backupu.
  • Rozwiązaniem są kopie przyrostowe i różnicowe, które zapisują tylko zmienione strony - najprościej zrobisz je narzędziem pgBackRest.

Kiedy baza rośnie do setek gigabajtów, codzienny pełny backup przestaje być praktyczny. Kopie przyrostowe i różnicowe pozwalają zapisywać tylko to, co się zmieniło, drastycznie skracając czas i zajętość dysku. Wyjaśnimy różnicę między tymi dwoma typami i pokażemy, jak wdrożyć je narzędziem pgBackRest.

Jak to wygląda w praktyce

Twój backup pełny bazy o rozmiarze kilkuset gigabajtów trwa wiele godzin i codziennie zapisuje niemal te same dane od nowa. Retencja tygodniowa oznacza siedem pełnych kopii, czyli wielokrotność rozmiaru bazy na dysku backupowym. Jednocześnie realnie zmienia się może kilka procent danych dziennie. Marnujesz miejsce i czas na kopiowanie tego, co się nie ruszyło. Chciałbyś zapisywać wyłącznie różnice, ale pg_dump tego nie potrafi.

Dlaczego tak się dzieje

Backup logiczny zawsze eksportuje całą zawartość bazy, bo operuje na poziomie danych, a nie plików. Nie ma pojęcia, które fragmenty zmieniły się od wczoraj. Kopie przyrostowe i różnicowe działają na poziomie fizycznym, porównując strony plików z kopią bazową. Różnica między nimi dotyczy punktu odniesienia. Kopia różnicowa zawiera wszystkie zmiany od ostatniej kopii pełnej. Kopia przyrostowa zawiera tylko zmiany od ostatniej kopii dowolnego typu, czyli od poprzedniego przyrostu.

Konsekwencja jest praktyczna. Przyrostowe są najmniejsze i najszybsze, ale odtworzenie wymaga pełnej kopii i łańcucha wszystkich przyrostów po niej. Różnicowe są większe, lecz do odtworzenia potrzeba tylko pełnej kopii i jednej różnicowej. pgBackRest, narzędzie open source rozwijane m.in. przy wsparciu Crunchy Data, obsługuje oba typy, sam pilnuje łańcucha zależności i potrafi wykrywać zmienione strony, więc nie musisz ręcznie liczyć różnic.

Jak to rozwiązać krok po kroku

  1. Zainstaluj pakiet pgbackrest na serwerze bazodanowym (lub na dedykowanym repozytorium backupów) i utwórz plik konfiguracyjny pgbackrest.conf, wskazując katalog danych PostgreSQL oraz miejsce na repozytorium kopii.
  2. Włącz archiwizację WAL, ustawiając w postgresql.conf parametr archive_mode = on oraz archive_command wywołujący pgbackrest archive-push. Kopie fizyczne bez archiwum WAL nie pozwolą na odtwarzanie do punktu w czasie.
  3. Zainicjuj repozytorium poleceniem pgbackrest --stanza=nazwa stanza-create, a następnie sprawdź poprawność konfiguracji przez pgbackrest --stanza=nazwa check.
  4. Wykonaj kopię pełną, która jest podstawą łańcucha: pgbackrest --stanza=nazwa --type=full backup. To jedyny typ, który zapisuje wszystkie dane.
  5. W kolejnych dniach rób kopie różnicowe albo przyrostowe: --type=diff zapisze zmiany od ostatniej pełnej, a --type=incr zmiany od ostatniej dowolnej kopii. Typowy plan to pełna raz w tygodniu i przyrostowe albo różnicowe w pozostałe dni.
  6. Ustaw retencję parametrem repo-retention-full, na przykład na dwie kopie pełne. pgBackRest sam usunie stare kopie i powiązane z nimi przyrosty oraz WAL, pilnując, żeby nie zostawić osieroconego łańcucha.
  7. Odtwarzanie wykonuj poleceniem pgbackrest --stanza=nazwa restore, opcjonalnie z --type=time --target dla konkretnej chwili. Narzędzie samo złoży pełną kopię z odpowiednimi przyrostami - nie robisz tego ręcznie.

Jak sprawdzić, że zadziałało

Listę kopii i ich typy podejrzysz poleceniem pgbackrest --stanza=nazwa info - zobaczysz pełne, różnicowe i przyrostowe wraz z ich rozmiarem oraz rozmiarem repozytorium. To najlepszy dowód oszczędności: kopie przyrostowe będą wielokrotnie mniejsze od pełnej. Zwróć uwagę na rozmiar w polu backup size kontra repo size, bo pokazuje realne zajęcie miejsca po deduplikacji i kompresji. Poprawność łańcucha weryfikuje sam info, oznaczając zależności między kopiami. Ostateczny test to odtworzenie kopii przyrostowej na maszynie testowej i sprawdzenie liczby wierszy w tabelach zapytaniem SELECT count(*) - jeśli dane się zgadzają, znaczy że pgBackRest poprawnie złożył pełną kopię z przyrostami.

Wróć do listy: 100 najczęstszych pytań i problemów z PostgreSQL

Szkolenie Administracja, replikacja i tuning baz danych PostgreSQL

Sprawdź szkolenie: Administracja, replikacja i tuning baz danych PostgreSQL

To szkolenie może być dofinansowane z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Szkolenie Zaawansowana administracja PostgreSQL - HA, DR, monitoring, skalowanie

Sprawdź szkolenie: Zaawansowana administracja PostgreSQL (HA, DR, monitoring, skalowanie)

To szkolenie może być dofinansowane z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Czym różni się kopia przyrostowa od różnicowej w PostgreSQL?
Różnica dotyczy punktu odniesienia. Kopia różnicowa zawiera wszystkie zmiany od ostatniej kopii pełnej. Kopia przyrostowa zawiera tylko zmiany od ostatniej kopii dowolnego typu, czyli od poprzedniego przyrostu. Przyrostowe są mniejsze i szybsze, ale odtworzenie wymaga pełnej kopii i całego łańcucha przyrostów, podczas gdy różnicowa potrzebuje tylko pełnej i jednej różnicowej.
Dlaczego pg_dump nie umie robić kopii przyrostowych?
Bo pg_dump działa na poziomie logicznym i zawsze eksportuje całą zawartość bazy. Nie ma pojęcia, które fragmenty zmieniły się od wczoraj. Kopie przyrostowe i różnicowe działają na poziomie fizycznym, porównując strony plików z kopią bazową, więc potrzebujesz do nich narzędzia takiego jak pgBackRest.
Jak zrobić kopię przyrostową narzędziem pgBackRest?
Najpierw wykonaj kopię pełną poleceniem pgbackrest --stanza=nazwa --type=full backup, bo jest ona podstawą łańcucha. Potem w kolejnych dniach rób kopie przyrostowe przez --type=incr albo różnicowe przez --type=diff. Wymaga to wcześniej włączonej archiwizacji WAL przez archive_command wywołujące pgbackrest archive-push.
Jak odtworzyć bazę z kopii przyrostowej, skoro składa się z wielu części?
Nie robisz tego ręcznie. Wywołaj pgbackrest --stanza=nazwa restore, a narzędzie samo złoży kopię pełną z odpowiednimi przyrostami w poprawnej kolejności. Możesz dodać --type=time i --target, żeby odtworzyć bazę do konkretnej chwili. pgBackRest sam pilnuje spójności łańcucha zależności między kopiami.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...