Mamãe , meu banco de dados se corrompeu !!!
Não se desespere.... sempre existe uma saída.... a vida não se resume a um banco de dado corrompido.... Siga as instruções e cruze os dedos. |
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 .
|
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
|
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 estará perdido. Somente pessoal especializado poderá tentar ir além deste ponto.
Só 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
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
Até o próximo artigo...
Jose Carlos Macoratti