데이터베이스 기초

많은 DBMS는 데이터를 갱신할 때 갱신 내용을 로그(저널)에 기록하고, 그 로그를 데이터베이스 본체보다 먼저 비휘발성 저장 장치에 쓴다(WAL: 로그 선행 기록). 이 방식을 취하는 주된 이유는?

  1. A장애가 일어나도 로그를 바탕으로 커밋된 갱신을 다시 수행하고 커밋되지 않은 갱신을 취소하여 올바른 상태로 되돌릴 수 있기 때문에
  2. B로그를 먼저 쓰면 데이터베이스 본체의 용량이 작아지기 때문에
  3. CSELECT 문의 검색에서 로그를 색인으로 사용할 수 있기 때문에
정답과 해설 보기

정답: A. 장애가 일어나도 로그를 바탕으로 커밋된 갱신을 다시 수행하고 커밋되지 않은 갱신을 취소하여 올바른 상태로 되돌릴 수 있기 때문에

데이터베이스 본체의 페이지는 성능을 위해 메모리상의 버퍼에서 갱신한 뒤 잠시 후에 저장 장치에 쓰입니다. 그래서 장애가 일어난 순간에는 커밋했는데 본체에 쓰이지 않은 갱신이나, 커밋하지 않았는데 본체에 쓰인 갱신이 섞여 있을 가능성이 있습니다. 갱신 전 값과 갱신 후 값을 로그에 기록하고 로그를 본체보다 먼저 써 두면, 장애 후에 로그를 바탕으로 커밋된 갱신을 다시 수행하고(롤포워드, REDO), 커밋되지 않은 갱신을 취소하여(롤백, UNDO) 올바른 상태로 되돌릴 수 있습니다. 커밋은 그 트랜잭션의 커밋 기록이 로그에 쓰인 시점에 완료된 것으로 볼 수 있으므로, 본체의 페이지를 매번 바로 쓸 필요가 없어 성능도 유지됩니다. 이 구조가 ACID 특성의 원자성과 지속성을 뒷받침합니다.

이 분야 연습하기 분야로 돌아가기

데이터베이스 기초의 다른 문제

  1. 트랜잭션 T1~T5가 있고, 장애가 발생하기 전에 체크포인트를 한 번 잡았다. T1은 체크포인트 전에 시작하여 커밋했다. T2와 T3는 체크포인트 전에 시작했으며, T2는 체크포인트 후 장애 전에 커밋했고, T3는 장애 시점에 커밋하지 않았다. T4와 T5는 체크포인트 후에 시작했으며, T4는 장애 전에 커밋했고, T5는 커밋하지 않았다. 장애 후의 복구에서 로그를 사용하여 롤포워드해야 하는 트랜잭션은?
  2. 100만 행이 있는 회원 표의 회원번호 열에 B+ 트리 인덱스를 만들었다. 일반적으로 기대할 수 있는 효과와 그 대가의 조합으로 올바른 것은?
  3. 100만 행의 회원 표에서 회원번호(모두 다름), 도도부현(47종류), 성별(2종류로 거의 반반) 열에 각각 B+ 트리 인덱스를 만드는 것을 생각한다. WHERE 절로 한 열의 값을 지정하여 검색할 때 인덱스의 효과가 가장 작다고 생각되는 열은?
  4. NoSQL이라고 불리는 데이터베이스 중 키-값형의 특징으로 일반적으로 올바른 것은?
  5. 여러 서버에 데이터의 복제본을 두는 분산 데이터베이스에 대한 CAP 정리의 설명으로 적절한 것은?