장애의 유형
데이터베이스에 장애가 발생해도 DBMS의 회복 기능을 통해 데이터베이스는 정확하고 일관된 상태로 유지 할 수 있다. 장애가 발생하는 원인은 정전, 사용자의 실수, 하드웨어 고장, 소프트웨어 오류, 미디어 장치 고장, 트랜잭션 논리적 오류 등 매우 다양하다.
데이터베이스 저장 연산
데이터베이스는 비휘발성 저장 장치인 디스크에 저장되어 있다. 응용 프로그램에서 트랜잭션 수행을 지시하면 디스크에서 메인 메모리로 데이터를 보내고 데이터를 다시 디스크로 보내는 작업이 필요하다. 디스크와 메인 메모리 간의 데이터 이동은 블록(block) 단위로 이동하며 디스크에 있는 블록을 디스크 블록, 메인 메모리에 있는 블록을 버퍼 블록이라 한다.
디스크와 메모리 간의 데이터 이동은 다음 두 연산으로 수행된다.
- input(X) : 디스크 블록에 저장되어 있는 데이터 X를 메인 메모리 버퍼 블록으로 이동시키는 연산
- output(X) : 메인 메모리 버퍼 블록에 있는 데이터 X를 디스크 블록으로 이동시키는 연산
메인 메모리의 버퍼 블록과 프로그램 변수 간의 데이터 이동은 다음 두 연산으로 수행된다.
- read(X) : 메인 메모리 버퍼 블록에 저장되어 있는 데이터 X를 프로그램의 변수로 읽어로는 연산
- write(X) : 프로그램 변수 값을 메인 메모리 버퍼 블록에 있는 데이터 X에 기록하는 연산
응용 프로그램에서 트랜잭션 수행을 지시하면 read(X) 연산으로 처리할 데이터를 가져온다. 이때 디스크에 저장된 데이터를 메인 메모리 버퍼 블록으로 가져와야하므로 내부적으로 input(X) 연산이 실행된다. read(X) 연산이 실행되어 데이터가 프로그램 변수에 저장되면 트랜잭션의 모든 연산은 프로그램 변수를 대상으로 처리된다. 그 후 write(X) 연산이 실행 된 후 output(X) 연산이 실행되어 결과 값이 디스크에 있는 데이터베이스로 전달된다.
트랜잭션에 데이터 이동 연산을 추가해 표현하면 아래와 같이 표현된다.
회복
회복의 핵심 원리는 데이터베이스의 데이터를 백업, 복사본을 만드는 것이다. 복사본을 만드는 방법에는 덤프와 로그 두 방식이 있다. 덤프는 데이터베이스 전체를 다른 저장 장치에 주기적으로 복사하는 방법이다. 그리고 로그는 데이터의 변경 기록만을 별도의 파일(로그 파일)에다 저장하는 방법이다. 트랜잭션이 수행되면서 로그 파일에 로그 레코드가 기록된다. 로그 레코드는 아래의 네 종류로 구분된다.
트랜잭션이 수행도중 아래와 같이 로그파일에 로그레코드가 기록된다.
회복 연산
장애가 발생했을 때 회복 연산인 redo와 undo가 사용된다. redo와 undo 연산을 수행하는데 로그 파일이 중요하게 사용된다.
- redo(재실행) : 완료 상태의 트랜잭션의 모든 변경 연산을 재실행해 트랜잭션의 수행 결과를 데이터베이스에 반영
- undo(취소) : 완료 상태가 아닌 트랜잭션의 모든 변경 연산을 취소하고 데이터베이스를 트랜잭션 수행 전 상태로 되돌림
데이터베이스 회복 기법
데이터베이스 회복 기법은 로그 회복 기법, 검사 시점 회복 기법, 미디어 회복 기법 등 여러 기법으로 나뉘며 그 중 로그 회복 기법을 일반적으로 사용한다. 회복 연산인 redo와 undo는 회복 기법에서 주요 연산으로 사용된다.
- 로그 회복 기법 : 로그 회복 기법은 트랜잭션의 데이터 변경 연산 결과를 언제 데이터베이스에 반영하는지에 따라 즉시 갱신 기법과 지연 갱신 기법으로 나뉜다.
- 즉시 갱신 회복 기법 : 트랜잭션 수행 중 데이터 변경 연산 결과를 데이터베이스에 즉시 반영한다. 트랜잭션에서 데이터 변경 연산이 실행되면 로그 파일에 로그 레코드를 먼저 기록한 후 데이터베이스에 변경 연산 결과를 반영한다. 즉시 갱신 회복 기법은 장애가 발생하면 아래의 기준에 따라 트랜잭션에 undo 연산 또는 redo 연산을 실행한다. undo 연산을 실행할 트랜잭션이 여러 개인 경우 로그에 기록된 순서의 반대로 undo 연산이 실행되며 redo 연산을 실행할 트랜잭션이 여러 개인 경우 로그 기록 순서대로 redo 연산이 실행된다.
- 지연 갱신 회복 기법 : 트랜잭션 수행되는 동안에는 데이터 변경 연산 결과를 로그 파일에만 기록해두었다가 commit 이후에만 데이터베이스 반영한다. 따라서 장애 발생 시 아직 완료가 되지 않은 트랜잭션에 undo 연산을 할 필요없이 로그에 기록된 내용을 버리기만 하면 되므로 redo 연산만 사용된다. 또한 undo 연산을 하지 않아 로그 레코드에 이전 값을 기록할 필요가 없으므로 변경 연산에 대한 로그 레코드는 <Ti,X,newValue> 형식으로 기록된다. 지연 갱신 회복 기법은 장애가 발생하면 아래의 기준에 따라 트랜잭션에 redo 연산을 수행한다.
- 검사 시점 회복 기법 : 로그 파일 전체를 보고 redo 연산과 undo 연산을 수행하면 회복 시간이 너무 오래 걸린다. 따라서 회복에 사용될 로그 기록의 범위를 정할 필요가 있다. 검사 시점 회복 기법은 로그 회복 기법을 이용하되 일정 시간 간격으로 검사 시점(checkpoint)를 만들고 검사 시점 이전의 로그는 회복에 이용되지 않음으로써 회복 시간을 단축시킨다.
- 미디어 회복 기법 : 데이터베이스가 저장되어 있는 비휘발성 메모리에 장애가 발생할경우 미디어 회복 기법을 사용한다. 미디어 회복 기법은 데이터베이스의 복사본인 덤프 파일을 사용해 데이터베이스를 복구한 후 필요에 따라 로그 파일을 토대로 redo 연산을 실행한다.
'Computer Science > DataBase' 카테고리의 다른 글
MySQL Join (0) | 2023.11.16 |
---|---|
[데이터베이스 - 9] 병행 제어 (0) | 2022.10.14 |
[데이터베이스 - 7] 트랜잭션 (0) | 2022.10.11 |
[데이터베이스 - 6] SQL (0) | 2022.09.29 |
[데이터베이스 - 5] 관계 데이터 모델 (0) | 2022.09.29 |