Blog JSystems - uwalniamy wiedzę!

Szukaj

PostgreSQL

Jak bezpiecznie odzyskać miejsce zajęte przez pg_wal

W skrócie

  • Katalog pg_wal urósł do wielu gigabajtów i grozi zapełnieniem dysku, a Ty nie wiesz, jak zwolnić miejsce, żeby nie zepsuć bazy.
  • WAL puchnie z konkretnego powodu - porzucony slot replikacji, zawieszona archiwizacja albo za duży limit rozmiaru - i sam z siebie nie zniknie, dopóki tej przyczyny nie usuniesz.
  • Bezpiecznie odzyskujemy miejsce, znajdując i usuwając przyczynę zalegania, a nie kasując pliki ręcznie - ręczne rm w pg_wal potrafi trwale uszkodzić bazę.

Pełny dysk pod pg_wal to stresująca sytuacja, ale ma jasne przyczyny i bezpieczne rozwiązania. Najważniejsze: nigdy nie kasuj plików WAL ręcznie. Pokażemy Ci, jak namierzyć powód i zwolnić miejsce tak, by baza dalej działała poprawnie.

Jak to wygląda w praktyce

Monitoring alarmuje, że partycja z pg_wal jest niemal pełna, a liczba segmentów (plików po 16 MB) rośnie i nie spada mimo checkpointów. W najgorszym scenariuszu dysk zapełnia się do końca, a PostgreSQL przestaje przyjmować zapisy i loguje "No space left on device". Pokusa jest jedna: wejść do katalogu i usunąć stare pliki. To jednak najprostsza droga do trwałego uszkodzenia klastra - te pliki wciąż mogą być potrzebne do odtwarzania po awarii albo do zasilenia repliki. Miejsce trzeba odzyskać u źródła, nie siłowo.

Dlaczego tak się dzieje

Segmenty WAL są usuwane (albo poddawane recyklingowi) dopiero, gdy nie są już do niczego potrzebne. Trzy najczęstsze powody, dla których zostają, to: nieaktywny slot replikacji, który każe primary trzymać WAL od swojego restart_lsn; zawieszona ciągła archiwizacja, gdy archive_command zwraca błąd i PostgreSQL nie może zarchiwizować segmentu, więc go nie usuwa; oraz po prostu wysoki max_wal_size, który pozwala WAL-owi urosnąć między checkpointami. Do tego dochodzi wal_keep_size, jeśli świadomie każesz serwerowi trzymać zapas segmentów. Klucz w tym, że każda z tych sytuacji ma konkretne, dające się sprawdzić źródło - i to je usuwamy, a nie pliki.

Jak to rozwiązać krok po kroku

  1. Ustal, ile miejsca zajmuje WAL i ile masz wolnego na dysku - to punkt odniesienia. Rozmiar samego katalogu sprawdzisz np. poleceniem du -sh na pg_wal po stronie systemu.
  2. Sprawdź sloty replikacji: SELECT slot_name, active, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS zalega FROM pg_replication_slots ORDER BY 3 DESC;. Osierocony slot (active = false z dużym zaleganiem) usuń przez pg_drop_replication_slot('nazwa') - ale dopiero po potwierdzeniu, że nie należy do potrzebnej repliki.
  3. Sprawdź archiwizację: SELECT * FROM pg_stat_archiver;. Jeśli rośnie failed_count, to archive_command się wywala - napraw komendę lub dostępność miejsca docelowego, żeby zaległe segmenty mogły się zarchiwizować i zwolnić.
  4. Wymuś checkpoint, by serwer mógł od razu poddać recyklingowi zbędne segmenty: CHECKPOINT;. To bezpieczna operacja, choć chwilowo obciąża dysk.
  5. Jeśli przyczyną jest zawyżony limit i masz mało miejsca, rozważnie zmniejsz max_wal_size: ALTER SYSTEM SET max_wal_size = '2GB'; i SELECT pg_reload_conf();. Ustaw też max_slot_wal_keep_size, żeby żaden slot nie zapchał dysku w przyszłości.
  6. Gdy dysk jest już całkiem pełny i baza się zatrzymała, dołóż tymczasowo trochę miejsca na tej partycji (rozszerzenie wolumenu albo skasowanie innych, niezwiązanych plików), żeby serwer wystartował - i dopiero wtedy spokojnie usuwaj przyczynę zalegania.
  7. Nigdy nie usuwaj plików z pg_wal ręcznie. Jeśli absolutnie musisz (ostateczność, po backupie), rób to wyłącznie narzędziem pg_archivecleanup, które kasuje tylko segmenty na pewno już niepotrzebne.

Jak sprawdzić, że zadziałało

Po usunięciu przyczyny i checkpoincie liczba plików w pg_wal powinna zacząć spadać, a wolne miejsce na partycji rosnąć - to najważniejszy sygnał. Wróć do pg_replication_slots i pg_stat_archiver: żaden slot nie powinien już zalegać w nieskończoność, a failed_count archiwizera powinien przestać rosnąć. Sprawdź też rozmiar katalogu ponownie po kolejnym checkpoincie i porównaj z wartością wyjściową. Jeśli WAL dalej narasta, to znak, że nie trafiłeś w prawdziwą przyczynę - wróć do kroków 2 i 3, bo najczęściej to właśnie slot albo zablokowana archiwizacja trzymają segmenty.

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

Czy mogę po prostu usunąć stare pliki z katalogu pg_wal?
Nie. Ręczne kasowanie plików w pg_wal to najprostsza droga do trwałego uszkodzenia klastra, bo te segmenty mogą być jeszcze potrzebne do odtwarzania po awarii albo do zasilenia repliki. Miejsce odzyskuje się, usuwając przyczynę zalegania. Jeśli już absolutnie musisz kasować, rób to wyłącznie narzędziem pg_archivecleanup.
Jakie są najczęstsze przyczyny puchnięcia pg_wal?
Trzy najczęstsze to: nieaktywny slot replikacji, który każe trzymać WAL od swojego restart_lsn; zawieszona ciągła archiwizacja, gdy archive_command zwraca błąd i segmenty nie mogą być usunięte; oraz po prostu wysoki max_wal_size pozwalający WAL-owi urosnąć między checkpointami. Każdą z nich da się sprawdzić u źródła.
Jak sprawdzić, czy przyczyną jest zablokowana archiwizacja?
Wykonaj SELECT z widoku pg_stat_archiver i sprawdź kolumnę failed_count. Jeśli rośnie, to archive_command się wywala, na przykład z powodu braku miejsca w celu albo złej ścieżki, i PostgreSQL nie usuwa segmentów, bo nie zdołał ich zarchiwizować. Napraw komendę lub dostępność miejsca docelowego, a zaległe segmenty się zwolnią.
Co zrobić, gdy dysk jest już całkiem pełny i baza stanęła?
Najpierw dołóż tymczasowo trochę miejsca na tej partycji, na przykład przez rozszerzenie wolumenu albo skasowanie innych, niezwiązanych plików, żeby serwer w ogóle wystartował. Dopiero potem spokojnie usuwaj prawdziwą przyczynę: osierocony slot albo zablokowaną archiwizację. Nie kasuj plików WAL, żeby zrobić miejsce.

Komentarze (0)

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

Brak komentarzy...