티스토리 뷰

Oracle DB의 메모리 구조

Oracle DB 서버의 메모리 구조

SGA 메모리

어떠한 서버의 Memory(=RAM)가 있다고 하면, DB를 설치할 때 메모리에서 "내가 얼마만큼의 공간을 사용하겠다"라고 지정한 공간이 SGA(System Global Area)입니다. 따라서, 이 SGA는 오라클이 사용하는 영역이 됩니다. 그리고 SGA의 내부에는 Buffer Cache, Shared Pool, Large Pool 등의 여러 공간이 존재합니다. 그럼 이 공간들에 대해 하나씩 설명해 보겠습니다.

Buffer Cache

필요한 데이터를 가져올 때 매번 Disk를 통해 가져오는 것은 속도적인 측면에서 느리기 때문에, 서버 기동 시 필요한 데이터나 자주 사용하는 데이터들을 DB로부터 가져와, 임시적으로 Buffer Cache에 올려 사용합니다. 이후, 자주 사용하지 않는 데이터들을 다시 DB로 내려놓기도 합니다.

Shared Pool

SQL이 실행될 때, SQL에 대한 분석 정보(=실행 계획)들을 파싱 해서 메모리에 가지고 있는데, 이러한 파싱 정보를 커서(Cursor)라고 합니다. 이 커서가 저장되어 있는 영역이 Shared Pool입니다. 엄밀히 따지자면 Shared Pool의 전체 영역이 커서를 저장하고 있는 것은 아닙니다.

Shared Pool은 세부적으로 Dictionary CacheLibray Cache로 나누어집니다. 이 중 Library Cache에 커서가 저장되어 있고, Dictionary Cache에는 테이블에 대한 메타정보가 저장되어 있습니다. 원래 Dictionary Cache와 Library Cache는 Disk에 저장되어 있긴 하지만, 자주 사용하기 때문에 메모리에 올려놓고 사용하는 것입니다.

Large Pool, Java Pool, Streams Pool

해당 영역은 필요에 따라서 사용하기도 하고, 사용하지 않기도 합니다.

Java Pool은 Oracle DB 내부에서 Java를 지원하기 때문에 Java를 실행할 때 사용하고 Large Pool은 병렬 처리를 할 때나 RMAN 백업 복구할 때 임시 저장 용도로 사용합니다.

 

과거, 낮은 버전에서는 DB를 세팅할 때  Buffer Cache는 공간을 얼마나 사용할 것인지, Shared Pool는 공간을 얼마나 사용할 것인지에 대해 일일이 다 정의를 해줬어야만 했습니다. 그러고 이러한 것들이 Parameter File에 의해서 관리되어졌습니다. 이후, 버전이 업그레이드 되면서 SGA_target만 잡아주면 나머지는 Oracle이 알아서 설정해주도록 변경되었습니다.

 

 

 

PGA 메모리

SGA는 여러 프로세스가 공통으로 사용하는 메모리 영역 이었다면, PGA는 각 프로세스가 SQL 처리와 같은 작업을 수행할 때 단독으로 사용하는 메모리 영역입니다. 프로세스는 SGA에서 필요한 정보를 가져올 수 있지만, 자신만의 Private한 공간도 필요합니다. 이 공간이 바로 PGA이며, 데이터를 정렬(SORT)하거나 그룹화(GROUP BY)할 때 PGA 메모리를 활용합니다. 또한, PGA를 사용하다 보면 2, 3배 공간이 늘어날 수 밖에 없습니다. PGA 영역의 크기는 PGA_aggregate_target에 의해 관리되며, 이 공간에 대한 LIMIT는 PGA_aggregate_limit을 통해 관리할 수 있습니다. 

이후, Oracle이 업그레이드 되면서 Memory_target이 새로 등장하게 되었습니다. 이 Memory_target은 SGA_target과 PGA_aggregate_target을 합친 파라미터입니다. 즉, Memory_target만 잡아주면 따로 SGA_target과  PGA_aggregate_target을 잡아줄 필요가 없습니다.

 

 

 

백그라운드 프로세스들

Oracle DB가 설치되어 있는 Server에서 ps -fu oracle 명령어를 입력하면 아래와 같이 백그라운드에서 실행되고 있는 프로세스들이 출력됩니다. ora_ 로 시작하는 프로세스는 전부 oracle과 관련된 프로세스라고 생각하시면 됩니다.

 

서버에서 동작하고 있는 Oracle 프로세스들

수많은 프로세스 중 가장 중요한 프로세스들은 pmon과 smon입니다. 이 프로세스들이 내려가면 DB는 죽었다라고 생각하시면 됩니다. 

 

 

 

Redo Log, Archive Log, Undo(Rollback)

Oracle에는 Redo와 Undo라는 개념이 존재합니다. Undo는 작업을 하다 CIMMIT이 되지 않은 상태에서 DB가 확 내려가게 되었을 때나 사용자가 작업을 하다 cancel해서 작업을 취소하였을 때 원자성에 의해 작업을 다시 처음으로 되돌아가는 것을 이야기하고, Redo는 COMMIT을 했지만 갑자기 DB가 내려가게 되어 DB에 변경사항이 반영되지 않았을 때 DB를 재기동하여 다시 작업을 하는 것을 이야기합니다. 이러한 Redo와 Undo에 대한 내용들은 전부 Redo Log와 Undo Segment 라는 파일에 저장됩니다.

 

