NOTA: l'ho provato su 9.1. Non ho un server 9.0 in giro qui. Sono sicuro che funzionerà comunque su 9.0.
ATTENZIONE (Come notato nei commenti di @erny):
Note that high CPU load due to I/O operations may be expected.
Puoi farlo praticamente senza downtime utilizzando uno spazio tabella temporaneo. Il tempo morto sarà sotto forma di blocchi esclusivi. Ma solo sul tavolo stai aspirando. Quindi tutto ciò che accadrà è che le query dei client aspetteranno semplicemente l'acquisizione del blocco se accedono alla tabella in questione. Non è necessario chiudere le connessioni esistenti.
Una cosa da tenere presente, però, è che spostare il tavolo e il vuoto pieno dovrà prima aspettare un blocco esclusivo!
Innanzitutto, è ovviamente necessario ulteriore spazio di archiviazione. Come Stéphane
menzionato nei commenti, questo deve essere almeno il doppio della tabella in questione rispetto a VACUUM FULL
una copia completa. Se sei fortunato e puoi aggiungere dinamicamente un disco alla macchina, fallo. Nel peggiore dei casi puoi semplicemente collegare un disco USB (rischioso e lento però)!
Successivamente, monta il nuovo dispositivo e rendilo disponibile come tablespace:
CREATE TABLESPACE tempspace LOCATION '/path/to/new/folder';
Puoi elencare facilmente i tablespace usando:
\db
Controlla nuovamente il tablespace corrente del tuo tavolo (devi sapere dove spostarlo di nuovo):
SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';
Se lo è NULL
, sarà nello spazio tabelle predefinito:
SHOW default_tablespace;
Se quello è NULL
così, sarà probabilmente pg_default
(controllare la documentazione ufficiale , in caso è cambiato).
Ora sposta il tavolo sopra:
ALTER TABLE mytable SET TABLESPACE tempspace;
COMMIT; -- if autocommit is off
Vuoto:
VACUUM FULL mytable;
Sposta indietro:
-- 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
Rimuovi lo spazio temporaneo:
DROP TABLESPACE tempspace;