#리두와 언두 작동 원리

언두 정보는

리두에 의해서도 보호됨

2단계 복구 프로세스

1 롤포워드 → 2 롤백

Demo#1 (INSERT-UPDATE-DELETE 시나리오)
{code:sqlborderStyle=solid}
insert into t (x, y) values (1, 1);
update t set x = x + 1 where x = 1;
delete from t where x = 2;
{code}
순번구분REDOUNDO상태비고
1{code:noneborderStyle=solid}INSERT{code}많이발생조금발생
  • 디스크[언두, 인덱스, 테이블] → 버퍼캐시[언두, 인덱스, 테이블] → 리두로그버퍼[언두, 인덱스, 테이블]
2{code:noneborderStyle=solid}(가설)시스템 중단시{code}
  • INSERT 작업은 없던일이 되며, 복구도 발생하지 않음
리두로그버퍼가 디스크에 플러시 되기 전이라고 가정
3{code:noneborderStyle=solid}(가설)버퍼캐시 풀방{code}
  • 버퍼캐시 확보를 위해 DBWR 이 블록을 디스크로 내려 쓰기 전에, LGWR 에게 리두 엔트리를 내려 쓰도록 요청 (발생한 언두의 리두 포함)
복구(롤백)을 위해 리두 먼저 플러시
4{code:noneborderStyle=solid}리두로그버퍼의 플러시{code}디스크에 플러시
  • 매 3초 마다
  • 리두 로그 버퍼가 1/3 이상 찬 경우
  • 리두 로그 버퍼에 저장된 데이터 크기가 1MB 정도 되는 경우
  • 커밋이 일어난 경우
  • 커밋하지 않은 채 버퍼 캐시에서만 변경된 블록이 존재하고, 그러한 커밋되지 않은 변경 내용을 디스크에 리두 : 자주 발생 하는 정상 시나리오
5{code:noneborderStyle=solid}UPDATE{code}발생발생
  • 디스크[언두, 인덱스, 테이블] → 버퍼캐시[언두, 인덱스, 테이블] → 리두로그버퍼[언두, 인덱스, 테이블]
INSERT 로 인해 생성된 리두 로그의 일부만 디크스에 플러시 되었다고 가정
6{code:noneborderStyle=solid}(가설)시스템 중단시{code}1. 재시작시, 전 단계에서 플러시된 리두 로그로 롤 포워드(INSERT)
2. 트랜잭션이 커밋되지 않은것을 발견하고 롤백(롤 포워드된 INSERT 의 언두 사용)
리두 엔트리가 플러시 될때는 그것에 해당하는 언두의 리두도 항상 같이 플러시 될까?
7{code:noneborderStyle=solid}(가설)AP가 트랜잭션 롤백{code}-사용함1. 메모리(디스크)의 언두 세그먼트 블록에서 언두 정보 확보
2. 언두 정보를 메모리(디스크)의 데이터/인덱스 블록에 반영
  • 롤백시 리두로그를 사용하지 않는다
  • 리두로그를 읽을 때는 복구 할때와 아카이브 생성시 뿐이다 (정상시 읽는일 없음)
  • 위의 사실로 인해 리두로그는 경합이 거의 없다 (리두 로그의 물리적 구성 확인 필요)
8{code:noneborderStyle=solid}DELETE{code}조금발생많이발생
9{code:noneborderStyle=solid}COMMIT{code}디스크에 플러시일관적인 읽기에 활용됨
  • 변경된 블록은 버퍼 캐시에, 모든 리두 로그는 디스크에 있음
  • 디스크에 반영되지 않은 변경된 블록이 있는 상태에서 장애가 발생해도 리두 로그로 복구 가능
  • 언두 정보는 일관적인 읽기를 위해 필요로 하는 세션이 활용함, 나중에 다른 트랜잭션에서 재사용 됨