본문 바로가기

Database

[DB]REDO와 UNDO로 데이터 복구하기

REDOUNDO에 대해 설명하기 전에 우리는 Transaction에 대해 알아야 합니다.

Transaction의 ACID(원자성, 일관성, 독립성, 지속성)특성이 REDO, UNDO와 긴밀한 연관이 되어 있기 때문입니다.


트랜잭션(=Transaction)

트랜잭션이란, 데이터베이스 관리 시스템(=DBMS)에서 상호작용하는 단위를 의미합니다.

DBMS는 트랜잭션에 대해 원자성(Atomicity), 일관성(Consistency), 독립성(Isolation), 지속성(Durability)를 보장합니다.

트랜잭션의 모든 연산은 반드시 한꺼번에 완료되거나 한꺼번에 취소되어야 하는 원자성(Atomicity)을 가지고 있습니다.

 

 

한꺼번에 완료가 된 경우, Commit을 통해 작업 결과를 데이터베이스에 반영합니다. 

반면, 트랜잭션이 완료되지 않아 한꺼번에 취소가 되는 경우, Rollback을 호출하고 작업 결과를 모두 취소하여 데이터베이스에 영향을 미치지 않게 됩니다. 

 

 

트랜잭션의 성질

원자성(Atomicity)

  • 모두 정상적으로 실행되거나 하나도 실행되지 않아야 하는 All OR Not 방식을 의미합니다.
  • 장애가 발생한 경우 지금까지 실행한 연산 처리들을 모두 취소하고 데이터베이스를 트랜잭션 작업 전 상태로 되돌려야 합니다. (=Undo)
  • 원자성 보장을 위해 장애 발생 시 회복 기능이 필요합니다. (=Redo)

일관성(Consistency)

  • 트랜잭션이 성공적으로 수행된 이후에도 데이터베이스가 일관된 상태를 유지해야 합니다.

독립성(Isolation)

  • 수행 중인 트랜잭션이 완료되기 전까지 중간 연산 결과에 따른 트랜잭션들이 접근할 수 없음을 의미합니다.
  • 격리성을 보장하기 위해선 여러 트랜잭션이 동시에 수행되더라도 마치 순서대로 하나씩 수행되는 것처럼 정확하고 일관된 결과를 얻을 수 있도록 제어하는 기능이 필요합니다. (=동시성 제어)

지속성(Durability)

  • 트랜잭션이 성공적으로 완료된 이후, 데이터베이스에 반영한 수행 결과는 영구적이어야 합니다.
  • 지속성의 보장을 위해서 장애 발생 시 회복 기능이 필요합니다.

 

 

트랜잭션을 보장하기 위한 기능

트랜잭션의 특성과 대응하여 필요한 DBMS 기능


REDO

  • 이전 상태로 되돌아간 후, 실패가 발생하기 전까지의 과정을 다시 실행하는 것을 의미합니다.
  • REDO을 시행하기 위해선 정상적으로 실행 되기까지의 과정을 기록해야 합니다. 이를 Log라고 합니다.
  • 복구의 역할을 하며, 오라클 서버에서의 동작들은 전부 REDO에 기록됩니다. (UNDO도 마찬가지 입니다.)
  • 쉽게 말해, 사용자가 했던 작업을 그대로 다시 한다고 생각하시면 됩니다.

다시 실행을 하는 경우는 장애가 발생했을 때 입니다.

 

UPDATE, DELETE 혹은 INSERT를 수행하고 난 후, 메모리에는 트랜잭션 변경이 적재되었지만, 아직 디스크(데이터베이스)에 COMMIT 되지 않은 상태일 때 장애로 인하여 시스템이 죽었다고 가정해봅시다. 이 때 시스템을 다시 기동하게 되면 트랜잭션을 다시 한번 실행시켜 복구 시킬 필요가 있습니다. 이 REDO 작업은 DBMS가 자동적으로 수행하게 됩니다.

 

 

REDO의 구조

데이터의 변경은 Cache에서 이루어집니다. 이 때 REDO에 대한 내역들이 저장될 REDO LOG(=변경 이력 데이터)가 생성됩니다.

