Redo Log

Redo Log


- 오라클에서는 데이터 변경이 생길 경우 만약에 발생할 장애를 대비하여 변경되기 전의 내용과 변경후의 내용을 모두 기록한다.

- 이 내용이 기록되는 장소 중 메모리가 Redo log Buffer 이며, 파일은 Redo log File 이다.

 

Redo 생성 원리


 ※ Write Log Ahead - 실제 데이터를 변경하기 전에 redo log에 먼저 기록을 한 후 데이터를 변경

 ※ Log Force at Commit - 사용자로부터 commit요청이 들어오면 관련된 모든 redo record들을 redo log file에 저장한 후 commit을 완료


 


1) 변경을 원하는 Block이 Bb Buffer Cache로 로드.

그 후 해당 Row 부분을 다른사용자가 바꿀 수 없도록 해당 Block에 Lock을 설정한 후 (=page fix)

PGA에서 Redo Log Change Vector가 생성됨.

 :Change Vector란 변경된 데이터를 나중에 복구를 할 목적으로 redo log에 기록할 변경된 데이터에 대한 모든 정보의 세트를 의미함

 예를들어 하나의 row를 insert 하는 경우 아래와 같이 여러개의 항목이 모여 하나의 change vector가 됨

 

- Change#1=Undo segment header 변경내용

- Change#2=Undo Block 변경내용

- Change#3=Data segment header 변경내용

- Change#4=Data block 변경내용

 

일반적으로 Redo Log는 트랜잭션의 변경을 복구 할 용도로 기록이 된다.

이것은 Commit된 데이터 외 Rollback 데이터를 복구 할 경우에도 사용된다는 뜻이다.

 

사용자가 commit한 후 아직 Checkpoint 발생 전에 DB가 강제종료 되었을 때 해당 데이터를 Roll forward 하는 내용도 저장해야 하지만 사용자가 Rollback한 후 아직 rollback이 완료되지 않은 상태에서 DB가 강제 종료 되었을 때도 Rollback 되지 못한 데이터를 전부 Rollback 해 주어야 한다.

그래서 Change Vector내에 Undo관련 내용까지 함께 저장되어 있는 것이다.

 

이렇게 PGA상에서 만들어진 Change Vector들은 Redo Record Format으로 Row 단위로 Redo Log Buffer에 복사된다.



2) PGA에서 change vector를 생성한 후 redo log buffer에서 필요한 용량을 계산하고 복사하려면 Latch를 획득해야 한다. 

모든 메모리 자원(shared pool, database buffer cache 등) 은 각자 적절한 latch를 가지고 있다. 

Redo Log Buffer 역시 마찬가지로 Redo Log Buffer에 내용을 쓰려면 Latch를 확보 해야하는데 첫번째로 Redo Copy Latch을 획득 해야한다. 만약 동시에 여러 서버 프로세스가 데이터를 변경하려 한다면 Redo Copy Latch를 획득하는 과정에서 과부하가 생길 수 있음. 

Redo Copy Latch는 Change Vector가 모두 Redo Log Buffer에 기록 될때까지 가지고 있어야 하기 때문에 여러개가 존재 해야한다.

Redo Copy Latch의 개수는 "_log_simultaneous_copies" 라는 히든 파라미터로 조정 가능 (기본값은 CPU 개수 x2)



3) Redo Copy Latch를 확보한 서버프로세스는 Redo Log Buffer에 내용을 기록하기 위해 Redo Allocation Latch를 확보해야 한다.

 

9i부터는 Redo Log Bufferr를 여러개의 공간으로 나눠 각 공간별로 Redo Allocation Latch를 할당해주는 Shared Redo Strand 기능이 도입되었으며 이 값은 LOG_PARALLEISM 파라미터로 설정이 가능하다. (기본값 1)

 

10g부터는 Shared Redo Strand가 더 확장된 개념인 Private Redo Strand기능이 도입되었다.

10g부터는각 서버 프로세스들이 Private Redo Strand 공간을 만들어서 그곳에 Change Vector를 생성한 후 필요한 경우 LGWR 이 Redo Log File에 바로 기록하게 된다.

