본문 바로가기
oracle/[Admin] 이론

[이론] chapter 01. Oracle Architecture

by #moonyz 2014. 10. 17.

1. DBMS와 ORACLE

- CPU : 실제 작업을 함

- 메모리 (RAM) : 작업을 하는 장소

- 하드디스크 (HDD) : 데이터를 저장


- oracle : DataBase Management System(DBMS)

- database : 데이터를 저장하는 보관소


- DBMS : 대량의 데이터를 사람을 대신해서 지켜주고 관리해주는 전문적인 프로그램


<메모리에서 작업하고 디스크에 저장한다>

- 메모리의 속도가 하드디스크보다 비교도 안될 만큼 빠르기 때문에

- 사용자가 저장한 데이터를 전부 하드 디스크에 저장

- 실제 내용을 조회하거나 변경하는 등의 작업은 전부 메모리에서 진행



2. ORACLE SERVER

(1) Oracle Server 전체구조

- 오라클 프로그램을 설치 한 후 실행 시키면 메모리와 디스크에 자신만의 특별한 구조를 생성함.

- 메모리와 디스크에 생성되는 구조를 Oracle Server라고 함.


<Oracle Server = instance + database>

> 인스턴스 (instance) : 메모리 부분에 생성되는 구조

① SGA (System Blobal Area) : 실제 작업들이 수행되는 공간

② Background Process : 오라클 서버가 잘 운영되도록 도와주는 역할 



> 데이터베이스(Database) : 디스크부분에 생성되는 구조

① Data files : 데이터 저장

② Control files : DB 관리 정보 ex) DB가 정상 종료 했는지, 비정상 종료 했는지 등.

③ Redo log files : 장애복구시 사용되는 파일


※ ORACLE 10g 버전부터 메모리 관리를 자동으로 최적유지 시켜주는 기능 등장

> ASMM (Automatic Shared Memory Management)

> AMM (Automatic Memory Management)

> 메모리 관리 기법에서 자세히 !



(2) Instance 할당 및 관리

<인스턴스 생성과정>

① 관리자가 DB 접속하여 오라클시작 (Startup)

② 요청을 받은 Oracle Server Process가 초기화 파라미터(pfile, spfile)를 참고하여 OS Kernel 에게 공유메모리 요청

③ 요청을 받은 OS Kernel은 파라미터(/etc/sysctl.conf 또는 /etc/system)를 참고하여 공유메모리 할당 >> SGA 생성

④ 공유메모리 할당 후  다른프로그램에서 사용하지 못하도록 세마포어 설정 값 등을 기반으로 관리 시작


- OS Kernel은 Oracle이 요구하는 대로 메모리를 할당해 줄 수 없다. (메모리 크기 한정, 커널만의 파라미터 값으로 허락)

- SGA 생성은 최초의 Oracle Server Process가 요청하여 만듬

- SGA 생성 후에는 OS Kenel이 관리 (다른 프로그램이 해당 메모리 공간을 사용할수 없도록)

- Oracle Server Process가 종료되어도 SGA는 종료되지 않음

- Instance가 종료되어야 SGA가 공유메모리에서 사라지게 된다.


하나의 메모리 블록을 여러 프로그램이 동시에 중복 사용하는 사태를 막기위해서 OS차원에서 공유메모리 관리


① 세마포어 (Semaphore)

- 깃발(Flag)

- RAM은 모든 프로그램이 실행될때 동시에 사용되는 공간이지만 하나의 블록에 여러개의 프로세스가 동시에 엑세스 하면 문제발생

- OS에서 하나의 블록에는 한번에 한개의 프로세스만 접속을 허용하게 관리

- 모든 프로세스들이 메모리 블록을 사용하기 전에 그 블록을 다른 프로세스가 사용하고 있는지 확인

- 해당 메모리 블록의 세마포어 상태를 먼저 확인 >> SET/UNSET 


<세마포어와 관련된 주요 커널 파라미터>

- SEMMSL : 하나의 세마포어 세트당 세마포의 최대 개수 정의

- SEMMNI : 리눅스 전체에서 설정 가능한 세마포어 세트의 최대 개수
- SEMMNS : 리눅스 전체에서 설정 가능한 세마포어의 최대 개수

- SEMOPM : 1call(1개의 시스템 호출)이 초당 호출 가능한 최대 세마포어 개수 정의

- 설정 값 확인 :  # ipcs -ls


② kernel 파라미터 설정

- 리눅스 : /etc/sysctl.conf

- 솔라리스 : /etc/system


- SHMMAX : 공유메모리 세그먼트의 최대크기  (세그먼트 : 커널이 응용프로그램들에게 할당해주는 메모리 덩어리)

>shmmax 변수 설정값 확인 : # cat /proc/sys/kernel/shmmax (default : 32MB)

>shmmax 매개변수를 2GB로 설정 >> # echo "2147483648" > /proc/sys/kernel/shmmax

