Como recuperar espaço em disco no PostgreSQL?

25

Eu tenho instalação local do banco de dados 9.1 com poucas tabelas que tinham cca. 300 milhões de registros e o banco de dados cresceu para cerca de 20 GB. Posteriormente, emiti um delete fromcomando para excluir todos os registros dele (eu deveria ter usado truncate, mas não sabia disso). Então, fiz o vácuo total no meu banco de dados para recuperar o espaço em disco, mas isso simplesmente não ajuda. Meu problema parece idêntico a este , mas não há solução fornecida. Eu já verifiquei este tópico e documentação em "recuperando espaço em disco" , mas ainda não consigo encontrar uma solução. Eu uso esse código para obter o tamanho de todas as tabelas

 SELECT nspname || '.' || relname AS "relation",
 pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
 FROM pg_class C
 LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
 WHERE nspname NOT IN ('pg_catalog', 'information_schema')
 AND C.relkind <> 'i'
 AND nspname !~ '^pg_toast'
 ORDER BY pg_total_relation_size(C.oid) DESC
 LIMIT 15;

Totalizando menos de 1 GB, no entanto

SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size FROM pg_database 

ainda mostra cerca de 20 GB. Qualquer conselho muito apreciado.

Comunidade
fonte
Bem, sua consulta de tamanho exclui: índices, tabelas pg_cataloge tabelas information_schema. Portanto, tente ver se é algum deles removendo essas restrições na WHEREcláusula. Por favor, mostre sua versão exata do PostgreSQL ( SELECT version()) e o que exatamente você está fazendo para "aspirar o banco de dados completo", ou seja, o comando exato. Se possível, execute VACUUM FULL VERBOSE;(sem argumentos) e cole a saída em algum lugar e vincule-a aqui.
Craig Ringer
Tente soltar o banco de dados. Você também pode tentar despejar o banco de dados e, em seguida, restaurá-lo eliminaria o lixo.
jb.
11
@jb Isso funcionaria, mas não seria necessário. Melhor aprender qual é o problema.
Craig Ringer

Respostas:

22

Embora você não tenha declarado, suponho, a partir de suas referências a documentos que você seguiu, que você fez um VACUUM FULL no banco de dados e / ou nas tabelas afetadas. Você também não especificou qual versão do postgresql está usando - presumo que seja> 9.0 (o VACUUM FULL se comportou de maneira diferente antes disso).

VACUUM FULL irá reescrever as tabelas afetadas em novos arquivos e excluir os arquivos antigos. No entanto, se algum processo ainda tiver o arquivo antigo aberto, o sistema operacional não o excluirá realmente - até que o último processo o feche.

Se possível, reiniciar o banco de dados garantiria que todos os arquivos abertos fossem fechados.

Se isso não for prático, você poderá verificar se esse é o seu problema e descobrir qual processo possui os arquivos abertos.

Se estiver usando Linux (ou a maioria dos outros sistemas Unix), você pode usar o comando 'lsof' para obter uma lista de todos os arquivos abertos em todos os processos. Os arquivos abertos, mas que foram excluídos, terão '(excluídos)' anexados ao nome do arquivo. Portanto, você pode receber a saída de lsof, procurando arquivos excluídos, como este:

sudo lsof -u postgres | grep 'deleted'

Se isso identificar processos que ainda possuem os arquivos antigos abertos, você pode usar pg_terminate_backend para finalizar esse processo:

SELECT pg_terminate_backend(xxx);

onde xxx é o PID do processo, encontrado na saída lsof.

Se estiver usando o Windows, o mesmo princípio pode ser aplicado, porque o postgres abre arquivos usando o sinalizador FILE_SHARE_DELETE, que permite excluir arquivos abertos em outro processo. O comando ' handle ' é o equivalente aproximado de lsof, embora eu não tenha certeza se você sabe se os arquivos foram excluídos ou não, para que algum trabalho adicional possa ser necessário.

É outra questão de por que esses processos estariam presos a identificadores de arquivos antigos. No entanto, no tópico que você citou na sua pergunta, Tom Lane parece sugerir que isso pode acontecer.

prejudicial
fonte
Como tive que recuperar com urgência o espaço em disco, perdi o banco de dados e o restaurei do backup. No entanto, o "como resolver" esse problema ainda é muito valioso para casos futuros. Meu banco de dados é 9.1, win 8 64 bits, a nomeação de arquivos (caso de arquivos abertos) se aplica da mesma maneira que no linux?
@arcull OK, eu não sabia que você estava usando o Windows. Adicionei algumas informações à resposta sobre como isso se aplica ao Windows. Se você acha que pode ser uma resposta útil, considere a possibilidade de fazer uma votação, pois facilita a localização de outras pessoas.
harmic