오라클 아키텍쳐(1) 메모리 구조

2018.12.14 07:00


 

오라클 데이터베이스 서버 구조 




- 오라클 데이터베이스 시스템(오라클 DBMS) 
   = 데이터베이스 + 인스턴스

* 오라클 DBMS 구조는 데이터을 저장하는 저장구조(데이터베이스)와 DBMS 운영을 위한 메모리와 프로세스(인스턴스)로 구성된다. 

* 서버 종료 후 데이터베이스(저장구조)만 남고 인스턴스(메모리와 프로세스)는 서버 기동시 시작된다.


오라클 데이터베이스 서버 아키텍처



- 데이터베이스 : 물리적 구조와 논리적 구조로 구성된 저장 영역 구조

- 인스턴스 : 메모리 구조(SGA, PGA) + 해당 인스턴스와 연관된 백그라운드 프로세스
  · SGA(System Global Area) : 인스턴스가 시작될 때 할당되는 공유 메모리 영역
    (서버 프로세스들과 백그라운드 프로세스들이 공유하는 공간)
  · PGA(Program Global Area) : 서버 프로세스, 백그라운드 프로세스 자신이 사용하는 데이터와 
    제어 정보를 저장하기 위한 갖는 자체적인 메모리 영역. 다른 프로세스들과 공유하지 않음

- 인스턴스가 시작되면 오라클은 인스턴스를 특정 데이터베이스와 연관시킴. 
  이것을 데이터베이스를 마운트 한다고 부른다.

- Instance는 단 한 개의 데이터베이스와만 연관
한 개 서버에 두 개의 데이터베이스를 운영하려면 데이터베이스 2개 + 인스턴스 2개 필요.
하지만 여러개의 인스턴스가 하나의 데이터베이스를 공유하는건 가능(RAC)


* 데이터가 저장된 파일을 오라클은 데이터베이스라 부르고
이 데이터베이스에 접속해서 데이터를 조회하거나 수정하려면 인스턴스를 통해 접근해야 한다. 
(디스크에 저장된 xls 파일을 수정하려면 엑셀 프로그램을 기동시켜서 메모리에 엑셀을 띄워야 하는 것과 같은 이치)
결국 오라클은 데이터베이스라는 저장영역과 인스턴스라는 메모리, 프로세스 구조로 구성된다.


* 인스턴스는 공유 불가능하지만 데이터베이스는 공유 가능하다. 이것이 오라클 RAC 구조이다. 


오라클 데이터베이스 메모리 구조



오라클 데이터베이스 메모리 구조



 
- 오라클 데이터베이스 메모리 구조 = SGA + PGA

- SGA(System Global Area)  = Shared Pool, 데이터베이스 버퍼 캐시, 리두 로그 버퍼, 라지 풀, 자바 풀, 스트림스 풀 등

- PGA(Program Global Area) = Stack Space + UGA(User Global Area)
 
- 오라클은 기동시 초기화 파라미터를 사용하여 메모리 구조를 생성, 관리
- 12C부터 목표 메모리 크기 초기화 파라미터(MEMORY_TARGET)와 최대 크기 초기화 파라미터(MEMORY_MAX_TARGET)만 설정하면 알아서 관리
 



SGA 구조

 
1) Database Buffer Cache
- 디스크의 데이터파일로부터 메모리로 데이터 복사.
- 오라클의 주 작업공간
- 모든 user는 데이터 버퍼 캐시에 대한 액세스 공유
- User Process가 특정 데이터를 사용해야 할 경우 맨 처음 데이터 버퍼 캐시에서 찾음.
  캐시에서 발견(캐시 적중)하지 못할(캐시 실패) 경우 디스크에서 데이터 블록을 캐시 버퍼로 복사함.
- Database Buffer Cache의 상태
 . Pinned Buffer : 다른 사용자가 사용중. 새로운 사용자는 사용할 수 없음
 . Dirty Buffer : 내용이 변경되었으나 아직 데이터 파일에 저장하지 않은 상태. 새로운 사용자는 사용할 수 없음
 . Free Buffer : 사용할 수 있는 상태
