mingming

Oracle DB Architecture - Redo Log Buffer 본문

새싹 하이브리드 클라우드/Database

Oracle DB Architecture - Redo Log Buffer

mingming_96 2023. 10. 11. 23:09

 

리두 로그 버퍼 ( Redo Log Buffer ) 

  • 오라클은 오브젝트가 변경되거나 DML 작업에 의해 데이터가 변경되는 경우 변경에 대한 로그를 리두 로그 버퍼에 기록합니다.
  • 해당 로그들은 리두 로그 버퍼에 기록 후 백그라운드 프로세스인 LGWR 프로세스에 의해 리두 로그 파일에 저장됩니다.
  • 리두 로그 버퍼의 크기는 LOG_BUFFER 파라미터로 지정 할 수 있습니다. 
  • 오브젝트 및 데이터 변경 시 생성되는 로그를 저장하는 SGA 메모리 공간입니다.
  • 데이터베이스내의 모든 변경 작업에 대한 복구를 지원합니다.
  • 아래의 명령으로 버퍼의 크기를 확인할 수 있습니다. 
SQL> show sga

      

Recovery & Rollback

항목 개념 주체
Recovery 장애에 대한 데이터베이스 복구 리두 로그 파일 + 언두 데이터  
Rollback 작업에 대한 작업 전 데이터로 복구  언두 데이터

 

Redo Log 생성 과정

1. 데이터 블록 변경 제한 : DML이 발생하는 대상 데이터 블록에대해 다른 세션에서의 변경을 방지하게 됩니다.

 

2. 리두 로그 생성 : 트랜잭션을 수행한 세션에서 실제 DML 전에 여러 개의 리두 로그를 생성한다. 여서 생서오딘 리두 로그를 리두 로그 버퍼에 기록하게 되며 이를 Write-Ahead 로깅이라고 하게 됩니다.  

 

3. 통계 정보 수집 : 리두 로그를 생성한후에는 해당 리두 로그에 대한 통계 정보를 수집하여 저장하게 됩니다  

 

4. 리두 Copy Latch 수집 : 리두 로그를 리두 로그버퍼에 기록하기 위해서는 리두Copy Latch를 획득해야 합니다. 리두Copy Latch는 리두로그버퍼에 로그를 기록하는 Latch 입니다.

 

5. 리두Allocation Latch 획득 : 리두 Copy Latch를 획득한 후에는 리두 Allocation Latch를 획득해서 리두로그 버퍼로부터 로그를 기록할 수있는여유 공간을 할당받아야 합니다.

 

6. SCN 할당 : 리두 Allocation Latch를 획득한 후에는 SCN을 할당합니다.

 

7. 리두 로그 버퍼 공간 확인 : 리두Copy Latch와 리두 Allocation Latch를 획득한 이후에는 리두 로그 버퍼에 공간이 존재하는지 확인합니다. 확인 후 리두 로그를 기록할 공간이 존재하면 8단계를 수행하고, 공간이 없다면 10단계를 실행하게 됩니다.   

 

8. 리두 로그 기록 : 리두 로그 버퍼에 공간이 존재하므로 리두 로그를 리두 로그 버퍼에 기록합니다.

 

9. 리두 Writing Latch 획득 : 리두 로그 버퍼에 공간이 없으면 해당 서버 프로세스는 리두 Writing Latch를 획득하게 됩니다.

리두 Writing Latch는 데이터베이스에 하나만이 존재하며 해당 Latch를 획득한 서버 프로세스만이 LGWR 백그라운드 프로세스를 기동시킬 수 있습니다.

 

10 . LGWR 기동 : 리두 Writing Latch를 획득한 프로세스는 LGWR 백그라운드 프로세스를 기동시켜 리두 로그 버퍼의 내용을 리두 로그파일에 기록하고 여유 공간을 확보하게 됩니다. 여유 공간 확보 후 8단계를 수행하게 됩니다               

 

Latch 와 Enqueue   

Latch 와 Enqueue는 락을 구현하기 위한 종류이며 많은 차이를 발생시키게 됩니다. Latch는 짧은 시간동안 메모리 등의 자원에 락을 수행하는 부분에서 사용되며 Enqueue는 테이블 및 인덱스 등의 작업 시 오래 시간 동안 락을 수행하는 부분에서 이용하게 됩니다.   
항목 Latch Enqueue
대상 자원 메모리 오브젝트
락 모드 대부분 Exclusive 모드 Excusive/Share 모드
자동 여부 자동으로 수행 인위적으로 수행
락 시간  짧은 시간 짧은 시간/긴 시간

 

리두 로그 관련 Latch

리두 로그 버퍼는 메모리 영역이므로 해당 공간에서 락이 필요하게 되면 Latch를 사용하게 됩니다.   
항목 개수 설명
리두 Allocation Latch 1개 존재 리두 로그 버퍼에서 사용할 공간 할당
리두  Copy Latch N개 존재  리두 고르 버퍼에 리두 로그를 기록
리두 Writing Latch 1개 존재 LGWR을 기동시켜 리두 로그 버퍼의 내용을 리두 로그 파일에 기록

 

리두 Less 작업 

과다한 트랜잭션을 수행하여 리두 로그를 많이 생성한다면 성능 저하가 발생할 수 있습니다. 이때 리두 Less 작업을 이용할 수 있습니다.    
리두 Less 작업은 최소한의 리두 로그만을 기록하여 작업속도가 향상되지만 장애 발생 시 복구가 불가능 하다는 단점이 있습니다. 
항목 사용 방법 내용
SQL 로더의 직접 로딩 Unrecoverable 옵션 사용 OS의 일반적인 읽을 수 있는 파일을 오라클 테이블로 로딩하는 경우 사용   
Insert  에서의 직접 로딩 Apeedn 힌트 이용
/Nologging 옵션 이용
Select 후 Insert 하는 대용량 Insert에서사용 가능  
인덱스 Rebuild   Nologging 옵션 이용 많은 DML로 인덱스의 균형이 어긋나는 경우 주기적으로 수행하는 작업 
인덱스 생성 Nologging 옵션 이용 조회 속도 향상을 위한 인덱스 생성 작업
Create Table As Select (CTAS) Nologging 옵션 이용 기존 테이블을 복사하는 경우 사용