Nosso servidor de produção Windows PostgreSQL 9.0 está com pouco espaço.
Em nosso banco de dados de 100 GB, temos uma grande tabela contendo dados binários TOASTed. Excluímos algumas linhas e precisamos devolver o espaço ao O/S.
Não temos espaço suficiente para fazer uma reescrita completa da tabela e todas as minhas leituras de CLUSTER
, VACUUM FULL
e pg_repack
é necessário reescrever a tabela. Meu google-fu tem sido insuficiente até agora para encontrar qualquer outra coisa.
Algum tempo de inatividade é aceitável (~ 2 horas), no entanto, o backup/restauração é muito lento para nossos propósitos, e não estou interessado em descartar o banco de dados entre as etapas.
PERGUNTA: Como posso devolver o espaço em disco ao sistema operacional sem fazer uma reescrita completa da tabela?
(Este é um servidor de produção, portanto, todas as soluções devem ser respeitáveis/recomendadas/suportadas, etc.).
(PS Um disco separado muito maior está disponível e pode ser usado, se a tabela puder ser reconstruída de alguma forma. Tablespaces?)
Se você usar qualquer coisa, exceto
CLUSTER
/VACUUM FULL
/pg_repack
(que gerencia bloqueios automaticamente), precisará garantir que não haja gravações simultâneas na tabela. Pegue um bloqueio exclusivo na tabela e faça tudo em uma única transação ou, melhor ainda, feche todas as conexões para evitar alterações simultâneas.TABLESPACE
Sim, sua última ideia pode funcionar. Crie um novo tablespace no outro disco.
Em seguida, crie uma cópia otimizada da tabela no novo tablespace:
A cópia será empacotada firmemente sem linhas mortas.
Em seguida, você pode simplesmente descartar a tabela antiga e renomear a nova para continuar usando o novo disco.
Ou , se você tiver que mantê-lo no disco antigo por algum motivo, exclua a tabela antiga, renomeie a nova e mova-a de volta para o tablespace padrão. Esta etapa é muito mais rápida agora com:
Por documentação:
De qualquer forma, não se esqueça de (re)criar todos os objetos dependentes. Índices, chaves estrangeiras, visualizações, ...
Bem, você poderia usar
ALTER TABLE tbl SET TABLESPACE ...
para começar, mas a tabela não seria otimizada conforme solicitado, apenas movida como está. Mas você teria espaço de manobra suficiente para executar pg_repack etc.COPY
Um backup / restauração completo pode demorar muito, mas você pode fazer isso apenas para a tabela em questão.
A mesa agora está bem embalada.
tabela temporária
Se você tiver RAM suficiente, poderá fazer algo semelhante com uma tabela temporária na RAM. Seria muito mais rápido. Instruções detalhadas:
Se o seu ambiente tiver mais espaço em disco do que o tamanho dos "dados reais (após reduzidos)" desta tabela. você pode usar pg_reorg para reduzir o espaço de inchaço desta tabela. ou você pode usar o incremento londiste3 para copiar esta tabela e usar menos tempo para trocar. mas se seu env não tiver mais espaço que essa tabela, não pode reduzir.
existe outra maneira de reduzir o espaço de inchaço quando você pode remover tuplas em páginas de heap; esse método usa menos espaço de adição para reduzir a tabela de inchaço. COMO exp:
você deve manter bloqueios de atenção, isso é apenas um pensamento.