type
status
date
slug
summary
tags
category
icon
password
리두 로그 버퍼
오브젝트 및 데이터 변경 시 생성되는 로그를 저장하는 SGA(System Global Area) 메모리 공간으로,
데이터베이스 장애 시 복구를 수행하기 위해 모든 DML에 대한 로그를 기록합니다.
아키텍처
Physiological 로깅
데이터베이스 로깅에는 Logical 로깅, Physical 로깅, Physiological 로깅이 있습니다.
ORACLE DB 에서는 Physiological 를 사용합니다.
변경된 데이터에 대해서는 이전/이후 이미지를 저장하는 방식으로
로깅 양이 적고 복구율이 높습니다. 성능저하를 방지합니다.
로깅 종류에 따른 비교표입니다.
항목 | Logical 로깅 | Physical 로깅 | Physiological 로깅 |
로그 양 | 📄 | 📄📄📄 | 📄📄 |
복구 | 😱 | 🙂 | 🙂 |
성능 | 🐇 | 🐢 | 🐇 |
Write-Ahead
로그를 기록하는 작업을 먼저 수행하는 의미로,
DML(Insert, Delete, Update) 작업을 수행할 겨우 실제 데이터에 대해 DML을 수행하기 전에 데이터들의 변경에 대한 내용을 리두 로그 버퍼에 미리 저장합니다.
로그를 먼저 기록하기 때문에 작업 중 장애가 발생해도 복구를 수행할 수 있게 됩니다.
생성 과정

- 데이터 블록 변경 제한 DML이 발생하는 대상 데이터 블록에대해 다른 세션에서의 변경을 방지하게 됩니다.
- 리두 로그 생성 트랜잭션을 수행한 세션에서 실제 DML 전에 여러 개의 리두 로그를 생성합니다. 여기서 생성된 리두 로그를 리두 로그 버퍼에 기록(Write-Ahead)합니다.
- 통계 정보 수집 리두 로그를 생성한 후에는 해당 리두 로그에 대한 통계 정보를 수집하여 저장합니다.
- 리두 Copy Latch 획득 리두 로그를 리두 로그버퍼에 기록하기 위해서는 리두 Copy Latch를 획득해야 합니다. 리두 Copy Latch는 리두 로그 버퍼에 로그를 기록하는 Latch입니다.
- 리두 Allocation Latch 획득 리두 Copy Latch를 획득한 후에는 리두 Allocation Latch를 획득해 리두로그 버퍼로부터 로그를 기록할 수 있는 여유 공간을 할당받아야 합니다.
- SCN 할당 리두 Allocation Latch를 획득한 후에는 SCN을 할당합니다.
- 리두 로그 버퍼 공간 확인 Copy Latch, Allocation Latch를 획득한 이후 리두 로그 버퍼에 공간이 존재하는지 확인합니다. 리두 로그를 기록할 공간이 존재하면 8단계를 수행하고, 공간이 없다면 10단계를 실행합니다.
- 리두 로그 기록 리두 로그 버퍼에 공간이 존재하므로 리두 로그를 리두 로그 버퍼에 기록합니다.
- 리두 Writing Latch 획득 리두 로그 버퍼에 공간이 없으면 해당 서버 프로세스는 리두 Writing Latch를 획득하게 됩니다. Writing Latch는 데이터베이스에 하나만이 존재하며 해당 Latch를 획득한 서버 프로세스만이 LGWR 백그라운드 프로세스를 기동시킬 수 있습니다.
- LGWR 기동 리두 Writing Latch를 획득한 프로세스는 LGWR 백그라운드 프로세스를 기동시켜 리두 로그 버퍼의 내용을 리두 로그파일에 기록하고 여유 공간을 확보하게 됩니다. 여유 공간 확보 후 8단계를 수행하게 됩니다
Latch 와 Enqueue
Latch 와 Enqueue는 락을 구현하기 위한 종류입니다.
Latch는 짧은 시간동안 메모리 등의 자원에 락을 수행하는 부분에서 사용되며
Enqueue는 테이블 및 인덱스 등의 작업 시 오래 시간 동안 락을 수행하는 부분에서 이용하게 됩니다.
항목 | Latch | Enqueue |
대상 자원 | 메모리 | 오브젝트 |
락 모드 | 대부분 Exclusive 모드 | Excusive/Share 모드 |
자동 여부 | 자동으로 수행 | 인위적으로 수행 |
락 시간 | 짧은 시간 | 짧은 시간/긴 시간 |
Redo Less
트랜잭션이 많아 리두 로그가 많이 생성된다면 성능저하가 발생할 수 있습니다.
대안으로 Redo Less 작업을 수행할 수 있습니다. 종류는 다음과 같습니다.
- Direct Loading
- 인덱스 Rebuild 또는 생성
- CTAS(Create Table As Select)
장점
최소의 리두 로그를 기록함으로써 디스크 I/O 감소로 인해 작업 속도 증가
단점
장애 발생 시 해당 테이블 또는 작업 완료 후의 백업 본이 없는 경우 복구 불가
리두 로그 파일
리두 로그 버퍼는 메모리 영역에서 동작해 변경 내용을 기록하는데 제약이 있습니다.
공간이 모두 사용되면 Overwrite되어 재사용되기 때문에 모든 변경에 대한 로그를 남길 수 없습니다.
이러한 이유로 LGWR 백그라운드 프로세스로 리두 로그 파일을 별도로 저장하게 됩니다.

