Como recuperar o espaço ocupado por um índice parcialmente construído e finalizado por uma queda de energia

9

Estou executando o postgres (postgis) 9.4.2 em um mac (10.10.4).

Eu tenho algumas mesas grandes (várias TBs).

Durante uma construção de índice em uma delas que leva cerca de uma semana, observei o espaço disponível em HD cair, como seria de esperar quase no ponto em que o índice seria concluído quando uma falta de energia durasse mais que a unidade de bateria e o sistema foi abaixo. Eu tive buffers off e fillfactor=100durante a compilação, pois é uma fonte de dados estática. Na reinicialização, o espaço disponível restante na unidade está exatamente onde estava quase no final da compilação do índice. A análise a vácuo não libera espaço.

Tentei largar a mesa e reinserir, e isso não deixou espaço. Agora estou em um lugar onde não tenho espaço suficiente para criar o índice.

Os arquivos gerados durante a compilação do índice estão presos em algum limbo em que não podem ser removidos pelo sistema devido à maneira como a máquina caiu durante a queda de energia?

Quando olho para os tamanhos de tabela + índices no banco de dados (que são os únicos dados nessa unidade), eles somam cerca de 6 TB . A unidade possui 8 TB e restam menos de 500 GB na unidade, portanto parece que há cerca de 1,5 TB perdidos em algum lugar, aproximadamente o tamanho que esse índice teria.

Alguma ideia?

dkitchel
fonte
O índice ainda está listado com uma consulta como esta? SELECT r.relname, r.relkind, n.nspname FROM pg_class r INNER JOIN pg_namespace n ON r.relnamespace = n.oid WHERE relkind = 'i';
Kassandry
Não, ele não aparece nos resultados dessa consulta.
precisa saber é o seguinte
11
Você tem alguma coisa na lista que SELECT indexrelid::regclass, indrelid::regclass FROM pg_catalog.pg_index WHERE NOT indisvalid;lhe dê?
Dezso
Não, isso aparece vazio.
dkitchel

Respostas:

5

Normalmente, esperamos que, quando o postgres for reiniciado, o processo de recuperação de falhas remova arquivos relacionados a um índice de reversão do diretório de dados.

Vamos supor que não funcionou, ou pelo menos que deve ser verificado manualmente.

A lista de arquivos que devem estar no datadir pode ser estabelecida com uma consulta como esta:

select pg_relation_filenode(oid)
   from pg_class
  where relkind in ('i','r','t','S','m')
    and reltablespace=0
  order by 1;

reltablespace=0é para o espaço de tabela padrão. Se o índice problemático foi criado em um espaço de tabela não padrão, ele 0deve ser substituído por seu OID em pg_tablespace.

i, r, t, S, m in relkindcorrespondem, respectivamente, a índices, tabelas, espaço de brinde, sequências, visualizações materializadas. Todos esses objetos têm seus dados em arquivos cujos nomes correspondem pg_relation_filenode(oid).

No disco, os arquivos de dados estão abaixo de $PGDATA/base/oid/onde oidé oido banco de dados obtido por select oid,datname from pg_database. Se não estamos falando sobre o espaço de tabela padrão, baseé substituído por PG_version_somelabel.

Listar e classificar os arquivos correspondentes aos arquivos de relfil nesse diretório:

ls | grep -E '^[0-9]+$' | sort -n > /tmp/list-of-relations.txt

(que na verdade mantém apenas o primeiro segmento para relações maiores que 1 Gb. Se houver segmentos remanescentes não anexados a algo, eles devem ser considerados separadamente)

e diferencie esse arquivo com o resultado da consulta acima.

Se houver arquivos de dados remanescentes que não correspondam a nenhum objeto que o banco de dados conheça, eles deverão aparecer nessa comparação.

Daniel Vérité
fonte
Impressionante! Encontrei 1 arquivo no datadir que não apareceu na lista de seleção. Posso remover com segurança esse arquivo?
precisa saber é o seguinte
Na verdade, corresponde a cerca de 800 arquivos com iterações após o ponto - todos como 499807.484 etc. Posso remover esses arquivos com segurança?
precisa saber é o seguinte
@dkitchel: seriam segmentos de 1 GB cada para o enorme índice. Talvez verifique se os carimbos de data e hora coincidem com quando o índice de criação estava em execução. Quanto à exclusão deles, bem, espero que meu raciocínio acima esteja correto, mas são seus dados, então, finalmente, é sua decisão!
Daniel Vérité
Sim, os registros de data e hora são consistentes com a criação do índice e a soma dos tamanhos dos arquivos corresponde ao tamanho do índice. Seu raciocínio parece sólido. Vou tentar com muita confiança. Muito obrigado.
precisa saber é o seguinte
Apenas acompanhando para que outras pessoas que se encontram na mesma situação possam usar a solução da @ DanielVerite com confiança. Sua solução realmente funcionou perfeitamente para mim.
precisa saber é o seguinte