Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
PostgreSQL
Odtwarzanie z pg_dump się wywala - kolejność i zależności
pg_dump sypie błędami o brakujących rolach, nieistniejących obiektach albo naruszonych kluczach obcych i nie kończy się poprawnie.pg_restore (który sam układa zależności) oraz opcji takich jak --clean, --if-exists i -j.Nieudane odtwarzanie backupu to jeden z najbardziej nerwowych momentów w pracy administratora - zwłaszcza gdy dzieje się w trakcie awarii. Uspokajamy: w ogromnej większości przypadków winna jest kolejność i zależności, a nie uszkodzony dump. Pokażemy Ci, jak to rozplątać.
Uruchamiasz odtwarzanie i konsola zapełnia się błędami: "role X does not exist" przy GRANT, "schema Y does not exist", "relation Z does not exist" albo naruszenie klucza obcego przy wgrywaniu danych. Przy dumpie tekstowym (psql -f) skrypt leci dalej mimo błędów, więc na końcu masz bazę wgraną częściowo i nie wiesz, co się udało. Przy formacie custom pg_restore potrafi przerwać na pierwszym twardym błędzie. W obu wypadkach efekt jest ten sam: baza nie jest kompletna, a Ty musisz ustalić, czego brakowało w odpowiedniej kolejności.
Obiekty w bazie mają zależności. Nadanie uprawnienia (GRANT) wymaga, by rola już istniała - a role są globalne i pg_dump ich nie zawiera, więc jeśli nie wgrałeś ich wcześniej z pg_dumpall --globals-only, każdy GRANT się wywali. Widok zależy od tabeli, tabela z kluczem obcym zależy od tabeli nadrzędnej, funkcja może zależeć od typu, a wszystko - od schematu i ewentualnego rozszerzenia. Format tekstowy dumpa ma ustaloną kolejność poleceń, ale wykonywany przez psql nie zatrzymuje się na błędach (chyba że ustawisz ON_ERROR_STOP), więc pojedyncza wywrotka na początku kaskaduje dalej. Format custom jest tu wygodniejszy, bo pg_restore zna graf zależności i potrafi ułożyć odtwarzanie poprawnie.
psql -f globalne.sql (plik z pg_dumpall --globals-only). To eliminuje gros błędów "role does not exist".-Fc, użyj pg_restore -d nazwa_bazy plik.dump - narzędzie samo poukłada kolejność obiektów zgodnie z zależnościami.psql: psql -v ON_ERROR_STOP=1 -f dump.sql. Dla pg_restore dodaj -e (exit on error), gdy chcesz twardo przerwać na pierwszym problemie.--clean --if-exists w pg_restore - najpierw czyści stare obiekty (bezpiecznie, bez błędów o ich braku), potem tworzy nowe. Unikasz konfliktów "already exists".--data-only wgrywane po strukturze), a więzy i indeksy z pg_restore, które i tak zakłada je po danych. W praktyce format custom robi to automatycznie.pg_restore -j 4 rozłoży pracę na cztery wątki, zachowując zależności. Działa tylko z formatem custom lub directory.Najpewniejszy dowód to odtwarzanie zakończone bez błędów krytycznych - przejrzyj cały log, nie tylko koniec. Po odtworzeniu policz obiekty i porównaj z serwerem źródłowym: liczbę tabel, widoków, funkcji i rekordów w kilku kluczowych tabelach (SELECT count(*) FROM ...). Sprawdź, czy więzy integralności są aktywne i czy uprawnienia się zgadzają (\dp w psql). Jeśli używałeś pg_restore, możesz najpierw podejrzeć plan odtwarzania bez wykonywania go: pg_restore -l plik.dump wypisze listę obiektów w kolejności - to świetne narzędzie do diagnozy, gdy coś dalej nie wchodzi.
Wróć do listy: 100 najczęstszych pytań i problemów z 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

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
Komentarze (0)
Brak komentarzy...