트랜잭션 - 2

초보개발·2022년 3월 25일
0

Database

목록 보기
7/10
post-custom-banner

장애와 회복

데이터베이스를 모순 없는 일관된 상태로 유지하기 위해 데이터베이스 관리 시스템은 회복 기능을 제공한다. 회복은 장애가 발생했을 시, 데이터베이스를 장애가 발생하기 전의 일관된 상태로 복구시키는 것을 말한다.

장애의 유형

시스템이 제대로 동작하지 않는 상태를 장애라고 한다. 데이터베이스 시스템에서 발생할 수 있는 장애는 트랜잭션 장애, 시스템 장애, 미디어 장애 세 가지로 나눌 수 있다.

  • 트랜잭션 장애: 트랜잭션 수행 중 오류가 발생해 정상적으로 수행을 계속할 수 없는 상태
  • 시스템 장애: 하드웨어 결함으로 정상적으로 수행할 수 없는 상태
  • 미디어 장애: 디스크 장치의 결함으로 디스크에 저장된 데이터베이스가 손상된 상태

데이터베이스의 저장 연산

데이터베이스는 디스크에 저장되어 있어 트랜잭션이 데이터베이스의 데이터를 처리하려면 디스크에서 메인 메모리로 가져와 처리 후, 다시 디스크로 보내는 작업이 필요하다.

디스크와 메인 메모리 간의 데이터 이동은 블록 단위로 수행된다. 디스크에 있는 블록을 디스크 블록이라 하고, 메인 메모리에 있는 블록은 버퍼 블록이라고 한다.

  • input(x): 디스크 블록에 저장되어 있는 데이터 x를 메인 메모리 버퍼 블록으로 이동시키는 연산
  • output(x): 메인 메모리 버퍼 블록에 있는 데이터 x를 디스크 블록으로 이동시키는 연산

사용자의 요구에 따라 응용 프로그램에서 트랜잭션의 수행시 버퍼 블록에 있는 데이터를 프로그램의 변수로 가져오고 데이터 처리 결과를 버퍼 블록으로 옮기는 작업도 필요하다.

  • read(x): 버퍼 블록에 저장되어 있는 데이터 x를 프로그램의 변수로 읽어오는 연산
  • write(x): 프로그램의 변수 값을 메인 메모리 버퍼 블록에 있는 데이터 x에 기록하는 연산

회복 기법

회복은 데이터베이스에 장애가 발생했을 때 장애가 발생하기 전의 모순이 없는 일관된 상태로 복구시키는 것이다. DBMS의 회복 관리자는 장애 발생을 탐지하고 장애가 탐지될 경우 데이터베이스 복구 기능을 제공한다. 데이터베이스 복구할 동안에는 업무 처리를 할 수 없기 때문에 빠른 회복 작업이 요구된다.

회복을 위한 연산

데이터를 별도의 장소에 미리 복사해두고 장애로 문제가 발생했을 때 복사본을 이용해 원래의 상태로 복원하는 것이 회복이다. 덤프, 로그 방법을 사용해 데이터를 복사해두었다가 회복시킬 때 복사본으로 사용한다.

  • 덤프: 데이터베이스 전체를 다른 저장 장치에 주기적으로 복사하는 방법
  • 로그: 데이터베이스에서 변경 연산이 실행될 때마다 데이터를 변경하기 이전 값과 변경한 이후의 값을 별도의 파일에 기록하는 방법

장애가 발생했을 때, 덤프나 로그를 이용해 데이터베이스를 복구하는 가장 기본적인 방법은 redo나 undo 연산을 실행하는 것이다.

  • redo(재실행): 가장 최근에 저장한 디비 복사본을 가져오고 로그를 이용해 복사본이 만들어진 이후에 실행된 모든 변경 연산을 재실행하여 장애가 발생하기 직전의 디비 상태로 복구
    • 전반적으로 손상된 경우
  • undo(취소): 로그를 이용해 지금까지 실행된 모든 변경 연산을 취소하여 디비를 원래의 상태로 복구
    • 변경 중이었거나 이미 변경된 내용만 신뢰성을 잃은 경우

로그 회복 기법

1. 즉시 갱신 회복 기법

즉시 갱신 회복 기법은 트랜잭션 수행 중에 데이터를 변경한 연산의 결과를 데이터베이스에 즉시 반영한다.
장애 발생 대비를 위해 데이터 변경에 대한 내용을 로그 파일에도 기록한다. 데이터베이스 회복시 로그를 정상적으로 사용하려면 트랜잭션에서 데이터 변경 연산이 실행되었을 때 로그에 먼저 기록 후 데이터베이스에 변경 연산을 반영해야 한다.

  • undo 연산 실행: 로그에 <TiT_i, startstart>는 존재하지만 <TiT_i, commitcommit> 레코드는 없을 경우
  • redo 연산 실행: 로그에 <TiT_i, startstart>와 <TiT_i, commitcommit> 레코드가 모두 존재하는 경우

2. 지연 갱신 회복 기법

지연 갱신 회복 기법은 트랜잭션이 수행되는 동안에는 데이터 변경 연산의 결과를 데이터베이스에 즉시 반영하지 않고 로그 파일에만 기록해 두었다가, 트랜잭션이 부분 완료된 후에 로그에 기록된 내용을 데이터베이스에 한꺼번에 반영한다.
트랜잭션이 수행되는 동안 장애가 발생할 경우 로그에 기록된 내용만 삭제하면 된다. 따라서 undo 연산은 없고 redo 연산만 필요하므로 로그 레코드에 변경 이전 값을 기록할 필요가 없다.

  • 로그 내용을 무시하고 버림: 로그에 <TiT_i, startstart>는 존재하지만 <TiT_i, commitcommit> 레코드는 없을 경우
  • redo 연산 실행: 로그에 <TiT_i, startstart>와 <TiT_i, commitcommit> 레코드가 모두 존재하는 경우

검사 시점 회복 기법

검사 시점 회복 기법은 로그 기록을 이용하지만 일정 시간 간격으로 검사 시점(checkpoint)를 만들어둔다. 장애가 발생하면 가장 최근 검사 시점 이전의 트랜잭션에는 회복 작업을 수행하지 않고 이후의 트랜잭션에만 회복 작업을 수행한다.
회복 작업의 범위가 checkpoint로 정해지므로 불필요한 회복 작업을 수행하지 않아 데이터베이스 회복 시간이 단축된다는 장점이 있다.

미디어 회복 기법

디스크에 발생할 수 있는 장애에 대비한 회복 기법이다. 미디어 회복 기법은 전체 데이터베이스를 다른 저장 장치에 복사하기 때문에 비용이 많이 들고 복사하는 동안, 트랜잭션을 수행 중단해야하므로 CPU가 낭비된다는 단점이 있다.

post-custom-banner

0개의 댓글