검사점 및 로그의 활성 부분

검사점은 현재 데이터베이스의 버퍼 캐시에 있는 커밋되지 않은 데이터 페이지를 디스크로 플러시합니다. 따라서 데이터베이스의 전체 복구 중에 처리되어야 하는 로그의 활성 부분이 최소화됩니다. 전체 복구 동안 다음 유형의 동작이 수행됩니다.

  • 시스템이 중지되기 전에 디스크로 플러시되지 않은 로그의 수정 레코드가 롤포워드됩니다.

  • 커밋 또는 롤백 로그 레코드가 없는 불완전한 트랜잭션과 관련된 모든 수정 내용이 롤백됩니다.

검사점 작업

데이터베이스에서 검사점이 수행하는 프로세스는 다음과 같습니다.

  • 검사점의 시작을 표시하는 레코드를 로그 파일에 기록합니다.

  • 검사점 로그 레코드의 체인에 검사점에 대해 기록된 정보를 저장합니다.

    검사점에 기록되는 한 가지 정보는 성공적인 데이터베이스 차원의 롤백을 위해 반드시 있어야 하는 첫 번째 로그 레코드의 LSN(로그 시퀀스 번호)입니다. 이 LSN을 최소 복구 LSN(MinLSN)이라고 합니다. MinLSN은 다음의 최소값입니다.

    • 검사점 시작의 LSN

    • 가장 오래된 활성 트랜잭션 시작의 LSN

    • 아직 배포 데이터베이스로 전달되지 않은 가장 오래된 복제 트랜잭션 시작의 LSN

    또한 검사점 레코드에는 데이터베이스를 수정한 모든 활성 트랜잭션 목록이 포함됩니다.

  • 데이터베이스에서 단순 복구 모델을 사용하는 경우 MinLSN 앞에 나오는 공간을 재사용 가능으로 표시합니다.

  • 커밋되지 않은 모든 로그와 데이터 페이지를 디스크에 씁니다.

  • 검사점의 끝을 표시하는 레코드를 로그 파일에 씁니다.

  • 이 체인의 시작 LSN을 데이터베이스 부팅 페이지에 씁니다.

검사점을 발생시키는 작업

검사점은 다음과 같은 상황에서 발생합니다.

  • CHECKPOINT 문이 명시적으로 실행된 경우. 현재 연결된 데이터베이스에서 검사점이 발생합니다.

  • 데이터베이스에서 최소 로그 작업이 수행된 경우(예: 대량 로그 복구 모델을 사용하는 데이터베이스에서 대량 복사 작업이 수행된 경우)

  • ALTER DATABASE를 사용하여 데이터베이스 파일을 추가 또는 제거한 경우

  • SHUTDOWN 문을 사용하거나 SQL Server(MSSQLSERVER) 서비스를 중지하여 SQL Server 인스턴스를 중지한 경우. 두 동작은 모두 SQL Server 인스턴스의 각 데이터베이스에 검사점을 설정합니다.

  • SQL Server 인스턴스가 데이터베이스를 복구하는 데 걸리는 시간을 줄이기 위해 각 데이터베이스에서 자동 검사점을 주기적으로 생성하는 경우

  • 데이터베이스를 백업한 경우

  • 데이터베이스를 종료해야 하는 작업을 수행한 경우. AUTO_CLOSE가 ON이고 데이터베이스에 대한 마지막 사용자 연결이 닫힌 경우 또는 데이터베이스를 다시 시작해야 하는 데이터베이스 옵션 변경을 수행한 경우를 예로 들 수 있습니다.

자동 검사점

SQL Server 데이터베이스 엔진에서는 자동 검사점을 생성합니다. 자동 검사점 간의 간격은 마지막 검사점 이후 경과된 시간과 사용된 로그 공간에 따라 결정됩니다. 데이터베이스가 거의 수정되지 않을 경우에는 자동 검사점 간의 시간 간격이 가변적이고 길어질 수 있습니다. 또한 많은 데이터를 수정할 경우에는 자동 검사점이 자주 발생할 수 있습니다.

recovery interval 서버 구성 옵션을 사용하여 서버 인스턴스의 모든 데이터베이스에 대한 자동 검사점 간격을 계산할 수 있습니다. 이 옵션은 시스템 재시작 중에 데이터베이스 엔진이 데이터베이스를 복구하는 데 사용하는 최대 시간을 지정합니다. 데이터베이스 엔진은 복구 작업 중에 해당 recovery interval 동안 처리할 수 있는 로그 레코드의 수를 예상합니다.

