PostgreSQL: Miejsce na dysku nie jest zwolnione po TRUNCATE


12

Mam TRUNCATEogromną tabelę (~ 120 Gb) o nazwie files:

TRUNCATE files;
VACUUM FULL files;

Rozmiar tabeli wynosi 0, ale nie zwolniono miejsca na dysku. Wszelkie pomysły, jak odzyskać utracone miejsce na dysku?

AKTUALIZACJA: Miejsce na dysku zostało zwolnione po ~ 12 godzinach, bez żadnych działań po mojej stronie. Używam serwera Ubuntu 8.04.


Chciałem zasugerować „odkurz to!”, Ale biorąc pod uwagę, że właśnie to zrobiłeś, radzę zabrać to do listy hakerów pg lub wydajności pg (i ponownie połączyć się z wątkiem lub odpowiedzią, gdy już otrzymasz) jeden).
Denis de Bernardy

Czy ten link ( postgresql.1045698.n5.nabble.com/... ) zawiera jakieś porady dla Ciebie? Może nadal coś uzyskuje dostęp do stołu lub czegoś podobnego.
DrColossos

@DrColossos: Przeczytałem komentarz w źródle (komentarz, którego nie mogę teraz znaleźć), który powiedział, że PostgreSQL powiadomił wszystkie połączenia, które miały nastąpić, i zablokował niezbędne zasoby. (Istnieje kilka, w tym sama tabela, indeksy, sekwencje i tabele toastowe.) Jestem prawie pewien, że znalazłem komentarz wcześniej, śledząc za pomocą ExecuteTruncate (), ale nie jestem w 100% pozytywny na ten temat.
Mike Sherrill „Cat Recall”

Odpowiedzi:


12

Zgodnie z komentarzami w źródle , truncatetworzy nowy, pusty plik pamięci i usuwa stary plik pamięci w czasie zatwierdzania. (Dokumenty sugerują, że „plik pamięci” jest po prostu plikiem, jeśli chodzi o system operacyjny, ale mogę nie rozumieć terminologii).

Utwórz nowy pusty plik pamięci dla relacji i przypisz go jako wartość parametru relfilenode. Stary plik pamięci jest zaplanowany do usunięcia przy zatwierdzeniu.

Ponieważ wydaje się, że usuwa plik, mogę sobie wyobrazić przypadki, w których podstawowy system operacyjny może nie zwolnić tego miejsca natychmiast. Wyobrażam sobie, że w niektórych przypadkach plik pamięci może skończyć na przykład w Koszu w systemie Windows. Ale w moim przypadku obcięcie tabeli w PostgreSQL 9. coś natychmiast zwiększyło przestrzeń w systemie Windows.

Obcinanie jest również rejestrowane w dzienniku WAL. Nie wiem, jaki to może mieć wpływ.


2
Można sobie wyobrazić, że inny proces zaplecza nadal ma deskryptor pliku do otwarcia pliku. Jeśli to się powtórzy, spróbuję zakończyć wszystkie inne procesy zaplecza, aby zobaczyć, czy to robi różnicę.
Peter Eisentraut

Jestem prawie pewien, że przeczytałem, że funkcja ExecuteTruncate () ma się upewnić, że tak się nie stanie. Cała część blokowania zasobów niezbędnych do ostatecznego usunięcia starego pliku pamięci. Ale nie wiem, gdzie to znalazłem w źródle. Przeglądam to online; w ten sposób łatwo się zgubić.
Mike Sherrill „Cat Recall”
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.