본문으로 건너뛰기

회복

정보처리기사 목차권한과 트랜잭션레슨 104 / 233

목차

회복(recovery)은 장애가 난 데이터베이스를 장애 직전의 올바른 상태로 되돌리는 일입니다. 로그에 적어 둔 바꾸기 전 값과 바꾼 뒤 값을 꺼내 씁니다.

점수를 고치는 트랜잭션 넷이 돌던 중에 정전으로 서버가 꺼졌습니다. 메모리에 있던 것은 날아갔고, 디스크에 얼마까지 반영됐는지는 알 수 없습니다. COMMIT을 마친 트랜잭션의 변경은 남아 있어야 합니다. 영속성입니다. 끝내지 못한 트랜잭션의 변경은 하나도 남아 있어서는 안 됩니다. 원자성입니다. 둘을 지키려면 '무엇을 어떤 값에서 어떤 값으로 바꿨다'는 기록이 있어야 합니다. 그 기록이 로그(log)이고, 로그를 읽어 둘을 지키는 일이 회복입니다. 아래 그림은 트랜잭션 넷의 로그가 쌓이고, 장애 뒤에 그 로그로 회복하는 장면입니다.

7단계 중 1단계. 데이터베이스는 값을 바꿀 때마다 바꾸기 전 값과 바꾼 뒤 값을 로그에 적어 둡니다.

1로그와 검사점

그림의 로그에 쌓이는 트랜잭션은 넷입니다. T1은 수강 표의 101번 OS 점수를, T2는 102번 OS를, T3은 104번 OS를, T4는 107번 NW를 고칩니다.

값을 바꿀 때마다 로그에 한 줄이 쌓입니다. 한 줄에는 어느 트랜잭션이 어느 데이터를 바꾸기 전 값에서 바꾼 뒤 값으로 바꿨는지가 들어갑니다. T1은 101번 OS를 75에서 80으로 바꾸고 COMMIT까지 마쳤습니다.

이어서 그림은 검사점을 보입니다. 검사점에 이르면 그때까지의 변경을 디스크에 모두 반영하고 로그에 표시를 남깁니다. 표시에는 그때 도는 중인 트랜잭션(T2)을 함께 적습니다. 검사점(checkpoint)은 자료에 따라 체크포인트라고도 부릅니다.

2REDO와 UNDO — COMMIT이 적혔는지로 가른다

그림에서 장애가 납니다. 메모리에 있던 것은 날아가고, 어느 변경이 디스크까지 갔는지는 알 수 없습니다. T4는 COMMIT을 적지 못한 채 끊겼습니다.

회복은 로그를 처음부터 다 읽지 않습니다. 마지막 검사점을 찾고, 그 표시에 함께 적힌 도는 중인 트랜잭션의 첫 줄까지 거슬러 읽습니다. 검사점 앞에서 COMMIT까지 마친 T1은 검사점에서 이미 디스크에 반영돼 아무것도 하지 않습니다. 표시에 적힌 T2는 바꾼 뒤 값이 검사점 앞 줄에 있어, 그 줄까지 읽어야 다시 반영할 수 있습니다.

로그에 COMMIT이 적힌 T2·T3은 끝까지 마친 트랜잭션입니다. 로그의 바꾼 뒤 값을 꺼내 다시 반영합니다. 이것을 REDO(재실행)라고 합니다. COMMIT이 적히지 않은 T4는 끝내지 못한 트랜잭션입니다. 로그의 바꾸기 전 값으로 되돌립니다. 이것을 UNDO(취소)라고 합니다. 회복이 끝나면 데이터베이스에는 확정한 변경만 남습니다.

가르는 기준은 하나입니다. 로그에 COMMIT이 적혔으면 REDO, 안 적혔으면 UNDO입니다. 트랜잭션과 ACID에서 ROLLBACK이 바꾼 것을 되돌릴 수 있었던 것도 이 로그가 있기 때문입니다.

3장애의 세 가지 유형

장애무엇이 망가지나어떻게 회복하나
트랜잭션 장애(transaction failure)그 트랜잭션 하나가 더 진행할 수 없습니다그 트랜잭션만 UNDO합니다
시스템 장애(system failure)메모리 내용이 날아가고 디스크는 남습니다로그를 읽어 REDO와 UNDO를 합니다
미디어 장애(media failure)디스크가 망가져 데이터를 읽을 수 없습니다백업으로 되살린 뒤 로그로 REDO합니다

4회복 기법 — 즉시 갱신·지연 갱신·그림자 페이징

로그는 언제나 데이터베이스보다 먼저 적습니다. 데이터베이스에 반영하는 시점은 두 가지로 갈립니다.

