Eu tenho uma mesa que está ocupando cerca de 90% do espaço do hd em nosso servidor. Eu decidi soltar algumas colunas para liberar espaço. Mas preciso devolver o espaço ao SO. O problema, porém, é que não tenho certeza do que acontecerá se eu executar VACUUM FULL e não houver espaço livre suficiente para fazer uma cópia da tabela.
Entendo que VACUUM FULL não deve ser usado, mas achei que era a melhor opção nesse cenário.
Todas as idéias seriam apreciadas.
Estou usando o PostgreSQL 9.0.6
Método com pouco ou nenhum tempo de inatividade (impacto mínimo para o usuário)
NOTA: Eu testei isso em 9.1. Eu não tenho nenhum servidor 9.0 por aqui. Tenho certeza de que funcionará no 9.0.
CUIDADO (conforme observado nos comentários de @erny):
Você pode fazer isso praticamente sem tempo de inatividade usando um tablespace temporário. O tempo de inatividade será na forma de bloqueios exclusivos. Mas apenas na mesa você está aspirando. Portanto, tudo o que acontecerá é que as consultas dos clientes simplesmente aguardarão a aquisição do bloqueio se acessarem a tabela em questão. Você não precisa fechar as conexões existentes.
Uma coisa para estar ciente, porém, é que mover a mesa e o vácuo completo precisarão esperar por um bloqueio exclusivo primeiro!
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, comoVACUUM FULL
uma cópia completa. Se você tiver sorte e puder adicionar um disco dinamicamente à máquina, faça isso. Na pior das hipóteses , você pode simplesmente conectar um disco USB (embora arriscado e lento)!Em seguida, monte o novo dispositivo e disponibilize-o como tablespace:
Você pode listar os tablespaces facilmente usando:
Verifique novamente o tablespace atual da sua tabela (você precisa saber para onde movê-lo de volta):
Se for
NULL
, estará no tablespace padrão:Se for assim
NULL
, provavelmente serápg_default
(verifique os documentos oficiais caso seja alterado).Agora mova a tabela sobre:
Aspire:
Mova de volta:
Remova o espaço temporário:
Como você não tem espaço suficiente para executar um vacumm ou reconstruir, você sempre pode reconstruir seus bancos de dados postgresql restaurando-os. Restaurar os bancos de dados, tabelas e índices liberará espaço e desfragmentará. Depois, você pode configurar a manutenção automatizada para limpar seus bancos de dados regularmente.
1 Faça backup de todos os bancos de dados em seu servidor postgresql
Você desejará fazer backup de todos os seus bancos de dados em uma partição que tenha espaço suficiente. Se você estava no Linux, você pode usar o gzip para compactar ainda mais o backup para economizar espaço
2 Faça backup de seus arquivos de configuração
3 Pare o Postgresql
4 apague o conteúdo do diretório de dados
5 Execute initdb para reinicializar seu diretório de dados
6 Restaurar arquivos de configuração
7 Inicie o Postgresql
8 Restaure o dump de todos os bancos de dados que você criou
Rapido e sujo:
Por exemplo,:
$ 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
Se você tiver espaço em disco para fazer um dump e restaurar, deverá ter espaço em disco para fazer um vácuodb --full. O problema é que o vácuodb --full fará uma cópia de todo o arquivo de dados. Então, o que você pode fazer é:
Depois de usar a resposta do exhuma acima para mover o
tablespace
de muitas tabelas para um disco diferente, o seguinte pode ser útil para:tablespace
de volta para o padrãopg_default
.Executar
vacuumdb
em todas as mesas, uma de cada vezSalvar comandos para voltar todas as tabelas movidas
Isso encontra todas as tabelas que usam um
tablespace
"tempspace" nomeado e grava em um arquivo os comandos SQL para movê-los de volta parapg_default
Por fim, execute os comandos SQL no arquivo