1. 회복

트랜잭션이 수행되는 동안 시스템에 알수없는 오류 또는 물리적으로 문제가 발생했을 때, 트랜잭션의 수행을 되돌려야 합니다.

rollback이란 트랜잭션 내의 질의를 수행하면서 문제가 발생했을 경우에 수행되는 것이지만,

시스템의 오류 또는 물리적인 문제의 경우는 시스템 상의 문제이므로 트랜잭션이 다시 수행되어야 합니다.

이를 시스템 회복(recovery)이라 합니다.

회복은 데이터의 신뢰성을 보장하며, 트랜잭션의 원자성과 영속성을 보장합니다.





2. undo, redo와 check point

시스템 오류 또는 물리적인 문제를 실패(failure)라고 합니다.

failure에는 두 종류가 있습니다.

  • local failure
    • 하나의 트랜잭션의 실패를 의미
  • global failure
    • 모든 트랜잭션이 실패하는 것을 의미


실패가 발생하면 시스템의 회복을 하기 위해 undo 또는 redo를 수행합니다.

  • undo
    • 트래잭션을 이전 상태로 되돌리는 것을 의미
  • redo
    • 이전 상태로 되돌아간 후, 실패가 발생하기 전까지의 과정을 그대로 따라가는 것을 의미합니다.
    • redo를 하기 위해서는 정상적으로 실행 되기까지의 과정을 기록해야 하는데, 이를 log라고 합니다.

check point라는 개념도 있습니다.
  • check point

    • check point로 설정한 지점 이전 까지는 트랜잭션이 성공적으로 수행이 돼서 disk에 확실히 저장된 상태를 의미합니다.

    • check point를 설정하는 이유는 시스템을 회복하기 위해 되돌아갈 때, 너무 많이 되돌아가지 않도록 하기 위함입니다.

      • 만약 실패가 발생하여 회복을 할 때 check point가 설정되어 있다면, redo는 check point 시점부터 log를 따라가면서 트랜잭션을 수행하지만, undo는 log를 따라가지 않고 트랜잭션을 재수행 합니다.


이제 여러 트랜잭션이 병행 처리 되는 과정에서 실패가 발생할 경우, undo와 redo가 어떻게 수행되는지 알아보도록 하겠습니다.



위의 그림에서,

  • 트랜잭션 T1
    • check point 이전에 실행이 완료되었으므로 failure 되더라도 이미 disk에 저장이 된 상태이므로 회복을 하지 않습니다.
  • 트랜잭션 T2
    • check point 이전에 실행된 내용은 disk에 반영이 되었으므로 check point 이후의 내용을 log를 따라가는 redo를 수행합니다.
  • 트랜잭션 T3
    • failure 시점에 실행중이였으므로 check point 시점으로 undo한 후, 트랜잭션을 재실행합니다.
  • 트랜잭션 T4
    • check point 이후에 실행됐고 failure 시점 전에 실행이 끝났으므로 redo를 수행합니다.
  • 트랜잭션 T5
    • check point 이후에 실행됐고 failure 시점에 실행중이였으므로 시작지점까지 undo한 후, 트랜잭션을 재실행합니다.




3. redo와 undo를 어떻게 구분할 수 있을까?

그런데 DBMS는 어떻게 해서 트랜잭션이 redo할 것과 undo할 것을 구분할 수 있을까요?

회복을 위해 시스템이 restart 되면, DB에서 restart file을 읽습니다.

restart file은 log의 check point record를 참조하고 있으며, check point record에서 undo할 대상을 확인합니다.


위의 예제를 통해 어떻게 undo와 redo 목록을 정하는지 그 과정을 살펴보겠습니다.

  1. 먼저, check point 시점에서 commit 된 트랜잭션은 T2와 T3입니다. 따라서 T2와 T3는 undo할 트랜잭션이 됩니다.
  2. 이어서 T4가 시작되므로, T4도 undo list에 추가됩니다.
  3. 그러다가 undo list에 있던 T2가 종료되므로, T2를 undo list에서 제거하고 redo list에 추가합니다.
  4. 다음으로 T5가 시작되므로 T5를 undo list에 추가합니다.
  5. 마지막으로 T4는 종료되므로 redo list에 추가됩니다.

이러한 과정을 통해 failure 시점에서 undo list와 redo list에 작성된 트랜잭션에 대해 undo와 redo를 수행합니다.





이상으로 시스템 오류로 인한 실패가 발생했을 때 회복하는 방법에 대해 알아보았습니다.

트랜잭션 내에서 에러가 발생했을 경우에는 rollback을 하고,

시스템 오류와 같은 트랜잭션 외부 요인으로 인해 에러가 발생했을 경우에는 회복을 한다는 점이 rollback과 recovery의 차이점입니다.