SQL Server 트랜잭션 로그 아키텍처(4/4)
– 미리 쓰기 트랜잭션 로그
- Version : SQL Server 2005, 2008, 2008R2, 2012
SQL Server에서는 미리 쓰기 로그(Write-Ahead Logging)기능을 사용하여 관련된 로그 레코드가 디스크에 기록되기 전에는 어떠한 데이터 수정 내용도 디스크에 기록되지 않도록 한다. 따라서 ACID 속이 유지 관리 된다.
[Write-Ahead Logging 프로토콜] 데이터가 올바르게 저장 및 교환되었는지 그리고 장애가 발생했을 경우 데이터를 알 수 있는 상태로 복구 할 수 있는지 확인하는데 필요한 특정하게 정의된 수행 단계의 모음이다. 네트워크에 정의된 프로토콜이 일관되고 보호된 방식으로 데이터를 교환하는 것처럼 WAL 역시 프로토콜을 준수하여 데이터를 보호 한다. |
미리 쓰기 로그의 작동 방식을 이해하려면 수정된 데이터가 디스크에 기록되는 방법을 알아야 한다.
SQL Server는 데이터를 검색해야 할 때 데이터 페이지를 읽어오는 버퍼 캐시를 유지 관리 한다. 데이터 수정은 디스크에서 직접 수행 되지 않고 버커 패시의 페이지 복사본에서 수행 된다. 수정 내용은 데이터베이스에 검사점이 발생 할 때까지 디스크에 기록되지 않거나 버퍼가 새 페이지를 보유하는데 사용 될 수 있도록 디스크에 기록 되어야 한다. 버퍼 캐시에 있는 수정된 데이터 페이지를 디스크에 쓰는 작업을 페이지 플러시라 한다. 캐시에서 수정되었으나 아직 디스크에 기록되지 않은 페이지를 커밋되지 않은 페이지라고 한다.
버퍼에 있는 페이지가 수정 될 때 로그캐시에는 수정 내용을 기록하는 로그 레코드가 작성 된다. 이 로그 레코드는 관련된 커밋되지 않은 페이지가 버퍼 캐시에서 디스크로 플러시 되기 전에 디스크에 기록되어야 한다.
로그 레코드가 기록되기 전에 커밋 되지 않은 페이지가 플러시 되면 로그 레코드가 디스크에 기록되기 전에 서버 장애가 발생하는 경우 롤백 될 수 없는 수정 내용이 디스크에 작성 된다.
SQL Server에는 관련 로그 레코드가 기록되기 전에 커밋되지 않은 페이지가 플러시 되지 않도록 하는 설계되어 있다. 로그 레코드는 트랜잭션 커밋이 되면 디스크에 기록 된다.
SQL Server의 모든 버전은 Win32 Create File 함수를 사용하여 로그 파일과 데이터 파일을 연다. SQL Server에서 파일을 열었을 때 dwFlagsAndAttributes 구성원(Member)에 FILE_FLAG_WRITE_THROUGH 옵션이 포함 된다. 이 옵션은 디스크의 중간 캐시를 통해 쓰고 디스크로 저장 된다. 시스템은 쓰기 작업을 계속 할 수 있지만 천천히 플러시 할 수는 없다. FILE_FLAG_WRITE_THROUGH 옵션 쓰기 작업이 성공적으로 완료 되었을 때 데이터가 안정한 저장소(디스크)에 올바르게 저장될 수 있도록 한다.
일부 드라이브 캐시 데이터는 디스크에 기록되기 전에 내부 메모리에 기록된다. 이렇게 되면 미리 쓰기 로그가 올바르게 작동할 수 없다. SQL Server를 운영하는데 이러한 유형의 디스크를 사용하는 경우에는 enable_force_flush 옵션을 사용하도록 설정 해야 한다.
많은 디스크 드라이브에는 캐시가 내장되어 있다. 하지만 드라이브 캐시는 배터리 지원 방식이 아닌 축전지 방식을 사용한다. 이러한 캐시 메커니즘은 전원 문제 또는 유사한 장애 시 쓰기를 보장 할 수 없다. 캐시 용량이 클수록 장애가 발생 하였을 때 더 많은 양의 데이터 손실이 발생 할 수 있다. 최근 많은 공급업체들이 배터리가 지원되는 캐싱 솔루션을 제공한다. 이는 전원 문제가 발생하여도 쓰여지지 않은 데이터는 완전히 플러시가 가능하다.
캐시를 사용하지 않는 I/O 전송은 드라이브 헤드를 이동하는데 필요한 시간, 회전율 및 여러 요소로 인하여 처리 시간이 길어 질 수 있다.
[참고 자료]
2013-04-19 / 강성욱 / http://sqlmvp.kr
'SQL Server > SQL Server Tip' 카테고리의 다른 글
SQL Server 테이블 및 인덱스 구조 아키텍처(2/4) – 힙 구조 (0) | 2015.07.20 |
---|---|
SQL Server 테이블 및 인덱스 구조 아키텍처(1/4) – 테이블 및 인덱스 구성 (0) | 2015.07.20 |
SQL Server 트랜잭션 로그 아키텍처(3/4) – 검사점 및 로그의 활성 부분 (0) | 2015.07.20 |
SQL Server 트랜잭션 로그 아키텍처(2/4) – 트랜잭션 로그 물리 아키텍처 (0) | 2015.07.20 |
SQL Server 트랜잭션 로그 아키텍처(1/4) – 트랜잭션 로그 논리 아키텍처 (0) | 2015.07.20 |