Private Redo Strand의 도입으로 인해 각 프로세스들이 Latch를 확보하기 위해 경합이 발생하던 부분이 줄어 성능면에서 더 향상되었고 이것을 Zero Copy Redo 라고도 한다. 

10g 부터는 LOG_PARALLEISM 파라미터가 _LOG_PARALLEISM_DYNAMIC 으로 (히든파라미터) 변경되고, 이 값이 True로 설정 되어 있으면 Stand 개수를 Oracle이 자동으로 관리한다. (권장값은 CPU 개수/8)


※ Redo Allocation Latch 개수 조회

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


4) Redo Log Buffer에서 특정 상황이 되면 LGWR이 Redo Log Buffer에 있는 내용 중 일부를 Redo Log File에 기록한다

 

서버 프로세스가 Redo Writing Latch를 확보 

-> LGWR에게 Redo Log Buffer 에 있는 내용을 Redo Log File에 기록하라고 요청


 ※ LGWR이 Redo Log File에 기록하는 상황

 

- 3초마다

LGWR프로세스는 할 일이 없을경우 Sleep상태로 되었다가 Rdbms Ipc Message 라는 대기 이벤트의 Ttime Out이 되는 시점인 3초마다 한번씩 Wake Up을 해서 Redo Log Buffer에서 Redo Log File에 기록해야 할 내용이 있는지를 찾게된다. 그래서 기록할 부분이 있으면 Redo Log File에 기록한 후 Redo Log Buffer에서 기록된 해당 내용을 Flush 한다.

 

- Redo Log Buffer의 전체 크기인 1/3이 찼거나 1MB가 넘을경우 서버 프로세스는 Redo Log Buffer를 할당받을 때마다 현재 사용된 Log Buffer의 Block수를 계산한다. 만약 현재 사용된 Log Buffer의 Block수가 _LOG_IO_SIZE의 값보다 많을경우 LGWR에게 Redo Log Buffer의 내용을 Redo Log File에 기록하도록 요청한다.

 

- 사용자가 Commit 또는 Rollback을 수행할 때

사용자가 Commit을 수행하여 Redo Log File에 기록되는 것을 Sync Write라고도 한다

 

- DBWR이 LGWR에게 쓰기를 요청할 때

Oracle 8i부터는 DBWR이 LGWR의 on-disk RBA값보다 큰 high-RBA값을 가진 Block을 데이터파일로 기록해야 할 때 해당 Block을 Differed Write Queue에 기록시킨 후 LGWR프로세스를 먼저 수행시켜 해당 Redo Log를 먼저 내려쓰게 만든 후 Data Block을 기록하는 방식으로 Sync를 맞추게 됨.

 

위 조건들일 때 LGWR은 Redo Log Buffer에 있는 내용을 Redo Log File에 기록한 후 Redo Log Buffer에서

Redo Log File에 기록된 내용을 flush하게 된다.

 

LGWR이 Redo Log Buffer의 내용을 Redo Log File로 내려쓸 때 DBWR과 마찬가지로 Block단위로 내려쓴다. 여기서 내려쓰는 Block의 크기는 DB_BLOCK_SIZE로 결정되지만 LGWR이 내려쓰는 LOG Buffer의 Block크기는 DB_BLOCK_SIZE의 값이 아니라 OS Block Size이며 OS종류에 따라 다를 수 있다.

 

현재 Redo Log Block Size (단위 byte)

SQL> select max(lebsz) from sys.x$kccle;

 

 ※ Redo Log에 기록되지 않는 경우

 

- Direct load (SQL loader, insert /*+APPEND */)

- TABLE 생성, INDEX 생성시 nologging 옵션 (일반적인 insert, update, delete 작업은 모두 기록됨)

'ORACLE > Oracle DBMS' 카테고리의 다른 글

데이터베이스 객체의 종류  (0) 2018.11.02
SCN과 Checkpoint  (0) 2014.06.12
Redo Log  (0) 2014.06.12
Control File  (0) 2014.06.11
Oracle Character set 에 관하여  (0) 2014.06.10
Parameter file 초기화 파라미터 파일  (0) 2014.04.23

티스토리 툴바