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와 관련된 값을 조회
'oracle > [Admin] 이론' 카테고리의 다른 글
[이론] chapter 06. Redo Log 관리 (3) | 2014.10.20 |
---|---|
[이론] chapter 05. Control File 관리하기 (0) | 2014.10.20 |
[이론] chapter 04. Oracle 시작하기 & 종료하기 (0) | 2014.10.20 |
[이론] chapter 03. Oracle Background Process (0) | 2014.10.20 |
[이론] chapter 02. SQL 문장의 실행 원리 (1) | 2014.10.20 |
댓글