DB&SQL

오라클 아키텍처 - Buffer Cachey, Redo Log Buffer, Undo

초롱불 2024. 5. 13. 12:35

Buffer Cache, Redo Log Buffer, Undo 개요

SGA의 구성요소인 Shared Pool 에 이어서 주요 구성 요소인 Buffer Cache와 Redo Log Buffer, undo를 정리해본다.

 

Buffer Cache

버퍼 캐시는 SGA에서 가장 큰 메모리 영역 중 하나로 디스크에서 읽은 데이터 블록의 복사본을 저장한다. 이 영역은 모든 사용자가 접근 할 수 있는 공유 데이터를 제공하며 한 사용자가 데이터를 요청할 떄 이미 캐시에 존재한다면 디스크 접근 없이 빠르게 데이터를 제공한다. 만약 요청한 데이터의 일부만 캐시에 존재한다면 나머지 데이터만 디스크에서 읽어오는 방식으로 처리한다.

 

데이터베이스 버퍼 캐시 쓰기 과정은 "더티 블록(Dirty Blocks)"이라 불리는 수정된 불록들을 디스크로 다시 쓰기 위해 데이터베이스 작성 프로세스를 사용한다. 더티 블록이란 데이터베이스 버퍼 캐시 내에서 수정되었지만 아직 디스크에 반영되지 않은 데이터 블록을 의미한다. 이러한 블록들은 다음과 같은 과정을 통하여 디스크로 쓰여진다.

더티블록의 처리 과정

  1. 블록 수정: 사용자가 데이터를 수정하는 SQL 명령(예: UPDATE, INSERT, DELETE)을 실행하면 해당 데이터가 저장된 블록이 버퍼 캐시로 로드된다. 만약 블록이 이미 캐시에 존재하지 않는 경우, 디스크에서 읽어와서 캐시에 추가된다.
  2. 더티 블록 표시: 블록 내의 데이터가 수정되면, 해당 블록은 더티(오염된) 상태로 표시된다. 이는 해당 블록이 수정되었으나 아직 디스크에는 반영되지 않았음을 나타낸다.
  3. 커밋 발생: 사용자가 트랜잭션을 커밋하면, 수정된 모든 더티 블록들이 디스크로 쓰여져야 하는 대기 목록에 추가된다.
  4. 데이터베이스 쓰기 프로세스: Oracle의 데이터베이스 쓰기 프로세스인 DBWR(Database Writer)가 활성화된다. DBWR은 더티 블록을 디스크로 비동기적으로 쓰는 역할을 한다. 이 과정은 시스템의 성능을 저하시키지 않기 위해 일반적으로 배치 처리 방식으로 이루어진다.
  5. 쓰기 알고리즘: DBWR은 여러 전략을 사용하여 쓰기 작업을 최적화한다. 예를 들어, 가장 오래된 더티 블록부터 쓰거나, 가장 자주 액세스된 블록을 우선적으로 쓰는 등의 방법이 있다. 또한, 여러 블록을 함께 쓰기 위해 I/O 병합 작업을 수행할 수 있다.
  6. 쓰기 완료: 더티 블록이 성공적으로 디스크로 쓰여지면, 해당 블록은 더 이상 더티 상태가 아니며 버퍼 캐시에서 일반 데이터 블록으로 다시 분류된다.

또한 버퍼 캐시는 인덱스 데이터도 저장하여 자주 사용되는 인덱스의 빠른 접근을 가능하게 한다.

 

Redo Log Buffer

Redo Log Buffer는 SGA 내에 위치하며, 데이터베이스 변경 사항(삽입, 삭제, 업데이트 등)에 대한 정보를 임시로 저장하는 메모리 영역이다. 사용자가 변경 사항을 커밋하거나 버퍼가 가득차면 로그 작성 프로세스는 이러한 redo log 하목에 시스템 변경 번호를 부여하고 Redo Log 파일로 기록한다. Redo log는 데이터베이스나 테이블을 이전 상태로 복구하는 데 사용될 수 있다.

 

Redo Log Buffer는 원형 버퍼(Circular buffer)로 운영되며 버퍼가 가득 차면 가장 오래된 데이터부터 새 데이터로 덮어쓰기 시작한다. 이는 시스템 충돌이나 예기치 못한 상황에서 데이터베이스를 복구할 필요가 있을 때 중요한 역할을 한다. Redo Log의 사용은 데이터베이스 튜닝에서 고려해야할 비용 요소 중 하나이다.

Undo

  • 변경 전 데이터 저장: Undo는 데이터베이스에서 트랜잭션을 취소하거나 이전 상태로 복구하는 데 사용된다. Undo는 변경 전 데이터를 디스크에서 읽어 메모리에 저장한다. 이 복사본을 Undo 데이터라고 한다. 이를 바탕으로 시스템 오류 혹은 사용자의 요청에 의해 트랙잭션을 취소해야할 때 Undo 데이터가 사용된다. 즉, 롤백을 수행할 수 있도록 한다.
  • 읽기 일관성: 커밋이 이루어지기 전까지는 변경 사항은 해당 세션에서만 조회가 가능하고 다른 사용자에게는 보이지 않는다. Undo를 수행할 시에 변경 전 데이터를 그대로 유지할 수도 있다. 이를 통하여 읽기 일관성을 제공할 수 있다.
  • 플래시백: 플래시백 기능을 사용하면 데이터베이스를 복구하거나 시간에 따른 변경 사항을 조회할 수 있따. 커밋된 모든 변경 사항은 일정시간 Undo 데이터로 저장되어 이 기능을 제공한다.

메모리 구조와 Undo

  • 블록(Block): 데이터베이스에서 가장 작은 논리적 데이터 그룹이다.
  • 익스텐트(Extents): 여러 블록의 집합으로, 더 큰 데이터 저장 단위를 형성한다.
  • 세그먼트(Segments): 여러 익스텐트의 집합으로, 보다 큰 메모리 영역을 포함한다.
  • 테이블스페이스(Tablespace): 하나 이상의 세그먼트를 포함하는 가장 큰 데이터 저장 단위이다.

Undo 데이터는 일반적으로 "Undo 세그먼트"에 저장된다. 이 세그먼트는 데이터베이스가 자동으로 관리하며, 필요에 따라 확장하거나 축소할 수 있다.

 

정리

버퍼캐시는 데이터 접근 속도를 높여주며 Redo log buffer는 데이터의 안정성을 보장하며 복구 가능성을 제공한다. Undo는 데이터 일관성을 유지하고 시스템 실패 또는 사용자 요구에 따라 쉽게 이전 상태로 복구할 수 있는 기능을 제공한다. Redo와 Undo의 차이는 데이터베이스 복구에 초점을 맞추느냐 트랜잭션 롤백과 일관성에 초점을 맞추느냐에 나타난다.

 

*Udemy ORACLE SQL TUNING masterclass 강의 내용 정리