솜은 코튼

[DB] 검사시점 회복 본문

DB

[DB] 검사시점 회복

솜.코 2023. 6. 2. 16:51

 

검사시점 회복

.

 

 

앞에 말한 로그를 이용하는 기법에서는 Redo와 Undo를 해야 될 트랜잭션을

결정하기 위해서 로그 전체를 조사해야 된다.

 

이것은 시간이 너무 많이 걸릴 뿐만 아니라 할 필요가 없는 트랜잭션을

또다시 Redo해야 되는 문제가 생긴다.

 

 

이 문제점을 해결하기 위한 방법이 '검사시점(checkpoint) 방법'이다.

 

이 방법은 트랜잭션을 수행하는 동안 앞에서 설명한 로그를 기록 유지하면서

일정한 시간 간격으로 검사시점을 만들어 놓고 다음 작업을 한다.

 

1 메인 메모리(로그 버퍼)에 있는 모든 로그 레코드를 안정 저장소로 출력
2 변경된 데이터 버퍼 블록을 전부 디스크로 출력
3 검사 시점 표시로써 <Checkpoint L> 로그 레코드를 안정 저장소에 출력
(여기서 L은 현재 실행 중에 있는 트랜잭션들의 리스트이다.)

 

 

이 <Checkpoint L> 레코드는 회복 작업의 범위를 정해 준다.

이 검사시점이 설정되면 검사시점 이전의 트랜잭션에 대해서는 회복 작업이 필요없다.

 

즉, 장애가 발생했다가 다시 시스템이 가동되면 회복 관리자는 로그에 있는

가장 최근 <Checkpoint L> 레코드를 찾아 그 시점 이후의 로그만을 회복 대상으로 하면 된다.

 

 

 

 

위의 그림에서 T1은 검사시점 이전에 실행이 완료되었고

T2는 검사시점 이전에 시작해서 장애시점 이전에 완료되었다.

T3는 검사시점 이전에 시작하였으나 장애시점까지 완료되지 못하였고

T4는 검사시점 이후에 시작하여 장애시점 이전에 완료되었다.

T5는 검사시점 이후에 실행을 시작하여 장애시점까지 완료되지 못했다.

 

여기서 T1은 회복 작업에 관련될 필요가 없다.

 

회복 관리자는 장애 발생 후 시스템이 재가동되면 가장 최근의 <Checkpoint L> 레코드를

로그에서 찾아 이 시점에서부터 검사를 하면서 Undo와 Redo를 해야 될 트랜잭션을 결정한다.

 

방법은 아래와 같다.

 

1 두 개의 빈 Undo-list와 Redo-list를 만든다.
2 검사시점 설정 당시에 활동 중인 트랜잭션은 전부 Undo-list에 삽입한다.
3 로그를 차례로 검색하면서 <Ti, Start> 로그 레코드를 만나면
트랜잭션 Ti를 Undo-list에 첨가한다.
4 로그를 차례로 검색하면서 <Ti, Commit> 로그 레코드를 만나면
트랜잭션 Ti를 Undo-list에서 삭제하고 Redo-list에 첨가한다.

 

위의 작업이 완료되면 회복 관리자는 먼저 Undo-list에 있는 모든 트랜잭션들에 대해

로그에 기록된 역순으로 Undo 연산을 수행한다.

 

그런 다음 다시 Redo-list에 있는 트랜잭션에 대해 로그에 기록된 순서로 Redo를 수행한다.

 

Undo 연산을 수행하여 회복하는 것을 '후진 회복'라 하고

Redo 연산을 수행하여 회복하는 것을 '전진 회복'이라 한다.

 

회복 작업이 완료될 때까지 시스템은 새로운 트랜잭션을 받아들일 수 없다.

 

 

여기서 T2는 c 이후에 일어난 변경 부분에 대해서만 Redo를 하면 되고,

T4는 트랜잭션 전체를 Redo해야 된다.

 

T3와 T5는 Undo를 실행해야 되는데

T3는 c 이전에 수행되었던 변경 부분도 Undo에 포함시켜야 된다.

 

 

 

 

 

 

 

 

* 해당 글은 '데이터베이스 시스템' 책을 참고하여 작성하였습니다. 출처: 데이터베이스 시스템 (이석호)