미리 쓰기 트랜잭션 로그

이 항목에서는 데이터 수정 내용을 디스크에 기록할 때 미리 쓰기 트랜잭션 로그의 역할에 대해 설명합니다. 트랜잭션 로그에 대한 기본 정보는 트랜잭션 로그 개요를 참조하십시오.

SQL Server에서는 미리 쓰기 로그(WAL) 기능을 사용하여 관련된 로그 레코드가 디스크에 기록되기 전에는 어떠한 데이터 수정 내용도 디스크에 기록되지 않도록 합니다. 따라서 트랜잭션의 ACID 속성이 유지 관리됩니다. 트랜잭션 및 ACID 속성에 대한 자세한 내용은 트랜잭션(데이터베이스 엔진)을 참조하십시오.

미리 쓰기 로그의 작동 방식을 이해하려면 수정된 데이터가 디스크에 기록되는 방법을 알아야 합니다. SQL Server는 데이터를 검색해야 할 때 데이터 페이지를 읽어 오는 버퍼 캐시를 유지 관리합니다. 데이터 수정은 디스크에 직접 수행되지 않고 버퍼 캐시의 페이지 복사본에서 수행됩니다. 수정 내용은 데이터베이스에 검사점이 발생할 때까지 디스크에 기록되지 않거나 버퍼가 새 페이지를 보유하는 데 사용될 수 있도록 디스크에 기록되어야 합니다. 버퍼 캐시에 있는 수정된 데이터 페이지를 디스크에 쓰는 작업을 페이지 플러시라고 합니다. 캐시에서 수정되었으나 아직 디스크에 기록되지 않은 페이지를 커밋되지 않은 페이지라고 합니다.

버퍼에 있는 페이지가 수정될 때 로그 캐시에는 수정 내용을 기록하는 로그 레코드가 작성됩니다. 이 로그 레코드는 관련된 커밋되지 않은 페이지가 버퍼 캐시에서 디스크로 플러시되기 전에 디스크에 기록되어야 합니다. 로그 레코드가 기록되기 전에 커밋되지 않은 페이지가 플러시되면 로그 레코드가 디스크에 기록되기 전에 서버 장애가 발생하는 경우에도 롤백될 수 없는 수정 내용이 디스크에 작성됩니다. SQL Server에는 관련 로그 레코드가 기록되기 전에 커밋되지 않은 페이지가 플러시되지 않도록 하는 논리가 있습니다. 로그 레코드는 트랜잭션이 커밋되면 디스크에 기록됩니다.

[!참고]

일부 IDE SATA 드라이브 캐시 데이터는 디스크에 기록되기 전에 내부 메모리에 기록됩니다. 이렇게 되면 미리 쓰기 로그가 올바르게 작동할 수 없습니다. SQL Server를 실행하는 컴퓨터에서 이러한 유형의 디스크 중 하나를 사용하는 경우에는 enable_force_flush 옵션을 사용하도록 설정해야 합니다.