오라클은 데이터파일과 컨트롤 파일에 가해지는 모든 변경사항을 하나의 Redo 로그엔트리로서 Redo 로그에 기록한다.

Redo 로그는 Online Redo, Archived(offline) Redo 로그로 구성된다.

Online Redo 로그는 Redo 로그 버퍼에 버퍼링된 로그 엔트리를 기록하는 파일로서, 최소 두 개 이상의 파일로 구성된다. 현재 사용 중인 Redo 로그 파일이 꽉 차면 다음 Redo 로그 파일로 로그 스위칭이 발생하며, 계속 Redo 로그를 써 나가다가 모든 Redo 로그 파일이 꽉 차면 다시 첫번째 Redo 로그 파일부터 재사용하는 라운드 로빈 방식을 사용한다.

Arcived Redo 로그는 Online Redo 로그가 재사용되기 전에 다른 위치로 백업해둔 파일을 말한다.

 

Redo의 3가지 목적

1. Database Recovery(Media Recovery) : Redo 로그는 물리적으로 디스크가 깨지는 등의 Media Fail 발생시 데이터베이스를 복구하기 위해 사용되며, 이땐 Archived Redo로그를 이용하게 된다

2. Cache Recovery(=Instance Recovery) : 모든 데이터베이스 시스템이 버퍼 캐시를 도입하는 것은 I/O 성능을 향상시키기 위함이지만, 버퍼 캐시는 휘발성이다. 따라서 캐시에 저장된 변경사항이 디스크 상의 데이터 블록에 아직 기록되지 않은 상태에서 정전등이 발생해 인스턴스가 비정상적으로 종료하면 그동안 작업 내용을 읽는다. 이러한 트랜잭션 데이터의 유실에 대비하기 위해 Redo 로그를 사용한다.

Instance Crash 발생 후 시스템을 재기동하면 우선 Onlin Redo 로그에 저장된 기록 사항들을 읽어들여 마지막 체크포인트 이후부터 사고 발생직전까지 수행되었던 트랜잭션을 재현한다. 그러면 버퍼 캐시에만 수정하고 데이터파일에는 반영되지 않았던 변경사항들이 복구되며, 이는 트랜잭션의 커밋여부를 불문하고 일단 버퍼캐시를 시스템이 셧다운 되기 이전 상태로 되돌린다. 

Cache Recovery가 완료되면 Undo 데이터를 이용해 시스템이 셧다운 되는 시점에 아직 커밋되지 않았던 트랜잭션들을 모두 롤백하는 Transaction Recovery가 진행된다. 이후 커밋되지 않은 기록사항들은 모두 제거되어 데이터파일에 커밋에 성공한 데이터만 남게되어 데이터베이스는 완전히 동기화된 상태가 된다.

3. Fast Commit : 변경된 메모리 버퍼 블록을 디스크 상의 데이터 블록에 기록하는 작업은 Random 액세스 방식으로 이루어지기 때문에 느리다. 로그는 Append 방식으로 기록하므로 상대적으로 매우 빠르다. 그래서 트랜잭션 발생 시 건건이 데이터 파일에 기록하기보다 우선 변경사항을 Append하는 방식으로 빠르게 로그 파일에 기록하고 메모리 데이터 블록과 데이터 파일 간 동기화는 적절한 수단을 이용해 나중에 배치 방식으로 일관 수행한다. 사용자의 갱신내용이 메모리상의 버퍼블록에만 기록된 채 아직 디스크에 기록되지 않았지만 Redo 로그를 믿고 빠르게 커밋을 완료한다는 의미로 Fast Commit이라고 한다. 적어도 커밋 정보가 로그에 기록돼 있기만 한다면 인스턴스 Crash가 발생해도 Redo 로그를 이용해 언제든 Recovery가 가능한 상태가 되어 오라클은 안심하고 커밋할수있다

 

Fast Commit은 DBMS의 공통적인 매커니즘이다. 근데 오라클만의 특징이 있는데, 'Delayed 블록 클린아웃'이다. 완전한 커밋을 위해서는 Lock을 해제하는 일까지 완료해야 하는데 다른 DBMS는 Lock 매니저를 통해 로우 Lock을 관리하기 때문에 커밋 기점에 빠르게 Lock 리소스를 해제할 수 있다. 반면 오라클은 Lock 매니저 없이 레코드의 속성으로서 로우 Lock을 구현하므로 Lock을 해제하려면 갱신했던 블록들을 일일히 찾아다녀야한다. 그래서 Redo 로그에 기록하는 것만으로는 도저히 커밋을 빠르게 처리할 수 없다. 그래서 Delayed 블록 클린아웃을 사용한다.

 

LGWR 프로세스에 의해 Redo 로그를 기록하는 시점

1. 3초마다 DBWR 프로세스로부터 신호를 받을때

2. 로그 버퍼의 1/3이 차거나 기록된 Redo 레코드량이 1MB 넘을때

3. 사용자가 커밋 또는 롤백 명령을 날릴때 (핵심)

+ Recent posts