메모리 구조: Redo

Kyojun Jin·2022년 9월 30일
0

SQLP

목록 보기
4/34

Redo Log

Redo log는 데이터베이스에서 만들어지는 모든 변경 사항을 그때마다 저장하는 로그이다.

Datafile 과 control file 의 변경사항은 모두 Redo Log에 기록된다.

변경 사항은 Redo Log 파일에 바로 저장되는 것이 아니라, Redo Log 버퍼에 저장되었다가 일정 조건 하에 파일로 옮겨진다.

로깅 파일

Datafile 과 control file 의 변경사항은 모두 Redo Log에 기록된다.

Redo log 은 Online Redo LogArchived Redo Log 파일로 나뉜다.

일단 오라클은 로깅을 바로 하는 것이 아니라, 변경사항이 있으면 Redo 버퍼에 저장을 하고, 이를 다시 로깅하는 방법을 따른다.

이때 이 버퍼에 있는 것이 저장되는 곳을 Online Redo Log 라고 한다.

Online Redo Log는 여러 개의 파일로 이루어져있는데, 각 용량은 정해져있다.

하나가 꽉 차면, 가장 먼저 생성된 Online Redo Log를 지우고 거기다 새 로그를 적게 된다.

이 동작을 Log Switching이라고 하며, Round-Robin 방식을 따른다.

또한, 지워진 곳에 있던 log 기록은 Archived Redo Log 에 저장된다.

Redo Log의 사용

1. 데이터베이스 복구

물리적인 문제가 생겨 블록 I/O가 실패하는 것을 Media Failure라고 한다.

이때 Archived Redo Log 을 이용하여 복구한다.

2. 캐시 복구

버퍼 캐시는 휘발성이다.
만일 도중에 오작동으로 시스템이 꺼지게 되면 캐시에서 디스크로 반영이 되지 않은 Dirty 버퍼들을 잃어버리게 된다.

이를 복구하기 위해 roll-forwardrollback의 과정을 거친다.

roll-forward 과정에서 마지막 체크포인트에서 사고 직전까지의 내용을 Online Redo Log 파일에서 불러와 버퍼 캐시를 복구한다.

rollback 과정에서 이 캐시 중 commit 되지 않은 transaction들을 undo 한다.

3. Fast Commit

매 수정 사항을 디스크에 기록하는 것은 좋지 않다.

디스크의 블록에 접근하는 것은 상당한 시간이 들지만, 수정 사항을 로그에 Append 하는 것은 시간이 적게 들어간다.

그래서 수정할 때마다 디스크에 반영하기 보단,
한 번에(batch) 수정하는 것이 낫다.

혹여 그동안 commit 했던 트랜잭션이 디스크에 반영되기 전에 시스템이 뻑이 났다면

캐시 복구를 해서 다시 살릴 수 있다.

로깅 시점

LGWR 프로세스는 백그라운드 프로세스로, 로그 버퍼 엔트리를 Redo Log 파일에 저장한다.

LGWR 프로세스가 내용을 Online Redo Log File 에 저장하는 시점은 다음과 같다.

1. 3초마다 DBWR 프로세스가 신호를 보낼 때

DBWR는 Dirty 버퍼를 데이터 파일에 기록하기 전에 로그 버퍼 내용을 Redo Log 파일에 기록하도록 LGWR에 신호를 보낸다.

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

1, 2는 대량의 트랜잭션이 발생했을 때를 대비해 미리미리 로그 버퍼를 비울 수 있도록 한다.

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

트랜잭션이 영속성을 보장받으려면 최소한 커밋 시점에는 Redo 정보가 메모리가 아닌 디스크에 안전하게 저장되어있음이 보장되어야 한다.

DBWR가 dirty 버퍼를 디스크에 저장하기 전에 Redo 로그를 남기는 (Redo 버퍼를 비우고 Redo 로그 파일에 저장하는) 이유는 나중에 복구하기 위해서이다.

이렇게 하지 않으면(커밋 여부를 기록하지 않고 데이터 파일에 바로 기록하게 되면) 나중에 redo 로그를 보고 복구된 (roll-forward) 캐시에서 커밋되지 않은 트랜잭션을 undo 할 수가 없다. (rollback)

이렇게 데이터 파일에 쓰기 전에 로그부터 남기는 것을 Write Ahead Logging 방식이라고 한다.

이때 Redo 로그에 기록해 둔 변경 사항 중에 어디까지를 데이터 파일에 기록했는지(데이터 파일과 버퍼 캐시가 어디까지 동기화 됐는지)를 관리해야 하는데, 이를 하는 주체가 체크포인트 프로세스이다.

장애가 발생했을 때 어디까지 복구해야 하는 지 확인할 때도 체크포인트가 쓰인다.

아래는 Redo 로깅 과정을 그림으로 나타낸 것이다.

0개의 댓글