Search

[데이터베이스 시스템] 회복 시스템

제목
Tag
작성일

회복 시스템

회복의 역할

예상치 못한 HW, SW 오류로 인해 안정적 디스크 반영 여부 보장이 불가능
오류 발생 이전의 일관된 상태로 데이터베이스를 복원
데이터베이스는 장애에 대비한 내재적 복원 절차 제공

시스템 실패 유형

트랜잭션 실패
논리적: 잘못된 데이터 입력, 부재, 버퍼 오버플로, 자원 초과 이용
시스템적: 운용 시스템의 교착상태 발생 등 시스템 제어 오류
시스템 장애
시스템의 하드웨어 고장, 소프트웨어 오류
메모리가 손실되므로 커밋 여부 식별할 수 있는 로그가 중요함
디스크 실패
디스크 저장장치의 손상 및 고장으로 인한 데이터 자체 손실
이 경우 로그만으로 회복이 어렵고 주기적인 백업 필요

데이터 저장 구조

전체 데이터는 디스크와 같은 비휘발성 저장장치에 저장
트랜잭션 처리시 메인 메모리내의 버퍼 영역에 데이터 적재하고 연산 수행
데이터는 블록 단위로 디스크 메모리 간 전송, 메모리에 올라온 각 블록 = 버퍼 블록
트랜잭션은 디스크로부터 주기억장치로 데이터를 가져오며, 변경된 데이터는 일정 시점에 Output 연산을 통해 디스크로 보내짐

데이터베이스 연산 처리 과정

메인 메모리와 디스크 사이 연산
Input(X): 물리적 블록 X를 디스크에서 읽어 메인 메모리(버퍼)에 적재
Output(X): 버퍼에 있는 블록 X를 디스크에 저장
트랜잭션이 수행하는 연산
Read(X)
버퍼 블록 X가 메인 메모리에 없을 경우 Input(X)수행
버퍼 블록 X 값을 변수 X에 할당
Write(X)
버퍼 블록 X가 메인 메모리에 없을 경우 Input(X) 수행
변수 X 값을 버퍼 블록 X에 반영

로그 기반 회복

데이터베이스가 수행한 모든 수정 작업을 기록한 여러 종류의 로그를 사용해 회복하는 시스템

로그 레코드의 종류

<Ti,Xj,V1,V2><T_i, X_j, V_1, V_2>: TiT_i가 데이터 항목 변경 연산을 수행해 XjX_j의 값을 V1V_1에서 V2V_2로 변경
<Ti,Start><T_i, Start>: TiT_i 시작
<Ti,Commit><T_i, Commit>: TiT_i 커밋
<Ti,Abort><T_i, Abort>: TiT_i 취소(롤백)

WAL(Write-Ahead Log)

트랜잭션이 실제 데이터를 변경하기 전에, 해당 변경 내용을 로그에 먼저 기록
로그 기록이 완료되지 않은 상태에서 데이터가 디스크에 반영되면 장애 발생 시 복원이 불가능해지므로 변경 순서가 반드시 로그 → 데이터 순이 되도록 강제함

회복을 위한 연산

1.
Redo(TiT_i)
T가 수행한 변경을 데이터베이스에 재적용
2.
Undo(TjT_j)
T가 수행한 변경을 되돌림 <Ti,Abort><T_i, Abort> 기록

시스템 장애 발생시 회복 판단 기준

로그에 start가 있지만 commit 또는 abort 포함하는 경우 → T를 Redo (커밋 되었으나 디스크 반영여부 불확실)
로그에 start가 있지만 commit 또는 abort 가 없는 경우 → T를 Undo (커밋 전 실패한 트랜잭션)

데이터베이스 변경과 커밋

트랜잭션의 변경 내용이 버퍼에만 반영된 상태에서 커밋된 경우 → 아직 디스크에는 반영되지 않았기 때문에 장애 발생 시 Redo 필요
트랜잭션 수행 중 데이터가 수정되었지만 커밋 전에 장애가 발생한 경우 → 트랜잭션은 정상적으로 종료되지 않았기 때문에 Undo 필요
트랜잭션 커밋 완료 판단 기준
커밋 로그 레코드가 안정된 저장장치에 기록 완료된 경우 → 트랜잭션 커밋으로 간주, Redo 대상
커밋 로그 레코드가 기록되기 전에 장애가 발생한 경우 → 커밋되지 않은 것으로 간주, Undo 대상

