Gostaria de compartilhar uma solução que encontrei para conseguir recuperar
registros de um banco de dados onde danificou-se os arquivos de log de
transação, e consequentemente não permitia a leitura de algumas tabelas.

Estava tentando fazer um backup (pg_dump) da base de dados de um cliente,
com aproximadamente 6.0 Gbytes, quando ocorreu o erro:

ERROR:  could not access status of transaction 266894
DETAIL:  could not open file "/var/lib/pgsql/data/pg_clog/10FC": No
such file or directory

O servidor do cliente é um P III 600 Mhz com 512 Mbytes de RAM, rodando
Conectiva 10 e (pasmem!) postgresql 7.4.3.

Nos fóruns pela internet descobri que este problema está relacionado com a
versão 7 do PgSQL onde foram relatados inumeros casos semelhantes. Então a
atualização para o 8.2.4 seria inevitável - uma vez que homologamos esta
versão com nosso ERP.

Porém, o cliente havia perdido os backups (novidade...) e não me restava
nada a não ser trabalhar em cima do servidor para ver se conseguia recuperar
alguma informação.

Então fiz os seguintes procedimentos, seguindo alguns posts nas comunidades
internacionais do PostgreSQL:

1) incluí a opção "ZERO_DAMAGED_PAGES = true" no postgresql.conf (sem
aspas);
2) parei o daemon do PgSQL e iniciei novamente de forma manual, com as
opções "-O -d 5 -P" (sem aspas) além dos parâmetros de conexão;
3) acessei em outra janela de console o psql e executei um VACUUM sobre a
base de dados --> falhou, com o mesmo erro de transação;
4) acessei o PSQL novamente e executei um REINDEX DATABASE sobre a mesma
base --> deu tudo certo;
5) tentei novamente realizar o Dump pelo pgsql 7.4 no servidor --> falhou,
mesmo erro;
6) tentei fazer o dump tabela por tabela do sistema, individualmente (usando
"--table") --> falhou, mesmo erro;

Então pensei: e se eu utilizar o pg_dump de uma versão mais atual? Será que
resolve?
Inicialmente, tentando um DUMP de toda a base de dados, ficou travado nas
tabelas que causavam erro (mais de 10 minutos..).

Para minha surpresa, fazendo o backup de cada tabela individualmente,
funcionou!

Em um servidor temporário com Window$ XP, instalei o PostgreSQL 8.2.4.
Executei então o pg_dump.exe desta máquina com Window$, utilizando os
seguintes parâmetros além dos parâmetros de conexão:

"-i -v -b -O -x --disable-triggers -t <tabela> -f <arquivo_output>"

Fiz este procedimento com todas as tabelas da base dados. E gerou os scripts
corretamente, sem problemas. Inclusive as tabelas que o dump geral não
conseguia ler.

Pude apenas identificar alguns estouros de campos (tipo NUMERIC(2,0) com
valor 16.998 por exemplo) e outros registros em branco dentro do bloco COPY,
mas acredito que seja incompatibilidade entre as versões do banco e do
pg_dump. Para estes casos, como a base era pequena, quando o COPY não
funcionava eu abri os arquivos texto gerados e alterava na unha através do
wordpad do Window$ .

Fato é que depois eu re-importei estes scripts gerados em uma base nova no
servidor temporário (8.2.4), e os registros estavam lá ;)

Com certeza alguns registros foram perdidos, mas pelo menos foi possível
recuperar grande parte das informações.

--
Tiago J. Adami

Dois Vizinhos - PR
Brazil

"Use linux, and set your soul free!"
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a