구성

리두 로그 멤버
리두 로그 버퍼의 내용을 기록하는 파일이며 하나의 리두 로그 멤버는 하나의 리두 로그 파일입니다.
LGWR 백그라운드 프로세스는 리두 로그 버퍼의 내용을 동일 그룹에 속해 있는 모든 리두 로그 멤버에 동일한 내용들을 기록합니다.
리두 로그 그룹
동일한 로그 기록을 저장하고 있는 리두 로그 멤버들의 집합을 의미합니다.
관련 동작
로그 스피닝
로그 스피닝은 Oracle DB에서 리두 로그 파일을 순환 사용하는 과정입니다. 로그 파일이 가득 차면 자동으로 다음 파일로 전환되어 DB의 지속적 운영, 성능 및 가용성을 유지합니다.
로그 스위칭
로그 스위칭은 현재 리두 로그 파일에서 다음 가용 파일로 전환하는 과정입니다. 이는 파일이 가득 차거나 수동 요청 시 발생하며, 데이터베이스의 연속 운영과 효율적 로그 관리에 중요합니다.
로그 스위칭 수행되는 작업입니다.
- 로그 시퀀스 번호 증가
- CKPT 프로세스로 인해 체크포인트 수행
- 리두 로그 파일에 대한 아카이브 발생
파일을 전환하는 행위를 스위칭, 순환되어 사용하는 과정 자체를 스피닝이라 부릅니다.
사용자가 임의로
alter system switch logfile
로 리두 로그파일 대상을 변경할 수 있습니다.로그 스위칭시 다음의 작업이 발생합니다
- 컨트롤 파일 확인 및 다음 리두 로그 그룹 준비 상태 확인
- 필요 시 체크포인트 및 아카이브 완료 대기
- 로그 스위치 직전 SCN을 리두 로그 파일 헤더에 기록
- 새 리두 로그 그룹 오픈 및 Current로 설정
- 이전 그룹을 ACTIVE로 표시하고 체크포인트 수행
- 아카이브 로그 모드인 경우 이전 그룹 아카이브 시작
로그 상태
리두 로그 파일의 상태는 다음과 같이 분류됩니다
- Unused: 아직 사용되지 않은 새로운 로그 파일
- Active: 현재 사용 중이거나 아카이브되지 않은 로그 파일
- Inactive: 더 이상 필요하지 않고 재사용 가능한 로그 파일
- Current: 현재 LGWR(Log Writer)가 쓰기 작업을 수행 중인 로그 파일

주의점
아래 최소 조건을 만족시키지 못하면 DB가 열리지 않습니다.
- 최소한 두 개의 리두 로그 그룹 존재
- 각 그룹은 한 개 이상의 멤버 존재
- 리두 로그 그룹은 순환 구조
- 리두 로그 그룹은 로그 시퀀스 번호를 가져 로그 스위치가 발생할 때마다 1씩 증가