Voltar ao Início
Serviços

Desenvolvimento de Sistemas
Consultoria e Orientação
Paginas Web

mais serviços...

Sistemas
Sistema de Controle Agricola
Controle de Sindicatos
Sistema Encargos de Contratos
Controle de Concursos

mais Sistemas...
Recuperando Um Banco de Dados Danificado
Autor: Marcos Ortega
Atividades: Análise de Sistemas/1994 Administração COMEX / 2000 SQL SERVER DBA Desenvolvedor em Delphi / Access

Banco de dados Danificados !


    Banco de dados Ib danificados, são difíceis de se encontrar graças a estabilidade desse SGDB, no meu caso por exemplo eu tenho contato com aproximadamente 8 a 15 banco de dados e alguns deles com mais de 700 MB simultaneamente acessados por pelo menos 08 usuários.
   
    Esse documento não estaria sendo escrito se não fosse um desses 8 bancos, e estou falando de um banco com quase 500MB, 478MB hoje (nov 2001), onde o meu usuário insiste em não fazer backup e ainda como se não bastasse ele "reseta" o servidor com estações conectadas (uug!). Bom, para meu espanto apenas 2 vezes o banco se danificou. Mas vamos falar da solução do problema que é o mais importante aqui.
   
    O nosso maior objetivo quando um banco está danificado no interbase, é justamente fazermos um backup / restore desse banco da melhor forma possível. Não é possível fornecer garantias de que esse backup (após o dano) estaria refletindo todo o banco de dados na sua posição anterior ao sinistro.
   
    http://www.ibphoenix.com/ibp_db_corr.html, é um excelente artigo sobre recuperação de banco de dados , vamos analisar alguns pontos desse artigo.
   
    Como primeiro passo o artigo sugere a modificação da forma de gravação do Interbase ( síncrona ou assíncrona ) para assíncrona. Onde o Interbase 6.0 tem como default a gravação síncrona o autor também se refere à gravação síncrona como "careful writes" que o interbase descarrega as paginas modificadas para o disco e ira gravar - las na ordem correta o que minimiza a possibilidade de perda dos dados porem degrada a velocidade (nada com que se preocupar pois essa degradação é muito pequena).
   
    Já a forma assíncrona certamente é um "force write" não tão cauteloso gravando as paginas descarregadas da memória em qualquer ordem. Esse método também pode ser usado para aumento de performance porem, é ressaltada pelo autor a necessidade de uma boa estratégia de backup quando esse método é usado.
   
    Primeiro Comando:
    gfix -write async database.gdb
   
    A Atenção para esse método assíncrono é que ele não tem sentido nos windows 3.1, 95, 98. Já no Unix e no NT ele assume a forma de gravação do próprio sistema operacional e seu método de cachê de disco.
   
    Para facilitar o trabalho, e realmente facilita muito, são as variáveis de memória.
   
   Set ISC_USER=sysdba
   Set ISC_PASSWORD=masterkey
   

   
    Cauteloso o autor sugere que seja feita uma copia do banco danificado pelo sistema operacional com o comando copy, e que seja essa copia a que vamos trabalhar.
   
   gfix -v -full database.gdb
   
    Esse comando irá validar e tentar recuperar o banco de dados, (como resultado ele nos mostra onde e qual é o problema do banco)
   
   gfix -mend -full -ignore database.gdb
   
    Com o parâmetro mend nos estamos agora tentando corrigir de qualquer forma o banco de dados, não há a partir desse momento nenhuma garantia de recuperação de todas as informações. Quando esse comando foi executado em uma das minhas “aventuras” ele aparentemente descartou mais de 17.000 registros de uma tabela de 18.000. (claro que isso foi reversível pois estávamos trabalhando em uma copia do banco).
   
   gfix -v -full database.gdb
   
    Agora para analisar se o banco está sem erros. O passo anterior (mend) e o (validade) devem ser usados repetitivamente até que o banco esteja recuperado (hummm bem digamos , sem erros). Mas é claro que nem tudo que está na documentação acontece na realidade, minha experiência me mostrou que 20% dos erros foram retirados nesse processo alem da perda de registros descrita anteriormente.
   
   gbak -backup -v -ignore database.gdb database.gbk
   
   gbak -backup -v -ignore -garbage database.gdb database.gbk
   
   gbak -backup -v -ignore -garbage -limbo database.gdb database.gbk
   

   
    Agora sim vamos para a primeira tentativa de backup os três comandos, são para cada uma das possibilidades -garbage para problemas com garbage collection, e -limbo para problemas com versão de registros.
   
   
   gbak -create -v database.gbk database.gdb
   

   
    A operação tão esperada de restore do banco de dados, mas ainda pode ser que você não esteja livre do problema, pois problemas de relacionado a índices podem persistir, e você terá que restaurar com os índices inativos (-inactive) e se o caso for ruim mesmo você ainda tem a possibilidade de restaurar uma tabela de cada vez ( -one_at_a_time), que ira fazer um commit no novo banco a cada tabela restaurada.
   
    Bem na maioria dos casos esses procedimentos acima irão recuperar o banco de dados com uma confiabilidade de sucesso bastante alta. Mas eu diria que devemos considerar o fator SORTE nesse caso, pois ainda dependemos da extensão do dano no banco de dados, que com sorte pode ser pequeno.
   
    Mas esse artigo não seria completo se eu não demonstrasse como foi que recuperei aqueles 17.000 registros perdidos na tentativa anterior de restauração. Bem os passos que segui foram os sequintes.
   
    Se é possível uma conexão no banco de dados vamos utilizar a seguinte estratégia.
   
   Recriar o banco de dados
    Fazendo um Backup apenas do metadata do banco
   
   Gbak -b -metadata database.gdb database.gbk
   

    E recriando ele novamente
   
    Gbak -r database.gbk database.gdb
   

   
    E agora vamos trazer os dados do Banco de dados Antigo ( danificado ) para o novo , lembrem-se nessa etapa eu não usei o banco de dados em que foi executado o utilitário gfix -mend, mas eu diria que o bom censo deve prevalecer aqui verifiquem qual banco está em melhores condições, uma outra copia do banco danificado ou o que foi passado gfix.
   
   
    Agora com um utilitário bastante versátil e excelente naquilo que se dispõe a fazer WIB_ISQL da Ibobjects http://www.ibobjects.com/ abra uma conexão com o novo banco de dados (aquele que acabamos de criar);
   
    Com essa conexão agora vamos utilizar um utilitário pouco conhecido do Data Pump, que podemos achar um help (aqui um help dele).
   
   
   Figura 1;
   
   
    Esta opção serve exatamente, para copiarmos os dados de um banco de dados ( neste caso um banco danificado ) para outro banco de dados ( neste caso um banco de dados novo com a mesma estrutura ); a operação dele é bastante simples.
   
    A primeira palheta do utilitário ScrDataSetSql ( Sql do DataSet Source ), nos da a opção de escolhermos um outro banco de dados para ser o fonte de dados, no botão (Select DataBase ) uma nova secção do WIB_ISQL irá ser aberta pronta para que seja apontado um banco de dados Fonte;
   
    O Espaço abaixo é dedicado para uma pesquisa no banco de dados fonte, esta pesquisa é para retornar os dados que desejamos para inserir no banco de dados destino, como no exemplo Figura 1 , eu estou trazendo todos os campos da tabela de registros do banco de dados danificado;
   
   Figura 2;
   
   
    A palheta DstStatmentSql é exatamente uma Expressão Select, para retornar quais são as tabelas e campos que serão afetados na inclusão dos registros , o botão select database, ainda se mantem, mas como o banco de dados destino já foi aberto na primeira secção do Wib_ISQL, não é nescessária a sua alteração;
   
   
   Figura 3;
   
   
    A palheta DSTLinks é agora o mecanismo de atribuição , que campo fonte será atribuído a que campo destino , essa palheta é gerada automaticamente, se os campos das 2 tabelas fonte e destino forem iguais, se não , não é tão trabalhoso assim escrever-las;
   
   
   A próxima Palheta, não utilizei , mas deve ter no help
   
   Na palheta Items Actions, após o botão prepare, ser clicado :
   Figura 4;
   
   
   
   Já a palheta Execute , com todo o historio da execução
   Figura 5;
   
   
   
    Foi com esse aplicativo, que eu entendo ser pouco conhecido a opção de datapump , pelos usuários do Interbase, que eu consegui recuperar +- 17.000 registros que estavam perdidos, pelo sistema gfix e gbak, essa é a minha modesta contribuição aos usuários Ib.
   
    Colabore voce tambem envie o seu artigo sobre qualquer assunto pelo email : mailto:colaboracao@santoandrea.com.br


Dicas em InterBase
Recuperando Um Banco de Dados Danificado
Paradox X Interbase
Avaliação de Um Banco de Dados

mais Interbase...
Dicas em Delphi
Utilizando os registros do windows

mais Delphi...
Dicas em Access
ADO ou DAO
Pesquisas mais Rapidas
Como Criar um Banco de Dados

mais Access...