데이터베이스

14. 데이터베이스의 회복(Recovery)과 병행제어

코카(Coca) 2018. 4. 10. 13:50

1. 회복(Recovery)

1)회복의 정의 

데이터베이스는 여러가지 요인으로 인해 데이터에 모순이 생기는 등 손상을 입는 경우가 있습니다. 이런 상황이 발생하면 DBMS에 있는 회복 관리자(recovery manager)를 통하여 데이터베이스가 손상되기 이전인 상태로 복구하는 작업을 하는데, 이것을 회복이라고 부릅니다. 회복은 대부분 로그 파일에 기록된 로그 정보를 이용해서 수행합니다. 데이터베이스의 회복이 이루어지는 동안에는 데이터베이스에 접근하여 업무를 처리할 수 없으므로 이 작업은 빠른 시간 내에 이루어져야 합니다.

로그(Log): 운영체제나 소프트웨어가 실행 중에 발생하는 이벤트나 각기 다른 사용자의 통신 소프트웨어 간의 메시지를 기록한 내역입니다. 여기서 데이터베이스에 쓰이는 로그를 트랜잭션 로그라고 하는데, 이는 데이터베이스에서 충돌이나 하드웨어 고장이 있었다고 해도 DBMS의 ACID특성을 보장하기 위해서 트랜잭션이 수행되어 데이터가 변경된 이력을 기록한 것입니다. 이런 로그 정보를 담은 파일을 로그 파일(Log File)이라 합니다.

 


 

2) 회복 기법

 - 즉시 갱신(Immediate Update) 기법: 트랜잭션 수행 중에 데이터를 변경한 연산의 결과를 데이터베이스에 즉시 반영하며, 장애 발생에 대비하기 위해 데이터 변경 사항을 로그 파일에도 기록합니다. 만일 장애가 발생하면 해당 로그의 내용을 토대로 회복 작업을 수행합니다.

 - 지연 갱신(Deferred Update) 기법: 트랜잭션의 수행 중에 데이터가 변경되어도 데이터베이스에 반영하지 않고 로그 파일에만 기록해두었다가, 부분 완료가 되면 로그에 기록된 내용을 통해 데이터베이스에 한꺼번에 반영하는 방법입니다. 트랜잭션이 수행 중 장애가 발생해도 데이터베이스에 반영된 것이 아니므로 데이터베이스는 그대로 유지되며, 로그에 기록된 내용은 파기됩니다.

 - 검사 시점(Check Point) 기법: 트랜잭션이 실행되는 중간에 일정 시간 간격으로 검사 시점(checkpoint)을 만들어두고, 해당 검사 시점까지 수행 및 완료된 내용을 데이터베이스에 적용시킵니다. 만일 장애가 발생하면 가장 최근 검사 시점 이전의 트랜잭션에는 회복 작업을 수행하지 않고, 이후의 트랜잭션에만 회복 작업을 수행합니다.

 - 그림자 페이징(Shadow Paging) 기법: 로그를 사용하지 않고선 데이터베이스를 동일한 크기의 단위인 페이지로 나눈 뒤, 각 페이지마다 복사하여 그림자 페이지를 보관하는 기법입니다. 데이터베이스의 변경되는 내용은 원본 페이지만 적용되고, 장애가 발생되면 그림자 페이지를 이용하여 회복합니다.

 


2. 병행 제어(Concurrenct Control)

1) 병행 제어란?

DBMS는 병행 수행(concurrency)기능을 지원하여 여러 개의 트랜잭션이 동시에 수행할 수 있게 만들며, 여러 사용자가 데이터베이스를 동시에 공유할 수 있도록 만들어줍니다. 병행 수행은 여러 트랜잭션들이 차례로 번갈아 수행되는 인터리빙(interleaving) 방식으로 진행되는데, 트랜잭션들이 동시에 같은 데이터에 접근하여 연산을 수행하는 경우 데이터의 모순, 갱신 분실, 연쇄 복귀 등의 문제가 생길 수 있습니다. 이러한 문제를 해결하기 위해 트랜잭션의 수행을 제어하는 것이 병행 제어입니다. 병행 제어는 동시성 제어라고도 부릅니다.

