Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
PostgreSQL
Zmiana parametru w postgresql.conf nie działa - reload czy restart
postgresql.conf, a serwer dalej działa po staremu - zmiana nie zadziałała.pg_settings, jaki kontekst ma parametr, wykonujemy właściwą operację i weryfikujemy wartość na żywo.Wielu administratorów zmienia wpis w postgresql.conf, po czym dziwi się, że nic się nie stało. Sedno tkwi w tym, że PostgreSQL dzieli parametry na kategorie według sposobu ich zastosowania - jedne wystarczy przeładować, inne wymagają restartu całego serwera. Do tego dochodzi mechanizm nadpisywania ustawień na różnych poziomach. Ten problem dotyczy każdego, kto stroi wydajność albo zmienia zachowanie bazy. Pokazujemy, jak sprawdzić, czego dany parametr wymaga, i jak potwierdzić zmianę.
Edytujesz plik, przeładowujesz konfigurację, a wartość w bazie ani drgnie:
# w postgresql.conf zmieniamy:
shared_buffers = 512MB
$ sudo systemctl reload postgresql
$ psql -c "SHOW shared_buffers;"
shared_buffers
----------------
128MBParametr dalej ma starą wartość, mimo że w pliku jest już nowa. To nie błąd - shared_buffers należy do grupy parametrów, które można zmienić wyłącznie przy restarcie serwera. Reload takich ustawień po prostu nie rusza.
Każdy parametr w PostgreSQL ma tak zwany kontekst, widoczny w kolumnie context widoku pg_settings. Kontekst sighup oznacza, że parametr aktualizuje się przy przeładowaniu konfiguracji (reload wysyła procesowi serwera sygnał HUP). Kontekst postmaster oznacza parametr wczytywany tylko przy starcie procesu głównego - taki wymaga pełnego restartu, na przykład shared_buffers, listen_addresses, max_connections czy wal_level. Są też konteksty user i superuser, gdzie parametr można zmienić w ramach sesji poleceniem SET. Druga częsta przyczyna to nadpisywanie - wartość ustawiona przez ALTER SYSTEM ląduje w pliku postgresql.auto.conf, który jest wczytywany po postgresql.conf i przesłania Twój ręczny wpis.
SELECT name, setting, context, pending_restart FROM pg_settings WHERE name = 'shared_buffers';.sighup, wystarczy reload: sudo -u postgres psql -c "SELECT pg_reload_conf();" lub sudo systemctl reload postgresql.postmaster, potrzebny jest pełny restart: sudo systemctl restart postgresql - dopiero wtedy nowa wartość wejdzie w życie.postgresql.auto.conf (efekt wcześniejszego ALTER SYSTEM). Jeśli tak, ustaw wartość spójnie przez ALTER SYSTEM SET shared_buffers = '512MB'; albo wyczyść wpis przez ALTER SYSTEM RESET shared_buffers;.SHOW config_file;. Łatwo pomylić plik przy kilku klastrach na jednej maszynie.pending_restart w pg_settings ustawiona na t to sygnał, że zmiana czeka na restart serwera - zaplanuj go w oknie serwisowym.Po właściwej operacji potwierdź nową wartość na żywo w serwerze - a przy okazji sprawdź, czy nic już nie czeka na restart:
SELECT name, setting, unit, context, pending_restart
FROM pg_settings
WHERE name = 'shared_buffers';Jeśli setting odpowiada nowej wartości, a pending_restart jest f, zmiana jest aktywna. Możesz też odczytać ją prościej: SHOW shared_buffers;.
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...