by axiom Redo Log Buffer Redo Log File Log Switch [2014.02.13]
데이터베이스 아키텍처를 분석하고 학습하다 보면 항상 데이터베이스 내부 구조에 대한 호기심이 생기게 마련이다. 이와 같은 데이터베이스 내부 아키텍처는 실제 업무를 수행하는 데 큰 도움이 되지는 않을 수 있다고 생각한다.
하지만 데이터베이스 내부 아키텍처를 이해하는 순간 데이터베이스에 문제가 발생하는 경우 정확한 그리고 논리적인 분석이 가능해진다. 그렇기 때문에 데이터베이스를 확실하게 분석하기 위해서는 데이터베이스 Internal은 반드시 이해하는 것이 유리하다.
이번 강좌에는 데이터베이스의 복구 및 데이터 정합성을 책임지는 Redo Log Buffer와 Redo Log File에 대해 확인해 보자.
데이터베이스의 복구를 책임지는 Log는 Redo Log Buffer와 Redo Log File로 구성된다. [그림 1]은 Log 관리를 위한 Redo Log Buffer와 Redo Log File에 대한 내용이다.
이는 DML을 수행하기 위해 Write-Ahead Logging 기법을 사용하게 되며 이와 같이 Write-Ahead Logging 기법 에 의해 발생한 로그를 Redo Log File에 바로 기록하게 되면 성능이 저하되므로 Redo Log Buffer라는 메모리 공간에 저장하게 된다.
물론 Redo Log Buffer에 저장된 로그는 추후 Redo Log File에 저장되어 디스크에 저장된다. 이는 메모리의 크기는 유한하며 휘발성이기 때문에 계속적인 보관을 위해서는 디스크 파일에 저장하는 것은 당연한 일이다.
Redo Log Buffer는 [표 1]과 같은 구성 요소를 가진다.
구성 요소 | 내용 |
---|---|
Log Buffer Guard Page | Redo Log Buffer의 Corruption을 방지하기 위해 존재 (4K 또는 8K) |
LOG_BUFFER | Log Buffer의 크기를 설정하는 파라미터 |
STATUS | Log Buffer의 사용 유무를 관리 |
Log Buffer Guard Page의 경우에는 Redo Log Buffer가 Corruption되는 경우를 방지하기 위해 사용하게 된다. 이와 같은 Log Buffer Guard Page는 크기가 4K 또는 8K를 차지하게 되며 이는 Show SGA를 통해 확인될 수 있다.
Redo Log Buffer의 크기는 LOG_BUFFER 파라미터를 이용해 설정할 수 있다.
STATUS의 경우에는 ACTIVE와 INACTIVE로 구별된다. 데이터베이스를 오픈하게 되면 Redo Log Buffer는 OS의 블록 크기로 구분된다. Redo Log Buffer의 내용은 OS의 Redo Log File로 쓰이게 되며 이런 경우에는 OS 블록 단위로 디스크 I/O가 발생하게 된다.
그렇기 때문에 Redo Log Buffer 또한 디스크 I/O 단위를 맞추기 위해 OS 블록의 크기로 데이터베이스 기동과 함께 구분된다. 이와 같이 Redo Log Buffer를 구분한 다음 Redo Log Buffer의 내용을 Redo Log File로 쓰기 작업을 하는 경우 쓰기 작업의 단위는 OS 블록의 크기로 디스크 I/O가 발생하게 된다.
이와 같은 상황에서 Redo Log Buffer의 OS 블록 단위로 구분된 조각 중에 사용 중인 것은 ACTIVE로 표시하게 되고 사 용하지 않은 쿼리는 INACTIVE로 표시하게 된다.
Record는 LGWR 프로세스에 의해 Redo Log File에 기록된다. 물론, Redo Log Buffer는 OS 블록 크기로 구분되어 있고 Redo Log File은 OS에 존재하는 파일이므로 서로 I/O 단위는 OS 블록 단위로 동일하게 된다.
이와 같은 Redo Log File은 [표 2]와 같은 구성 요소를 가진다.
구성요소 | 내용 |
---|---|
GROUP | 여러 개의 GROUP이 존재하며 하나의 GROUP에 로그 기록이 끝나면 다음 GROUP으로 이동 |
MEMBER | GROUP 안에 존재하며 하나의 GROUP은 여러 개의 MEMBER를 가질 수 있으며 동일한 GROUP의 MEMBER들은 항상 동일한 내용을 저장하고 있음 |
LOG SWITCH | 하나의 GROUP에서 로그 기록이 종료하고 다음 GROUP으로 로그 기록을 옮기는 과정 |
LOG SPINNING | 하나의 GROUP에서 로그 기록을 수행하고 데이터베이스의 모든 GROUP에 로그를 기록한 후 처음 GROUP으로 다시 돌아오는 현상 |
GROUP과 LOG SWITCH 및 LOG SPINNING에 대해 자세히 확인해 보자. Redo Log File에서 GROUP은 여러 개 존재할 수 있다. 물론 하나의 GROUP에는 여러 개의 MEMBER가 존재하게 된다.
오라클의 경우에는 GROUP의 개수가 최소한 2개 이상이여야만 데이터베이스를 생성할 수 있다. 따라서 데이터베이스를 생성하게 되면 최소 2개 이상의 GROUP이 생성된다.
이와 같이 2개의 GROUP이 생성되었다면 GROUP 1과 GROUP2가 생성될 것이다. 처음에 GROUP 1에 로그를 기록하게 되고 GROUP 1에 정해진 크기만큼의 로그가 다 기록된 후에는 GROUP 2에 로그가 기록된다. 물론, GROUP 2에 정해진 크기의 로그가 기록된 후에는 GROUP 3이 존재하지 않으므로 다시 GROUP 1에 로그를 기록하게 된다.
[그림 2]와 같이 GROUP 1에 로그를 기록한 후 모든 기록이 종료하게 되면 GROUP 2에 로그를 기록하게 된다. 또한 GROUP 2에 로그의 기록이 종료하게 되면 GROUP 1에 로그를 다시 기록하게 된다. 이와 같이 Redo Log File의 GROUP은 계속해서 재사용하게 된다.
이와 같이 하나의 GROUP에서 다른 하나의 GROUP으로 로그 기록을 이동하는 것을 LOG SWITCH라고 하며 LOG SWITCH 시에는 이전 GROUP의 로그 기록을 데이터베이스의 Datafile에 기록해야만 한다.
LOG SWITCH가 발생해 처음의 GROUP에 다시 로그를 기록하게 되는 현상을 LOG SPINNING이라고 한다. 다음 강좌에서는 Redo Log File에 대해 좀 더 자세히 확인해 보자.
- 강좌 URL : http://www.gurubee.net/lecture/2684
- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.