Eu tenho um aplicativo da web Django com backend postgresql 9.3.10 (sentado em um sistema operacional Linux). Eu encontrei um 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 consigo adicionar facilmente mais espaço em disco ao servidor, nem posso excluir coisas nesta VM. No entanto, existem várias tabelas que são candidatas ao truncamento, mas parece que também não posso truncá-las agora.
Alguém pode me dar uma dica do que posso fazer aqui? Isso está afetando muito meu servidor de produção, e eu sou um DBA acidental aqui, totalmente perplexo.
Como o PostgreSQL deve escrever WAL antes de fazer qualquer alteração nas tabelas, ele precisa de espaço livre em disco para excluir coisas e liberar mais espaço em disco.
Se você deixar o disco ficar cheio, não poderá recuperar a partir do PostgreSQL. Mesmo
TRUNCATE
ainda tem que escrever para WAL.Portanto, você deve liberar algum espaço no volume ou expandir o volume. Se seus arquivos de log do PostgreSQL estiverem no
pg_log
diretório de dados, você pode remover alguns deles com segurança e reiniciar o Pg.Não exclua ou . _ Estes não são logs de erros do servidor, são partes críticas do banco de dados, o log de transações e o log de confirmação.
pg_xlog
pg_clog
Mais algumas ideias sobre como liberar espaço em disco em caso de emergência:
SELECT
,COPY IN
,COPY OUT
,CREATE INDEX
, ...): não é garantido que ajude, mas pode em alguns casos.Pg_Cancel_Backend(<PID>)
se você já tiver uma sessão privilegiada aberta ou apenaskill -s INT -- <PID>
caso contrário.Pg_Terminate_Backend(<PID>)
se você já tiver uma sessão privilegiada aberta ou apenaskill -s TERM -- <PID>
caso contrário.pg_prewarm
o módulo:SET pg_prewarm.autoprewarm_interval = 0
, se você já tiver uma sessão privilegiada aberta.rm -f <PGDATA>/autoprewarm.blocks
pg_stat_statements
o módulo e tiver uma sessão privilegiada aberta:SELECT Pg_Stat_Statements_Reset()
.SELECT Pg_Stat_Reset()
.(Só para ficar claro: todas essas são medidas temporárias , não soluções de longo prazo ou mesmo de curto prazo!)