Jump to content

Como recuperar um banco de dados Postgres corrompido


Postagens Recomendadas

  • Administradores

Tópico originalmente criado por: @Jonathan Santos

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.

c820e61080d8ec11d78822f82d15c91aa6e08e6c_2_690x243.png
 

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.
Link to comment
Compartilhe em outros sites

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora


×
×
  • Create New...