Como recuperar um banco de dados Postgres corrompido

Se você está recebendo uma ou mais mensagens das listadas abaixo é sinal que seu banco de dados possui um registro ou tabela corrompida.

  • ERROR: missing chunk number 0 for toast value 382548694 in pg_toast_847386
  • pg_dump: SQL command failed
  • pg_dump: Error message from server: ERROR: compressed data is corrupt
  • pg_dump: The command was: COPY public.docs (id, created_at, content, link_id,job, is_job_label, hashtext) TO stdout;

Solução 01

Antes de prosseguir, tente realizar um vacuum FULL da tabela em questão, isso fará com que o Postgre tente reescreve a tabela no disco. Se nenhum erro for apresentamento, muito provavelmente seu problema tenha sido solucionado.

 vacuum FULL FREEZE ANALYZE "TABELA_EDOC" 

Solução 02

Continuo com o mesmo problema, e agora? Crie uma função chamada " chk " que ficará responsável por retornar os registros corrompidos.

 create function chk(anyelement)
   returns bool
language plpgsql as $f$
    declare t text;
    begin t := $1;
      return false;
      exception when others then return true;
    end;
  $f$; 

Execute um select utilizando a função " chk " para obter o handle dos registros corrompidos.

 select handle from "TABELA_EDOC" where chk("TABELA_EDOC"); 

Para facilitar a contagem dos registros você pode utilizar um count .

 select count(handle) from "TABELA_EDOC" where chk("TABELA_EDOC"); 

Volte a tela inicial do pgAdmin e localize a tabela com registros corrompidos, selecione e vá em " properties ". Compare o número de Rows estimadas com o número de registros retornados no " select count " que fizemos acima.

Se “select count” < Rows

Nem tudo está perdido. Vamos executar um delete com os registros retornados pela função chk.

 delete from "TABELA_EDOC"
where handle in (select handle from "TABELA_EDOC" where chk("TABELA_EDOC")) 

Nesse ponto você já deve ser capaz de realizar operações normalmente com a tabela que possuía registros corrompidos, apenas remova a função chk

 drop function chk(anyelement); 

Se “select count” = Rows

Uma vez que o número de registros é igual ao número de linhas na tabela apagar os registros corrompidos seria o mesmo que executar um truncate ou drop na tabela.

O que pode ser feito nesse caso?

  • Restauração de backup.
  • Criação de um novo banco e importação das notas.
  • Recriar as tabelas corrompidas.