여기서 중요한 것은 블록의 데이터가 커밋되지 않은 시점에 변경된다는 것입니다. 여러 DBMS들은 REDO LOG를 커밋 되기 전에 디스크에 기록하는 방식으로 지속성을 구현해냈습니다.

하지만, REDO LOG를 디스크에 기록하는 방식은 성능에 영향을 줄 수 있기 때문에 연동하여 곧바로 디스크에 기록하려고 하지 않습니다.

 

 

REDO의 회복 기법

 


UNDO

  • 트랜잭션을 이전 상태로 되돌리는 것을 의미합니다. (=Rollback)
  • 사용자가 했던 작업을 반대로 진행합니다.

UNDO는 UPDATE, DELETE 혹은 INSERT 등의 트랜잭션 발생한 후, 해당 트랜잭션을 취소하고 싶을 떄 사용합니다.

또는, 장애가 발생하여 해당 트랜잭션을 모두 취소하고 특정한 COMMIT시점으로 다시 되돌아 가는 것을 의미합니다.

 

 

UNDO의 구조

데이터가 변경되면 UNDO 정보가 생성되고, 생성된 UNDO 정보는 UNDO SEGMENT에 보관됩니다. SEGMENT에 보관된다는 점을 보면, UNDO 정보TABLE SPACE 어딘가에 보관된다는 것을 알 수 있습니다. (TABLESPACE에 SEGMENT를 저장할 수 있습니다.)

 

UNDO 정보가 저장되는 TABLE SPACE를 UNDO TABLE SPACE라고 합니다. UNDO TABLE SPACE에는 여러 개의 UNDO SEGMENT가 생성됩니다. UNDO SEGMENT가 트랜잭션과 1대1로 대응되기 때문입니다.

 

UNDO SEGMENT링 버퍼의 구조를 가지고 있습니다. 링 버퍼는 조금 지나면 데이터가 덮어쓰이는 버퍼이지만, 커밋하지 않은 데이터는 덮어써지지 않습니다. 덮어쓰지 못하고 UNDO SEGMENT가 가득하면 UNDO SEGMENT가 커지게 됩니다.

 

 

UNDO의 회복 기법


타임 테이블로 알아보는 REDO와 UNDO

  • T1: CheckPoint 이전에 실행이 완료되었으므로 Failure 되더라도 이미 Disk에 저장이 된 상태이기 때문에 회복하지 않습니다.
  • T2: CheckPoint 이전에 실행된 내용들은 이미 Disk에 반영이 되었으므로, CheckPoint 이후에 내용들만 Redo 합니다.
  • T3: Failure 시점에 해당 트랜잭션이 실행 중이었기 때문에 CheckPoint 시점으로 Undo한 후, 트랜잭션을 재실행 합니다.
  • T4: CheckPoint 이후에 실행되었고, Failure 전에 트랜잭션이 끝났기 때문에 Redo를 수행합니다.
  • T5: CheckPoint 이후에 실행되었고, Failure 시점에 실행중이었으므로 시작지점까지 Undo한 후, 트랜잭션을 재실행합니다.
CheckPoint? (중간 저장)
CheckPoint로 설정한 지점 이전까지는 트랜잭션이 성공적으로 수행되어 Disk에 확실히 저장된 상태를 의미합니다.
CheckPoint를 설정하는 이유는 시스템을 회복하기 위해 되돌아갈 때, 너무 많이 되돌아가지 않기 위해서입니다.
→ 만약 실패가 발생하여 회복할 때 CheckPoint가 설정되어 있다면, Redo는 CheckPoint의 시점부터 Log를 따라가면서 트랜잭션을 다시 수행하지만, Undo는 Log를 따라가지 않고 트랜잭션을 수행합니다.

 

'Database' 카테고리의 다른 글

[DB]SQL 기초  (0) 2024.09.04
[DB]관계 데이터 모델  (0) 2024.09.03
[DB]데이터베이스 시스템  (0) 2024.09.03
[DB]CLOB과 BLOB  (0) 2024.08.28
[DB]내장 SQL와 커서  (0) 2024.08.28