목차
참고1. Connecting to an Oracle Instance
참고2. Select Query 실행 과정
참고3. Update Query 실행 과정
Redo log file이란?
Redo log의 목적
Redo Log Buffer를 Redo File에 기록하는 시점
참고4. SCN이란?
Fast Commit
Delayed Block Clean Out
Write Ahead Logging
LogFileSync 대기 이벤트
Redo 관련된 Parameter 및 옵션
1. User Process 가 SQL 문장을 가지고 DB Server의 Listener에게 접속 요청
2. Listener는 Listener.ora라는 파일을 참고하여 접속 요청을 확인
3. Listener가 접속 요청 확인 후 적절한 요청이면 DB Server 에Server Process 생성
4. 생성된 Server Process는 User Process의 쿼리를 받아서 Instance에 접속해서 해당 쿼리 수행
5. 결과를 User Process에게 전달하여 사용자가 결과를 확인할 수 있음
Redo log file은 Redo log buffer에 기록된 내용을 기록해 두는 파일.
Redo log buffer는 휘발성으로 LGWR을 통해 여러 조건에 맞을 때 안전하게 파일에 기록.
DB에 장애가 생겼을 때 redo log file이 없으면 데이터를 복구할 수가 없음.
1. Database Recovery
2. Cache Recovery
3. Fast Commit
Database Recovery
- 물리적으로 Database 가 손상되었을 경우 복구하게 되며,
이 부분은 백업부분을 restore 한 뒤에 장애가 나기전 시점, 혹은 원하는 시점까지
recovery 하는 부분. Media recovery 라고 하며 이 경우 주로 Archive log 를 이용한다.
Cache Recovery
- Instance 가 비정상 적으로 종료되고 재기동 하면 Online Redo 로그에 저장된 기록을
읽어들어 마지막 체크포인트이후 부터 사고 직전까지 수행되었던 트랜잭션을 재현한다.
Roll forward 단계라고 치며, 버퍼캐시에만 수정하고 데이터파일에는 반영되지 않았던
변경사항들이 복구된다, 여기서는 트랜잭션 Commit 여부를 확인하지 않는다.
이후 Transaction Recovery 가 시작되며, 여기서 UNDO 데이터를 이용한 Commit 여부를 체크한다.
시스템이 비정상 종료 되는 시점에 Commit되지 않았던 트랜잭션을 모두 Rollback 진행하여
데이터파일에는 커밋에 성공한 데이터만 남게 되며, 데이터베이스는 완전히 동기화 됩니다.
Fast Commit
- 사용자의 갱신사항을 메모리의 버퍼블록에만 기록한 채 아직 디스크에 기록되지 않았지만
Redo 로그를 믿고 빠르게 커밋한다고 의미에서 Fast Commit 이라고 부른다.
LGWR이 내려 쓰는 경우
1. Commit이 발생했을 때
2. 1/3이 찼을 때
3. 변경량이 1M가 되었을 때
4. 3초 마다
5. DBWR이 내려 쓰기 전에
commit을 수행한다고 디스크로 데이터를 내려쓴다는 건 아닙니다.
System Commit Number(SCN)이란?
Commit이 발생하게 되면 LGWR의 해당 트랜잭션은 고유한 번호를 부여 받아서 관리하게 되는데,
이렇게 Commit 할 때 생성되는 번호를 System Commit Number(SCN)이라고 부른다.
오라클은 SCN 번호를 가지고 트랜잭션을 관리하면서 장애 발생시 복구도 하게 된다.
System Commit Number(SCN)의 구조
SCN은 크게 SCN base(4bytes) + SCN Wrap(2 bytes)로 구성.
(초당 16,000회를 발생시켜도 약 500년 가까이 사용할 수 있을 정도)
그래서 SCN값은 DB를 다시 생성하지 않는 한 0으로 돌아가지 않음.
SCN 기록 장소와 시점
1. Control file header
- check point 발생 시
- Resetlogs 발생 시
- incomplete recovery 수행 시
2. Data blocks (cache Layer)
- Block CleanOut 시 마지막 SCN을 각 블록에 기록
3. Data blocks (ITL entries)
- Data block 의 transaction Layers 안에 있는 ITL entries 에 commit 된 SCN 정보 기록
(delayed block cleanout)
4. Datafile Headers (모든 데이터 파일 헤더에 아래의 경우에 SCN을 기록)
- 마지막 Check Point 발생 시
- begin backup 수행 시
- 복구가 되었다면 사용 된 마지막 SCN을 기록
5. Redo Records / log buffer
- commit이 수행되면 commit record 에 SCN을 포함하여 저장
6. 그 외 undo segment 와 tablespace Headers 에도 기록
SCN 관련 뷰 참고
select * from v$sysstat where name = 'calls to kcmgas';
- SCN은 Sequence에서 발생시키는 것이 아니라 steve adams가 개발한 "kcmgas" function으로 구현
- 조회하면 value 값에 현재 SCN 값을 확인 가능
select * from v$transaction;
- DMS 수행 후 조회하면 다음에 발생 될 SCN 정보 확인 가능
등등
System Change Number(SCN)이란?
datafile, redo log file, control file 간의 동기화 정보를 맞추기 위해 사용
Data block Header, Redo records, Segment Header에 기록
System Change Number(SCN)의 구조
scn_base(4 bytes) + scn_wrap(2 bytes) + scn_sequence(1 byte) 로 구성
sequence는 동일한 SCN 블록을 여러개의 서버 프로세스가 동시에 변경할 경우 구분을 위해 사용
Fast Commit
- 사용자의 갱신사항을 메모리의 버퍼블록에만 기록한 채 아직 디스크에 기록되지 않았지만
Redo 로그를 믿고 빠르게 커밋한다고 의미에서 Fast Commit 이라고 부른다.
h5.Delayed 블록 클린아웃 (Clean out)
오라클 경우 별도의 Lock 매니저 없이 레코드 속성으로 Lock을 구현하였기 때문에 Lock을
해재할라면 블록을 일일이 찾아다녀야 됨으로 커밋 시점에는 Undo 세그먼트 헤더의
트랜잭션 테이블에만 커밋 정보를 기록하고, 블록 클린아웃은 나중에 수행하도록 한다.
h5.Write Ahead Logging
Buffer Cache 에 있는 블록버퍼를 갱신하기전에 먼저 Redo buffer 에 기록.
(LGWR) Redo log buffer 기록되어 있는 해당 redo 엔트리를 모두 redo log file 에 기록 후에
(DBWR) Buffer Cache 에 있는 Dirty 블록들을 디스크에 갱신할 수 있다.
h5.LogFileSync 대기 이벤트
LGWR 프로세스가 Redo 로그 버퍼의 Redo 엔트리를 Redo 로그에 기록 완료 할 때까지 발생 하는 대기 이벤트
nologging : 최소한의 로그는 생성 됨
(Data Dictionary 변경 내역, 새로 할당된 Extent 상태 변경(Invalid) 내역)
기본적으로 Nologging 으로 진행되는 부분.
관련된 Parameter
SQL> select group#, bytes, status from v$log;
GROUP# BYTES STATUS
---------- ---------- ----------------
1 1048576 INACTIVE
2 1048576 CURRENT
3 1048576 ACTIVE