Vi as trocas de e-mails dos Srs. e vi que os Srs. dominam completamente o PostGreSQL. Então eu gostaria de relatar um caso, e colocar o desafio para os Srs. Estou disposto a pagar por esta ajuda. Se alguém souber a solução e se interessar, favor entrar em contato comigo.
Situação: Nós tinhamos 3 HD's SATA em RAID que rodavam PostgreSQL 8.0 A placa controladora parou repentinamente e vários arquivos foram corrompidos. Enviamos os HD's para recuperação por empresa especializada e eles nos enviaram um HD 250GB com o que foi possível recuperar.
A partir daí fiz os seguintes passos, com o objetivo de fazer um pg_dump para recuperar os dados. (devo ter feito muita besteira, eu sei, o DBA tentou recuperar os dados e não conseguiu, então mandaram eu tentar, mas sou programador - é a vida né)
a) Instalei o PostgreSQL 8.0 em outro servidor. (com o fonte e make install, visto que no repositório a versão mais antiga é a 8.1, e as tabelas entre essas versões são incompatíveis).
b) rodei ...pgsql/bin/initdb data e ele criou o diretório data.
c) parei o servidor.
d) renomeei o diretório data para data_bkp
e) copiei o diretório "pgdata", do HD recuperado, para ...pgsql/data
f) arrumei as permissões do diretório para 0700 e chown para postgres:postgres
g) iniciei o servidor
h) executei ...pgsql/bin/pg_dump "pec" -> meu banco alvo principal
Como resultado, apareceram milhões de Warning: pg_class bad ownership (ou coisa parecida). Verifiquei na tabela pg_class, dizia que o tal do ownerID era 1. Fui na tabela pg_shadow (usuários) e dei um select *. Apareceram 2 usuários, um com ID 100 e outro com 101. O usuário de usesysid 1 (postgres) sumiu!!!
i) então fiz CREATE USER postgres WITH SYSID 1 PASSOWRD '***'
Resultado: não foi possível criar usuário. usuário 'postgres' já existe!
j) Parei o servidor e executei "dropuser postgres", disse que as tabelas templates estavam subordinadas a esse usuário. Mudei o owner de template0 e template1 para outro usuário, apaguei o usuário postgres e criei ele novamente, com usesysid 1
k) fiz novamente o pg_dump pec.
Retornou o erro: "pec" não existe em pg_database.
especificamente assim:
pg_dump: missing pg_database entry for database "pec"
Vi a tabela pg_database e vi ela não aparece no SELECT *. Entretanto se eu tento inserir "pec" em pg_database, ele diz que não é possível, por violação de chave primária. (dtname "pec") ou seja, já existe (????)
Se eu movo o subdiretório referente a esse banco, no entanto, o erro é outro:
"unable to find 'pec' in base/87648732648(número exemplo)" ->isso é óbvio mas fiz pra testar. Conclusão: de alguma forma o postgres sabe que existe o DB "pec" e qual o diretório, mas o pg_dump não (!?)
Nota: Atraves do PGadmin é possível conectar na db "pec", mas ela não tem nenhuma tabela, nenhuma view, nenhum schema (nada!), mesmo com o diretório referente, dentro de data/base, tendo aprox. 700MB.
Obrigado por qualquer ajuda desde já.
Caso precisem da informação de localidade, estou em Curitiba,
Att.
Rodrigo Kravetz de Oliveira.
_______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