위 그림에서 표현하진 않았지만 SGA 내부에는 Redo Log Buffer라는 공간도 존재합니다. Redo Log Buffer는 Disk에 저장되어 있는 Redo Log File을 임시로 저장합니다. SGA 메모리에서 설명드렸던 것과 마찬가지로 Disk에 있는 데이터를 매번 읽기엔 조금 느리기 때문에 Memory(Redo Log Buffer)에 Redo Log File을 올려놓고 사용하는 것입니다. 

 

Archive Log는 데이터베이스에서 생성된 Redo Log File을 보관하는 방식입니다. Redo Log는 데이터베이스의 변경 사항을 기록하여 시스템 장애 시 데이터 복구를 가능하게 합니다. Archive Log는 이러한 Redo Log를 주기적으로 아카이브하여 보존하는 역할을 합니다. Redo Log File이 중요하다 싶다면 로그 파일이 저장되는 방식을 Archive Mode로 변경하여 사용합니다. 

Archive Log의 특징

  • 데이터 복구: Archive Log를 사용하면 데이터베이스의 특정 시점으로 복수할 수 있어, 데이터 손실을 최소화할 수 있고 유연성을 제공합니다.
  • 운영 지속성: Archive Mode를 활성화하면 데이터베이스는 지속적으로 변경 사항을 기록하고, 필요 시 아카이브를 통해 복구 작업을 수행할 수 있습니다.
  • 저장소: Archive Log는 별도의 디렉토리나 저장소에 저장되며, 이로 인해 로그 파일을 관리하고 필요한 시점으로 복구하는 데 용이합니다.
  • 백업 및 복구: 정기적인 백업과 함께 Archive Log를 활용하면, 데이터베이스의 전체 상태를 안전하게 유지할 수 있습니다.

 

 

리스너, SQL*Net 통신

메모리 내부에는 smon, pmon 프로세스와 같이 Listener 프로세스가 존재합니다. 이 Listener는 외부(=WAS, 사용자 PC 등)에서 TCP/IP 통신을 통해 접속을 받는 역할을 합니다. 이후 SGA로 접근하여 DB를 사용할 수 있게 되는데, 만약 외부에서 수천명, 수만명이 접속하면 어떻게 될까요? 아마 Listener 프로세스에서 병목 현상이 발생하게 됩니다. 따라서, Listener 프로세스는 접속만 처음에 받는 역할만 하고, 접속 시에 사용자 별로 D.S(Dedicate Server)를 띄우게 됩니다. 그래서 처음 접속만 리스너가 신경쓰고, 이후 접속이 들어오면  SQL 처리는 사용자가 리스너를 거치지 않고 D.S를 통해 작업을 수행하게 됩니다.

 

D.S는 사용자 별로 생성되어지기 때문에 100명의 사용자가 접속한다면 100개의 D.S가 만들어지게 됩니다. 이러한 방식은 자원을 낭비한다는 문제점을 갖고 있었고, 해당 문제점을 개선하고자 MTS(=Multi Threaded Server)라는 개념이 등장하게 되었습니다. MTS는 특정 몇 개의 서버 프로세스들을 띄워놓고, Buffer에 쌓여있는 작업들을 각각의 프로세스들이 나누어 작업하는 것을 이야기합니다. 하지만, 작업을 처리하는 프로세스의 갯수에 제한이 있기 때문에 기존의 방식보다 속도가 느리다는 단점이 있습니다. 

 

과거에는 MTS 방식을 많이 사용하였지만, 현재는 Memory의 가격이나 성능, 용량이 너무 좋아졌기 때문에 D.S를 몇 천개, 몇 만개를 띄우던 성능에 크게 영향을 주지 않아 Dedicate 방식을 사용합니다.

 

그럼 이번엔 실제로 SQL*Net을 통해 리스너를 거쳐 접속해보겠습니다.

sqlplus scoot/tiger@//loclahost/ora19 명령어를 통해 DB에 접속해보겠습니다.

 

  • sqlplus: Oracle Database에 접속하기 위한 명령행 도구. SQL 쿼리를 실행하고 데이터베이스와 상호작용할 수 있게 해줍니다.
  • scoot: 데이터베이스에 접속할 사용자 이름.
  • tiger: 해당 사용자의 비밀번호
  • @//localhost/ora19:데이터베이스 접속 정보
    • localhost: 데이터베이스 서버의 호스트 이름을 나타냅니다.
    • ora19: Oracle 데이터베이스의 서비스 이름 또는 SID를 나타냅니다. 여기선 ora19라는 이름의 데이터베이스에 접속하려고 합니다. 

다시 ps -fu oracle 명령어를 입력하여 백그라운드 프로세스들을 살펴보겠습니다.

 

백그라운드 프로세스를 확인해보면 orcleORA19 (LOCAL=NO) 프로세스가 새로 생성된 것을 볼 수 있습니다. 이를 통해 해당 프로세스가 외부에서 Listner를 거쳐 접속했다는 것을 알 수 있습니다.


초보 DBA를 위한 이것저것

[DB]Oracle DB의 메모리, 프로세서 구조

[DB]Tablespace 공간 확장 및 이해

[DB]세그먼트(Segment)와 오브젝트(Object)

[DB]파싱(Parsing)과 실행계획(Excution Plan)

참고

https://www.youtube.com/watch?v=79cfNIPu0e4&list=PLB4gJELhoLImJ3SBsmvFH8K78j1_zPNzK&index=1

글 보관함
최근에 올라온 글
Total
Today
Yesterday