- LRU(Least Recently Used) List 방식으로 관리
 
2) Redo Log Buffer
- 데이터의 변경사항을 기록해 놓은 메모리 공간(순환 버퍼)
  (리두 로그에 대한 자세한 내용은 이전 블로그 글 참조)


 
3) Shared Pool (공유풀) = 라이브러리 캐시 + 데이터 딕셔너리 캐시 + 서버결과 캐시
가. Library Cache

  - soft parse 때 사용

  - SQL에 대한 분석정보, 실행계획(Execution Plan) 등 저장

  - 컴파일된 PL/SQL 코드 저장


나. Data Dictionary Cache
  - 구문분석 또는 옵티마이저가 실행계획을 세울 때 사용되는 Dictionary들이 캐쉬
  - Data Dictionary : 데이터베이스의 스키마, 유저, 객체 등 데이터베이스 운영에 필요한 정보를 관리하는 별도의 시스템 객체

다. Server Result Cache
  - 11g부터 사용
  - 쿼리 결과값을 캐쉬
  - 디폴트는 사용하지않음
  - 사용하려면 설정을 바꿔주거나 쿼리문에 /*+result-cashe*/ 포함

라. Reserved Pool
  - Shared Pool에 5kb 넘는 오브젝트 적재시 사용
  - Shared_Pool_Size의 5% ~ 50%
 - v$shared_pool_reserved 뷰에서 request_failures 값이 증가하면 Reserved pool 값이 부족한 상태임

* 공유 풀 : 데이터 버퍼 캐시 말고 프로세스간 공유해야 할 데이터가 임시로 저장되는 공간.
특히 중요한건 데이터 딕셔너리에 대한 캐시가 저장되는 데이터 딕셔너리 캐시와
파싱된 SQL 정보가 저장되는 라이브러리 캐시임

* 공유풀은 LRU 방식으로 관리

* 데이터베이스 버퍼 캐시는 블록 단위로 저장되고 관리되는데 반해서 공유풀은 가변 크기

 
4) Large Pool
- 대규모 메모리 할당을 위한 메모리 공간
 . I/O 서버 프로세스
 . 오라클 백업 및 복원
 . Parallel Query 작업
 . Advanced Queuing

* 라지풀은 사용되고 나면 바로 해제(LRU 리스트 불필요)
 
5) Java Pool
- JVM 의 세션별 Java코드 및 데이터 보관
 
 
 

PGA(Program Global Area)


서버 프로세스가 데이터 및 제어 정보를 저장하기 위해 사용하는 전용(Private) 메모리 공간
서버 프로세스만 접근 가능(공유하지 X)
1) Stack Space
- SQL문장에 바인드 변수를 사용했을 때 해당 바인드 변수를 저장하는 공간
 
2) User Global Area
- 커서에 대한 런타임 정보 저장
- 세션에 대한 제어 정보 저장
- SQL 처리를 위한 공간(정렬, 해쉬 등)
 

* Shared Server 환경에서는 여러 클라이언트 유저가 서버 프로세스를 공유함. 그래서 이 경우 UGA는 SGA(쉐어드 풀 또는 라지 풀)로 이동하고 PGA는 Stack Space만 사용










오라클의 메모리 관리 방식


ㅇ APMM(Automatic PGA Memory Management)


- 자동 PGA 메모리 관리기법

- 9i부터

- PGA의 SQL WORK Areas 영역 크기만 제어(정렬, 해쉬에 사용하는 공간)




ㅇ ASMM(Automatic Shared Memory Management)


- 자동 공유 메모리 관리 기법

- 10g부터

- SGA 메모리 중 공유풀, 라지풀, 자바풀 등의 크기를 자동으로 관리




ㅇ AMM(Automatic Memory Management)


- 자동 메모리 관리 기법

- 11g에서 추가

- 초기화 파라미터 MEMORY_TARGET 값이 0보다 크면 작동

- 오라클이 MEMEORY_TARGET에서 지정된 값 범위내에서 SGA와 PGA의 값을 자동으로 조절




또루아빠 SQL(오라클,mysql) , , , , , , , , , , , ,