Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
PostgreSQL
Jak bezpiecznie odzyskać miejsce zajęte przez pg_wal
pg_wal urósł do wielu gigabajtów i grozi zapełnieniem dysku, a Ty nie wiesz, jak zwolnić miejsce, żeby nie zepsuć bazy.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.
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.
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.
du -sh na pg_wal po stronie systemu.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.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ć.CHECKPOINT;. To bezpieczna operacja, choć chwilowo obciąża dysk.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.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.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

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...