ğ Manual do MDB corrompido (Como reparar um banco de dados corrompido?)
(*) O texto a seguir foi originalmente publicado na Revista Fórum Access nş 34 - Nov/Dez - 1999, pág. 27, sob o título "Manual do MDB corrompido" (O texto foi atualizado pelo Autor: João Rodrigues).

Introdução
Esta é uma das perguntas mais freqüentes no Grupo de Discussão de Access, pois, infelizmente, diversos fatores podem causar danos a um banco de dados, resultando em perda de registros ou, simplesmente, impedindo a sua utilização normal.

O objetivo desta matéria é ampliar a discussão sobre os problemas que conduzem à perda de dados, descrevendo soluções para cada caso, além de mostrar o que pode ser feito para evitar que um banco de dados fique corrompido.

Podemos classificar estes fatores em quatro categorias:

  1. Falha na operação do microcomputador – talvez esta seja a maior responsável por causar danos a um banco de dados ou outro arquivo qualquer. A dificuldade está em identificar as causas do problema, que podem ser várias:
  1. Problemas de software – são causados por algum arquivo indevidamente apagado durante a desinstalação de um programa; um vírus já removido, mas que deixou algum arquivo importante danificado; Registro do Windows alterado indevidamente ou corrompido etc;
  2. Usuários sem experiência ou treinamento – estes usuários podem causar sérios danos ao banco de dados. Por exemplo, existem pessoas que, por incrível que pareça, desligam o computador direto no estabilizador, sem clicar no Menu Iniciar – Desligar; além de alterar parâmetros de configuração do Windows e do Access. Há ainda aqueles desavisados (os piores) que abrem e, pior, salvam o banco de dados com o Word ou Excel (leia mais sobre isso no tópico Arquivo Irrecuperável). O único jeito é efetuar reuniões/treinamentos com os usuários, explicando-lhes como operar o sistema corretamente; e
  3. Problemas com a rede local – Ao contrário do que muitos pensam, o Microsoft Access trabalha muito bem em rede, desde que esta esteja bem configurada. Porém, quando arquivos começam a ficar corrompidos em uma rede local, será bem mais complicado identificar a causa do problema. Veja alguns exemplos:


A solução é chamar uma empresa especializada em redes e testar tudo com equipamentos apropriados. O ideal é ter um contrato de manutenção da rede para detectar e solucionar os problemas à medida em que ocorrem.

Também um driver incorreto de placa de rede pode vir a corromper um BD situado na rede local, fazendo com que o Access apresente mensagens de erro como "Formato de banco de dados não reconhecido", durante a abertura ou execução do aplicativo. Este problema foi abordado no artigo Formato de banco de dados não Reconhecido, e ocorre quando é instalado o Windows 98 num microcomputador com a placa de rede da marca Realtek (os modelos 8019 e 8029 tem sido mais citados), cujo driver original corrompe arquivos mdb.

A solução, neste caso, é baixar o driver atualizado do site do fabricante e instalá-lo no Win 98.


Arquivo Irrecuperável
Se você abrir e salvar um banco de dados do Access (arquivo mdb) com outro programa, tal como o Word, Excel, Notepad etc, ele ficará irremediavelmente corrompido. Ao tentar abrir o banco de dados com o Access, será exibida a caixa de diálogo solicitando uma Senha. Este é um comportamento normal do Access nesta situação, e não adianta digitar nenhuma senha ou fazer qualquer coisa, pois o arquivo está perdido. O problema está descrito nos artigos:


Mensagens de Erro Mais Comuns
A seguir, mostrarei as mensagens mais comuns exibidas pelo Access ao se deparar com um banco de dados corrompido. As causas indicadas podem variar dependendo da versão. Para obter mais detalhes, o leitor poderá visitar as páginas da Microsoft Knowledge Base (KB) citadas ao longo do presente artigo.

Se você utiliza o Access 2.0 e está recebendo as mensagens de erro abaixo (ou suas similares em português), faça o download do Service Pack (arquivo "ACCSVC.EXE") no site de suporte da Microsoft:


