Mamãe , meu banco de dados se corrompeu !!!


Cena 1

A mensagem esta piscando na tela , seus olhos estão fixos , e, você não sabe se esta sonhando ou se realmente tudo isto esta acontecendo. Pela sua mente passam pensamentos desconexos e você esta tentanto se lembrar se fez ou não fez backup , mas a fatídica mensagem permanece na tela piscando . Você já decorou cada silaba dela:

estoque.mdb is corrupt or is not a database file. Attempt to repair?

Cena 2

Aqui você decide :

1-) Você não conseguiu reparar a base de dados e não fez o backup diário. Você é mais um a engrossar a fila dos desempregados.

2-) Você reparou a base dados mas houve perda de alguns dados. Por sorte alguém tinha feito um backup dos dados. Seu pescoço esta salvo, por enquanto...

3-) Você não só conseguiu reparar a base de dados mas aproveitou a oportunidade para mostrar que você é realmente necessário a empresa . A promoção é uma questão de tempo.

Brincadeiras á parte , todos estamos sujeitos , em nossa vida profissional, a imprevistos que podem , dependendo de nossa atitude , ter um final feliz ou desastroso. A primeira coisa a fazer é agir com bom senso e não perder a calma. Mas vamos ao artigo...

Uma atitude inteligente é estar preparado para o imprevisto , ser proativo e tomar atitudes que minimizem uma possível catástrofe. Quer um exemplo : FAZER SEMPRE BACKUP DOS ARQUIVOS DE DADOS , com isto , além de poder dormir tranquilo , você já mostra que é um profissional sério e competente.

Usando o utilitário para reparar o seu banco de dados.

Uma das primeiras ações que se toma quando surge uma mensagem indicando que um banco de dados Access esta corrompido é utilizar o utilitário de reparação. No Visual Basic temos o método RepairDatabase que podemos usar para reparar a base de dados. No código abaixo damos um exemplo para reparar a base de dados Northwind.mdb .

Sub Repara_Database()

   Dim erro_Loop As Error

   If MsgBox("Deseja reparar o arquivo Northwind ?", _
         vbYesNo) = vbYes Then
      On Error GoTo Erro_Repara
      DBEngine.RepairDatabase "Northwind.mdb"
      On Error GoTo 0
      MsgBox "Fim do processo de reparação !"
   End If

   Exit Sub

Erro_Repara:

   For Each erro_Loop In DBEngine.Errors
     MsgBox " A reparação falhou...!" & vbCr & "Erro numero: " & errLoop.Number & _
     vbCr & erro_Loop.Description
   Next erro_Loop

End Sub

Mas, atenção !!! você deve usar o utilitário de reparação SOMENTE quando a mensagem de erro exibida indicar que o utilitário deve ser usado. Se a mensagem não indicar a utilização do utilitário NÃO O UTILIZE.

O utilitário de reparação tenta reparar somente as tabelas, consultas e índices do banco de dados. Ele não repara formulários , relatórios , módulos e macros danificados, apenas os copia para o banco de dados reparado.

Usando o utilitário de compactação

O utilitário de compactação elimina os espaços vazios existentes no banco de dados criando um novo banco de dados de destino e copiando cada objeto do banco de dados antigo para o novo. O visual Basic possui o método CompactDatabase que podemos usar para compactar um banco de dados access. A seguir um código exemplo para compactar o banco de dados Northwind.mdb

Sub Compacta_Database()

   Dim dbsNorthwind As Database

   Set dbsNorthwind = OpenDatabase("Northwind.mdb")

   ' Verifica se ja existe um arquivo com o nome do arquivo
   ' a ser compactado
   If Dir("NwindBackup.mdb") <> "" Then Kill "NwindBackup.mdb"

   ' Cria uma versao compactada do banco de dados
   DBEngine.CompactDatabase "Northwind.mdb","NwindBackup.mdb", dbLangGeneral

   Set dbsNorthwind = OpenDatabase("NwindBackup.mdb")

End Sub

Em versões anteriores a versão 3.6 do JET a DAO usava os métodos RepairDatabase e CompactaDatabase separados , a partida da versão 3.6 do Jet o método CompactDatabase faz o serviço completo : a compactação e a reparação do Banco de dados. A seguir o código de uma função que checa a versão do Jet , e , utiliza ou não o método RepairDatabase :

Function Compacta_ReparaDatabase(DatabasePath As String, _
Optional Password As String, Optional TempFile As String = "c:\temp.mdb")
    
    'faz a compactação e a reparação de um banco de dados
    
    'Checa  versão do Jet : Versoes anteriores a 3.6 devem usar o método RepairDatabase
    'para fazer a reparação
    If DBEngine.Version < "3.6" Then DBEngine.RepairDatabase DatabasePath
    
    'se nao informou nome do arquivo temporário usa "c:\temp.mdb"
    If TempFile = "" Then TempFile = "c:\temp.mdb"
    
    'apaga o arquivo temporário se já existir
    If Dir(TempFile) <> "" Then Kill TempFile
    
    'Se existir senha usa o formato ";pwd=PASSWORD" 
    If Password <> "" Then Password = ";pwd=" & Password
    
    'compacta o banco de dados
    DBEngine.CompactDatabase DatabasePath, TempFile, , , Password
    
    'apaga o primeiro arquivo
    Kill DatabasePath
    
    'move o arquivo compactado para o caminho original
    FileCopy TempFile, DatabasePath
    
    'apaga o arquivo temporario
    Kill TempFile

End Function

Recuperando um Banco de dados Corrompido