자동 검사점 간의 간격은 복구 모델에 따라서도 달라집니다.

  • 전체 또는 대량 로그 복구 모델을 사용하는 데이터베이스의 경우 로그 레코드의 수가 데이터베이스 엔진에서 recovery interval 옵션에 지정된 시간 동안 처리할 수 있다고 예상한 레코드의 수에 도달할 때마다 자동 검사점이 생성됩니다.

  • 단순 복구 모델을 사용하는 데이터베이스의 경우 로그 레코드의 수가 다음의 두 값 중에서 작은 값에 도달할 때마다 자동 검사점이 생성됩니다.

    • 로그의 70%가 찼을 때

    • 로그 레코드의 수가 데이터베이스 엔진에서 recovery interval 옵션에 지정된 시간 동안 처리할 수 있다고 예상한 수에 도달했을 때

복구 간격 설정 방법은 방법: 복구 간격 설정(SQL Server Management Studio)을 참조하십시오.

팁

-k SQL Server 고급 설치 옵션을 사용하면 데이터베이스 관리자가 일부 검사점 유형에 대한 I/O 하위 시스템의 처리량을 기준으로 검사점 I/O 동작을 스로틀할 수 있습니다. -k 설치 옵션은 자동 검사점 및 스로틀되지 않은 다른 모든 검사점에 적용됩니다.

자동 검사점은 데이터베이스가 단순 복구 모델을 사용하고 있을 때 트랜잭션 로그의 사용되지 않는 부분을 자릅니다. 그러나 데이터베이스가 전체 또는 대량 로그 복구 모델을 사용하고 있을 때는 자동 검사점에서 이러한 로그를 자르지 않습니다. 자세한 내용은 트랜잭션 로그 잘림를 참조하십시오.

이제 CHECKPOINT 문에서는 검사점을 완료하는 요청 시간(분)을 지정할 수 있는 선택적 checkpoint_duration 인수를 제공합니다. 자세한 내용은 CHECKPOINT(Transact-SQL)를 참조하십시오.

활성 로그

MinLSN에서 마지막으로 쓰여진 로그 레코드까지의 로그 파일 부분을 로그의 활성 부분 또는 활성 로그라고 합니다. 로그의 이 섹션은 데이터베이스의 전체 복구를 수행하는 데 필요합니다. 활성 로그는 어떤 부분도 잘라낼 수 없습니다. 모든 로그 레코드는 로그의 MinLSN 앞에서 잘라야 합니다.

다음 그림에서는 두 개의 활성 트랜잭션이 있는 트랜잭션 로그 끝의 단순화된 버전을 보여 줍니다. 검사점 레코드는 단일 레코드로 압축되었습니다.

활성 트랜잭션이 있는 트랜잭션 로그 끝

LSN 148은 트랜잭션 로그의 마지막 레코드입니다. LSN 147에 기록된 검사점이 처리되면 Tran 1이 커밋되고 Tran 2만 유일한 활성 트랜잭션이 됩니다. 이 경우 Tran 2에 대한 첫 번째 로그 레코드가 마지막 검사점에서 활성 상태인 트랜잭션에 대한 가장 오래된 로그 레코드가 됩니다. 따라서 Tran 2에 대한 Begin Transaction 레코드인 LSN 142가 MinLSN이 됩니다.

장기 실행 트랜잭션

활성 로그에는 커밋되지 않은 모든 트랜잭션의 모든 부분이 포함되어야 합니다. 트랜잭션을 시작했으나 커밋하거나 롤백하지 않은 응용 프로그램이 있으면 데이터베이스 엔진이 MinLSN을 앞당기지 못하게 됩니다. 이로 인해 다음 두 가지 유형의 문제가 발생할 수 있습니다.

  • 트랜잭션이 커밋되지 않은 많은 수정 작업을 수행한 후에 시스템이 종료되면 시스템이 다시 시작된 후의 복구 단계 수행 시 recovery interval 옵션에 지정된 시간보다 훨씬 더 오래 걸릴 수 있습니다.

  • 로그가 MinLSN을 통과하여 잘릴 수 없으므로 너무 커질 수 있습니다. 이러한 문제는 트랜잭션 로그가 각 자동 검사점에서 일반적으로 잘리게 되는 단순 복구 모델을 데이터베이스에서 사용하는 경우에도 발생합니다.

복제 트랜잭션

로그 판독기 에이전트는 트랜잭션 복제를 위해 구성한 각 데이터베이스의 트랜잭션 로그를 모니터링하고 복제 표시된 트랜잭션을 트랜잭션 로그에서 배포 데이터베이스로 복사합니다. 활성 로그에는 복제용으로 표시되었지만 아직 배포 데이터베이스로 전달되지 않은 모든 트랜잭션이 포함되어야 합니다. 이러한 트랜잭션이 제때에 복제되지 않으면 로그 잘라내기가 수행되지 않을 수 있습니다. 자세한 내용은 트랜잭션 복제 작동 방법을 참조하십시오.