기법데이터베이스에 반영하는 시점회복에 쓰는 연산
즉시 갱신(immediate update)트랜잭션이 도는 중에 바로 반영합니다UNDO와 REDO를 모두 씁니다
지연 갱신(deferred update)COMMIT을 할 때까지 미루고 로그에만 적습니다REDO만 씁니다
  • 즉시 갱신은 끝내지 못한 트랜잭션의 변경이 이미 데이터베이스에 들어가 있을 수 있어 UNDO가 필요합니다.
  • 지연 갱신은 COMMIT 전에 장애가 나면 반영된 것이 없어 되돌릴 것도 없습니다. 그래서 UNDO가 필요하지 않습니다.
  • 위 그림과 아래 예제는 즉시 갱신 쪽입니다. 도는 중에 반영했다고 보고 REDO와 UNDO를 모두 씁니다.

로그를 쓰지 않는 기법도 있습니다. 그림자 페이징(shadow paging)은 페이지를 가리키는 표를 두 벌 둡니다. 하나는 그대로 두고(그림자 페이지 표), 바꿀 때는 새 페이지를 만들어 다른 한 벌(현재 페이지 표)만 새 페이지를 가리키게 고칩니다. COMMIT하면 현재 페이지 표가 그림자 페이지 표가 됩니다. 장애가 나면 그림자 페이지 표로 돌아가면 됩니다. 옛 페이지가 그대로 남아 있어 로그도 REDO·UNDO도 필요하지 않습니다. 가르는 기준은 간단합니다. 로그로 회복하는지, 옛 페이지를 남겨 두고 회복하는지입니다.

예제

로그를 읽고 가른다

그림에서 본 장면을 시험에 나오는 로그 표기로 적으면 다음과 같습니다. 기록 하나는 <트랜잭션, 데이터, 바꾸기 전 값, 바꾼 뒤 값> 꼴입니다.

<T1, 수강(101,OS).점수, 75, 80>
<T1, COMMIT>
<T2, 수강(102,OS).점수, 60, 70>
<검사점 {T2}>
<T2, COMMIT>
<T3, 수강(104,OS).점수, 75, 85>
<T3, COMMIT>
<T4, 수강(107,NW).점수, 50, 60>
--- 여기서 장애 ---

로그를 아래에서 위로 거슬러 읽어 마지막 검사점을 찾습니다. 검사점 표시에 적힌 T2와 그 뒤에 나오는 트랜잭션을 둘로 가릅니다.

트랜잭션로그에 COMMIT이 있나회복할 때
T1있다(검사점 앞)아무것도 하지 않습니다
T2있다REDO
T3있다REDO
T4없다UNDO

T2가 검사점 앞에서 시작했어도 COMMIT이 검사점 뒤라 REDO 대상입니다. 가르는 기준은 언제 시작했는지가 아니라 COMMIT이 적혔는지입니다. T2의 바꾼 뒤 값 70은 검사점 앞 줄에 적혀 있습니다. 검사점 표시의 T2를 보고 그 줄까지 거슬러 읽습니다.

회복이 끝난 뒤 네 점수는 다음과 같습니다.

학번과목코드점수
101OS80
102OS70
104OS85
107NW50

107번의 점수만 옛 값 50으로 돌아갔습니다. T4가 COMMIT을 마치지 못했기 때문입니다.

시험 포인트

  • 필기: 로그에는 바꾸기 전 값과 바꾼 뒤 값이 함께 적힙니다. 로그에 COMMIT이 적힌 트랜잭션은 REDO, 적히지 않은 트랜잭션은 UNDO 대상입니다. 검사점은 그때까지의 변경을 디스크에 반영하고 표시를 남겨, 회복할 때 읽을 로그 범위를 줄여 줍니다. 즉시 갱신은 UNDO와 REDO를 모두 쓰고, 지연 갱신은 REDO만 씁니다. 그림자 페이징은 로그 없이 옛 페이지를 남겨 두고 회복합니다. 장애는 트랜잭션 장애·시스템 장애·미디어 장애로 나뉩니다.
  • 실기: REDO(재실행)·UNDO(취소), 즉시 갱신(Immediate Update)·지연 갱신(Deferred Update)·검사점(Checkpoint, 자료에 따라 체크포인트)·그림자 페이징(Shadow Paging)입니다.

확인 문제

1. 장애가 난 뒤 로그가 다음과 같았습니다. 회복할 때 REDO하는 트랜잭션을 모두 고르세요.

<TA, 학생(104).학년, 1, 2>
<TA, COMMIT>
<TB, 학생(102).학년, 2, 3>
<검사점 {TB}>
<TC, 학생(107).학년, 1, 2>
<TC, COMMIT>
<TB, COMMIT>
<TD, 학생(105).학년, 3, 4>
--- 여기서 장애 ---
  • ① TC
  • ② TB, TC
  • ③ TA, TB, TC
  • ④ TB, TC, TD
