본문
1. DBMS와 Oracle 이야기
- Oracle : DBMS 분야의 한 종류
- Database : 데이터를 저장하는 보관소
※ 메모리에서 작업하고 디스크에 저장한다. (속도 차이 때문에)
2. Oracle Server의 전체 구조 살펴보기
(1) Oracle Server의 전체 구조
< Oracle Server 구조 >
- 인스턴스(Instance) : 메모리 부분에 생성되는 구조
- SGA(System Global Area) : 실제 작업이 수행되는 공간
- Background Process : 오라클 서버가 잘 운영 되도록 / 메모리와 디스크 사이에서 연결해주는 역할
- ASMM(Auto Shared Memory Management) : 메모리 관리를 자동으로 최적으로 유지시켜주는 기능.
- AMM(Auto Memory Management) : 11g, ASMM이 더 발전된 기능
(2) Oracle Instance의 할당 및 관리
< Oracle Instance 구조 >
▣ Instance가 생성되는 과정
① SQL> startup
② Oracle Server가 초기화 파라미터(pfile 또는 spfile)을 참고하여 OS kernel에게 메모리 할당을 요청.
③ OS Kernel은 OS Kernel 파라미터(리눅스 /etc/sysctl.conf)를 조회하여 공유메모리(=SGA)를 할당.
* 오라클 서버 종료 => SGA 종료 X
Instance 종료 => SGA 종료 O (공유 메모리에서 사라짐)
- 세마포어
: 어떤 자원의 현재 사용 여부를 표현, SET/UNSET의 값을 가짐
서버 내에 동작하는 모든 프로세스들은 메모리 블록을 사용하기 전에 그 블록을 다른 프로세스가
사용하고 있는지 확인하기 위해 해당 메모리 블록의 세마포어 상태를 먼저 확인
▣ 세마포어 관련 주요 Kernel 파라미터
- SEMMSL : 세마포어 세트당 세마포어의 최대 개수
- SEMMNI : 세마포어 세트의 최대 개수
- SEMMNS : 세마포어의 최대 개수 (SEMMSL X SEMMNI 이상)
- SEMOPM : 초당 호출 가능한 최대 세마포어 개수
[oracle@localhost ~]$ ipcs –ls
|
▣ 그 외 Kernel 파라미터
- SHMMAX : 공유 메모리 세그먼트의 최대 크기(바이트 단위)
* 변경 방법 1) /proc 파일에 직접 반영 # echo “2147483648” > /proc/sys/kernel/shmmax
2) sysctl 명령어 사용 # sysctl –w kernel.shmmax=2147483648
3) vi 편집기로 /etc/sysctl.conf 파일 내용 수정, sysctl –p로 적용
- SHMMNI : 공유 메모리 세그먼트의 최대 개수 # cat /proc/sys/kernel/shmmni
- SHMALL : 공유 메모리의 최대 크기 (default : 2097152 bytes) # cat /proc/sys/kernel/shmall
- SHMMIN : 단일 공유메모리 세그먼트의 최소 크기(byte)
- SHMSEG : 1개의 프로세스에 부여될 수 있는 공유메모리 세그먼트의 최대 개수
▣ 공유메모리를 ORACLE 할당하는 3가지 방법
① 공유 메모리로 사용할 물리적 메모리가 충분할 경우 하나의 세그먼트에 전체 SGA 할당 가능
② 하나의 세그먼트에 다 할당할 수 없으면 연속적인 여러 개 세그먼트로 분산시켜 할당 가능
③ 연속되지 않은 여러 세그먼트에도 가능, fixed Area 부분은 반드시 한 개의 세그먼트에 할당
(3) SGA의 주요 구성 요소 ※ 거의 모든 작업이 SGA에서 이루어지기 때문에 관리가 중요함
① Database Buffer cache : 데이터의 조회나 변경 등의 실제 작업이 일어나는 곳
사용자가 조회하거나 변경하려는 모든 데이터는 이곳에 있어야 함
* 데이터가 저장되어 있는 데이터 파일 블록을 복사한 후 DB Buffer Cache로 가져와서 작업
⇒ 속도를 높이기 위해 (여러 사용자가 작업하는 환경일 경우)
* 디스크에 작업하는 속도보다 메모리에서 작업하는 속도가 빠르기 때문
* 메모리에 있는 데이터는 다른 사용자에게 공유 가능
▣ Database Buffer Cache 상태 3가지
- Pinned Buffer : 현재 다른 사용자가 사용 중인(=변경 중) Buffer 블록 (A 사용자 사용 불가)
- Dirty Buffer : 현재 작업은 진행되지 않지만 다른 사용자가 변경한 내용을 저장하지 않은 Buffer
(=commit 후 저장되지 않은 상태) ( A 사용자 사용 불가)
- Free Buffer : unused(사용되지 않았던지) , Dirty Buffer였다가 하드디스크로 저장이 완료되어 재사용할 수
있는 블록 (A 사용자 사용 가능)
* 어쩔 수 없이 덮어써야 하는 경우 ⇒ LRU List 사용
- LRU 알고리즘 : 가장 오래 사용이 안 된 것을 덮어쓰는(=버리는) 알고리즘
- Working Set = LRU List + LRUW List
* LRU List를 이용하는 대표적인 구성요소 : Shared Pool, Database Buffer Cache ···
▣ LRU LIST
- 메인 리스트 : 사용된 Buffer들의 리스트 , Hot 영역과 Cold 영역으로 나뉨
- 보조 리스트 : 미 사용된 Buffer들이나, DBWR에 의해 기록된 Buffer들의 리스트(Free list)
▣ LRUW LIST
- 메인 리스트 : 변경된 Buffer들의 리스트(Dirty list)
- 보조 리스트 : 현재 DBWR에 의해 기록 중인 Buffer들의 리스트(Pinned list)
* 사용자가 데이터 파일을 DB Buffer Cache에 가져와야 할 때
① LRU 리스트의 보조리스트에서 Free Buffer 찾는다.
② 보조 리스트의 Buffer가 모두 사용된 경우 메인리스의 cold 영역에서 free Buffer를 찾는다.
③ 특정 개수(10g-40%)만큼 찾았는데 없다면 Scan을 멈추고 DBWR에게 Dirty Buffer를 내려쓰라고 요청
④ 데이터 파일로 저장이 완료된 Dirty Buffer들이 Free Buffer로 바뀌게 되어 LRU List에 추가됨
⑤ Free Buffer를 확보 후 데이터 파일에서 필요한 블록을 Database Buffer Cache로 복사.
* 인스턴스 최초 구동 시에는 모든 Buffer들은 LRU List의 보조 리스트에서 관리됨
- DBWR : DB Buffer Cache에 있는 변경 완료된 데이터를 데이터 파일로 저장해주는 백그라운드 프로세스
- Latch : 순서를 정해주는 역할(=은행 번호표)
모든 메모리 자원에는 Latch가 존재, (하나의 메모리에 여러개의 Latch가 존재하는 경우도 있음)
* 모든 프로세스들은 해당 메모리 자원에서 접근해서 사용하려면 반드시 그 메모리의 Latch를 가지고 있어야
한다. (Latch 확보 후 내용을 기록할 수 있음)
* 데이터를 변경하려면 Redo Log Buffer에 변경된 데이터를 기록해야 하는데, 이때 Redo Copy Latch를
확보 한 후 Redo Allocation Latch를 확보해야만 기록할 수 있음.
② Redo Log Buffer : 데이터에 변경사항이 생길 경우(DML, DDL 등) 해당 변경 내용을 기록해 두는 역할
⇒ 장애가 발생했을 때 복구하기 위해서
- Redo Log File : Redo Log Buffer의 내용을 디스크에 저장해 주는 파일
③ Shared Pool : 다른 사용자와 어떤 대상을 공유해서 사용하기 위해 만들어진 곳.
동적 파라미터로 DB 종료 없이 변경 가능.
< Shared Pool 구조 >
- Library Cache : 이미 수행되었던 SQL 문장, PL/SQL문장, 실행계획등이 저장. LRU 알고리즘으로 관리
- Dictionary Cache : 구문분석이나 옵티마이져가 실행계획을 세울 때 사용되는 주요 딕셔너리들이
Row 단위로 Cache되어 있음. LRU 알고리즘으로 관리
- Server Result Cache : 결과값을 Cache해 두는 공간, 11g부터 생성
* 결과값을 이 곳에 저장해 두었다가 Select가 수행 되었을 때 DB Buffer Cache까지 가지 않고
즉시 Server Result Cache에서 가져가도록 해서 속도를 더 높임 (급격한 성능 개선 X)
* 사용 : SQL 문장에 /*+ result_cache */라는 힌트 문구 사용
RESULT_CACHE_MOD 파라미터 값을 Force로 변경
┌ SQL Query Result Cache : SQL 결과 값 저장
└ PL/SQL Query Result Cache : PL/SQL 결과 값 저장
- Reserved Pool : Shared Pool에 5KB(11g 기준)가 넘는 오브젝트가 적재되어야 할 경우 사용하기 위해
예약해 놓은 공간
* 크기 변경 : SHARED_POOL_RESERVED_SIZE 파라미터에 용량 설정
④ Large Pool : 필수 공간 X
* 사용하는 경우 ① Shared Server mode로 Oracle Server를 운영할 경우 UGA를 Large Pool에 생성
② 병렬처리 작업을 할 경우 각 Process들 간의 Mesage Buffer가 Large Pool에 생성
③ RMAN으로 백업이나 복구를 할 경우 RMAN이 사용하는 I/O용 Buffer를 생성
⑤ Java Pool : 필수 공간 X
* Java 관련 code나 Java Virtual Machine(JVM)관련 데이터를 저장하기 위해 생성되는 공간
⑥ Streams Pool : 10g, Streams 기능을 사용할 경우에만 생성됨. 기본값 0
⑦ Fixed SGA : Oracle이 내부적으로 사용하기 위해 생성시키는 공간.
* 백그라운드 프로세스들이 필요한 Database의 전반적인 공유 정보 또는 프로세스들끼리 공유해야만하는
Lock 정보같은 내용들이 저장됨
* 크기는 Oracle이 시작될 때 자동으로 설정. 사용자나 관리자가 임의로 변경 X
(4) Dynamic SGA 기능
- Dynamic SGA : 관리자가 필요에 의해서 SGA의 구성요소의 크기 변경 후 Oracle Instance의 재시작 없이
즉시 적용할 수 있는 기능(Redo Log Buffer를 포함한 몇가지는 제외)
ex) Database Buffer Cache 크기를 100MB로 변경 할 경우
SYS> alter system set DB_CACHE_SIZE=100 M ;
- Granule(그래뉼) : Oracle에서 메모리를 할당하는 단위
* 10g 기준 SGA_MAX_SIZE가 1GB 이하 : 1Granule = 4MB
SGA_MAX_SIZE가 1GB 초과 : 1Granule = 16MB
* SGA 크기 확인 : SYS> show sga ;
SYS> show sga; Total System Global Area 422670336 bytes
|
* Total System Global Area : 전체 SGA의 양
* Fixed Size : Background Process들이 사용하는 공간으로 예약
* Variable Size : Shared Pool, Large Pool, Java Pool로 사용되는 공간
* Database Buffers : DB Buffer Cache로 사용되는 공간
* Redo Buffers : Redo Log Buffer로 사용되는 공간
SYS> show parameter sga_max_size ; NAME TYPE VALUE
NAME TYPE VALUE
NAME TYPE VALUE
|
* VALUE값이 0인 이유 : ASMM 기능(자동) , 데이터가 없는 것이 아님
SYS> alter system set shared_pool_size=10M ; System altered.
SYS> show parameter shared_pool_size ; NAME TYPE VALUE |
* 그래뉼 단위 때문에 10M가 아닌 4의 배수인 12M로 할당
(SGA_MAX_SIZE가 160M로 1GB 미만이기 때문에 1granule이 4M로 계산)
(5) Program Global Area(PGA)의 주요 구성 요소
- PGA : 각 Process들이 개별적으로 사용하는 메모리 공간
⇒ 각 Process마다 개별적으로 저장해야 할 내용을 담는 공간. ex) SGA : 학교 운동장 PGA : 사물함
* Oracle Server내에 동작하는 모든 Process는 각각 PGA를 다 가지고 있음
① Private SQL Area
- Persistent Area : Bind 변수 값을 저장해두는 공간
- Runtime Area : SQL문장을 수행하는 도중 데이터를 임시로 저장해야 할 경우 사용하는 공간
- Bind 변수 : 일반적으로 사용자로부터 특정 값을 입력 받을 경우 입력 받은 값을 저장할 변수를 뜻함.
② SQL Work Area : Sort 관련 작업(Sort Area)이나 Hash 관련 작업이 있을 경우 작업 수행하는 공간
서진수,『오라클 관리 실무』, 생능출판사, 2013, pp.90-143
'Oracle > Oracle_Admin' 카테고리의 다른 글
Chapter 05. Control File 관리하기 (0) | 2014.09.02 |
---|---|
Chapter 04. Oracle 시작하기와 종료하기 (0) | 2014.09.01 |
Chapter 03. Oracle Background Processes (0) | 2014.06.12 |
Chapter 02. SQL 문장의 실행 원리 (2) | 2014.06.12 |
오라클 관리 실무 / 서진수 지음 (0) | 2014.06.10 |