PGA(Program Global Areas)
오라클은 서버 프로세스나 백그라운드 프로세스가 시작될때 자기만의 메모리인 PGA를 가진다. PGA는 비공유 메모리로 각 서버 프로세스에 대한 데이터 및 제어 정보를 포함하고 있다. 또한, 유저의 글로벌 데이터나 세션 상태정보, 참조되는 포인터 정보등을 저장되어 있으며 정렬 공간과 임시 테이블을 가지고 있다.
SGA(System Global Area)
- Shared pool
Shared pool안에는 공유 SQL 영역과 라이브러리 캐시가 들어있다. 공유 SQL 영역은 sql 문장을 수행하는 영역이며 서로 다른 유저간에 공유할 수 있는 다양한 구성 요소를 캐시에 저장할 수 있다. 파싱된 정보는 라이브러리 캐시에 적재되며 옵티마이저는 “sql문장을 어떻게 빠르게 수행할까?”를 계산해서 실행계획을 만들고 저장한다.
옵티마이저 : 사용자가 작성한 sql문에 대한 여러 실행 방법들 중에서 최적의 실행 방법(실행계획)을 결정하는 역할을 한다.
하드 파싱 : sql 문장이 기계가 인식할 수 있는 수준으로 내부적으로 컴파일하는 과정을 말한다.
소프트 파싱 :기존에 만들어져 있는 정보(하드 파싱한 정보)를 재사용하는 것을 말한다. sql문장을 처리하는 속도가 향상된다.
- Large pool
오라클에서 백업이나 Recovery 작업을 할때 대용량의 메모리 할당을 제공하는 선택적 영역이다.
- Java pool
Java pool은 오라클 데이터베이스에서 자바를 이용할 수 있도록 하기 위해 만들어진 영역이다. Java pool에는 JVM(Java Virtual Machine)에 접속된 모든 세션별 Java 코드와 데이터, 실행 계획들이 저장된다.
- Database buffer cache
데이터 파일에서 읽은 데이터 블록을 복사해서 보관하는 영역이다. 첫번째 유저가 데이터 사용시 블럭단위로 데이터 버퍼에 캐싱이 되면 다음 유저는 버퍼 캐시에 저장된 캐시를 통해 빠르게 데이터를 이용할 수 있다. 데이터 파일의 크기보다 메모리 적재하는 데이터가 작기 때문에 꽉차면 가장 오래전에 액세스된것을 밀어버리고 새로운 데이터가 적재된다. (LRU 방식)
- Redo log buffer
Instance recovery할 때 사용되는 리두 정보가 디스크에 저장되어 있는 리두 로그 파일에 기록될 때까지 변경된 정보롤 저장한다.
- Streams pool
Oracle Streams 프로세스용 메모리를 제공한다.
백그라운드 프로세스
오라클 데이터베이스 시스템에서 Oracle Instance가 시작하게 되면 오라클 도구(SQL *Plus, SQL Developer)를 실행하는 유저 프로세스와 서버 코드를 실행하는 서버 프로세스가 시작 된다. 또한, 백그라운드 프로세스도 실행되며 데이터베이스의 성능을 최대화시키고, 많은 유저들을 수용할 수 있도록 한다.
- DBWR(데이터베이스 기록자 프로세스)
DBWn은 데이터 버퍼 캐시에 있는 데이터를 데이터 파일로 내려쓰는 작업을 한다. 데이터 버퍼 캐시에 데이터를 올려두고 데이터를 변경할 경우 변경데이터를 리두 로그 버퍼에 저장하고 리두 파일에 저장되게 된다. 그리고 나서 commit하고 checkpoint가 이루어질때까지 덮어쓰는데 그전까지의 버퍼 캐시를 더티 버퍼라고 한다. DBWR은 checkpoint가 이루어질때 변경내용을 내려쓰거나 주기적으로 내려쓴다. DBWR의 개수는 최대 10개 까지 cpu 개수만큼 늘어날 수 있어 DBWn이라고도 불린다.
- LGWR(로그 기록자 프로세스)
Redo Log Bufffer의 내용을 디스크에 있는 Redo Log File에 내려 쓰는 작업을 한다. 리두로그 버퍼가 1/3 찼거나 유저 프로세스가 트랜잭션을 commit할 때 내려쓴다.
- CKPT(체크포인트 프로세스)
DBWR에게 데이터를 내려쓰라고 명령을 하고 checkpoint정보를 control file(데이터베이스의 파일의 물리적인 위치)과 데이터 파일 헤더에 저장한다. control file에는 checkpoint위치와 동기화 정보를 가진다.
- SMON(시스템 모니터 프로세스)
인스턴트가 실행될 때 Recovery가 필요할 경우 SMON이 Recovery를 수행하며 사용하지 않는 임시 테이블 스페이스나, 세그먼트를 지우는 작업을 한다.
- PMON(프로세스 모니터 프로세스)
유저 프로세스가 비정상적으로 종료되거나 실패했을 때 Recovery를 수행하고, 데이터베이스 버퍼 캐시를 정리하는 역할을 한다. 고아 프로세스나 좀비 프로세스를 정리하고 Idle 세션을 관리한다.
- RECO(복구자 프로세스)
분산 데이터베이스에서 시스템 장애나 네트워크 문제로 인해 트랜잭션을 실패했을 떄 자동으로 해결해준다.
- LREG(리스너 등록 프로세스)
LREG는 인스턴스가 시작되었을 때 리스너에게 db에 대한 정보를 등록시켜주는 역할을 한다. 리스너가 시작한 후 LREG는 최대 60초 안에 자동으로 리스너에 db를 저장하며(동적) alter system register 명령을 실행할 경우 수동으로 db를 등록할 수 있다.
- ARCn(아카이버 프로세스)
리두 로그 파일의 내용이 가득 차면서 로그 파일이 스위치 될때 리두로그 파일을 아카이브 저장소로 복사한다. ARCn은 10개까지 생성될 수 있으며 아카이브 모드일 때만 사용된다.
논리적/물리적 구조
Block : block은 데이터베이스를 이루는 가장 작은 요소로 최소 i/o 단위이다. 대부분의 block의 크기는 8kb(standard block size)이다.
Extent : 하나 이상의 연속적인 블록의 집합으로 구성되어져 있다. 디스크의 위치가 연속적인 위치로 할당이 되며 Extent 단위로 읽어들이기 때문에 읽는 속도가 빨라진다.
Segment : 세그먼트는 테이블스페이스 안에 존재하며 하나 이상의 extent가 모여서 만들어진다. 세그먼트에는 테이블 인덱스, 물리적인 위치를 가지는 오브젝트가 포함되어 있으며 데이터 세그먼트, 인덱스 세그먼트, 언두 세그먼트, 임시 세그먼트가 있다.
Tablespace : 유저가 만든 테이블이 저장되는 구조이다. SYSTEM, SYSAUX 는 데이터베이스 생성시 만들어지는 필수 테이블 스페이스이다. 여러개의 테이블 스페이스가 모여 하나의 데이터 베이스를 구성한다.
//Tablespace 생성하기
CREATE TABLESPACE [테이블스페이스명]
DATAFILE [파일위치]
SIZE 1G
AUTOEXTEND ON
NEXT 10M
MAXSIZE 2G;
create 테이블명(
id number(5),
name varchar2(20)
) tablespace [테이블스페이스명]
모든 유저마다 default로 USER tablespace가 지정되어 있기 때문에 유저가 create table ~ 을 이용하여 테이블을 만들때 테이블 스페이스를 따로 지정해주지 않아도 된다.
참고자료
Background Process, “oracle background process”, http://www.gurubee.net/lecture/1892
Oracle Database Server Architecture:Overview, “oracle memory structure”, https://www.thegeekdiary.com/oracle-database-server-architecture-overview/
oracle memory structure 이미지 출처 : https://www.thegeekdiary.com/oracle-database-server-architecture-overview/