ORACLE

:) 태영쓰 :: ORACLE Redolog 리두로그 ?

태영의 오라클 2017. 9. 3. 01:44



Redo log 

Redo log 생성원리

Change Vector 

Redo copy latch

Redo allocation latch 

LGWR (Log writer) 

Redolog 다중화

Redolog 관리하기 

Redolog trace


에 대하여 . . .






◈  리두로그 (Redolog )



< 그림 1 >


1. 리두로그란 ? 


위의 그림의 SGA의 Redolog buffer 와 저장소인 Redolog File 의 형태로 있습니다 ~ 


- Re (다시) do (하다) = 데이터가 변경될 경우 변경 의 내용을 기록합니다. 

- Un (취소) do (하다) = 데이터가 변경될 경우 변경 전의 내용을 기록합니다.



장애가 발생했을 경우 복구 하기 위해 데이터가 변경되지 전의 내용과 변경된 후의 내용을 모두 기록 하는 기능을 하고 있습니다. 


redo log buffer : 메모리 , redo log file : 파일


2. 생성 원리 


데이터 변경이 발생 (DML,DDL) 하면 두 가지 메커니즘에 의해 Redo Log에 기록된다.


- write log ahead 실제 데이터 변경 전에 redo log 먼저 기록한 후 데이터가 변경된다.

(DBWR 작동 이전에 LGWR가 작동) 

      - Log force at Commit : Commit을 치면 내려쓴다.

사용자로부터 commit 요청이 들어오면 관련된 모든 redo recored들을 redo log file에 저장한 후 commit을 완료 (redo log file에 기록하지 않고 Commit은 완료 되지 않은 상태)

<그림 2>


* 리두로그가 생성되는 순서 


1. DML이 발생시 버퍼캐시에 락을 걸고 업데이트를 한다. 

2. PGA는 Change vector를 생성한다. 

3. 리두로그 버퍼에 저장 할 수있는지 레치를 먼저 할당 받는다. 

4. 리두로그에 Redo Entry라는 형태로 저장한다. 

5. 위 그림의 4가지 상황에 따라 LGWR 프로세스가 Redolog file에 내려쓴다.


+ Archive log 가 있다면 추가 저장한다. 




Change vector ? 


PGA가 생성하며 변경된 데이터를 나중에 복구할 목적으로 Redo log에 기록할 변경 데이터에 대한 모든 정보의 묶음


  • Undo segment header 변경사항
  • Undo block 변경사항
  • Data segment header 변경사항
  • Data block 변경사항

Redo Record Format으로 row 단위로 Redo log Buffer로 복사 된다. 




Redo copy Latch ?


Copy 를 위한 번호표 할당 하며 (cpu 개수 * 2) 이며 cpu 가 8개 미만인 경우

레치는 1개이다. 이때 여러개가 다수로 통과 한다. 


여기서 경합발생 한다면 --> 성능저하 로 이어진다.


조회 : 

select name, gets misses, immediate_gets, wait_time from v$latch_children where name='redo copy'; --copy latch  




Redo allocation Latch ?


redolog buffer의 공간확보를 위한 레치 이며 한번에 1개씩만 할당 할 수 있다. 

8i 까지는 1개 였지만 9i는 Shared Redo Strand : 하나의 redo log buffer를 마지 디스크의 파티션과 같이 여러 개로 나눠서 작업 할수 있어짐 

10g = _LOG_PARALLELISM 오라클 동적관리 되어짐  (권장값 : cpu개수 /8) 개


조회 : 

select name, gets misses, immediate_gets, wait_time from v$latch_children where name='redo allocation';

select count(*) from v$latch_children where name='redo allocation';




LGWR(로그 기록자 프로세스, Log Writer)


로그 버퍼의 내용을 메모리로부터 디스크로 복사하는 백그라운드 프로세스




  • User process가 트랜잭션을 commit 하거나 rollback 할때
  • 리두로그 버퍼가 1/3 찼을 때
  • DBWn 프로세스가 수정된 버퍼를 디스크에 기록하기 전에 
  • 3초 마다
  • 1MB 이상의 트랜잭션이 발생 했을 때



Redo log 다중화 


Redo log file이 고장나면 문제가 생기므로, 같은 멤버들을 최소한 두개 이상 묶어 한 그룹으로 만들기를 권장한다. 




Redo log 관리하기 


신규 group 생성하기 

alter database add logfile group 4 '/u01/app/oracle/oradata/orcl/redo01.log' size 5m;


Member 추가하기

alter database add logfile member '/u01/app/oracle/oradata/orcl/redo01.log' to group 4;


member 삭제하기 

alter database drop logfile member '/u01/app/oracle/oradata/orcl/redo01.log';


group 삭제하기

alter database drop logfile group 4

(그룹에 1개인 멤버를 지우려면 지워지지 않음. 지우려면 그룹을 삭제해야함 )


log switch 발생하기

alter system switch logfile;


checkpoint 발생하기

alter system checkpoint;






redolog file trace










아래의 공감 버튼은 작성자를 춤춰 날뛰게 합니다.


↓↓↓↓