회복

이한수·2022년 3월 13일
0

DataBase

목록 보기
3/5

개인 공부 정리 목적입니다. 잘못된 부분이 있을경우 알려주시면 감사하겠습니다.
참고 : 데이터베이스 개론

먼저 회복과 병행제어 관련 정리하기 전에 트랜잭션이란 무엇인지 간단히 짚고 넘어가려고 한다.

데이터 베이스는 다수의 사용자에 의해 동시 사용되므로 ,
일관성있는 데이터를 유지해야 하며, 문제가 발생해도 재빠르게 원래 상태로 복구가 되어야한다.

트랜잭션?

작업 하나를 수행하는 데 필요한 데이터베이스의 연산들을 모아놓은 것으로써 , 논리적인 작업 단위를 의미한다.
또한 , 장애가 발생했을 때 복구하는 작업 단위이기도 하다.

트랜잭션 특성

1) 원자성(atomicity)

트랜잭션을 구성하는 연산들이 모두 정상적으로 실행되거나 하나도 실행되지 않아야 한다는 방식.
간단히 말해 , 트랜잭션이 다 수행되기전에 에러가 발생하면 그 트랜잭션은 무효처리 시켜버리는 것이다.

2) 일관성(consistency)

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

3)격리성(isolation)

트랜잭션이 완료될 때까지 트랜잭션이 생성한 중간 연산 결과에 다른 트랜잭션들이 접근할 수 없음을 말한다.

4)지속성

트랜잭션이 성공적으로 온료된 후에 데이터베이스에 반영된 결과는 영구적이어야 한다.

트랜잭션 연산??
commit : 트랜잭션이 성공적으로 수행되었음을 선언 , 즉 DB에 반영.
rollback : 트랜잭션 수행이 실패했음을 선언 , 이때 트랜잭션이 취소되고 수행되기전 상태로 되돌린다.

여기까지 트랜잭션에 대한 것은 간단히 정리하고 ,
이 중요하다는 트랜잭션을 데이터베이스 관리 시스템은 어떻게 관리해주고 , 처리해주는지 알아보자.

장애?

시스템이 제대로 동작하지 않는 상태를 장애라고 한다.
원인으로는 굉장히 다양한데,종류는 아래를 보자

1)트랜잭션 장애

앞서 살펴봤던 트랜잭션 수행 중 오류가 발생되어 정상적 수행이 불가능한 상태.
트랜잭션의 논리적 오류 , 잘못된 데이터 입력 , 시스템 자원의 과다요구등이 있다.

2)시스템 장애

하드웨어 결함으로 수행 불가할때.
하드웨어 이상으로 메인 메모리에 저장된 정보가 손실되거나 교착상태가 발생한 경우가 있다.

3)미디어 장애

디스크 장치의 결함으로 인해 디스크에 저장된 데이터베이스의 일부 혹은 전체가 손상된 상태.

트랜잭션 수행 과정

기본적으로 데이터베이스는 저장 장치에 저장한다.
(일반적으로 비휘발성 저장 장치인 디스크에 상주)
이때 , 트랜잭션이 처리되기 위해 디스크에서 메인 메모리로 가져와야 읽어서 수행할 수 있기 때문에 먼저 디스크의 데이터를 메인메모리로 가져올 필요가 있다.

참고 : 디스크와 메인 메모리 사이에서 데이터 이동은 "블럭" 단위로
수행된다.

input(data) : 디스크 블록 -> 메인 메모리 버퍼블록으로 이동.

output(data) : 메인 메모리 버퍼블록 -> 디스크 블록으로 이동.

위 연산은 보다시피 디스크와 메인메모리에서의 필요한 연산들이다.
여기서 끝이 아니다.
메인 메모리의 데이터를 프로그램의 변수로 불러와 처리하고 다시 메인메모리로 돌려주는 과정이 필요하다.

read(data) : 메인 메모리 버퍼블록 -> 프로그램의 변수

wrtie(data) : 프로그램의 변수 -> 메인 메모리 버퍼블록

즉 수행 과정은 input -> read -> 처리 -> write -> output이 된다.

회복이란

데이터 베이스에 장애가 발생했을 때 장애가 발생하기 저의 상태로 복구시키는 것을 말한다.
이는 DBMS의 "회복 관리자"가 담당한다.
DB를 복구하는 동안 DB에 접근이 불가하므로 회복은 빠른 시간 내에 이루어 져야 한다.

