Blog JSystems - uwalniamy wiedzę!

Szukaj

PostgreSQL

Jak zrobić i odtworzyć backup bazy przez pg_dump

W skrócie

  • Potrzebujesz pewnej kopii bazy PostgreSQL i możliwości odtworzenia jej na innym serwerze, ale nie wiesz, jak poprawnie użyć pg_dump i jak potem przywrócić dane.
  • Backup logiczny przez pg_dump zapisuje strukturę i dane w przenośnej postaci, ale bez znajomości formatów (plain vs custom) i roli globalnych obiektów łatwo o niekompletne odtworzenie.
  • Użyj pg_dump w formacie custom z kompresją i równoległością, backupuj globalne obiekty osobno przez pg_dumpall --globals, a odtwarzaj przez pg_restore do świeżej bazy.

pg_dump to podstawowe narzędzie backupu logicznego w PostgreSQL. Jest przenośne, działa między wersjami i pozwala odtworzyć pojedynczą bazę albo jej fragment. Pokazujemy, jak zrobić backup we właściwym formacie i jak go bezbłędnie przywrócić, wraz z rolami i uprawnieniami.

Jak to wygląda w praktyce

Objaw to zwykle potrzeba, a nie awaria: migracja bazy na nowy serwer, kopia przed ryzykowną zmianą, przeniesienie pojedynczej bazy z klastra albo regularny backup logiczny obok kopii fizycznej. Często pojawia się też problem odwrotny - odtworzenie z dumpa się nie udaje, bo backup zrobiono w formacie plain (zwykły plik SQL), przez co nie da się odtwarzać równolegle ani wybierać pojedynczych obiektów, albo bo zapomniano o rolach i uprawnieniach.

Dlaczego tak się dzieje

pg_dump tworzy tak zwany backup logiczny: nie kopiuje plików bazy, tylko generuje komplet poleceń (albo dane w formacie wewnętrznym), które odtwarzają strukturę i zawartość bazy. Dzięki temu backup jest przenośny między systemami i wersjami PostgreSQL - w odróżnieniu od backupu fizycznego, który jest związany z konkretną wersją i architekturą.

Kluczowa sprawa jest format. Format plain to zwykły skrypt SQL, który odtwarzasz przez psql - prosty, ale bez selektywnego odtwarzania i równoległości. Format custom (i directory) to postać skompresowana, którą odtwarzasz przez pg_restore z możliwością wyboru obiektów i pracy wielowątkowej. Druga sprawa: pg_dump obejmuje jedną bazę, ale nie zapisuje obiektów globalnych klastra - ról, uprawnień i tablespace. Te zapisuje osobno pg_dumpall z opcją --globals-only. Pominięcie tego kroku to najczęstsza przyczyna niekompletnego odtworzenia.

Jak to rozwiązać krok po kroku

  1. Zrób backup pojedynczej bazy w formacie custom z kompresją: pg_dump -h localhost -U postgres -F c -f baza.dump nazwa_bazy. Flaga -F c to format custom, który później odtworzysz elastycznie przez pg_restore.
  2. Dla dużej bazy użyj formatu directory i równoległości, aby przyspieszyć: pg_dump -F d -j 4 -f katalog_backup nazwa_bazy. Opcja -j 4 uruchamia cztery równoległe procesy zrzutu.
  3. Zabezpiecz obiekty globalne całego klastra (role, hasła, uprawnienia, tablespace): pg_dumpall --globals-only -f globalne.sql. Bez tego pliku odtworzona baza może nie mieć właścicieli i uprawnień.
  4. Przy odtwarzaniu najpierw wgraj globalne obiekty na docelowym serwerze: psql -f globalne.sql postgres. Dzięki temu istnieją już role, do których będą przypisane obiekty bazy.
  5. Utwórz pustą bazę docelową i odtwórz do niej dump: createdb nazwa_bazy, a następnie pg_restore -d nazwa_bazy -j 4 baza.dump. Równoległe -j 4 działa tylko dla formatów custom i directory.
  6. Jeśli robiłeś backup w formacie plain (zwykły plik SQL), odtwarzasz go inaczej - przez psql: psql -d nazwa_bazy -f baza.sql. Pamiętaj, że tu nie zadziała równoległość ani wybór pojedynczych obiektów.

Jak sprawdzić, że zadziałało

Po odtworzeniu sprawdź, czy wszystkie obiekty są na miejscu. Porównaj liczbę tabel: SELECT count(*) FROM information_schema.tables WHERE table_schema = 'public'; na źródle i na kopii. Zwaliduj liczbę wierszy w kluczowych tabelach po obu stronach. Sprawdź, czy właściciele i uprawnienia się zgadzają, np. \dp w psql, oraz czy role istnieją: \du. Jeśli pg_restore zgłaszał ostrzeżenia, przejrzyj je - drobne komunikaty o brakujących rolach oznaczają zwykle pominięty plik globalnych obiektów. Na koniec wykonaj proste zapytanie biznesowe, aby potwierdzić, że dane są spójne.

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ę format custom od plain w pg_dump?
Format plain to zwykły skrypt SQL odtwarzany przez psql, prosty, ale bez równoległości i wyboru obiektów. Format custom jest skompresowany i odtwarzany przez pg_restore, co pozwala odtwarzać wybrane obiekty i pracować wielowątkowo.
Dlaczego po odtworzeniu z pg_dump brakuje ról i uprawnień?
pg_dump zrzuca tylko jedną bazę, bez globalnych obiektów klastra takich jak role i tablespace. Musisz osobno zrobić pg_dumpall z opcją --globals-only i wgrać ten plik przed odtworzeniem właściwej bazy.
Jak przyspieszyć backup i odtwarzanie dużej bazy?
Użyj formatu directory przy pg_dump z opcją -j oraz pg_restore z opcją -j, aby uruchomić kilka równoległych procesów. Równoległość działa jednak tylko dla formatów custom i directory, nigdy dla zwykłego pliku SQL.
Czy backup z pg_dump działa między różnymi wersjami PostgreSQL?
Tak, backup logiczny jest przenośny między wersjami, dlatego pg_dump nadaje się do migracji na nowszą wersję. Zaleca się używać pg_dump w wersji zgodnej z serwerem docelowym, czyli tym nowszym, na który odtwarzasz dane.

Komentarze (0)

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

Brak komentarzy...