티스토리 뷰
데이터베이스 장애(Failure)란?
-데이터베이스 시스템이 트랜잭션을 실행 하는 도중이 발생하며, 예고없이 급작스럽게 발생합니다.
해당 장애가 발생할 시, 트랜잭션의 ACID 성질을 지원하기 위해 복구를 하는 과정이 필요합니다.
데이터베이스 장애(Failure) 종류
- 트랜잭션 장애
-트랜잭션의 내부 논리 오류로, 사용자의 코드, 시스템 내부 오류에 의하여 발생하는 장애
-'데드락'이 대표적인 트랜잭션 장애 - 시스템 장애
-휘발성 기억 장치인 메모리 내용이 사라지는 경우에 발생하는 장애
-운영체제 오류, 하드웨어 결함이 주 요인임. - 디스크 장애
-비휘발성 장치인 디스크 내용이 사라지는 경우에 발생하는 장애
-하드웨어 및 소프트웨어 결함이 주 요인임.
복구 알고리즘
- 복구 대비 알고리즘
-정상적인 상태에서 시스템 복구를 대비하기 위하여 수행하는 알고리즘.
-현재는 장애가 일어나지않은 정상적인 상태임. - 복구 알고리즘
-연산 수행중 장애가 발생했을 때, 수행하는 알고리즘.
-장애가 일어나 당장 복구를 해야하는 상태임.
Stable storage(안전 저장장치)
-장애가 발생하여도 저장된 내용이 상실되지 않는 가상적인 저장공간입니다.
여러개의 하드디스크에 저장내용을 중복 분산 저장을 함으로써 구현한 저장장치입니다.
장애 복구를 위해 꼭 필요한 저장장치 입니다.
데이터 저장 구조
- 디스크 블록
-시스템의 비휘발성인 디스크에 존재함.
-운영체제에 의해 디스크 블록으로 데이터 접근이 가능합니다.
-영구적으로 저장되며 데이터 버퍼가 접근합니다. - 데이터 버퍼
-시스템의 휘발성인 메모리에 존재함.
-DBMS에 의해 블록 단위로 복사됩니다.
-트랜잭션들이 데이터 버퍼에 있는 데이터를 복사해 사용합니다.
-장애 발생시 데이터 손실 가능합니다. - 트랜잭션 메모리
-시스템의 휘발성인 메모리에 존재함.
- 트랜잭션이 실행되는 공간입니다.
-사용자 영역에 존재하는 공간입니다.
-데이터 버퍼에 접근하여 데이터를 복사하여 사용합니다.
복구 기법
- Log-based 복구 방식
-로그를 기록하는 방식으로, 데이터베이스 변화 발생전 먼저 안전 저장 장치에 변화를 기록하는 방식입니다.
-log를 먼저쓰고 데이터를 고쳐야합니다.
-현재 주로 쓰이는 복구 방식입니다.
- Normal Processing(정상처리)
-정상인 경우, 로그는 Stable Storage에 저장됩니다.
-디스크와 메인 메모리간 데이터이동은 블록단위로 이뤄집니다.
-로그 블록 하나에 다수의 트랜잭션 로그 레코드가 저장됩니다. - CheckPoint(검사점)
-복구를 원활히 하기 위해 CheckPoint를 생성합니다.
-모든 로그 레코드와 페이지를 디스크에 반영합니다. (데이터베이스와 디스크의 상태를 동일하게 만듬)
-CheckPoint 연산이 잘 수행되면 Stable Storage에 저장합니다.
-따라서 CheckPoint 이전의 트랜잭션은 복구연산할 필요가 없습니다. - Recovery(복구)
-redo-list 와 undo-list로 분류합니다.
-redo-list는 트랜잭션은 완료 하였으나, 아직 디스크에 반영되지 않은 것입니다.
-undo-list는 아직 완료 되지않아, 원상복구 해야하는 것 입니다.
- Normal Processing(정상처리)
- Shadowing 복구 방식
-DB를 복사 봍여넣기 하는 방식으로 현재에는 잘 안쓰이는 방식입니다.
-동시 트랜잭션이 많은경우 Shadowing 문제가 발생합니다.
-Editor와 같은 간단한 응용에서 사용되는 기법입니다.
데이터 버퍼관리
Buffer의 역할
- Disk I/O연산을 줄여줌 (Disk 연산은 매우 느린 연산임)
- 데이터 요청이 들어왔을 시, Buffer에 해당 데이터가 있으면 Disk까지 가지않고 빠르게 데이터 넘김.
- DBMS가 원하는 시점에 Disk에 flushing 함으로 추후의 복구기능을 구현할 수 있음 (forced out-put)
Buffer Replacement 정책
-버퍼는 메모리 내부에 가상으로 만든 공간입니다. 즉, 제한된 버퍼 공간에서 무한으로 버퍼를 사용할 수 없습니다.
계속 사용하다 보면 버퍼 내의 공간이 부족할 때 새로운 데이터를 저장하기 위해 공간을 확보해야하므로, 버퍼에서 어떤 데이터를 삭제하여 공간을 확보할지 정하는게 Replacement 정책입니다.
- Least Renectly Used(LRU)
-가장 오랫동안 사용되지 않은 데이터를 버퍼에서 제거하여 버퍼의 공간을 만듭니다.
현제 데이터베이스에서 가장 많이 쓰이는 기법입니다. - Most Recently User(MRU)
-가장 최근에 사용된 데이터를 버퍼에서 제거하여 버퍼의 공간을 만듭니다.
데이터 페이지 버퍼링
-데이터 버퍼에서 Disk I/O 연산을 줄이기위해 개발된 개념으로, 디스크에서 하나하나 직접 데이터를 읽거나 쓰는대신,
메모리의 버퍼에서 하나의 페이지로 데이터를 일시적으로 저장하고 한번에 Disk와 연산을 하는 개념입니다.
페이지를 관리하기 위해선 트랜잭션들끼리 동시접근을 막기 위해 동기화를 해야합니다.
- pinned block 기법
-데이터 버퍼의 동기화에 쓰이는 것으로, 여러 트랜잭션이 데이터 버퍼에 동시에 들어와 시스템 꼬이는걸 막습니다.
동기화를 구현하는 방법엔 latch, lock방식이 있습니다.
- latch
-운영체제가 지원하는 기능으로, 아주 짧은 동안만 lock을 거는 방식입니다. - lock
-DBMS가 지원하는 기능으로, 다수의 lock 모드가 존재하며, latch보다 lock 시간이 깁니다.
- latch
- Dual Paging 문제
-Data Buffer에서 디스크에 저장을 하려고 할때, 동시에 Buffer가 디스크에서 꺼내와야할 데이터가 있는경우입니다.
이같은 경우, 두가지 작업을 동시에 해야하기에 알고리즘을 통해서 해결을 해야하며, 복잡하고 시간이 오래 걸리는 문제입니다. - Slot Page 구조
-페이지 헤더, 레코드로 구성되고, 중간영역은 Free Space로 빈 공간인 구조입니다.
앞에는 페이지 헤더로 구성되어 있고, 뒤에는 레코드로 구성되어 있어, 페이지 헤더에 존재하는 Slot 번호가 뒤의 Record를 가리키는 구조로 되어있습니다. (Slot 번호는 변하지 않음)
Steal / Force 방식
- Steal - commit 되지 않은데이터들도 disk에 업데이트 가능한 방식
- Force - commit 될 때마다 disk에 즉시 update 하는 방식
Steal / Force방식으로 4가지 방식이 가능하지만, 성능을 고려하여 Steal/Not Force 방식이 제일 많이 사용됩니다.
log 기반 Recovery
log 버퍼
-데이터 버퍼와 마찬가지로 메모리에 로그 블록을 따로 만들어 log를 저장하는 블록입니다.
특징은 다음과 같습니다.
- 트랜잭션 commit, log 버퍼가 꽉 찼을때, 사용자 명령 이렇게 3가지 경우에만 disk에 flush됩니다.
- 트랜잭션 commit 되기전에 모든 log가 disk에 먼저 flush되어 저장됩니다.
- log group commit을 하면 다수개의 log를 모아서 한번에 flush 할 수 있습니다.
복구 알고리즘
복구 알고리즘은 Redo단계, Undo단계 크게 두가지로 나뉘어 집니다.
- Redo -> 가장 Check Point 이후 모든 log를 Redo 하는 과정.
이때, 완료된 트랜잭션(commit OR abort)가 있으면 undo-list에 추가함 - Undo -> 전체 트랜잭션에서 undo-list에 있는 것을 다 undo시킴.
이때 undo 작업을 수행할때도 log를 남기게 되는데 이것을 CLR이라고 합니다.
Fuzzy CheckPoint
일반적인 CheckPoint 기술은 Disk에 저장할때 모든 데이터베이스 활동을 일시 중지 시키게 됩니다. 이런 상황에서 데이터베이스 성능이 안좋아 지기에 이 문제를 해결하기 위해 Fuzzy CheckPoint라는 기법이 있습니다.
Fuzzy CheckPoint의 작동 원리는 다음과 같습니다.
- check point 시작될때 현재 버퍼 리스트를 check point 리스트로 간주합니다.
- check point 연산이 진행될때, 데이터베이스 활동을 중단하지않고 계속 진행합니다.
- check point 연산중 새롭게 시작된 연산들은 새로운 버퍼 리스트에 저장합니다.
- check point 연산이 끝나면 새로운 버퍼 리스트를 디스크에 저장합니다.
(만약 중간에 Failure가 발생하면 최근의 checkpoint 지점부터 다시 처리합니다.)
'DB' 카테고리의 다른 글
트랜잭션 Lock (0) | 2023.09.12 |
---|---|
데이터베이스 CLI 명령어 (MYSQL 버전) (0) | 2023.09.02 |
정규화, 반정규화 (0) | 2023.08.25 |
데이터모델링의 이해 (0) | 2023.08.25 |
인덱스(Index) (0) | 2023.08.14 |