본문 바로가기
데이터 [Data]/데이터베이스론

데이터베이스론 보고서 14 : 로그 우선쓰기를 왜 해야 하는가?

by 냉철하마 2021. 7. 21.

  로그 우선 쓰기(로그 먼저 쓰기, WAL; Write-Ahead Logging)는 트랜잭션이 데이터베이스를 갱신하면 주기억 장치의 데이터베이스 버퍼에 갱신 사항을 기록하고, 로그 버퍼에는 이에 대응되는 로그 레코드를 기록하는 방식이다. 만일 데이터베이스 버퍼가 로그 버퍼보다 먼저 디스크에 기록되는 경우에는 로그 버퍼가 디스크에 기록되기 전에 시스템이 다운되었다가 다시 기동되었을 때 주기억장치는 휘발성이므로 데이터베이스 버퍼와 로그 버퍼의 내용은 남아있지 않게 된다. 이는 로그 레코드가 없어서 이전 값을 알 수 없으므로 트랜잭션의 취소가 불가능하다. 따라서 데이터베이스 버퍼보다 로그 버퍼를 먼저 디스크에 기록해야 한다.

  데이터베이스는 여러 응용이 주기억 장치 버퍼 내의 동일한 데이터베이스 항목을 갱신한 후에 디스크에 기록함으로써 성능을 향상시키는 것이 중요하다. 디스크에 버퍼의 내용을 기록하는 것을 가능한 만큼 줄이는 것이 일반적이며, 트랜잭션이 버퍼에는 갱신 사항을 반영했지만 버퍼의 내용이 디스크에 기록되기 전에 고장이 발생할 수도 있다. 이러한 고장이 발생하기 전에 트랜잭션이 완료 명령을 수행했다면, 회복 모듈은 이 트랜잭션의 갱신 사항을 재수행(Redo)하여 트랜잭션의 갱신이 지속성을 갖도록 해야 한다. 반면에 고장이 발생하기 전에 트랜잭션이 완료 명령을 수행하지 못했다면 원자성을 보장하기 위해서 이 트랜잭션이 데이터베이스에 반영했을 가능성이 있는 갱신 사항을 취소(Undo)해야 한다. 이러한 과정을 회복이라고 한다.

  주기억 장치와 같은 휘발성 저장 장치에 들어있는 내용은 시스템이 다운된 후에 모두 사라지는 반면에 디스크와 같은 비휘발성 저장 장치에 들어있는 내용은 디스크 헤드 등이 손상을 입지 않는 이상 시스템이 다운된 후에도 유지된다. 여기서 모든 유형의 고장을 견딜 수 있는 저장 장치를 의미하는 안전 저장 장치(stable storage)가 있는데, 두 개 이상의 비휘발성 저장 장치가 동시에 고장 날 가능성은 매우 낮으므로, 이에 두 개 이상의 사본을 중복하여 저장함으로써 안전 저장 장치를 구현한다.

  데이터베이스에서 고장은 재해적 고장, 비재해적 고장으로 분류된다. 재해적 고장은 디스크가 손상을 입어서 데이터베이스를 읽을 수 없는 고장이며, 재해적 고장으로부터의 회복은 데이터베이스를 백업해 놓은 자기 테이프를 기반으로 한다. 비재해적 고장은 로그를 기반으로 한 즉시 갱신, 로그를 기반으로 한 지연 갱신, 그림자 페이징(shadow paging) 등 대부분의 회복 알고리즘이 적용되는 고장으로 대부분의 상용 DBMS에서 로그를 기반으로 한 즉시 갱신 방식을 사용한다.

  이 중에서 로그를 사용한 즉시 갱신에서는 트랜잭션이 데이터베이스를 갱신한 사항이 주기억 장치의 버퍼에 유지되다가, 트랜잭션이 완료되기 전이라도 디스크의 데이터베이스에 기록될 수 있다. 데이터베이스에는 완료된 트랜잭션의 수행 결과뿐만 아니라 철회된 트랜잭션의 수행 결과도 반영될 수 있으며, 트랜잭션의 원자성과 지속성을 보장하기 위해 DBMS는 로그라고 부르는 특별한 파일을 유지한다. 이 로그를 활용하여 데이터베이스의 항목에 영향을 미치는 모든 트랜잭션의 연산들에 대해서 로그 레코드를 기록한다. 주기억 장치 내의 로그 버퍼에서 로그 레코드들을 기록하고 로그 버퍼가 꽉 찰 때 디스크에 기록하는데, 이 때 로그는 데이터베이스 회복에 필수적이므로 일반적으로 안전 저장 장치에 저장된다. 각 로그 레코드가 어떤 트랜잭션에 속한 것인가를 식별하기 위해서 각 로그 레코드마다 트랜잭션 ID를 포함시키는데, 동일한 트랜잭션에 속하는 로그 레코드들은 연결 리스트로 유지된다.

  결국 로그 우선 쓰기를 통하여 고장이 발생해도 로그를 기반으로 한 즉시 갱신, 지연 갱신 등을 통해 데이터베이스의 안전하고 빠른 회복을 도모하는 것이 주요 이유라고 할 수 있다.

 

댓글