
Usando PostgreSQL 9.3. Tive uma consulta de longa duração atualizando cerca de 8 milhões de linhas. Obviamente algo deu errado. Dois dias depois, recebi um alerta de pouco espaço em disco. Parei a consulta e foi isso que vi.
root@server:/var/lib/postgresql/9.3/main# du -BM * | sort -n
1M global
1M pg_notify
1M pg_serial
1M pg_snapshots
1M pg_stat
1M pg_stat_tmp
1M pg_tblspc
1M pg_twophase
1M PG_VERSION
1M pg_xlog/archive_status
1M mydb.opts
1M mydb.pid
3M pg_subtrans
7M base/1
7M base/12030
7M base/12035
11M base/22029472
21M pg_clog
72M pg_multixact/offsets
315M pg_log
444M pg_multixact/members
516M pg_multixact
625M pg_xlog
3493M base/pgsql_tmp
61851M base/22053373
65372M base
Observe isto:61851M base/22053373
Como meus dados reais estão em espaços de tabela armazenados em volumes diferentes, presumo que se trate de alguma transação temporária que se acumulou.
Existem algumas postagens on-line sobre problemas semelhantes, mas nenhuma solução canônica que encontrei. Em geral, o conselho é “executar VACUUM FULL” e às vezes o lixo acumulado desaparece. É isso que estou fazendo agora, mas está demorando e tenho medo de ocupar o espaço restante em disco (3 GB) e fazer tudo desabar.
Alguém já teve experiência com isso? O que está armazenado aqui? Existe uma maneira segura de liberar rapidamente esse espaço? Ou pelo menos mova-o para outro lugar (tenho bastante espaço nos discos do meu espaço de tabela).
Responder1
Eu descobri. É um erro meu. Este é um novo banco de dados que um colega criou no espaço de tabela padrão, em vez de um dos nossos bancos personalizados.
Para aqueles que estão enfrentando problemas semelhantes, aqui estão algumas coisas que aprendi durante a investigação. base/22053373
no meu caso é fora de um banco de dados. Você pode ver qual banco de dados é assim:
SELECT oid, * FROM pg_database
Cada arquivo dentro dele recebe o nome de oid de um tipo pg (tabela ou outro). Os arquivos maiores provavelmente são das suas tabelas maiores. Conecte-se ao banco de dados e selecione na pg_class
coleção para descobrir qual.
No momento estou movendo o banco de dados para um espaço de tabela personalizado usando
ALTER DATABASE mydb SET TABLESPACE mytablespace;
Tenho certeza que isso resolverá meu problema.