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):
Note that high CPU load due to I/O operations may be expected.
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 jak VACUUM 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:
CREATE TABLESPACE tempspace LOCATION '/path/to/new/folder';
Możesz łatwo wymienić obszary tabel, używając:
\db
Sprawdź dwukrotnie bieżący obszar tabel (musisz wiedzieć, gdzie go przenieść z powrotem):
SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';
Jeśli tak NULL
, będzie w domyślnym obszarze tabel:
SHOW default_tablespace;
Jeśli to jest NULL
tak dobrze, to będzie prawdopodobnie pg_default
(sprawdź oficjalne dokumenty w przypadku to zmienić).
Teraz przesuń stół:
ALTER TABLE mytable SET TABLESPACE tempspace;
COMMIT; -- if autocommit is off
Odkurz to:
VACUUM FULL mytable;
Cofnij to:
-- assuming you are using the defaults, the tablespace will be "pg_default".
-- Otherwise use the value from the SELECT we did earlier.
ALTER TABLE mytable SET TABLESPACE pg_default;
COMMIT; -- if autocommit is off
Usuń tymczasowe miejsce:
DROP TABLESPACE tempspace;