>sysctl 명령어를 사용하여 값설정 >> # sysctl -w kernel.shmmax=2147483648

>kernel 값 변경사항을 영구적으로 적용 >> # vi /etc/sysctl.conf 에 변수값 추가 >> # sysctl -p 재부팅없이 변경값 적용

- SHMMNI  : 공유메모리 세그먼트 최대 개수

>default : 4096 --세그먼트 개수가 4096개 >> 아주 충분하므로 변경할 필요가 없음

- SHMALL : 공유 메모리의 최대 크기

>dafault : 2097152 bytes

>shmall 크기 확인 : # cat /proc/sys/kernel/shmall

- SHMMIN : 단일 공유메모리 세그먼트의 최소크기 (byte)

- SHMSEG : 1개의 프로세스에 부여될수 있는 공유메모리 세그먼트의 최대 개수


※ 공유메모리를 할당할때 위의 파라미터를 기초로 해서 3가지 방법으로 할당

- 하나의 세그먼트에 전체 SGA 할당 >>공유메모리로 사용할 물리적메모리가 충분할 경우

- 여러 세그먼트에 분산시켜 할당 >> 하나의 세그먼트에 다 할당할수 없을 경우

- 연속적이지 않은 여러 세그먼트에 분산시켜 할당 >> 위의 방법들로 여의치 않으면..



(3) SGA의 주요 구성 요소

- 오라클에서 실제로 거의 대부분의 작업이 일어나는 공간

- 잘 관리 하면 성능 good, 잘 못관리하면 성능 bad

- 구성요소 : Database Buffer Cache, Redo Log Buffer, Shared Pool(Library Cache, Dictionary Cache, Server Result Cache)

Large Pool, Java Pool, Streams Pool, Fixed SGA



① Database Buffer Cache

- 데이터의 조회, 변경 등의 실제작업이 일어나는 공간

- 사용자가 조회하거나 변경하려는 모든 데이터는 이곳에 있어야 한다.

- Database Buffer Cache Block 상태 : Pinned Buffer, Dirty Buffer, Free Buffer

- LRU List : Buffer Cache들의 상태를 관리하기 위한 List, LRU알고리즘사용(가장 최근까지 많이 사용된 것은 keep, 가장 사용이 안된것에 overwrite)

- Working Data Set : LRU, LRUW >> 스캔의 효율성을 위해 세부적인 리스트로 관리

LRU List : 메인 리스트 - 빈자리 + 쓰는자리 / 보조 리스트 - Free List (빈자리)

LRUW List : 메인 리스트 - Dirty List (변경된 버퍼) / 보조 리스트 - DBWR에 의해 기록중인 버퍼 리스트

- Latch : List 사용순서 관리, List에는 한번에 하나의 프로세스만 접근 가능하게 관리 ex)은행의 번호표


② Redo Log Buffer

- 데이터에 변경사항이 생길 경우 해당 변경 내용을 기록해 두는 역할 (DDL, DML, TCL)

- 장애 발생시 복구를 위함

- Redo Log Buffer : 변경된 내용을 기록하는 메모리 공간

- Redo Log File : Redo Log Buffer의 내용을 디스크에 저장하는 파일

- nologging 옵션 설정시 기록되지 않음. but insert, update, delete 같은 작업 모두 기록

- Redo Log에 기록을 하게 되면 전체적인 성능이 저하되는 부작용이 있다.


③ Shared Pool

- Library Cache : soft parse할때 사용되는 공간 (이미 실행되었던 SQL, PL/SQL문장, 실행계획 저장, LRU 알고리즘으로 관리)

- Dictionary Cache : 구문분석이나 옵티마이져가 실행계획을 세울때 사용, 주요딕셔너리들 저장, LRU알고리즘으로 관리

- Server Result Cache

> 11g 부터 추가, 결과값을 캐시해두는 공간

> 동일한 select 문장 수행시 DB Buffer Cache 까지 가지않고 즉시 결과를 가져가도록 

> 기본값 : 사용안함 

> /*+ result_cache*/ 구문을 사용하여 설정 --힌트 쓰기 번거로울땐 RESULT_CACHE_MODE 파라미터를 Force로 변경 (기본값 Manual)

Result Cache를 살펴본후 결과가 존재 하지 않을경우 다시 DB Buffer Cache로 가서 데이터 가져와야 하므로 시간↑

Result Cache에 있는 데이터의 원본값이 DB Buffer Cache에서 변경되었을 경우 값을 반영시킨후 가져와야 하므로 시간↑

> SQL Query Result Cache 와 PL/SQL Function Result Cache --각각의 결과값 저장

- Reserved Pool

> Shared Pool에 5KB(11g기준)가 넘는 오브젝트가 적재되어야 할 경우에 사용하기위해 예약해둔 공간

> 인스턴스가 시작될때 Shared Pool Size의 5%크기로 설정 (최대 Shared Pool Size의 50%)

> 사이즈 조회 : SHARED_POOL_SIZE --동적파라미터이므로 재부팅하지 않아도 됨(9i부터 가능)

