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 from
comando 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.
fonte
pg_catalog
e tabelasinformation_schema
. Portanto, tente ver se é algum deles removendo essas restrições naWHERE
clá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, executeVACUUM FULL VERBOSE;
(sem argumentos) e cole a saída em algum lugar e vincule-a aqui.Respostas:
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:
Se isso identificar processos que ainda possuem os arquivos antigos abertos, você pode usar pg_terminate_backend para finalizar esse processo:
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.
fonte