데이터베이스 아키텍처를 분석하고 학습하다 보면 항상 데이터베이스 내부 구조에 대한 호기심이 생기게 마련이다.
이와 같은 데이터베이스 내부 아키텍처는 실제 업무를 수행하는데 큰 도움이 되지는 않을 수 있다고 생각한다.
하지만 데이터베이스 내부 아키텍처를 이해하는 순간 데이터베이스에 문제가 발생하는 경우 정확한 그리고 논리적인 분석이 가능해진다.
그렇기 때문에 데이터베이스를 확실하게 분석하기 위해서는 데이터베이스 Internal은 반드시 이해하는 것이유리하다.
Redo Log Buffer의 목적은 복구를 위해서다. 그렇기 때문에 Redo Log Buffer는 복구를 위해 모든 아키텍처가 구성되어 있다.
이번 강좌에서는 Redo Log를 생성하는 과정에 대해 확인해 보자.
Redo Log의 생성
Redo Log의 생성은 매우 복잡한 과정을 거치게 된다. 그럼 각 단계별로 확인해 보자.
- [그림 1] Redo Log의 생성
- 1) Page Fix Rule 수행 : 불특정 세션에서 DML 작업을 수행하게 되면 [그림 1]과 같이 해당 데이터 블록에 세마포어를 이용한 Page Fix Rule을 적용하게 되어 해당 데이터 블록을 변경 할 수 없게 된다.
-
- 2) Pinning Buffer : 위와 같이 변경을 수행하는 데이터 블록은 데이터베이스 버퍼에서 Pinned 상태로 변경되어 다른 변경을 방지하게 된다.
-
- 3) Change Vector Array Build : 변경하고자 하는 데이터 블록에 대해 변경을 막은 후에는 Write-Ahead Logging에 의해 로그를 기록하기 위해 Change Vector를 생성하게 되며
Change Vector의 모임인 Redo Record들을 PGA(Private Global Area, Program Global Area)에 저장하게 된다.
-
- 4) Redo Size 계산 : 위와 같이 생성된 DML을 위한 Redo Record에 대해 Redo 크기를 계산한다.
-
- 5) Redo 통계정보 수집 : Redo Record를 생성한 후에는 Redo 관련 통계정보를 생성하게 된다.
-
- 6) SCN 할당 : 해당 DML 작업에 대한 SCN 할당
-
- 7) Redo Copy Latch 획득 : 로그를 Redo Log Buffer에 기록하기 위해 Redo Copy Latch를 획득
-
- 8) Redo Allocation Latch 획득 : 로그를 기록하기 위한 Redo Log Buffer에서 공간을 할당 받기 위해 Redo Allocation Latch 획득
-
- 9) SCN 재할당 : 최소 1회 SCN을 할당하며 해당 단계에서 새로운 SCN을 할당해 해당 SCN으로 Redo Log Buffer에 기록
-
- 10) Redo Log Buffer의 여유 공간 확인 : Redo Log Buffer에 여유 공간이 있는지 확인
위와 같은 절차로 기본적으로 Redo Log를 생성하게 된다.
다음 강좌에서는 이와 같은 과정에 대해 좀 더 자세히 확인해 보자.
[참고] Redo Log 통계정보 확인
아래와 같이 V$SYSSTAT, V$SESSTAT, V$MYSTAT 에서 Redo Log에 대한 통계정보를 확인할 수 있다.
- - V$SYSSTAT : 전체 데이터베이스에 대한 자원 사용 통계 정보
- - V$SESSTAT : 각 세션별로 자원 사용 통계 정보
- - V$MYSTAT : 현재 세션의 자원 사용 통계 정보
SELECT *
FROM V$SYSSTAT
WHERE name LIKE '%redo%'
STATISTIC# NAME CLASS VALUE
90 redo synch writes 8 41915
91 redo synch time 8 5105480
132 redo blocks read for recovery 2 4588
133 redo entries 2 119354
134 redo size 2 51029892
135 redo buffer allocation retries 2 2
136 redo wastage 2 4866644
137 redo writer latching time 2 0
138 redo writes 2 16819
139 redo blocks written 2 112809
140 redo write time 2 5105301
141 redo log space requests 2 2
142 redo log space wait time 2 6
143 redo log switch interrupts 2 0
144 redo ordering marks 2 1320
145 redo subscn max counts 2 0
각각의 뷰는 위와 같은 의미를 가지며 해당 뷰의 각 항목들은 다음과 같다.
- - redo synch writes : n Redo 싱크를 위한 SCN Write
- - redo synch time : Redo 싱크를 위해 소요된 시간
- - redo blocks read for recovery : n 복구를 위해 엑세스한 Redo 블록
- - redo entries : Redo Record의 개수
- - redo size : Redo Record의 크기
- - redo buffer allocation retries : Redo Log Buffer의 공간을 할당 받기 위한 시도 횟수
- - redo wastage : Redo 가비지 정보
- - redo writer latching time : Redo를 작성하기 위한 래치 시간
- - redo writes : Redo Record를 기록한 횟수
- - redo blocks written : Redo Record를 기록하기 위해 사용한 블록수
- - redo write time : Redo Record를 기록하는 시간
- - redo log space requests : Redo Log Buffer의 공간을 할당 받기위한 시도 횟수
- - redo log space wait time : Redo Log Buffer의 여유 공간 할당을위해 대기한 시간
- - redo log switch interrupts : Redo 로그 스위치에 대한 시간
- - redo ordering marks : Redo 정렬을 위한 표시(SCN, RBA)
- - redo subscn max counts : Redo에 대한 서브 SCN의 최대 개수