Redo
오라클은 데이터 파일과 컨트롤 파일에 가해지는 모든 변경사항을 하나의 Redo 로그 엔트리로서 Redo 로그에 기록
Redo 로그 종류
Online redo 로그 : Redo 로그에 버퍼링된 로그 엔트리 기록, 최소 두개이상의 파일로 구성, 사용중인 Redo 로그 파일이 꽉차면 로그 스위칭
Archived Redo 로그 : Online Redo 로그가 재사용되기 전에 다른 위치로 백업해둔 파일
Redo 로그의 목적
1. Database Recovery
물리적으로 디스크 깨지는 Media Fail 발생시 데이터베이스 복구를 위해 Archived Redo 로그 사용
2. Cache Recovery
Instance Crash 발생 후 시스템을 재기동하면 Online Redo 로그에 저장된 기록을 읽어 마지막 체크포인트 이후부터 사고 발생 직전까지 수행된 트랜잭션 재현 => Roll forward
Roll forward : 버퍼 캐시에만 수정하고 데이터 파일에 반영되지 않았던 변경사항을 복구, 트랜잭션의 커밋여부를 불문하고 일단 버퍼 캐시를 시스템이 셧다운 되기 이전 상태로 되돌리는 것
3. Fast Commit
변경된 메모리 버퍼 블록을
- 디스크 상의 데이터에 블록에 기록하는 작업은 Random 액세스 방식으로 이루어져 느림
- 로그는 Append 방식으로 기록하므로 상대적으로 매우 빠름
트랜잭션 발생시 건건이 데이터 파일에 기록하기 보다 변경사항을 Append 방식으로 빠르게 로그 파일에 기록하고 메모리 데이터 블록과 데이터 파일 간 동기화는 DBWR, Checkpint를 이용해 배치 방식으로 일괄 수행
Redo 레코드를 기록하는 과정
1. 사용자 커밋
2. 서버 프로세스는 커밋 레코드를 Redo 로그 버퍼에 기록
3. LGWR가 즉시 트랜잭션 로그 엔트리와 함께 Redo 로그 파일에 저장
4. 커밋을 수행한 서버 프로세스에 'success code' 리턴
Log Force at Commit : 4번 이후 DBWR 수행되어 디스크에 Dirty 블록 동기화 시키지만 Instance Crash가 발생하더라도 Redo를 통해 복구 할 수 있음
Write Ahead Logging : DBWR가 버퍼 캐시로부터 Dirty 블록들을 디스크에 기록하기 전에 LGWR가 해당 Redo 엔트리를 모두 Redo 로그파일에 기록을 보장
Undo
Undo 세그먼트는 테이블 세그먼트와 아래와 같은 구조적 동일성을 가진다
1. 익스텐트 단위 확장
2. 빠른 읽기/쓰기를 위해 Undo 블록들을 버퍼 캐시에 캐싱
3. 데이터 유실을 방지하기 위해 변경사항을 Redo 로그에 로깅
Undo 세그먼트 목적
1. Transaction Rollback
트랜잭션 롤백 시 Undo 데이터 활용
2. Transaction Recovery
Instance Crash 발생 후 Redo를 이용해 Roll forward 단계가 완료되면 최종 커밋되지 않은 변경사항을 모두 복구
시스템 셧다운 시점에 아직 커밋되지 않았던 트랜잭션을 롤백할 때 Undo 활용
3. Read Consistency
Undo 데이터 활용해 읽기 일관성 제공
(1) Undo 세그먼트 트랜잭션 테이블 슬롯
Undo 세그먼트의 첫번재 익스텐트 중 첫번째 블록에는 Undo 세그먼트 헤더 정보가 담긴다
Undo 세그먼트 헤더에는 트랜잭션 테이블 슬롯이 위치하고, 슬록에 기록되는 사항은 아래와 같다
1. 트랜잭션 ID
2. 트랜잭셩 상태정보
3. 커밋 SCN
4. Last UBA(Undo BLock Address)
5. 기타
트랜잭션을 시작하려면 먼저 Undo 세그먼트에 있는 트랜잭션 테이블로부터 슬롯을 할당받아야하고, 할당 받은 슬롯에 자신이 현재 Active 상태임을 표시하고 갱신 시작
(2) 블록 헤더 ITL 슬롯
각 데이터 블록과 인덱스 블록헤더에는 ITL 슬롯이 위치
특정 볼록에 속한 레코드를 갱신하려면 먼저 블록 헤더로부터 ITL 슬롯을 확보해야 한다.
ITL 슬록에 트랜잭션 ID를 기록하고 현재 해당 트랜잭션이 Active 상태임을 표시한후에 블록 갱신이 가능
1. ITL 슬롯 번호
2. 트랜잭션 ID
3. UBA
4. 커밋 Flag
5. Locking 정보
6. 커밋 SCN
(3) Lock Buyte
블록에 레코드가 저장되는 로우마다 그 헤더에 Lock Byte를 할당해 해당 로우를 갱신 중인 트랜잭션의 ITL 슬롯 번호를 기록
레코드 갱신 과정
1. 대상 레코드의 Locy Buyte가 활성화 시
2. ITL 슬롯을 찾아가고
3. 다시 ITL이 가리키는 트랜잭션 테이블 슬롯을 찾아가 트랜잭션이 active 상태면 트랜잭션이 완료 될 때 까지 대기
문장수준 읽기 일관성
(1) 문장수준 읽기 일관성
단일 SQL 문이 수행되는 도중 다른 트랜잭션에 의해 데이터의 추가 변경 삭제가 발생하더라도 일관성 있는 결과집합을 리턴하는 것

(2) Consistent 모드 블록 읽기
CR 블록은 Current 블록의 복사본
트랜잭션 시작 시 SCN 보다 큰 블록은 그 이전의 SCN 값으로 Undo를 통해 되돌려서 읽음
이때 Undo가 롤백을 진행하지 못하면 Snapshot Too Old 발생