Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
PostgreSQL
VACUUM vs VACUUM FULL - czym się różnią i kiedy który
Nazwy sugerują, że VACUUM FULL to po prostu "mocniejszy VACUUM", i właśnie to nieporozumienie kosztuje ludzi zablokowaną produkcję. To są dwie zupełnie różne operacje o różnych skutkach i różnej cenie. Jedna działa w tle bez przeszkadzania, druga zatrzymuje dostęp do tabeli na czas przepisania jej od zera. Żeby dobrze utrzymywać bazę PostgreSQL, trzeba dokładnie rozumieć, co robi każda z nich i kiedy naprawdę potrzebujesz tej drugiej.
Widzisz, że tabela z częstymi aktualizacjami zajmuje na dysku znacznie więcej, niż wynikałoby z liczby aktualnych wierszy. Odpalasz zwykły VACUUM, a rozmiar na dysku wcale nie spada - i wyciągasz wniosek, że VACUUM nie działa. Sięgasz więc po VACUUM FULL na produkcyjnej tabeli w środku dnia i nagle wszystkie zapytania do niej stają w kolejce, aplikacja zwalnia albo się wywala, bo operacja trzyma wyłączną blokadę. Drugi wariant tego samego problemu: automatyczny autovacuum chodzi, ale tabela nadal jest rozdęta, bo trafiła na długo otwartą transakcję, która nie pozwala posprzątać martwych wierszy.
PostgreSQL działa na modelu wielowersyjnym. Aktualizacja wiersza nie nadpisuje go w miejscu - powstaje nowa wersja, a stara zostaje jako wiersz martwy, dopóki żadna transakcja może go jeszcze potrzebować. Zwykły VACUUM przechodzi po tabeli i oznacza przestrzeń po martwych wierszach jako wolną do ponownego użycia przez tę samą tabelę. To dlatego rozmiar na dysku po nim zwykle nie maleje: miejsce zostaje zarezerwowane w plikach tabeli i będzie zapełniane nowymi wierszami, zamiast wracać do systemu. VACUUM FULL robi coś zupełnie innego - przepisuje całą tabelę do nowego, ciasno upakowanego pliku i dopiero wtedy oddaje uwolnione miejsce systemowi operacyjnemu. Cena za to jest wysoka: na czas przepisywania bierze wyłączną blokadę, więc nikt nie poczyta ani nie zapisze tej tabeli, i chwilowo potrzebuje miejsca na dwie kopie danych naraz.
VACUUM zamowienia;. To wystarcza, żeby tabela nie puchła w nieskończoność, bo odzyskane miejsce jest ponownie wykorzystywane.VACUUM ANALYZE zamowienia;. To dobry nawyk po dużych zmianach w danych.pg_stat_activity i zamknij zawieszone sesje z bardzo starym początkiem transakcji.VACUUM FULL zamowienia;. Upewnij się wcześniej, że na dysku jest zapas miejsca na drugą kopię tabeli.pg_repack przepisuje tabelę w tle bez wyłącznej blokady na cały czas operacji, co często jest lepsze na produkcji.REINDEX ... CONCURRENTLY, które przebudowuje indeks bez blokowania zapisów.Zmierz rozmiar tabeli przed i po. Przed operacją zanotuj pg_size_pretty(pg_total_relation_size('zamowienia')), wykonaj działanie i zapytaj ponownie. Po zwykłym VACUUM rozmiar na dysku zwykle się nie zmieni - to normalne, bo miejsce zostało zwolnione wewnętrznie; efekt potwierdzisz raczej spadkiem liczby martwych wierszy w widoku pg_stat_user_tables (kolumna n_dead_tup) oraz świeższą datą last_vacuum. Po VACUUM FULL rozmiar fizyczny powinien wyraźnie spaść. Warto też po większym sprzątaniu zerknąć, czy planer ma aktualne statystyki - kolumna last_analyze w tym samym widoku powie, kiedy ostatnio je odświeżono.
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...