Blog JSystems - uwalniamy wiedzę!

Szukaj

PostgreSQL

Gdzie są katalogi i pliki klastra PostgreSQL (PGDATA)

W skrócie

  • Musisz zajrzeć do plików klastra - po logi, po konfigurację, po WAL - ale nie wiesz, gdzie fizycznie leży katalog danych PostgreSQL.
  • Katalog PGDATA i jego układ różnią się między dystrybucjami, a same nazwy podkatalogów (base, pg_wal, global) nic nie mówią, dopóki nie wiesz, co jest czym.
  • Pytamy serwer o ścieżkę zapytaniem SQL, a potem mapujemy najważniejsze podkatalogi i pliki, żeby wiedzieć, czego nigdy nie ruszać ręcznie.

Prędzej czy później zejdziesz na poziom systemu plików: żeby przejrzeć logi, podmienić parametr, sprawdzić, co zjada miejsce, albo przenieść klaster. Kłopot w tym, że PostgreSQL nie ma jednej stałej ścieżki - Debian trzyma dane inaczej niż Red Hat, a instalacja ze źródeł jeszcze inaczej. Zamiast zgadywać, warto raz zrozumieć, gdzie zapytać o ścieżkę i co znaczą poszczególne podkatalogi katalogu danych, zwanego PGDATA.

Jak to wygląda w praktyce

Klasyczna sytuacja: log serwera mówi o problemie, a Ty szukasz katalogu danych, żeby przejrzeć pliki logów albo poprawić postgresql.conf. Sprawdzasz oczywiste miejsca i okazuje się, że na Ubuntu dane leżą pod /var/lib/postgresql/16/main, a pliki konfiguracyjne w zupełnie innym drzewie: /etc/postgresql/16/main. Na systemach z rodziny Red Hat wszystko jest razem w /var/lib/pgsql/16/data. Wchodzisz do katalogu danych i widzisz kilkanaście podkatalogów o skrótowych nazwach - base, global, pg_wal, pg_xact - bez pojęcia, który z nich jest bezpieczny do oglądania, a który to wnętrzności silnika, gdzie ręczna zmiana rozwala bazę.

Dlaczego tak się dzieje

Rozjazd bierze się z konwencji pakietów. Debian i Ubuntu mają narzędzia obsługujące wiele wersji i klastrów obok siebie (stąd układ wersja/nazwa i rozdzielenie danych od konfiguracji do /etc), a Red Hat trzyma domyślny klaster w jednym drzewie data. Sam PostgreSQL nie narzuca ścieżki - podaje ją przy inicjalizacji klastra i zapamiętuje jako PGDATA. Wewnątrz tego katalogu układ jest już stały i taki sam wszędzie: base zawiera właściwe dane, po jednym podkatalogu na bazę (nazwanym numerem OID), global trzyma obiekty wspólne dla całego klastra (jak lista ról), pg_wal to dziennik zapisów z wyprzedzeniem (Write-Ahead Log), pg_xact pilnuje statusów transakcji, a pliki tekstowe postgresql.conf, pg_hba.conf i postgresql.auto.conf odpowiadają za konfigurację i reguły dostępu. Plik PG_VERSION mówi, w jakiej wersji format danych został zapisany.

Jak to rozwiązać krok po kroku

  1. Zapytaj sam serwer o ścieżkę - to jedyny pewny sposób niezależny od dystrybucji: SHOW data_directory; w psql albo dowolnym kliencie. Zwróci pełną ścieżkę do PGDATA.
  2. Sprawdź, gdzie realnie leżą pliki konfiguracyjne (na Debianie to inny katalog niż dane): SHOW config_file;, SHOW hba_file;. Dzięki temu edytujesz właściwy plik, a nie kopię, która nic nie zmienia.
  3. Jeśli nie możesz połączyć się z bazą, odczytaj ścieżkę z definicji usługi: na systemd systemctl show -p Environment postgresql@16-main pokaże ustawioną zmienną PGDATA, a proces zobaczysz w ps aux | grep postgres - główny proces ma ścieżkę w argumencie -D.
  4. Wejdź do katalogu danych i zorientuj się w układzie: base (dane baz), global (obiekty klastra), pg_wal (dziennik WAL), log lub pg_log (logi serwera, jeśli tak skonfigurowane).
  5. Zapamiętaj żelazną zasadę: plików w base, global, pg_wal i pg_xact nie edytujesz ani nie kasujesz ręcznie przy działającym serwerze - to prosta droga do uszkodzenia klastra. Ręcznie ruszasz wyłącznie pliki konfiguracyjne.
  6. Rozmiar poszczególnych baz sprawdzaj przez SQL, a nie licząc pliki: SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM pg_database ORDER BY pg_database_size(datname) DESC;.

Jak sprawdzić, że zadziałało

Najprostszy dowód, że trafiłeś we właściwy katalog: w PGDATA istnieje plik PG_VERSION z numerem wersji zgodnym z tym, co zwraca SELECT version();. Powiązanie podkatalogów w base z konkretnymi bazami zrobisz zapytaniem SELECT oid, datname FROM pg_database; - numer OID to nazwa podkatalogu. Jeśli edytowałeś konfigurację, potwierdź, że serwer czyta ten sam plik, który zmieniłeś: SHOW config_file; musi wskazywać dokładnie tę ścieżkę. Gdy chcesz sprawdzić, gdzie serwer faktycznie pisze logi (bywa, że w innym miejscu niż PGDATA), użyj SHOW log_directory; razem z SHOW logging_collector; - jeśli kolektor jest wyłączony, logi mogą trafiać do dziennika systemowego zamiast do pliku.

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

Jak najpewniej znaleźć katalog danych PostgreSQL?
Zapytaj sam serwer: SHOW data_directory; zwróci pełną ścieżkę do PGDATA niezależnie od dystrybucji. To pewniejsze niż zgadywanie, bo Debian, Red Hat i instalacja ze źródeł trzymają dane w różnych miejscach.
Dlaczego na Ubuntu pliki konfiguracyjne nie leżą w katalogu danych?
Bo pakiety Debiana i Ubuntu rozdzielają dane (w /var/lib/postgresql) od konfiguracji (w /etc/postgresql), aby obsługiwać wiele wersji i klastrów obok siebie. Realną lokalizację plików sprawdzisz przez SHOW config_file; oraz SHOW hba_file;.
Których plików w PGDATA nie wolno ruszać ręcznie?
Plików w podkatalogach base, global, pg_wal i pg_xact przy działającym serwerze - to wnętrzności silnika i ręczna edycja albo kasowanie prowadzi do uszkodzenia klastra. Ręcznie zmieniasz wyłącznie pliki konfiguracyjne: postgresql.conf i pg_hba.conf.
Co zawierają podkatalogi base i global?
base to właściwe dane baz - po jednym podkatalogu na bazę, nazwanym numerem OID (powiązanie z nazwą da SELECT oid, datname FROM pg_database). global trzyma obiekty wspólne dla całego klastra, jak lista ról. Podkatalog pg_wal zawiera dziennik zapisów z wyprzedzeniem.

Komentarze (0)

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

Brak komentarzy...