1. Oracle의 데이터베이스 정의
- Database : 물리적인 디스크에 저장된 데이터의 집합. (물리적인 OS 파일의 집합)
- 인스턴스 : 공유메모리(SGA)와 이를 액세스하는 프로세스의 집합
2. 백그라운드 프로세스
프로세스명 | 설명 | |
SMON (System Monitor) | 비정상 종료된 인스턴스 재기동 시 인스턴스 복구 수행, 임시 세그먼트와 익스텐트 모니터링 | |
PMON (Process Monitor) | 이상이 생긴 프로세스가 사용하던 리소스 복구 | |
DBWn (Database Writers) | 버퍼캐시에 있는 Dirty 버퍼를 데이터파일에 기록 | |
LGWR (Log Writer) | 로그버퍼의 내용을 Redo 로그 파일에 기록 | |
ARCn (Archiver) | 꽉 찬 Redo 로그가 덮여 쓰여지기 전에 Archive 로그 디렉토리로 백업 | |
CKPT (Checkpoint) | 이전 체크포인트 마지막 시점 이후의 변경사항을 데이터파일에 기록하도록 트리거링 기록 완료 후 어디까지 기록했는지 컨트롤파일, 데이터파일 헤어데 저장. |
|
RECO (Recoverer) | 분산 트랜잭션 과정에 발생한 문제 해결 |
3. 데이터 저장 구조
프로세스명 | 설명 | |
블록(페이지) | 사용자가 실제로 데이터를 저장하는 공간. 대부분 DBMS는 블록 단위로 I/O | |
익스텐트 | 공간을 확장하는 단위. 데이터 입력 시 공간이 부족해지면 정해진 익스텐트 크기의 연속된 블록 할당 | |
세그먼트 | 익스텐트의 집합. 익스텐트 내 블록이 논리적으로 서로 인접한 반면, 익스텐트끼리 서로 인접하지는 않음. 데이터 저장공간을 사용하는 오브젝트를 저장공간을 사용하지 않는 뷰와 구분해서 세그먼트라고 부름. 저장공간을 사용한다는 것은 테이블 스페이스로부터 한 개 이상의 익스텐트 할당. |
|
테이블스페이스 | 세그먼트를 담는 컨테이너로서, 여러 데이터파일로 구성. 각 세그먼트는 한 테이블스페이스에만 속하지만, 한 테이블스페이스에는 여러 세그먼트 존재. 한 세그먼트는 여러 데이터 파일에 걸쳐 저장.(한 테이블스페이스가 여러 데이터 파이로 |
4. Undo를 사용하는 목적
1) Transaction Rollback
2) Transaction Recovery (-> Instance Recovery 시 rollback 단계)
3) Read Consistency
5. Redo를 사용하는 목적
1) Database Recovery(=Media Recovery)
2) Cache Recover (-> Instance Recovery 시 roll forword 단계)
3) Fast Commit
1) Redo 로그는 물리적으로 디스크에 결함이 생기는 등 Media Fail 발생 시 데이터베이스를 복구하기 위해 사용. 이때는 Archived Redo 로그 이용하게 되며 'Media Recovery'라고도 함
2) Redo 로그는 Cache Recovery를 위해 사용되며 'Instance Recovery'라고도 함. 모든 DB는 I/O 성능을 위해 버퍼캐시를 사용하지만, 버퍼캐시는 휘발성.
캐시에만 적용한 변경사항을 데이터파일에 기록하지 않은 상태에서 인스턴스가 비정상 종료되면 그때까지의 작업내용을 모두 잃기 때문에 이러한 트랜잭션 유실에 대비하기 위해 Redo 로그를 남김
3) Redo 로그는 Fast Commit을 위해 사용. 변경된 메모리 버퍼 블록을 데이터파일에 기록하는 작업은 Random 액세스 방식으로 이루어지기 때문에 느림. 반면 로그는 Append 방식으로 기록하므로 훨씬 빠르다.
따라서, 트랜잭션에 의한 변경사항을 건건이 데이터파일에 기록하기보다 우선 append 방식으로 빠르게 로그파일에 기록하고, 버퍼캐시 블록과 데이터파일 블록 간 동기화는 적절한 수단(DBWR, Checkpoint)을 이용해 나중에 일괄 수행.
로그 스위치는 너무 자주 발생하면 자칫 백업(Archive)을 완료하지 못한 Online Redo 로그로 스위칭이 일어나면서 DB Hang 발생 가능.
7. Redo 메커니즘
1) Log Force at commit
- DML을 수행하는 사용자 프로세스가 로그 버퍼에 로그를 기록하고 데이터 블록 변경.
- 이후 Log Writer(LGWR)가 주기적으로 로그 버퍼 엔트리를 Redo로그파일에 기록하는데 메모리상의 로그 버퍼는 언제든 유실 가능성 있음
- 따라서 트랜잭션의 영속성을 보장하려면 최소한 커밋 시점에는 로그를 메모리가 아닌 데이터 파일에 안전하게 기록해야 함.
2) Fast Commit
- 사용자가 요구한 갱신 사항을 휘발성인 버퍼캐시에만 기록한 채 아직 디스크에 영구기록 하지 않았더라도 Redo 로그를 믿고 빠르게 커밋을 완료한다는 의미
- 커밋정보가 로그파일에 기록되어 있기만 하면, 인스턴스 crash가 발생하더라도 Redo로그를 이용해 언제든 복구 가능
3) Write Ahead Logging
- 버퍼캐시 블록을 갱신하기 전에 먼저 Redo 엔트리를 로그 버퍼에 기록해야 하며, DBWR가 버퍼캐시의 Dirty 블록들을 데이터 파일에 기록하기 전에 LGWR가 해당 Redo 로그 엔트리를 모두 Redo 로그 파일에 기록했음이 보장되어야 함
8. Snapshot Too old
- 데이터를 읽는 도중 다른 트랜잭션에 의해 변경되거나 변경이 진행 중인 블록을 만나면 과거 시점으로 되돌린 CR Copy 블록을 만들어서 읽음
- 이 때, Undo 정보를 이용하는데, 필요한 Undo 블록이 다른 트랜잭션에 의해 재사용(overwriteing)된 상태면 CR Copy 생성 불가.
- 이 때, "Snapshot Too old' 에러 발생하므로 Snapshot too old는 undo 관련 메커니즘
9. SGA 구성 요소
- Database Buffer Cache : Disk I/O의 영향도를 줄이기 위해 Data File 의 Data Block을 메모리에 가져다 놓는다.
- Shared Pool : SQL 및 SQL 실행계획을 공유해서 같은 SQL의 Parsing은 권한 확인만 수행 하도록 만들어서 실행 속도를 높이도록 만든다. ( Data Dictionary Cache 를 활용해서 실행계획을 만들고 저장해서 공유한다. )
- Redo Log Buffer : 데이터 변경사항 ( DML 발생시) 정보를 가지며 Redo log file에 Write 되기 이전에 Memory에 먼저 Write 되는 영역
- Large Pool : Parallel Query 메시징 or 대용량의 메모리 할당이 필요한 경우 사용된다.
- Java Pool : Java Object에 대한 메모리 영역
- Stream Pool : Data 복제 등을 위한 Stream 사용 영역
9-1.Shared Pool (공유 풀)
1) Library Cache(라이브러리 캐시)
SQL 및 PL / SQL 문을 저장하는 데 사용. SQL이 실행될 때 라이브러리 캐시에 존재하는 명령문이 있으면 데이터베이스를 재사용하고 (Library cache hit) 그렇지 않으면 DB는 새 애플리케이션 코드를 작성(library cache miss).
라이브러리 캐시에는 공유 SQL 영역과 프라이빗 SQL 영역 존재. 공유 SQL 영역은 첫 번째 SQL 발생을 처리하고나면 모든 사용자가 공유. 하나의 고유한 명령문에는 오직 하나의 공유 sql 영역만 존재. 개인 SQL 영역은 고유 한 사용자 세션에 할당 된 비공유 메모리. 많은 개인용 SQL을 동일한 공유 SQL 영역에 연결할 수 있음.
2) Data dictionary cache (딕셔너리 캐시)
딕셔너리 캐시는 사용자 이름, 테이블 스페이스, 세그먼트, 테이블 정의, 인덱스, 뷰 등 메타 데이터에 대한 정보 저장. DDL이 사용되거나, 명령문이 parse되거나 더 많은 extents가 필요할 때 사용
3) Server Result cache:
데이터 블록 대신 sql 쿼리 결과 캐시, pl/sql 함수 결과 세트 저장.
4) Reserved pool
큰 연속 메모리 할당용
9-2 Database buffer cache
DB 버퍼 캐시는 데이터 파일에서 불러온 데이터 블록을 저장. 블록 관리를 위해 둘 이상 버퍼풀로 나뉨.
사용자는 버퍼 캐시에 대한 액세스 공유 가능.
DB 버퍼 캐시의 주요 목적은 lazy write를 통해 디스크 I/O를 최소화하여 성능 향상시키는 것. 즉 디스크 대신 자주 액세스 하는 블록 유지. 사용되지 않은 버퍼수가 적으면 데이터베이스가 버퍼 캐시에서 버퍼 제거.
9-3. Large pool
Large pool은 옵션 메모미. 공유 서버에 대한 UGA, 명령문 병렬 실행에 사용되는 메세지 버퍼, I/O용 버퍼, 백업 및 복구를 위해 RAM제공.
Large Pool과 Reserved pool의 차이점은 Large pool은 LRU(Least Recently Used) list를 가지고 있고 reserved pool은 공유풀에서 LRU list 사용
10.PGA 구성 요소
- SQL Work Area : 정렬에 관련된 작업 Sort by, Group by 같은 정렬이 필요할 경우 or Hash join 시 디스크 I/O를 감소
- Private SQL Area : SQL Runtime Memory Structure 로서 Cursor & Data Fetch 및 SQL 바인드 변수
댓글