Lidando com o espaço em disco cheio no postgresql

14

Eu tenho um aplicativo da web Django com back-end postgresql 9.3.10 (sentado em um sistema operacional Linux). Corri para o erro de disco cheio, de modo que, mesmo se eu tentar truncar uma tabela, recebo erros do tipo:

ERROR:  could not extend file "base/30137/33186048": No space left on device
HINT:  Check free disk space.

Não posso adicionar facilmente mais espaço em disco ao servidor, nem excluir coisas nesta VM. No entanto, existem várias tabelas candidatas a truncamento, mas parece que também não posso truncá-las agora.

Alguém pode me dar conselhos sobre o que posso fazer aqui? Isso está afetando bastante meu servidor de produção, e eu sou um DBA acidental aqui, tão totalmente perplexo.

Hassan Baig
fonte
Você pode recuperar algum espaço se você pode (temporariamente) soltar um tabelas de índice ... Truncar e, em seguida, recriá-lo
joanolo

Respostas:

9

Como o PostgreSQL deve escrever o WAL antes de fazer alterações nas tabelas, ele precisa de espaço livre em disco para excluir as coisas e liberar mais espaço em disco.

Se você deixar o disco encher, não poderá se recuperar no PostgreSQL. Mesmo TRUNCATEainda tem que escrever para o WAL.

Portanto, você deve liberar espaço no volume ou expandir o volume. Se os arquivos de log do PostgreSQL estiverem no pg_logdiretório de dados, você poderá remover com segurança alguns deles e reiniciar a página.

Você não exclua pg_xlogou pg_clog. Esses não são logs de erro do servidor, são partes críticas do banco de dados, do log de transações e do commit.

Craig Ringer
fonte
Por que TRUNCATEtem que escrever para wal e como é essa entrada no WAL?
Evan Carroll
"truncate não registra os dados completos, apenas o fato de ter ocorrido um truncado. Para poder recuperá-lo, o arquivo subjacente é mantido até a confirmação da transação." [fonte] ( postgresql.org/message-id/… Portanto, a entrada do truncado na parede é super pequena. meros bytes. Se essa era a carga de espaço necessária, você provavelmente poderia obtê-la rm -rf /tmp/*ou excluir seu vimrc.
Evan Carroll
@EvanCarroll rm -rf /tmp/*... que também pode excluir coisas que você pode querer, como soquetes de aplicativos etc. É melhor ser mais seletivo. Quanto espaço necessário, você está certo, é mínima - um 8k mesa vazia + alguns kb de entradas WAL para o truncado, alocação XID, cometer registro, etc.
Craig Ringer