Nas demais versões, os erros mais comuns são:

  1. Erro 3197 - "O mecanismo do banco de dados Microsoft Jet interrompeu o processo, pois você e um outro usuário estão tentando alterar os mesmos dados ao mesmo tempo."
    Causa: Este erro é típico de bloqueio de registro em um ambiente multiusuário. Entretanto, ele ocorre também quando um campo do tipo MEMO ou OLE possui dados corrompidos armazenados.
  2. Erro 3343 - "Formato de banco de dados não reconhecido"
    Causa: Este erro ocorre geralmente quando o Access é indevidamente fechado durante o processo de escrita de dados no disco, ou quando uma das condições abaixo é verdadeira:
  1. Erro 3015 - "<Nome do Arquivo mdb> não é um índice nesta tabela. Examine a coleção de índices do objeto TableDef para determinar os nomes de índice válidos".
    O erro é bem documentado na Microsoft Knowledge Base (KB), principalmente no artigo Q158933 - ACC: Error " Isn't an Index in This Table

    Causa: Este erro é tipicamente causado quando há um índice corrompido na tabela de sistema "MSysObjects". Normalmente ele ocorre por um processo de reparar o banco de dados abortado, porém pode ocorrer por problemas de hardware, na rede local, falta ou variações no fornecimento de energia etc. Também pode ocorrer com um mdb convertido da versão 7.0 para a 97.
  2. "Este programa executou uma operação ilegal e será fechado"
    Antes de concluir pela corrupção do banco de dados, sugiro que você leia o artigo Erro: "Este programa executou uma operação ilegal e será fechado", pois esta mensagem poderá surgir em decorrência de fatores diversos que não um banco de dados corrompido. Para não ser repetitivo, sugiro que você verifique se o seu caso está enquadrado nas situações contidas no referido artigo e, assim, solucionar o seu problema mais rapidamente.
  3. Erro "Disk Error -- Reserved error (-1601)"
    Causa: Algumas tabelas do sistema (system tables) estão corrompidas, conforme explicado no artigo 302498 da Microsoft Knowledge Base.
  4. Erro - "Automation Error"
    Causa: Este erro pode ocorrer após a conversão de um banco de dados da versão 7.0 (95) para a versão 8.0 (97), por causa de um bug no motor Jet do Access 7.0 fazendo com que um objeto fique corrompido.
  5. No site de Tony Toews, há um tutorial com muitas outras mensagens de erro além das citadas acima. Portanto, não deixe de conferir esse excelente tutorial.


Problemas com réplicas corrompidas
Sugiro ao leitor que pesquise diretamente no Access Replication FAQ, que contém algumas respostas específicas nos seguintes itens:


Guia de Soluções
Caso o problema esteja em algum formulário, relatório ou módulo, você não conseguirá reparar um arquivo mdb corrompido com o assistente do próprio Access, disparado a partir do menu Ferramentas – Utilitários de banco de dados – Reparar banco de dados, já que ele tenta reparar somente as tabelas, consultas e índices.

Portanto, você precisará seguir as orientações contidas no presente Guia.

Descubra a estação de trabalho que está corrompendo o banco
Como vimos, uma simples queda de energia pode corromper um banco de dados. Entretanto, se você desconhece o motivo que causou o dano ao banco, sugiro que você tente identificar a estação de trabalho em que ocorreu o problema. E, então, checar se o equipamento apresenta algum dos defeitos de hardware listados no início deste artigo. Este procedimento é fundamental para evitar que o problema se repita no futuro.

Ao se deparar com um banco de dados corrompido, o Access não deleta o arquivo temporário ldb que foi criado no mesmo diretório ou pasta que contém o arquivo mdb. Portanto, você poderá empregar o LDBViewer, citado no artigo "Como descobrir os usuários conectados ao mdb e impedir o acesso de novos usuários?", para abrir o arquivo ldb e descobrir qual a estação de trabalho que deixou o banco no estado "Suspect = Yes".

Em paralelo à identificação do computador problemático, siga os passos listados a seguir para tentar recuperar o banco de dados corrompido.

Importante: Antes de iniciar qualquer procedimento, feche o arquivo mdb corrompido e faça um back-up. Depois, delete o arquivo ldb deixado na mesma pasta ou diretório do mdb.