> 크기 설정 : SHARED_POOL_RESERVED_SIZE 파라미터로 용량 설정

> 공간확인 : V$SHARED_POOL_RESERVED (REQUEST_FAILURES 값이 증가하면 부족, REQUEST_MISSES 값이 0이거나 증가하지않으면 충분)


④ Large Pool

- 필수 구성요소는 아님

- Shared Server mode로 Oracle Server를 운영할 경우 UGA를 이곳에 생성

- 병렬처리(Parallel Execution) 작업을 할 경우 프로세스들간의 Message Buffer가 이곳에 생성

- RMAN으로 백업이나 복구를 할경우 RMAN이 사용하는 I/O용 Buffer가 이곳에 생성

- LRU 알고리즘으로 관리 X


⑤ Java Pool

- 필수 구성요소는 아님

- Java Virtual Machin(JVM) 관련 데이터를 저장하기 위해 생성되는 선택적인 공간


⑥ Streams Pool

- 10g 이상부터 생긴 SGA 구성요소

- Stream기능을 사용할 경우에 사용

- 관리자가 설정하지 않으면 기본값은 0, stream기능을 사용하면 동적으로 Oracle Streams가 크기를 증가시킴


⑦ Fixed SGA

- Oracle이 내부적으로 사용하기 위해 생성시키는 공간

- Background Process들이 필요한 데이터베이스의 전반적인 공유정보

- 각 Process들끼리 공유해야만 하는 Lock 정보 등 저장

- Oracle이 시작될때 자동으로 설정

- 사용자나 관리자가 임의로 변경 불가능



(4) Dynamic SGA 기능

- 요약 : Oracle Process >> OS kernel에게 RAM 할당 요청 >> 파라미터파일 참조하여 할당 >> Oracle Process는 SGA 생성

- 각 구성요소의 크기를 결정하는 것은 쉽지 않은 작업 >> 서버에서 이루어지는 작업의 상황에 따라 수시로 변할수 있기때문

- Oracle 8i 까지 : 구성요소의 크기를 변경하고 나서 Oracle Instance를 재시작해야만 변경사항 적용 (Static SGA)

- Oracle 9i 부터 : 관리자가 필요에 의해서 SGA의 구성요소 크기를 변경한후 Oracle Instance 재시작없이 즉시적용가능 (Dynamic SGA)

- Oracle 10g 부터 ASMM 적용 : 사용자가 SGA의 각 구성요소 값을 지정하지 않아도 Oracle이 스스로 최적의 값을 찾아서 사용하도록 하는 기술

- SQL > alter system set DB_CACHE_SIZE = 100M ; -> 100M로 할당되지 않음 -> 그래뉼단위때문.


* 그래뉼 (Granule) : 오라클에서 메모리를 할당할때 사용하는 단위

- 9i 까지

SGA_MAX_SIZE가 128M 이하면 1granule = 4M (4배수 단위로 할당)

SGA_MAX_SIZE가 128M 초과면 1granule = 16M (16배수 단위로 할당)

- 10g 부터

SGA_MAX_SIZE가 1G 이하면 1granule = 4M (4배수 단위로 할당)

SGA_MAX_SIZE가 1G 이하면 1granule = 16M (16배수 단위로 할당)



① 현재 사용중인 SGA 크기 확인

SQL > show sga;


② Granule(그래뉼) 확인



(5) PGA의 주요 구성 요소 

- 각 프로세스마다 개별적으로 저장해야 할 내용을 담는 공간

- Oracle Server내에서 동작하는 모든 프로세스는 각각 PGA를 가지고 있다. (Server Process, Background Process 등)


* Instance PGA : Server Process가 사용하는 PGA


- Session Memory : 작업을 요청한 User Process의 정보를 저장


① Private SQL Area

- Persistent Area : Bind 변수값을 저장해 두는 공간

- Runtime Area : SQL 문장을 수행하는 도중에 데이터를 임시로 저장해야 할 경우에 사용하는 공간


② SQL Work Area

- Sort Area : 정렬(sort)작업을 하는경우에 수행하게 되는공간 (SORT_AREA_SIZE)

- Hash Area : 해시(hash) 관련 작업이 있을 경우에 수행하는 공간 (HASH_AREA_SIZE)

- Bitmap Merge Area : (CREATE_BITMAP_AREA_SIZE)


- 8i 까지는 각각의 크기들을 직접 파라미터 값을 설정해서 수동으로 관리

- 9i 부터는 PGA의 크기를 Oracle Server 가 자동으로 관리

PGA_AGGREGATE_TARGET : PGA 총량을 지정

WORKAREA_SIZE_POLICY : manual로 설정하면 기존 처럼 수동으로 관리할수 있음

_SMM_MAX_SIZE : 1개의 개별 Server Process가 쓸수있는 PGA 메모리량 지정


- V$PGASTAT : 현재 Server의 PGA와 관련된 값을 조회



댓글