[참고] 병행 수행과 병행 제어 (데이터베이스 개론, 2013. 6. 30., 한빛아카데미(주))

 

 


2) 병행 제어 기법: 로킹(Locking)

  로킹은 병행 제어의 대표적인 기법입니다. 병행 수행도중 하나의 트랜잭션이 사용하는 데이터에 자물쇠를 걸어 다른 트랜잭션이 접근할 수 없게 만들어, 트랜잭션이 마무리 될때까지 독점해서 사용하도록 만드는 방법입니다. LOCK 명령어를 통해 독점권을 획득하고, 트랜잭션이 실행된 뒤 완료되면 UNLOCK명령어로 독점권을 해체하여 다른 트랜잭션이 데이터를 사용할 수 있게 만듭니다.

 로킹은 병행 수행에서 일어나는 위험성을 방지하지만, 하나의 데이터를 공유하는 다른 트랜잭션의 연산을 지연시키게 됩니다. 따라서 필요한 부분만 LOCK을 설정하는 것이 바람직합니다. 예를들어 2개의 트랜잭션이 동일한 데이터에게 'read연산→트랜잭션 연산→해당 데이터에게 write로 갱신' 작업을 하는 경우에는 모순이 생길 수 있어서 먼저 연산을 수행하는 트랜잭션이 read와 write 모두 LOCK을 거는것이 바람직합니다.

 하지만 2개의 트랜잭션이 모두 데이터를 단순히 읽어오기만 하는 read 연산만 한다면, 한 트랜잭션이 실행될 때 다른 트랜잭션도 데이터에 접근해서 연산을 수행해도 문제가 생기지는 않습니다. 이런 경우에는 쓰기는 허용하지 않되, 읽기는 허용하여 성능을 높일 수 있습니다.

 이렇게 로킹은 용도에 따라 공유 락배타 락으로 구분할 수 있습니다.

 

- 공유 락(Shared Lock): LOCK을 설정한 데이터에 대해 read만 허용하고, write는 불허하는 방법

 

 

- 배타적 락(Exclusive Lock): LOCK을 설정한 데이터에 대해 read과 write모두 불허하는 방법

 

 

2-1) 로킹 단위(Locking Granularity)

로킹 단위는 LOCK을 설정하는 대상의 범위입니다. 이 단위는 속성, 튜플, 테이블, 전체 데이터베이스 등 다양한 범위로 설정이 가능합니다. 여기서 로킹의 단위가 크면 제어 기법을 구현하기 편리하지만 병행성 수준이 떨어집니다. 반대로 로킹 단위가 작으면 제어 기법을 구현하기 복잡하지만 병행성의 수준이 높아집니다.

 

 

2-2) 2단계 로킹 프로토콜(Two Phase Locking Protocol)

확장 단계축소 단계라는 2개의 단계로 구성된 로킹 기법입니다. 이 기업은 트랜잭션 스케줄의 직렬성을 보장해주지만, 교착 상태(deadlock)가 발생할 수 있다는 단점이 있습니다.

 

- 확장 단계(Growing Phase): 트랜잭션들이 LOCK연산만 수행할 수 있고, UNLOCK이 불가능합니다.

- 축소 단계(Shrinking Phase): 트랜잭션들이 UNLOCK연산만 수행할 수 있고, LOCK이 불가능합니다.

 

 


3) 타임 스탬프 순서기법

 시스템에 들어오는 트랜잭션의 순서대로 고유번호인 타임 스탬프를 부여하고, 이 타임 스탬프의 순서에 따라 데이터에 접근하여 실행하는 기법입니다. 타임 스탬프 기법은 정해진 순서에 따라 실행되므로 교착상태가 발생하지 않습니다.