Redo |
오라클은 데이터 버퍼 및 컨트롤 파일에 가해지는 모든 변경사항을 Redo Log Buffer에 차곡차곡 기록한다.
버퍼가 꽉 찬다면 LGWR 프로세스에게 요청하여 오래된 순서대로 Redo 파일에 쓴 다음 삭제하여 여유공간을 확보하는데,
이렇게 둥글게 둥글게 돌아가면서 재활용하는 방식을 라운드 로빈(Round-Robin) 이라고 한다.
Redo 파일도 한개만 있는것이 아니라 여러개가 존재하는데,
역시 하나의 Redo 파일이 꽉 차면 오래된 순서대로 백업한 뒤 재활용하는 라운드 로빈 방식을 사용한다.
이 때, Redo 파일의 번호가 바뀌는 것을 로그 스위칭(Log Switching)이라고 한다.
위의 프로세스에 의하여 백업된 Redo 파일은 "Offline Redo, Archived Redo" 라고 부르며
아직 백업되지 않은 Redo 파일은 "Online Redo" 라고 한다.
Redo의 목적 |
Redo는 다음의 목적을 위해 사용된다.
- Database Recovery (Media Recovery)
디스크가 깨지는 등의 Media Fail 발생 시,
백업된 Archived Redo 로그를 사용하여 데이터베이스 복구를 시도한다.
- Instance Recovery (Cache Recovery)
갑작스럽게 DB가 종료되는 등의 Instance Crash 발생 시,
마지막 체크포인트에서 Online Redo 로그를 활용하여 커밋여부를 불문하고 사고 직전의 캐시 상태를 복구한다음, (Roll-Forward 단계)
커밋여부를 가려서 커밋되지 않은 데이터를 롤백한다. (Roll-Back 단계)
위의 프로세스를 거치고 나면 사고가 발생하기 전에 커밋된 데이터만 남게된다.
- Fast Commit
데이터가 변경될 때 마다 건건히 OS에게 IO Call을 요청하는 것은 굉장히 비싸기 때문에,
오라클은 우선 변경사항이 발생할 때 마다 Buffer Cache와 Redo Log Buffer에 기록해놓고
나중에 한꺼번에 파일에 기록하는 방식을 사용하는데,
모든 변경이 완료된 뒤 커밋 명령어를 날렸을 때,
데이터 파일에 쓰는 것은 나중으로 미루지만,
메모리 안에서 빠르게 커밋을 완료하는 매커니즘을 Fast Commit 이라고 한다.
Redo 로그를 믿고 (장애가 발생하더라도 Instance Recovery로 복구할테니)
빠르게 커밋을 완료하는 것이다.
Note.
Log Force At Commit
Fast Commit에서 트랜잭션의 영속성를 보장하기 위해선,
변경점이 캐시에 쓰여지기 전에 Redo Buffer의 내용을 먼저 디스크에 기록해야 한다.
Fast Commit되어 캐시에는 기록되었지만 Redo 파일에 적히지 않은 변경사항은
디스크에 쓰여지기 전에 Instance Crash가 발생한다면 커밋된 내용이 사라지기 때문이다.
즉, 커밋된 데이터를 지키기 위해
Log Force At Commit 매커니즘이 필요하다.
Note.
Write Ahead Logging
트랜잭션의 원자성을 보장하기 위해선,
변경점이 디스크에 쓰여지기 전에 Redo Log를 먼저 디스크에 기록해야 한다.
Instance Crash가 발생했을 때 오라클은 Redo의 내용을 전부 재현한 뒤에
Redo 내용들의 커밋여부를 가려내어 롤백하기 시작하는데,
애초에 Redo 파일에 적혀있지 않았다면 감찰대상에서 제외되기 때문이다.
즉, 커밋되지 않은 데이터가 커밋될 수 있기 때문에
Write Ahead Logging 매커니즘이 필요하다.
LGWR 프로세스 |
Redo Log Buffer의 내용을 디스크에 기록하는 작업은 LGWR 프로세스가 담당하며,
아래의 시점에서 자동으로 호출된다.
- 3초마다 DBWR 프로세스로부터 신호를 받을 때.
- 로그 버퍼의 1/3이 차거나 Redo 레코드 량이 1MB를 넘을 때.
- 사용자가 커밋 또는 롤백 명령을 날릴 때.
1, 2번은 작업량이 한꺼번에 몰리는 것을 막기 위해서이고,
3번은 이미 Log Force At Commit에서 설명하였다.
위 시점에서 LGWR 프로세스가 Redo 로그를 디스크에 기록할 때,
log file sync 대기 이벤트가 발생한다.
'# 미사용' 카테고리의 다른 글
Router : 여러개의 라우터가 호출될때 (0) | 2018.06.28 |
---|---|
Router : 재사용 가능성 (0) | 2018.06.28 |
오라클 Buffer Lock (0) | 2018.05.19 |
오라클 DB Buffer Cache (0) | 2018.05.17 |
오라클 기본 아키텍쳐 (0) | 2018.05.15 |