회복의 유형

회복 기법은 트랜잭션이 수정한 데이터가 언제 디스크에 반영되는지에 따라 구분
지연 갱신 회복
트랜잭션 수행 중에는 디스크에 반영하지 않고 로그에만 기록
트랜잭션이 커밋된 후에야 디스크에 적용
장애 발생 시 로그만 보고 Redo만 수행하면 됨 → Undo 불필요
즉시 갱신 회복
변경이 발생하면 즉시 디스크에 반영
장애 발생 시, 디스크에 이미 반영된 갱신을 로그 기반으로 Undo 또는 Redo를 통해 정리해야 함

체크포인트의 필요성과 기법

로그 크기는 시간이 지남에 따라 계속 증가하므로 대용량 로그 탐색 비용이 매우 커짐. Redo 해야하는 트랜잭션 중 대부분은 이미 데이터베이스에 반영되어 있으므로 재실행은 자원 낭비
→ 이를 해결하기 위한 체크포인트 기법
일정 시점에 메인 메모리의 버퍼 블록에 존재하는 모든 로그 레코드 안정 저장장치로 기록
수정된 모든 버퍼 블록 디스크에 반영
로그 레코드 <checkpoint ListT>를 안정한 저장장치에 기록
이후 회복시 체크포인트 이후 로그만 탐색하면 되므로 복구 효율 향상

체크포인트 기반 회복 과정

로그의 마지막부터 역방향으로 탐색<checkpoint ListT> 레코드 찾음
<checkpoint ListT> 이후에 실행된 트랜잭션에 대해서만 Redo/Undo 수행

회복 알고리즘

트랜잭션 롤백 알고리즘

1.
로그를 역방향으로 탐색
2.
TiT_i의 로그 레코드 <Ti,Xj,V1,V2><T_i, X_j, V_1, V_2> 찾을 때마다:
a.
데이터 항목 XjX_j의 값을 V1V_1 로 복원
b.
로그 레코드 <Ti,Xj,V1><T_i, X_j, V_1>을 로그에 기록(복원 작업 기록)
3.
<Ti,Start><T_i, Start> 찾으면:
a.
역방향 탐색 종료
b.
로그에 <Ti,Abort><T_i, Abort>레코드 기록

시스템 장애 후 회복 알고리즘

시스템 장애 이후 재시작 시 로그 전체를 기반으로 복구작업 진행
** List of Undo: 미커밋 상태인 트랜잭션만 모아놓은 것
1.
Redo 단계
최근 체크포인트에서부터 순방향 로그 탐색
롤백 대상 트랜잭션의 List of Undo를 ListT로 초기화
<Ti,Xj,V1,V2><T_i, X_j, V_1, V_2>, <Ti,Xj,V1><T_i, X_j, V_1> 형태의 모든 레코드를 재실행
<Ti,Start><T_i, Start> 발견시 TiT_iList of Undo에 추가
<Ti,abort><T_i, abort>, <Ti,commit><T_i, commit> 발견시 TiT_iList of Undo에서 제거
2.
Undo 단계
Redo 단계가 끝난 시점부터 역방향으로 로그 탐색하며 List of Undo에 남아있는 트랜잭션에 대해 롤백 수행
<Ti,Start><T_i, Start> 발견시 로그에 <Ti,abort><T_i, abort> 기록하고 List of Undo에서 제거
List of Undo에 트랜잭션이 존재하지 않는 상태가 되면 Undo 단계 종료
Redo 단계에서는 커밋된 트랜잭션, 즉 실행했지만 반영 안된 작업을 재실행, Undo 단계에서는 미커밋 트랜잭션, 즉 중간에 실패했을 가능성이 있는 작업을 이전 값으로 복원하는 작업임