정답

②입니다. 마지막 검사점 뒤에 COMMIT이 적힌 트랜잭션은 TC와 TB입니다. 둘의 바꾼 뒤 값을 다시 반영합니다.

  • ① 검사점 뒤에 시작한 것만 REDO한다고 봤습니다. TB는 검사점 앞에서 시작했지만 COMMIT이 검사점 뒤라 REDO 대상입니다.
  • ③ 검사점 앞에서 COMMIT한 TA까지 넣었습니다. TA의 변경은 검사점에서 이미 디스크에 반영돼 다시 할 것이 없습니다.
  • ④ COMMIT이 없는 TD까지 넣었습니다. TD는 끝내지 못한 트랜잭션이라 되돌리는 쪽입니다.

2. 다음 (가)~(라)에 맞는 이름을 한글 이름과 영문으로 함께 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

  • (가) 트랜잭션이 도는 중에 바꾼 값을 바로 데이터베이스에 써 넣는 방식입니다. 끝내지 못한 트랜잭션의 변경이 이미 들어가 있을 수 있어, 되돌리는 연산이 반드시 필요합니다.
  • (나) 트랜잭션이 끝낼 때까지 데이터베이스를 건드리지 않고 기록만 쌓아 두는 방식입니다. 끝내지 못한 트랜잭션은 데이터베이스에 흔적이 없어 되돌릴 것이 없습니다.
  • (다) 도는 중에 한 번씩 디스크에 모두 반영하고 로그에 표시를 남기는 일입니다. 장애가 나면 이 표시를 찾아 읽을 로그 범위를 줄입니다.
  • (라) 기록을 쌓는 대신 페이지를 가리키는 표를 두 벌 두고, 한 벌은 옛 페이지를 그대로 가리키게 남겨 두는 방식입니다.
정답

받는 답: (가) 즉시 갱신(Immediate Update) · (나) 지연 갱신(Deferred Update) · (다) 검사점(Checkpoint) · (라) 그림자 페이징(Shadow Paging)

(가)의 실마리는 '도는 중에 바로 써 넣는다', (나)는 '끝낼 때까지 데이터베이스를 건드리지 않는다', (다)는 '읽을 범위를 잘라 주는 표시', (라)는 '표를 두 벌 두고 옛 페이지를 남긴다'입니다.

  • 같은 이름의 다른 꼴: (다) 체크포인트(Checkpoint) — 자료에 따라 이렇게도 부릅니다. 함께 받습니다.
  • 틀리는 꼴 지연 갱신 — (가)에: COMMIT까지 반영을 미루는 방식입니다. (가)는 미루지 않고 바로 반영합니다.
  • 틀리는 꼴 즉시 갱신 — (나)에: 도는 중에 바로 반영하는 방식입니다. (나)는 끝낼 때까지 미룹니다.
  • 틀리는 꼴 그림자 페이징 — (나)에: 로그를 쓰지 않고 페이지 표 두 벌로 회복하는 방식입니다. (나)는 기록을 쌓아 두는 로그 기반 방식입니다.

3. 회복에 쓰는 연산 둘입니다. (가)·(나)에 맞는 이름을 한글 이름과 영문으로 함께 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

  • (가) 로그에서 바꾼 뒤 값을 꺼내 데이터베이스에 다시 써 넣습니다. 끝까지 마친 트랜잭션에 합니다.
  • (나) 로그에서 바꾸기 전 값을 꺼내 데이터베이스를 그 값으로 돌려놓습니다. 끝내지 못한 트랜잭션에 합니다.
정답

받는 답: (가) 재실행(REDO) · (나) 취소(UNDO)

(가)의 실마리는 '바꾼 뒤 값으로 다시 반영한다', (나)는 '바꾸기 전 값으로 돌려놓는다'입니다. 로그가 두 값을 함께 적어 두기 때문에 양쪽이 모두 됩니다.

  • 틀리는 꼴 ROLLBACK — (나)에: 트랜잭션을 취소하는 SQL 명령의 이름입니다. 회복할 때 데이터베이스가 하는 연산의 이름은 취소(UNDO)입니다.
  • 틀리는 꼴 COMMIT — (가)에: 트랜잭션의 변경을 확정하는 SQL 명령입니다. 회복 연산의 이름이 아닙니다.
  • 틀리는 꼴 검사점 — (가)에: 읽을 로그 범위를 줄여 주는 표시이고, 값을 다시 써 넣는 연산이 아닙니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

정보처리기사 목차로