오라클] 리두 로그(Redo Log)

2018.12.10 07:00



리두 로그(Redo Log)



오라클 아키텍처에 대해 처음 접할 때 헷갈리고 이해하기 어려웠던 것 중 하나가 리두 로그(Redo Log)다. 



Redo  다시 한다. 


뭘 다시 할까?




일단 리두 로그에 데이터가 저장되는 상황을 먼저 살펴보면 






1. 유저가 데이터를 수정하면 서버 프로세스는 변경된 데이터를 리두 로그 버퍼에 기록한다. 


2. 서버 프로세스는 리두 로그 버퍼에 데이터를 기록한 후 데이터 버퍼 캐시에도 변경 내용을 기록한다. 


3. 로그 라이트 프로세스(LGWR)는 리두 로그 버퍼를 관리하다 커밋이 일어나거나 리두 로그 버퍼가 일정량 차면 디스크에 있는 리두 로그 파일에 기록한다. 


 리두 로그 버퍼의 내용을 리두 로그 파일로 기록하는 경우는 아래의 경우이다.

   . 커밋이 발생할 때

   . 리두 로그버퍼가 1/3이 찼을 때

   . 3초마다

   . 변경량이 1M이 되었을 때

   . DBRW가 디스크에 내려쓰기 전에



4. 데이터베이스 라이터 프로세스(DBWR)는 데이터 버퍼 캐시를 관리하다 아래의 경우 디스크 파일로 버퍼 캐시의 내용을 저장한다

   . 체크 포인트 신호가 발생했을 때

   . 더티 버퍼가 임계값에 찼을 때

   . 타임아웃이 발생했을 때

   . 테이블스페이스가 오프라인 될 때

   . 테이블스페이스가 begin backup이 될 때





* 커밋이 발생하면 변경된 데이터가 디스크로 저장된다고 생각하기 쉽다. 

오라클에서는 커밋 했을 때 수정된 데이터가 디스크에 기록되는건 맞지만 데이터가 저장되는 위치는 dbf 파일이 아니라 리두 로그 파일로 저장된다. 

그 후 위에서 언급한 상황이 발생하면 데이터 버퍼 캐시의 관리하에 데이터 파일로 저장된다. 



* 리두 로그에 먼저 기록하고 나서 데이터를 변경하는 방법을 Log Ahead Method 또는 Write-Ahead라고 한다고 하는데 이렇게 번거로운 방법을 사용하는 이유는 데이터 버퍼 캐시의 기록을 디스크에 기록하는 것보다 리두 로그 버퍼의 내용을 디스크에 기록하는게 훨씬 빠르기 때문이다. 


10g 기준으로 데이터 버퍼 캐시의 블록은 8KB인데 리두 로그 버퍼의 블록은 512KB(Windows, Linux, AIX 등) 또는 1KB(HP-UX)를 사용하기 때문에 작은 데이터가 변경되었다면 데이터 버퍼 캐시보다 리두 로그 버퍼의 내용을 기록하는게 훨씬 빠르다. 거기다 데이터 버퍼 캐시는 변경된 데이터를 저장하려면 원래 데이터가 저장되었던 위치를 찾아서 수정해줘야 하는데 반해서 리두 로그 버퍼는 리두 로그 파일에 순서대로 쭉쭉 써주면 되기 때문에 훨씬 빠르게 저장할 수 있다.


(리두 로그 버퍼의 블록 사이즈는 11g부터 Redo log file을 생성할 때 512byte, 1KB, 4KB 중에서 선택해서 생성할 수 있게 되었다)



* 만약 리두 로그 파일이 장애가 나거나 사용할 수 없는 경우라면 LGWR는 alert 로그에 해당 에러를 기록하고 커밋을 수행하지 않고 대기상태로 들어가게 된다. 



* 만약 데이터 수정 후 커밋을 발생시켜서 LGWR이 리두 로그 버퍼 내용을 리두 로그 버퍼에 기록했지만 아직 데이터 파일에 저장되지 않은 상태에서 인스턴스에 어떤 장애가 발생한다면 오라클은 리두 로그 파일의 내용을 참고해서 커밋한 내용을 데이터 파일에 반영해서 수정한다. 


즉. 리두 로그의 내용을 다시(Re) 기록한다(Do)



* 리두 로그 파일은 리두 로그 버퍼의 내용을 디스크에 저장한다. 장애시 인스턴스 복구를 위한 중요성 때문에 몇 개의 그룹으로 만들어 순환 사용하는 방식이다(한 개의 그룹 안에는 다시 몇 개의 멤버로 구성해서 다중화)



* 리두 로그 파일이 1그룹 ⇒ 2그룹  ⇒ 3그룹 ⇒ 다시 1그룹으로 순환하는 방식이기 때문에 잦은 로그 스위치기 일어나면서 맨 처음의 리두로그 파일을 덮어쓰는 문제를 해결하고자 별도의 지정된 디스크에 따로 리두 로그 파일을 복사해서 관리할 수 있는데 이것을 아카이브 로그 모드(Archive Log Mode)라고 한다




< 리두 로그 파일에 대한 내용과 리두 로그 그룹에 대한 이전 블로그 글 >


[SQL(오라클,mysql)] - 오라클] 리두 로그 파일(Redo Log File)




< 아카이브 로그에 대한 이전 블로그 글 >


[SQL(오라클,mysql)] - 오라클] 아카이브 로그 모드(Archive Log Mode)




또루아빠 SQL(오라클,mysql) , , , , , , , , , , , ,