Se o Access exibe mensagens de erro diferentes da mensagem de operação ilegal

  1. Em primeiro lugar, instale a atualização (Service Pack - SP) do motor Jet correspondente às versões do Access e do sistema operacional em uso nas estações de trabalho da rede local. Isso corrigirá os bugs do Jet. O download pode ser feito a partir do Microsoft Download Center ou mais facilmente do site The Access Web.

    O arquivo baixado contém uma nova versão do motor Jet, que possui um processo de Compactar melhorado e que passou a incorporar toda a funcionalidade do processo de Reparar. Ao descompactar o arquivo, você obterá o utilitário Jetcomp.exe, que emprega o compactador melhorado.

    Atenção: O Jet 3.5 SP-3, por exemplo, requer a prévia instalação do Office 97 Service Release 2 (SR-2), caso contrário você poderá causar problemas no Access 97. Procure observar esse tipo de restrição antes de instalar qualquer SP.

    As DLLs decorrentes da descompactação dos arquivos baixados deverão ser copiadas para a subpasta System ou System32 conforme a versão do Windows, caso a atualização não contenha um instalador que faça esse trabalho por você. Depois inicie o Access e tente reparar e compactar o arquivo corrompido (Access 95), ou utilizar o programa Jetcomp.exe no caso do Access 97 em diante.

    Nota: Uma outra solução muito comentada no Grupo de Discussão da Revista Fórum Access é o uso do Access 2000 ou XP para reparar BD's corrompidos de versões anteriores, já que as novas versões do Access já possuem as melhorias do Jet.
  2. O passo anterior costuma corrigir as tabelas de sistema corrompidas. Porém, se algum outro objeto (tabela, consulta, formulário, relatório, macro ou módulo) estiver corrompido, o Access continuará a exibir mensagens de erro ao abrir o banco.

    Neste caso, em linhas gerais, siga os passos abaixo para identificar o objeto corrompido:
    1. Crie um novo banco de dados (mdb).
    2. Importe um-a-um cada objeto do mdb corrompido para o novo banco de dados. Você pode usar o Assistente de Importação do Access (menu Arquivo - Obter dados externos - Importar) ou arrastar-e-soltar os objetos entre as duas janelas abertas do Access (do banco corrompido e do novo banco) - neste caso, se o Access permitir a abertura do mdb corrompido.
    3. O processo é chato e demorado, mas você não tem outra opção: importe cada objeto nesta ordem: tabelas - consultas - formulários - relatórios - macros - módulos.
    4. Após importar cada objeto, tente abri-lo antes de importar o seguinte. Faça isso até obter uma mensagem de erro ou outro sintoma que revele o objeto corrompido.
    5. Se a falhar ocorrer numa tabela, tente o seguinte:

Continue a importação dos demais objetos.

    1. Se a falha estiver num Formulário ou Relatório, delete o objeto corrompido e tente importá-lo de um back-up. Se isso não for possível, tente uma das alternativas abaixo:
    1. Se a falha estiver numa Macro ou Módulo, delete o objeto corrompido e tente importá-lo de um back-up. Se isso não for possível, tente uma das alternativas abaixo:


Após resolver o problema, você poderá recriar os Relacionamentos entre as tabelas ou importá-los com a função ImportRelations do artigo "Q128157: Using DAO in Visual Basic Code to Import Relationships".

Ao final, efetue a compilação, salve todos os módulos e compacte o novo mdb.


Se o Access exibe a mensagem "Este programa executou uma operação ilegal e será fechado":
Conforme mostrado anteriormente, o aparecimento desta mensagem não significa que o banco de dados esteja realmente corrompido.

Todavia, em se tratando de um mdb contendo objetos corrompidos, o Access poderá apresentar a mensagem de operação ilegal. Neste caso, eu costumo tentar uma solução que tem resolvido 99% dos meus problemas com formulários, relatórios e módulos corrompidos: trata-se do argumento de linha de comando não documentado "/decompile", que força a "descompilação" do mdb.

Para utilizar este método, clique no botão Iniciar do Windows, selecione o item Executar e digite a expressão abaixo (escreva o caminho de um mdb válido):

"C:\Arquivos de Programas\Microsoft Office\Office\msaccess.exe" "C:\Temp\Prazos.mdb" /decompile

Após concluir a operação, uma mensagem irá solicitar que você compile o banco novamente. Clique no botão OK da mensagem e saia do Access sem fazê-lo. Inicie o Access novamente, carregue o seu mdb e abra a estrutura de qualquer módulo ou a janela Depurar (CTRL+G). Clique no menu Depurar - Compilar e Salvar todos os Módulos. Depois, realize a compactação do banco de dados.

Notas:

  1. O argumento Decompile funciona no Access 2000 também. Porém, não é exibida nenhuma caixa de diálogo, como acontece no Access 97.
  2. Para uma discussão mais profunda sobre este argumento, leia o artigo "The real deal on the /Decompile switch" na página de Michael Kaplan.


Última Tentativa
Finalmente, se nada acima deu certo, não desista ainda do seu banco de dados corrompido. Visite a página da empresa PK Solutions, pois eles garantem que recuperam qualquer banco de dados Access corrompido em até 48 horas, por preços a partir US$ 120.00. Procure pelo link "Database Recovery Service".

Outra empresa do ramo é a Data Revive

Mais Informações:
Na Microsoft Knowledge Base, leia os artigos abaixo para obter detalhes mais específicos conforme a sua versão do Access:



Conclusão
Conforme mostrado ao longo do texto, há um grande número de fatores que provocam danos a um banco de dados do Microsoft Access. Os principais sintomas de que o arquivo está corrompido são as mensagens de erro exibidas pelo Access durante a abertura ou execução do banco de dados. Entretanto, algumas dessas mensagens, principalmente as de "Operação Ilegal", podem estar relacionadas a outros fatores estranhos ao Access, tais como: problemas de hardware; instalação de softwares incompatíveis; código contendo instruções indevidas etc.