Ponieważ nie masz wystarczająco dużo miejsca, aby uruchomić vacumm lub przebudować, zawsze możesz odbudować swoje bazy danych postgresql, przywracając je. Przywracanie baz danych, tabel, indeksów zwalnia miejsce i defragmentację. Następnie możesz skonfigurować automatyczną konserwację, aby regularnie opróżniać bazy danych.
1 Utwórz kopię zapasową wszystkich baz danych na serwerze postgresql
Będziesz chciał wykonać kopię zapasową wszystkich baz danych na partycji, która ma wystarczającą ilość miejsca. Jeśli korzystasz z systemu Linux, możesz użyć gzip, aby dodatkowo skompresować kopię zapasową, aby zaoszczędzić miejsce
su - postgres
pg_dumpall | gzip -9 > /some/partition/all.dbs.out.gz
2 Utwórz kopię zapasową plików konfiguracyjnych
cp /path/to/postgresql/data_directory/*.conf /some/partition/
3 Stop Postgresql
pg_ctl -D /path/to/postgresql/data_directory stop
4 skasuj zawartość katalogu danych
rm -Rf /path/to/postgresql/data_directory/*
5 Uruchom initdb, aby ponownie zainicjować katalog danych
initdb -D /path/to/postgresql/data_directory
6 Przywróć pliki konfiguracyjne
cp /some/partition/*.conf /path/to/postgresql/data_directory/*.conf
7 Uruchom Postgresql
pg_ctl -D /path/to/postgresql/data_directory start
8 Przywróć zrzut wszystkich utworzonych baz danych
gunzip /some/partition/all.dbs.out.gz
psql -f /some/partition/all.dbs.out
gzip
części, aby zaoszczędzić czas.UWAGA: Testowałem to na wersji 9.1. Nie mam tutaj żadnego serwera 9.0. Jestem pewien, że preeeettty będzie działało na 9.0.
UWAGA (jak zauważono w komentarzach @erny):
Możesz to zrobić praktycznie bez przestojów, korzystając z tymczasowego obszaru tabel. Czas przestoju będzie miał postać wyłącznych zamków. Ale tylko na stole odkurzasz. Wszystko, co się stanie, to zapytania klientów będą po prostu czekać na uzyskanie blokady, jeśli uzyskają dostęp do danej tabeli. Nie musisz zamykać istniejących połączeń.
Należy jednak pamiętać, że przesuwanie stołu i próżnia pełna będą musiały najpierw poczekać na wyłączność blokady!
Po pierwsze, oczywiście potrzebujesz dodatkowej pamięci. Jak
Stéphane
wspomniano w komentarzach, musi on być co najmniej dwa razy większy niż tabela, o której mowa, tak jakVACUUM FULL
pełna kopia. Jeśli masz szczęście i możesz dynamicznie dodać dysk do komputera, zrób to. W najgorszym przypadku możesz po prostu podłączyć dysk USB (ryzykowny i wolny)!Następnie zamontuj nowe urządzenie i udostępnij je jako przestrzeń tabel:
Możesz łatwo wymienić obszary tabel, używając:
Sprawdź dwukrotnie bieżący obszar tabel (musisz wiedzieć, gdzie go przenieść z powrotem):
Jeśli tak
NULL
, będzie w domyślnym obszarze tabel:Jeśli to jest
NULL
tak dobrze, to będzie prawdopodobniepg_default
(sprawdź oficjalne dokumenty w przypadku to zmienić).Teraz przesuń stół:
Odkurz to:
Cofnij to:
Usuń tymczasowe miejsce:
źródło
size of table x 2
, ponieważVACUUM FULL
tworzy pełną kopię tabeli.Szybko i brudno:
Na przykład,:
$ service postgresql stop $ mv /var/lib/postgresql/9.5/main /mnt/bigdisk $ ln -sr /mnt/bigdisk/main /var/lib/postgresql/9.5 $ vacuumdb --all --full $ rm /var/lib/postgresql/9.5/main $ mv /mnt/bigdisk/main /var/lib/postgresql/9.5 $ service postgresql start
źródło
Jeśli masz miejsce na dysku, aby zrobić zrzut i przywrócić, powinieneś mieć miejsce na dysku, aby wykonać próżnię - full. Problem polega na tym, że Vacuumdb --full utworzy kopię całego pliku danych. Co możesz zrobić:
źródło