Bem , se você tiver mesmo que tentar reparar o seu banco de dados vai ter que ter paciência para identificar o que causou o problema e então adotar a solucção adequada . Vejamos algumas possibilidades:

1-) Se você esta usando a versão 2.0 do Microsoft Access e estiver obtendo com frequência as seguintes mensagens de erro:

- Couldn't open SYSTEM.MDA

- <Database> is corrupt or is not a database file. Attempt to repair?

Pode tentar fazer o download do Service Pack para a versão 2.0 e atualizar a sua versão. Este Service Pack vêm com um utilitário para reparação melhorado.

2-) Faça uma cópia do seu arquivo mdb , e delete o arquivo com extensão ldb , se ele estiver presente. O arquivo ldb é usado para definir quais registros estão bloqueados e por quem . Se você abrir o banco de dados no modo compartilhado o arquivo ldb será novamente criado. Nas versões do Access 7.0 e Access 97 este arquivo é automaticamente deletado depois que o último usuário encerra a aplicação. Isto só não acontence em duas situações : quando o usuário não tem permissão para excluir arquivos ou quando arquivo mdb correspondente esta CORROMPIDO.

3-) Feche o banco de dados , se ele estiver aberto e , execute o utilitário de compactação. Agora verifique se o seu arquivo foi recuperado. Se foi , parabéns , desta você escapou , se não, vamos continuar, a esperança é a última que morre...

4-) Se oque estiver danificado for uma tabela , consulta ou indice , execute o utilitário de reparação. Se você obtiver sucesso nesta operação obterá as seguintes mensagens , conforme a versão do Access que estiver usando:

Microsoft Access 97:

Successfully repaired the '<path><database name>' database.

Microsoft Access for Windows 95:

Microsoft Access repaired database '<path><database name>' successfully.

Microsoft Access 2.0 ou anterior (Você ainda usa isto!!! ):

Repair of database '<path><database name>' completed successfully.

Se a operação não conseguir reparar o seu banco de dados , isto indica que os danos causados em sua tabela ,consulta ou índice é muito grave e não pode ser corrigido ou pode ser também que o objeto que estiver danificado é um objeto que o utilitário de reparação não pode reparar. A esta altura pode começar a suar frio...

5-) Se o objeto danificado for uma tabela , tente o seguinte :

- Exporte a tabela para o um arquivo no formato ASCII.
- Exclua os relacionamentos associados a esta tabela e a seguir exclua a tabela do banco de dados
- Utilize o utilitário de compactação e compacte o banco de dados.
- Recrie a tabela e os relacionamentos que ela possuia anteriormente.
- Utilize um processador de textos (WordPad, Bloco de notas...) e examine o arquivo texto que foi gerado pela exportaçao da tabela. Procure por dados inválidos e remova estes registros. Salve o arquivo no formato ASCII.
- Importe o arquivo ASCII para o banco de dados recriando a tabela original.

Se deu certo , ufa !!!, você é um cara de sorte . Se não deu certo , bem , vamos tentar mais uma vez...

6-) Crie um novo banco de dados e tente importar os objetos (tabelas, consultas, etc..) um por um do banco de dados danificado para o novo. Quando terminar recrie os relacionamentos. Esta técnica resolve quando o problema está relacionado com tabelas do sistema danificadas.

7-) Se o objeto danificado for um relatório ou um formulário , o problema pode estar também nos controles que esses objetos estiverem usando. Crie um novo formulário ou relatório e copie os controles do formulário ou relatório originais. Ou crie novos formulários/relatórios e recrie todos os controles que os originais estiverem usando. Isto tenta resolver o problema para esta caso específico.

8-) Se o problema estiver em uma macro ou módulo, crie uma nova macro/módulo e copie o conteúdo dos objetos originais.

9-) Se você estiver usando o Access 95 ou Access 97 , pode tentar atualizar a versão do Jet 3.5 , fazendo o download no site da Microsoft. Esta atualização trás o utilitário Jetcomp.exe que pode em alguns casos reparar banco de dados que seriam considerados irrecuperáveis. Esta atulização trás também um método de compactação melhorado que já faz a função do utilitário de reparação.

10-) Bem , agora você vai tirar o Ás que guarda na manga para situações críticas. Jogando a sua última cartada: Existe um comando não documentando que podemos usar para descompilar o banco de dados. Clique no botão iniciar e na caixa executar digite :

c:\access\msaccess.exe c:\dir\seubancodedados.mdb /decompile.

A seguir será solicitado a compilação do banco de dados , NÃO O FAÇA. Saia , abra o seu banco de dados novamente e no menu Depurar escolha - Compilar e salvar todos os módulos. Para terminar faça a compactação do seu mdb.

Se a esta altura você não conseguiu reparar o seu banco de dados , ele provavelmente perdido. Somente pessoal especializado poderá tentar ir além deste ponto.

So lhe resta uma opção... Restaure o seu Backup !!!

Você pode também dar uma olhada nos artigos da KB :

- Q279334 ACC97: How to Repair a Damaged Jet 3.5 Database

- Q209137 ACC2000: How to Repair a Damaged Database

- Q182867 ACC: Jet Database Engine 3.x Error Messages Due to Corruption

- Q123589 ACC2: Error Message "Couldn't Open SYSTEM.MDA"

- Q123823 ACC2: MS Access Version 2.0 Service Pack Questions and Answers

- Q123588 ACC2: Microsoft Access Repair Utility Enhanced

- Q172733 Updated Version of Microsoft Jet 3.5 Available for Download

- Q148424 ACC: Troubleshooting Fatal System Errors in MS Access 95 and 97

Até o próximo artigo...


Jose Carlos Macoratti