Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
PostgreSQL
Role i uprawnienia nie wróciły po odtworzeniu - pg_dumpall --globals
pg_dump na nowym serwerze aplikacja dostaje błędy o nieistniejących rolach albo braku uprawnień.pg_dump zapisuje jedną bazę, ale nie zapisuje ról ani haseł, bo te są wspólne dla całego klastra, a nie dla pojedynczej bazy.pg_dumpall --globals-only i odtwarzasz je przed przywróceniem bazy.To jedna z najczęstszych pułapek przy przenoszeniu bazy między serwerami. Backup wygląda na kompletny, dane się odtwarzają, a jednak logowanie nie działa. Wyjaśnimy, dlaczego role znikają i jak zrobić backup, po którym środowisko wstaje w komplecie, razem z użytkownikami i hasłami.
Przenosisz bazę na nowy serwer: robisz pg_dump, tworzysz bazę docelową i odtwarzasz dump. Dane są na miejscu, ale aplikacja nie może się zalogować, bo rola, na której działa, nie istnieje. Albo rola istnieje, lecz przy odtwarzaniu poleceń GRANT sypią się błędy role "app_user" does not exist. Ręcznie tworzysz brakujące role, ale wtedy nie znasz ich haseł ani atrybutów, więc i tak trzeba je konfigurować od zera. Robi się z tego droga przez mękę.
W PostgreSQL role, ich hasła oraz uprawnienia na poziomie klastra (na przykład CREATEDB czy SUPERUSER) nie należą do żadnej pojedynczej bazy. Są obiektami globalnymi, wspólnymi dla całego klastra i przechowywanymi w katalogu systemowym poza bazami użytkownika. Dlatego pg_dump, który z definicji zrzuca zawartość jednej bazy, ich nie zawiera. W dumpie znajdują się polecenia GRANT odwołujące się do ról po nazwie, ale sama definicja roli i jej hasło pozostają na starym serwerze.
Kiedy odtwarzasz taki dump na świeżym klastrze, w którym tych ról jeszcze nie ma, polecenia GRANT nie mają komu nadać uprawnień. Właściciele tabel również nie mogą zostać ustawieni, bo wskazywana rola nie istnieje. Rozwiązaniem jest oddzielne narzędzie pg_dumpall, które w trybie --globals-only wyciąga właśnie te obiekty globalne dla całego klastra.
pg_dumpall --globals-only -f globals.sql. Powstanie plik SQL z definicjami wszystkich ról, ich haseł, atrybutów i uprawnień na poziomie klastra oraz definicji tablespace'ów.pg_dump -Fc baza -f baza.dump. Te dwa pliki uzupełniają się nawzajem.psql -f globals.sql postgres. Kolejność jest kluczowa - role muszą istnieć, zanim odtworzysz bazę, która się do nich odwołuje.pg_restore -C -d postgres baza.dump. Opcja -C tworzy bazę i od razu ustawia poprawnego właściciela, bo rola już istnieje.pg_dump baz, dorzuć jedno wywołanie pg_dumpall --globals-only, żeby nie odtwarzać ról ręcznie w kryzysie.pg_dumpall bez flagi - zapisze i globalsy, i wszystkie bazy. Wadą jest format wyłącznie tekstowy i brak równoległości, więc dla dużych baz zostań przy rozdzieleniu na globalsy plus pojedyncze dumpy custom.Po odtworzeniu obiektów globalnych wypisz listę ról poleceniem \du w psql i porównaj ją z listą ze starego serwera - powinny zgadzać się nazwy oraz atrybuty. Poprawność haseł potwierdzisz najlepiej realnym logowaniem rolą aplikacyjną: psql -U app_user -d baza -h nowy_serwer. Jeśli logowanie przechodzi bez ręcznego ustawiania hasła, znaczy że hasło przyjechało w globalsach. Na koniec sprawdź uprawnienia na kluczowej tabeli poleceniem \dp nazwa_tabeli - obecność wpisów GRANT dla właściwych ról dowodzi, że odtworzenie w poprawnej kolejności zadziałało i aplikacja ma pełny dostęp.
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...