회복 할때 사용할 복사본 만드는 방법으로는 ,

덤프(dump) : 데이터 베이스 전체를 다른 저장 장치에 주기적으로 복사.

로그(log) : 데이터베이스에서 변경 연산이 실행될 때마다 변경 전값과 이후 값을 별도 파일에 기록.

위 방법으로 만들어진 복사본을 이용하여 복구하기 위한 연산은

redo(재실행) : 복사본을 가져온 후 로그를 이용하여 복사본 생성 시점 이후에 실행된 모든 변경연산을 재실행한다(전반적으로 손상된 경우 사용)

undo(취소) : 로그를 이용해 지금까지 실행된 모든 연산을 취소하여 데이터 베이스를 원래 상태로 복구(변경중이었거나 이미 변경된 내용만 신뢰성을 잃은 경우 사용)

그럼 로그파일은 어떻게 생겼을까
이 로그 파일은 회복을 위한 중요 정보를 가지고 있으므로 데이터 손실이 발생하지 않는 저장 장치에 저장해둔다.

1.<T,start> : 트랜잭션 T의 수행시작을 기록
2.<T,X,old_value , new_value> : T가 x데이터를 이전값에서 새로운 값으로 변경연산을 수행했음을 기록
3.<T,commit> : T가 성공적으로 완료됨을 기록
4.<T,abort> : T가 철회되었음을 기록.

순서를 의미하는 것이아니라 로그파일은 위와같은 레코드들로 구성된다고 이해하면 된다.

회복 기법

redo와 undo연산은 아래와 같은 회복기법들에서 DBMS가 사용한다.

1)로그 회복 기법

로그를 이용한 회복 기법은 연산 결과를 DB에 반영하는 시점에 따라 즉시 갱신 회복 기법과 지연 갱신 회복 기법으로 나뉜다.

  • 즉시 갱신 회복 기법

트랜잭션 수행 중 변경한 연산 결과를 write연산으로 즉시 DB에 반영.
그와 동시에 로그에도 기록한다.

장애가 발생하였을 경우 그 시점에 따라 사용되는 연산이 달라진다.
로그파일에 start레코드는 있으나 commit레코드가 었을때 undo연산

start레코드와 commit레코드 모두가 존재할때는 redo연산을 한다.

  • 지연 갱신 회복 기법

즉시 갱신과 달리 변경 연산이 수행결과를 바로 DB에 반영하지 않고 COMMIT을 만났을때 반영한다.
즉 , 수행 도중 장애가 발생하면 고르에 기록된 내용을 버리기만 하면 되므로 , undo연산이 필요치 않고 로그파일 내부 레코드 또한 ,
<T,X,old_value , new_value> -> <T,X,new_value>
형태로 기록 된다.

redo 연산을 수행하는 때는 즉시 갱신과 같다.

2)검사 시점 회복 기법

로그를 이용한 회복 기법은 로그 전체를 분석하여 로그에 기록된 모든 트랜잭션을 대상으로 redo나 undo 연산을 결정해야 한다.

이 과정에서 전체를 대상으로 적용하면 시간이 오래 걸리고 ,
redo연산이 필요없는 트랜잭션에도 redo연산을 실행하는 일이 생기므로 비효율적이다.

검사 시점 회복 방식은 위의 비효율성을 해결하기 위해 제안된 방법으로, 로그 회복 기법 처럼 로그 기록을 이용하되 , 일정 시간 간격으로 검사 시점을 만들어 둔다.
그리고 장애가 발생하면 가장 최근 검사 시점 이후의 트랜잭션만 회복 작업을 한다.

3) 미디어 회복 기법

데이터 베이스는 디스크에 저장된다.
휘발성 저장 장치인 메인 메모리보다 장애가 드물게 발생하지만 , 디스크 헤더의 고장 등으로 발생할 우려가 있다.

디스크에 발생할 수 있는 장애에 대비한 기법으로써 , 전체 DB를 일정 주기마다 다른 안전한 저장 장치에 복사해두는 덤프를 사용한다.

그런 다음 장애가 발생하면 , 가장 최근에 복사해둔 것을 가져와 복구하고 , 필요에 따라 로그의 내용을 토대로 redo연산을 수행한다.

단 , 전체를 복사하므로 비용이 크고 , 회복 시간이 길어 다른 트랜잭션이 수행을 그동안 못하므로 cpu낭비가 크다는 단점이 있다.

profile
성실하게

0개의 댓글