NOTA: Eu testei isso na 9.1. Não tenho nenhum servidor 9.0 por aqui. Tenho muita certeza de que ele funcionará no 9.0.
CUIDADO (Conforme observado nos comentários de @erny):
Note that high CPU load due to I/O operations may be expected.
Você pode fazer isso praticamente sem tempo de inatividade usando um espaço de tabela temporário. O tempo de inatividade será na forma de bloqueios exclusivos. Mas apenas na mesa você está aspirando. Então, tudo o que acontecerá é que as consultas do cliente simplesmente aguardarão a aquisição do bloqueio se eles acessarem a tabela em questão. Você não precisa fechar as conexões existentes.
Uma coisa a ter em mente, porém, é que mover a mesa e o vácuo cheio precisará esperar primeiro um bloqueio exclusivo!
Primeiro, você obviamente precisa de algum armazenamento adicional. Como Stéphane
mencionado nos comentários, isso precisa ser pelo menos duas vezes maior que a tabela em questão, VACUUM FULL
assim como uma cópia completa. Se você tiver sorte e puder adicionar dinamicamente um disco à máquina, faça isso. Na pior das hipóteses , você pode simplesmente conectar um disco USB (embora seja arriscado e lento)!
Em seguida, monte o novo dispositivo e disponibilize-o como espaço de tabela:
CREATE TABLESPACE tempspace LOCATION '/path/to/new/folder';
Você pode listar os espaços de tabela facilmente usando:
\db
Verifique duas vezes o espaço de tabela atual da sua tabela (você precisa saber para onde movê-lo de volta):
SELECT tablespace FROM pg_tables WHERE tablename = 'mytable';
Se for NULL
, ele estará no espaço de tabela padrão:
SHOW default_tablespace;
Se isso é NULL
assim, ele provavelmente vai ser pg_default
(confira os documentos oficiais em caso é alterado).
Agora mova a mesa para cima:
ALTER TABLE mytable SET TABLESPACE tempspace;
COMMIT; -- if autocommit is off
Vácuo:
VACUUM FULL mytable;
Mover para trás:
-- 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
Remova o espaço temporário:
DROP TABLESPACE tempspace;