[Database] 회복기법

[Database] 회복기법

UNDO & REDO

UNDO(원 상태로 돌리다)

  • 복구 방법
    • 사용자가 했던 작업을 반대로 진행합니다.
  • 만약 해당 트랜잭션이 어떤 이유든 정상적으로 종료될 수 없게 되면, 즉, 데이터베이스의 내용 자체는 손상되지 않았지만 변경 중이거나 변경된 내용에 대한 신뢰성을 잃어버린 경우에 트랜잭션이 변경한 페이지들은 원상 복구되어야 합니다.
    이러한 복구를 UNDO라고 하며 로그를 이용하여 모든 변경을 취소시키는 방법입니다.
    이를 통해 트랜잭션의 원자성을 제공합니다.
  • UNDO 데이터의 기록
    • INSERT 시, insert된 로우의 rowid 기록
    • UPDATE 시, 바뀐 컬럼의 바뀌기 전 값 기록
    • DELETE 시, 지워진 모든 데이터 기록

REDO(다시 하다)

  • 복구의 역할
  • 서버에서 어떤 역할을 하든지 모두 REDO에 기록이 됨니다.(UNDO포함)
  • 복구 방법
    • 사용자가 했던 작업을 그대로 다시 함
  • 데이터베이스 내용 자체가 손상이 된 경우에 가장 최근에 복제본을 적재시킨 뒤 복제혼 이후에 일어난 변경만을 로그를 이용하여 재실행함으로써 데이터베이스를 복원하는 것
    이를 통해 트랜잭션의 영속성을 제공합니다.

복구는 UNDO를 통해서 복구를 하게 됩니다. 즉 ROLLBACK을 한다는 말입니다. 시스템 장애가 발생하게 되면 UNDO데이터도 모두 날아갑니다. 결국 시스템 장애시 REDO 데이터를 이용해서 마지막 CHECK POINT부터 장애까지의 DB BUFFER CACHE를 복구하게 됩니다. 이게 완료가 되면 UNDO를 이용하여 COMMIT되지 않은 데이터를 모두 ROLLABCK함으로써 복구를 완료하게 됩니다. 결국 REDO가 UNDO를 복구하고 최종적으로 UNDO가 복구를 하게 됩니다.


지연갱신 회복 기법 & 즉시갱신 회복 기법

지연갱신 회복 기법

  • 트랜잭션이 부분 완료 상태에 이르기까지 발생한 모든 변경내용을 로그 파일에만 저장하고 데이터베이스에는 커밋이 발생할 때까지 저장을 지연하는 기법입니다.
  • 회복 과정에서 UNDO가 필요 없다는 점이 특징이며 이를 통해 트랜잭션의 원자성을 보장할 수 있습니다.

즉시갱신 회복 기법

  • 트랜잭션 수행 도중 데이터를 변경하면 변경 정보를 로그 파일에 저장하고, 트랜잭션이 부분 완료되기 전이라도 모든 변경 내용을 즉시 데이터베이스에 반영하는 기법입니다.
  • 트랜잭션 완료 이전에 수행한 갱신 연산은 미 완료 갱신이라 하며 회복 시 로그 파일을 참조하여 REDO와 UNDO 연산을 모두 실행해야 합니다.


Checkpoint 회복 기법

  • Checkpoint 회복기법은 이전은 신경쓰지 않고 Checkpoint 이후만 즉시 갱신 또는 지연갱신을 수행합니다.
  • 즉, 가장 최근 checkpoint 지점을 찾아 그 시점 이후의 로그만을 회복 대상으로 합니다.
  • 회복 시 로그 파일의 정보를 모두 검사해야 하고, 이미 반영된 변경에 대해서 불필요한 REDO 연산을 수행해야 하는 로그 기반 회복 기법의 문제점을 해결 할 수 있습니다.



그림자 페이징(Shadow Paging) 회복 기법

  • 트랜잭션이 실행되는 동안 현재 페이지 테이블과 그림자 페이지 테이블 2개의 페이지 테이블을 유지하고 관리하는 회복 기법입니다.
  • 데이터베이스를 일정 크기의 블록인 페이지 단위로 유지하고, 로그를 기록하지 않습니다.
  • 그림자 페이징 회복 기법의 장점은 로그 레코드를 유지할 필요가 없으며 장애 이후 회복 처리가 불필요 합니다.



미디어 회복 기법

  • 디스크와 같이 비휘발성 저장 장치의 내용이 손상되는 장애가 발생했을 시에 회복을 위한 기법이며 백업, 미러링, RAID등을 이용해 복구할 수 있습니다.
  • 데이터베이스의 전체 내용을 안전한 저장소에 복사(덤프)하기 때문에 대량의 데이터 전송이 필요하며 데이터 전송 도중 트랜잭션 중지로 CPU의 낭비가 발생할 수 있습니다.


출처

댓글

이 블로그의 인기 게시물

[Python] # -*- coding: utf-8 -*-를 쓰는 이유

[소프트웨어공학] NS(Nassi-Schneiderman) 차트

[컴퓨터네트워크] Telnet이란?