방법: 데이터베이스 확인 및 복구(프로그래밍 방식)

이 항목에서는 Engine 개체를 사용하여 손상된 Microsoft SQL Server Compact 4.0 데이터베이스를 확인 및 복구하는 방법에 대해 설명합니다. SqlServerCe 네임스페이스를 사용하는 방법은 SqlServerCe 네임스페이스 참조 설명서를 참조하십시오.

SQL Server Compact 데이터베이스 파일은 4KB 논리 단위로 명명되는 페이지로 나뉩니다. 각 페이지가 데이터베이스 파일에 기록될 때 SQL Server Compact는 해당 페이지에 대한 체크섬을 계산하고 저장합니다. 페이지가 파일에 기록된 다음 수정되거나 손상되면 예상 체크섬과 일치하지 않게 됩니다.

System.Data.SqlServerCe.SqlCeEngine 클래스의 Verify 메서드를 호출하면 데이터베이스 파일의 모든 페이지에 대한 체크섬을 다시 계산하고 체크섬이 예상 값과 일치하는지 확인합니다. 이 메서드가 true를 반환하면 데이터베이스 파일이 손상되지 않은 것입니다. 이 메서드가 false를 반환하면 데이터베이스 파일이 손상되었으므로 응용 프로그램에서 Repair 메서드를 호출해야 합니다.

데이터베이스 파일이 손상되었으면 SqlCeEngine 개체의 Repair 메서드를 사용하여 해당 데이터베이스 파일을 복구할 수 있습니다. Repair 메서드는 데이터베이스를 분석하여 페이지 체크섬을 계산합니다. 현재 체크섬이 이전에 페이지가 데이터베이스에 기록될 때 계산된 체크섬과 일치하지 않으면 해당 페이지가 손상된 것으로 간주됩니다.

Repair 메서드를 호출할 경우 다음과 같은 옵션이 있습니다.

  • RepairOption.RecoverAllOrFail

    Repair 메서드가 RecoverAllorFail 값을 사용하여 호출된 경우 이 복구는 데이터 손실이 없는 경우에만 성공합니다. 데이터 손실이 발견되면 복구가 중지되고 예외가 throw됩니다. 이는 복구 데이터베이스의 데이터 손실 및 손상을 방지할 수 있는 가장 효율적인 옵션입니다.

  • RepairOption.RecoverAllPossibleRows

    Repair 메서드가 RecoverAllPossibleRows 값을 사용하여 호출될 경우 데이터베이스는 손상된 페이지의 행을 포함한 모든 데이터를 읽으려고 시도합니다. 이렇게 하면 잠재적으로 더 많은 데이터를 복구할 수 있습니다. 그러나 이 옵션을 사용해도 복구된 데이터의 모든 손상을 방지할 수는 없습니다.

  • RepairOption.DeleteCorruptedRows

    DeleteCorruptedRows 값으로 Repair 메서드를 호출하면 손상된 페이지가 모두 무시됩니다. 손상된 페이지에 데이터 행 또는 데이터베이스 스키마가 있는 경우 중요한 데이터가 손실될 수 있습니다. 그러나 이 옵션을 사용하여 복구된 데이터에는 손상이 없어야 합니다.

  • RepairOption.RecoverCorruptedRows

    이 옵션은 SQL Server Compact 4.0에서 사용되지 않습니다. RecoverAllPossibleRows 옵션을 대신 사용해야 합니다. RecoverCorruptedRows 값으로 Repair 메서드를 호출하면 데이터베이스에서 손상된 페이지의 데이터를 읽으려고 합니다. 이렇게 하면 더 많은 데이터를 복구할 수는 있지만 복구된 데이터의 논리 손상이 없음을 보장하지 않습니다.

중요 정보 중요

관리자는 Repair 메서드 사용 시와 사용 후에 다음 사항을 기억해야 합니다.

  • Repair 메서드로 모든 데이터베이스의 데이터를 완전히 복구할 수는 없습니다. 응용 프로그램에서 선택한 Repair 옵션과 관계없이 일부 유형의 데이터 손상은 완전히 복구할 수 없습니다.

  • 관리자는 원본 데이터베이스를 복구한 후에 Verify 메서드를 대상 데이터베이스에서 실행해야 합니다.

  • 선택한 복구 옵션과 관계없이 Repair 메서드는 모든 데이터베이스 불일치에 대한 세부 내역을 로그 파일로 작성합니다. 이 파일은 원본 데이터베이스 .sdf 파일이 들어 있는 디렉토리와 같은 디렉토리에 작성됩니다. 응용 프로그램 또는 데이터베이스 관리자는 이 로그 파일을 검토하여 결과 데이터베이스가 유효한지 여부를 확인해야 합니다.

  • 응용 프로그램에서 RecoverAllOrFail 옵션을 사용하지 않는 경우 응용 프로그램 또는 데이터베이스 관리자가 결과 데이터베이스의 유효성을 검사할 책임이 있습니다. 이렇게 하려면 로그 파일을 검토하여 데이터베이스를 신뢰할 수 있는지 여부를 확인하면 됩니다.

  • 사용자 또는 응용 프로그램이 결과 데이터베이스의 유효성을 검사할 수 없는 경우 백업에서 데이터베이스를 복원하거나 데이터베이스를 수동으로 다시 생성합니다.

데이터베이스를 확인하려면

  1. Engine 개체를 만듭니다.

    SqlCeEngine engine = new SqlCeEngine("Data Source = Northwind.sdf");
    
  2. Verify 메서드를 호출하여 데이터베이스에서 손상된 행을 검사합니다.

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

데이터베이스를 복구하려면

  • 데이터베이스에 손상된 행이 있을 경우 Repair 메서드를 호출하여 데이터베이스를 수정합니다. RecoverAllorFail 복구 옵션을 전달하여 손상된 모든 행을 삭제하거나 DeleteCorruptedRows 복구 옵션을 전달하여 손상된 행의 복구를 시도할 수 있습니다.

    engine.Repair (null, RepairOption.RecoverAllorFail );
    
  • 대/소문자를 구분하는 복구된 데이터베이스를 만들려면 Repair 메서드의 연결 문자열 속성에 대/소문자 구분 속성을 설정합니다. 대/소문자 구분 데이터베이스에 대한 자세한 내용은 데이터 정렬 작업(SQL Server Compact)을 참조하십시오. 예:

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

다음 예에서는 SQL Server Compact 데이터베이스를 확인하는 방법과 손상된 행이 발견된 경우 손상된 행에서 데이터를 복구하여 데이터베이스를 복구하는 방법을 보여 줍니다.

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

if (false == engine.Verify())
{
   MessageBox.Show("Database is corrupted.");
   engine.Repair(null, RepairOption.RecoverAllorFail);
}
표시: