데이터베이스 미러링 세션 중 자동 페이지 복구

SQL Server 2008부터는 데이터베이스 미러링 파트너가 데이터 페이지를 읽지 못하게 하는 특정 오류 유형을 확인하여 미러 데이터베이스의 손상된 페이지를 자동으로 복구하려고 시도합니다. 페이지를 읽지 못하는 파트너는 다른 파트너로부터 새 복사본을 요청합니다. 이 요청이 성공하면 읽을 수 없는 페이지는 새 복사본으로 대체되고 일반적으로 오류가 해결됩니다.

[!참고]

데이터베이스 미러링 파트너에 의한 자동 페이지 복구는 DBCC 복구와는 다릅니다. 이 경우 모든 데이터가 유지됩니다. 반대로 DBCC REPAIR_ALLOW_DATA_LOSS 옵션을 사용하여 오류를 수정하는 경우에는 일부 페이지 및 데이터가 삭제될 수 있습니다.

자동 페이지 복구 시도가 발생되는 오류 유형

데이터베이스 미러링 자동 페이지 복구는 다음 표에 나열된 오류 중 하나로 인해 실패한 작업이 있는 데이터 파일의 페이지만 복구하도록 시도합니다.

오류 번호

설명

자동 페이지 복구 시도가 발생되는 인스턴스

823

운영 체제가 데이터에서 실패한 CRC(순환 중복 검사)를 수행한 경우에만 동작이 수행됩니다.

ERROR_CRC이며 이 오류에 대한 운영 체제 값은 23입니다.

824

논리 오류입니다.

조각난 쓰기 오류 또는 잘못된 페이지 체크섬과 같은 논리적 데이터 오류입니다.

829

페이지가 복원 보류로 표시되었습니다.

모두

최근에 발생한 823 CRC 오류 및 824 오류를 보려면 msdb 데이터베이스의 suspect_pages 테이블을 참조하십시오.

자동으로 복구할 수 없는 페이지 유형

다음 컨트롤 페이지 유형은 데이터베이스 미러링으로 복구할 수 없습니다.

  • 파일 헤더 페이지(페이지 ID 0)

  • 9페이지(데이터베이스 부트 페이지)

  • 할당 페이지: GAM(전역 할당 맵) 페이지, SGAM(공유 전역 할당 맵) 페이지 및 PFS(페이지 여유 공간) 페이지

주 데이터베이스에서 I/O 오류 처리

주 데이터베이스에서는 노드가 SYNCHRONIZED 상태이고 주 서버가 미러 서버에 로그 레코드를 계속 보내는 경우에만 자동 페이지 복구가 시도됩니다. 자동 페이지 복구 시도에서 기본적인 동작 시퀀스는 다음과 같습니다.

  1. 주 데이터베이스의 데이터 페이지에서 읽기 오류가 발생하면 주 서버는 해당 오류 상태와 함께 suspect_pages 테이블에 행을 삽입합니다. 그런 다음 주 서버는 미러 서버에 해당 페이지의 복사본을 요청합니다. 이 요청에는 페이지 ID와 현재 플러시된 로그 끝에 있는 LSN이 지정됩니다. 페이지가 복원 보류로 표시되므로 자동 페이지 복구 시도 중에는 액세스할 수 없습니다. 복구 시도 중에 이 페이지에 액세스하려고 하면 오류 829(복원 보류)가 발생하며 실패합니다.

  2. 페이지 요청을 받으면 미러 서버는 요청에 지정된 LSN까지 로그를 다시 수행할 때까지 대기합니다. 그런 다음 미러 서버는 미러 데이터베이스에 있는 해당 페이지에 액세스를 시도합니다. 페이지에 액세스할 수 있는 경우 미러 서버는 해당 페이지의 복사본을 주 서버로 보냅니다. 액세스할 수 없는 경우 미러 서버는 주 서버로 오류를 반환하고 자동 페이지 복구 시도가 실패합니다.

  3. 주 서버는 해당 페이지의 새 복사본이 포함된 응답을 처리합니다.

  4. 자동 페이지 복구 시도가 주의 대상 페이지를 수정하면 해당 페이지는 suspect_pages 테이블에 복원된 것으로(event_type = 4) 표시됩니다.

  5. 페이지 I/O 오류로 인해 지연된 트랜잭션이 발생한 경우 페이지를 복구하고 나면 주 서버에서 이러한 트랜잭션을 해결하려고 시도합니다.

미러 데이터베이스에서 I/O 오류 처리

미러 데이터베이스에서 발생한 데이터 페이지의 I/O 오류는 다음 방식으로 처리됩니다.

  1. 로그 레코드를 다시 수행할 때 미러 서버에 하나 이상의 페이지 I/O 오류가 발생한 경우 미러링 세션은 SUSPENDED 상태가 됩니다. 이때 미러 서버는 해당 오류 상태와 함께 suspect_pages 테이블에 행을 삽입합니다. 그런 다음 미러 서버는 주 서버에 해당 페이지의 복사본을 요청합니다.

  2. 주 서버는 주 데이터베이스에 있는 해당 페이지에 액세스하려고 합니다. 페이지에 액세스할 수 있는 경우 주 서버는 해당 페이지의 복사본을 미러 서버로 보냅니다.

  3. 미러 서버가 요청한 모든 페이지의 복사본을 받을 경우 미러 서버는 미러링 세션을 다시 시작합니다. 자동 페이지 복구 시도가 주의 대상 페이지를 수정하면 해당 페이지는 suspect_pages 테이블에 복원된 것으로(event_type = 5) 표시됩니다.

    미러 서버가 요청한 페이지를 주 서버로부터 받지 못할 경우 자동 페이지 복구 시도가 실패하고 미러링 세션은 일시 중단된 상태로 남게 됩니다. 미러링 세션을 수동으로 다시 시작하는 경우 손상된 페이지는 동기화 단계 중에 다시 나타납니다.

개발자를 위한 최상의 방법

자동 페이지 복구는 백그라운드로 실행되는 비동기 프로세스입니다. 따라서 미러된 데이터베이스의 경우에도 읽을 수 없는 페이지를 요청하는 데이터베이스 작업은 실패하게 되고 오류를 일으킨 조건과 상관없이 오류 코드가 반환됩니다. 미러된 데이터베이스에 대한 응용 프로그램을 개발하는 경우 실패한 작업에 대한 예외를 차단해야 합니다. SQL Server 오류 코드가 823, 824 또는 829인 경우 작업을 나중에 다시 시도해야 합니다.