Compartilhar via


Como verificar e reparar um banco de dados (programaticamente)

Neste tópico, você aprenderá como verificar e reparar um banco de dados corrompido do Microsoft SQL Server Compact 4.0 com o uso do o objeto Engine. Para obter mais informações sobre como usar o namespace SqlServerCe, consulte a documentação de referência de namespaces do SqlServerCe.

Os arquivos de banco de dados do SQL Server Compact são divididos em unidades lógicas de 4 KB chamadas páginas. Conforme cada página é gravada no arquivo do banco de dados, o SQL Server Compact calcula e salva uma soma de verificação para essa página. Se a página for modificada ou corrompida depois de ser gravada no arquivo, ela não corresponderá mais à sua soma de verificação esperada.

Chamar o método Verify da classe System.Data.SqlServerCe.SqlCeEngine recalculará as somas de verificação de todas as páginas no arquivo de banco de dados e verificará se essas somas correspondem aos seus valores esperados. Se esse método retornar true, o arquivo de banco de dados não foi corrompido. Se esse método retornar false, o arquivo de banco de dados foi corrompido e o aplicativo deverá chamar o método Repair.

Se o arquivo de banco de dados for corrompido, você poderá tentar recuperá-lo usando o método Repair do objeto SqlCeEngine. O método Repair examina o banco de dados e calcula as somas de verificação da página. Se uma soma de verificação não corresponder à soma de verificação calculada anteriormente quando aquela página foi gravada no banco de dados, essa página será considerada corrompida.

A seguir são descritas as opções disponíveis ao chamar o método Repair:

  • RepairOption.RecoverAllOrFail

    Se o método Repair for invocado usando-se o valor RecoverAllorFail, a recuperação será bem-sucedida somente se não houver perda de dados. Se for detectada perda de dados, a recuperação é parada e uma exceção é descartada. Essa é a opção mais efetiva para ajudar a proteger contra perda e corrupção de dados no banco de dados reparado.

  • RepairOption.RecoverAllPossibleRows

    Se o método Repair for invocado usando-se o valor RecoverAllPossibleRows, o banco de dados tentará ler todos os dados, incluindo linhas de páginas corrompidas. Isso potencialmente resulta em um maior volume de dados recuperado. No entanto, o uso dessa opção não garante que os dados recuperados não estarão corrompidos.

  • RepairOption.DeleteCorruptedRows

    Se o método de reparo for invocado com o valor DeleteCorruptedRows, todas as páginas corrompidas serão descartadas. Isso poderá causar uma perda de dados significativa se a página corrompida contiver linhas de dados ou um esquema de banco de dados. No entanto, não deve haver qualquer corrupção nos dados recuperados usando essa opção.

  • RepairOption.RecoverCorruptedRows

    Essa opção foi substituída no SQL Server Compact 4.0. Você deve usar a opção RecoverAllPossibleRows. Se o método de reparo for invocado com o valor RecoverCorruptedRows , o banco de dados tentará ler os dados das páginas corrompidas. Isso pode resultar na recuperação de mais dados, mas não garante que os dados recuperados estejam isentos de corrupção lógica.

Importante

O administrador deve se lembrar dos seguintes pontos durante e depois de usar o método Repair.

  • O método Repair não garante a completa recuperação dos dados de todos os bancos de dados. Algumas formas de corrupção de dados não podem ser reparadas totalmente, independentemente da opção Repair que é selecionada pelo aplicativo.

  • O administrador deve executar o método Verify no banco de dados de destino, depois de reparar o banco de dados de origem.

  • Independentemente da opção Repair selecionada, o método Repair irá gravar detalhes sobre inconsistências do banco de dados em um arquivo de log. O arquivo é gravado no mesmo diretório que contém o arquivo .sdf do banco de dados de origem. O administrador do aplicativo ou de um banco de dados deve examinar o arquivo de log para determinar se o banco de dados resultante é válido.

  • Quando o aplicativo não usa a opção RecoverAllOrFail, é responsabilidade do administrador do aplicativo ou de banco de dados validar o banco de dados resultante. Isso ocorre através do exame do arquivo de log para determinar se o banco de dados é confiável.

  • Se você ou o aplicativo não puder validar o banco de dados resultante, restaure o banco de dados de um backup ou reconstrua manualmente o banco de dados.

Procedimentos do SQL Server Compact 4.0

Para verificar um banco de dados

  1. Crie um objeto Engine.

    SqlCeEngine engine = new SqlCeEngine("Data Source = Northwind.sdf");
    
  2. Chame o método Verify para examinar linhas corrompidas no banco de dados.

     if (false == engine.Verify()) {...}
    

Para reparar um banco de dados

  • Se o banco de dados possuir linhas corrompidas, chame o método Repair para corrigir o banco de dados. Você pode optar por excluir todas as linhas corrompidas passando a opção de reparo DeleteCorruptedRows ou por tentar recuperar as linhas corrompidas passando a opção de reparo RecoverAllorFail.

    engine.Repair (null, RepairOption.RecoverAllorFail );
    
  • Para criar um banco de dados reparado que diferencia maiúsculas de minúsculas, defina a propriedade com diferenciação de maiúsculas e minúsculas na propriedade de cadeia de conexão do método Repair. Para obter mais informações sobre bancos de dados com diferenciação de maiúsculas e minúsculas, consulte Trabalhando com agrupamentos (SQL Server Compact). Exemplo:

    engine.Repair("Data Source= Test.sdf; LCID= 1033; Case Sensitive=true;", RepairOption.RecoverAllorFail );
    

Exemplo

Este exemplo mostra como verificar um banco de dados do SQL Server Compact e, se forem encontradas linhas corrompidas, como reparar o banco de dados ao recuperar dados das linhas corrompidas.

SqlCeEngine engine = new SqlCeEngine("Data Source = AdventureWorks.sdf");

if (false == engine.Verify())
{
   MessageBox.Show("Database is corrupted.");
   engine.Repair(null, RepairOption.RecoverAllorFail);
}
Dim engine As New SqlCeEngine("Data Source = AdventureWorks.sdf")

If False = engine.Verify() Then
   MessageBox.Show("Database is corrupted.")
   engine.Repair(Nothing, RepairOption.RecoverAllorFail)
End If

Consulte também

Conceitos

Mantendo bancos de dados (SQL Server Compact)