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