Radzenie sobie z miejscem na dysku pełnym w postgresql

14

Mam aplikację internetową Django z zapleczem postgresql 9.3.10 (w systemie Linux). Wystąpił błąd pełnego dysku, taki że nawet jeśli spróbuję obciąć tabelę, dostaję błędy tego rodzaju:

ERROR:  could not extend file "base/30137/33186048": No space left on device
HINT:  Check free disk space.

Nie mogę łatwo dodać więcej miejsca na dysku do serwera, ani nie mogę usunąć rzeczy z tej maszyny wirtualnej. Istnieje jednak kilka tabel, które są kandydatami do obcinania, ale wydaje się, że nie mogę ich teraz obciąć.

Czy ktoś może mi doradzić, co mogę tutaj zrobić? Uderza to mocno w mój serwer produkcyjny, a ja jestem tu trochę przypadkowym DBA, więc jestem kompletnie zaskoczony.

Hassan Baig
źródło
Możesz odzyskać trochę miejsca, jeśli możesz (tymczasowo) upuścić indeks ... obciąć tabele, a następnie odtworzyć go
joanolo

Odpowiedzi:

9

Ponieważ PostgreSQL musi napisać WAL przed wprowadzeniem jakichkolwiek zmian w tabelach, potrzebuje wolnego miejsca na dysku, aby usunąć rzeczy i zwolnić więcej miejsca na dysku.

Jeśli pozwolisz, aby dysk się zapełnił, nie możesz odzyskać z PostgreSQL. Nawet TRUNCATEwciąż musi pisać do WAL.

Więc musi zwolnić trochę miejsca na woluminie, lub poszerzyć głośność. Jeśli twoje pliki dziennika PostgreSQL znajdują się w pg_logkatalogu danych, możesz bezpiecznie usunąć niektóre z nich i ponownie uruchomić Pg.

Czy nie usuwać pg_xloglub pg_clog. To nie są dzienniki błędów serwera, to krytyczne części bazy danych, dziennik transakcji i dziennik zatwierdzeń.

Craig Ringer
źródło
Dlaczego TRUNCATEtrzeba pisać na wal i jak wygląda ten wpis w WAL?
Evan Carroll,
„obcinanie nie rejestruje pełnych danych, tylko fakt, że nastąpiło obcinanie. Aby móc je przywrócić, plik źródłowy jest przechowywany do momentu zatwierdzenia transakcji”. [źródło] ( postgresql.org/message-id/… Więc wpis Truncate'a w ścianie jest bardzo mały. Zwykłe bajty. Gdyby to było całe potrzebne miejsce, prawdopodobnie można je zdobyć rm -rf /tmp/*lub usunąć vimrc.
Evan Carroll
@EvanCarroll rm -rf /tmp/*... które mogą również usuwać rzeczy, których możesz chcieć, takie jak gniazda aplikacji itp. Lepiej być bardziej selektywnym. Jeśli chodzi o potrzebne miejsce, masz rację, jest minimalne - 8k pustej tabeli + kilka kb wpisów WAL do obcinania, alokacji xid, zatwierdzania rekordów itp.
Craig Ringer