Tan Kim

Oracle Database

Oracle Database는 세계에서 가장 널리 사용되는 엔터프라이즈급 RDBMS다. 높은 신뢰성·확장성·보안성을 바탕으로 금융·통신·정부 등 미션 크리티컬 환경에서 사용된다.

아키텍처 개요

Oracle 인스턴스는 SGA(공유 메모리)와 백그라운드 프로세스들로 구성된다. 하나의 데이터베이스는 RAC 환경에서 여러 인스턴스로 운영할 수 있다.

Client App
  └── User Process
        └── Server Process
              ├── SGA (공유 메모리)
              │    ├── Buffer Cache
              │    ├── Shared Pool
              │    └── Redo Log Buffer
              ├── PGA (프로세스 전용 메모리)
              └── Background Processes (DBWn, LGWR, CKPT ...)

SGA (System Global Area)

SGA는 모든 서버 프로세스와 백그라운드 프로세스가 공유하는 메모리 영역이다.

구성 요소 역할
Buffer Cache 디스크에서 읽은 데이터 블록을 캐싱, 반복 I/O 감소
Shared Pool SQL 실행 계획, 파싱된 SQL, PL/SQL 코드 저장
Redo Log Buffer 변경 이력(redo entry)을 디스크 기록 전 임시 보관
Large Pool 백업/복구, 병렬 실행, 공유 서버 프로세스용 대용량 메모리
Java Pool JVM 기반 Java 코드 실행 영역

PGA (Program Global Area)

PGA는 각 서버 프로세스에 고유하게 할당되는 메모리로, SGA와 달리 다른 프로세스와 공유되지 않는다.

  • 정렬(sort) 영역, 해시 조인 작업 공간
  • 세션 정보, 커서 상태
  • 인스턴스 PGA = 모든 개별 PGA의 합계
  • MEMORY_TARGET 설정 시 SGA ↔ PGA 간 자동 재분배

프로세스 구조

백그라운드 프로세스

프로세스 역할
DBWn 더티 버퍼를 데이터 파일에 기록 (Database Writer)
LGWR Redo Log Buffer를 Redo Log 파일에 기록 (Log Writer)
CKPT 체크포인트 발생 시 데이터 파일 헤더 갱신
SMON 인스턴스 복구, 임시 세그먼트 정리
PMON 실패한 사용자 프로세스 정리, 자원 반환
ARCn Redo Log를 아카이브 로그로 복사 (아카이브 모드 시)

RAC (Real Application Clusters)

RAC는 여러 노드의 인스턴스가 단일 데이터베이스를 공유하는 클러스터 솔루션이다. 수평 확장성과 고가용성을 동시에 제공한다.

[Node 1 Instance] ──┐
                    ├── Shared Storage (ASM)
[Node 2 Instance] ──┘
       ↕ Cache Fusion (inter-node 메모리 공유)
  • Cache Fusion: 노드 간 고속 interconnect로 버퍼 캐시 데이터를 직접 전달, 디스크 I/O 없이 블록 공유
  • 자동 페일오버 및 로드 밸런싱
  • 노드 추가로 선형에 가까운 성능 확장

Data Guard

Data Guard는 물리적 또는 논리적 스탠바이 데이터베이스를 구성해 재해 복구(DR)와 고가용성을 제공한다.

구성 설명
Physical Standby Redo Apply로 블록 단위 완전 복제, 읽기 전용 오픈 가능
Logical Standby SQL Apply로 논리적 변환, 스탠바이에서 다른 구조 허용
Active Data Guard Physical Standby를 읽기 전용으로 열어 리포팅 오프로드
  • 자동 블록 손상 복구 (프라이머리 ↔ 스탠바이 간 양호한 블록 복제)
  • RAC + Data Guard 조합: 프라이머리와 스탠바이 모두 RAC 구성 가능
  • Data Guard Broker로 설정·전환 자동화

ASM (Automatic Storage Management)

ASM은 Oracle 커널에 통합된 파일 시스템 겸 볼륨 매니저다. OS 파일 시스템 없이 데이터베이스 파일을 직접 관리한다.

  • Disk Group: 여러 디스크를 묶어 스트라이핑·미러링 적용
  • 파일 레벨 미러링으로 선택적 보호 (전체 디스크 단위 아님)
  • RAC 환경에서 모든 노드가 동일한 ASM 디스크 그룹 공유
  • Data Guard 스탠바이 리두 로그도 ASM에 위치 권장
-- ASM 디스크 그룹 조회 (ASM 인스턴스에서 실행)
SELECT name, state, total_mb, free_mb FROM v$asm_diskgroup;

주요 버전

버전 출시 특징
19c 2019 LTS(~2027), 자동 인덱싱, SODA JSON API, Hybrid Partitioned Tables
21c 2021 Innovation Release, 블록체인 테이블, 네이티브 JSON 타입, AutoML
23c 2023 LTS, JSON Relational Duality, 네이티브 Vector 타입, AI 벡터 검색

자주 쓰는 쿼리

세션 및 실행 중인 SQL 확인

-- 현재 활성 세션
SELECT sid, serial#, username, status, sql_id
FROM v$session
WHERE status = 'ACTIVE' AND username IS NOT NULL;
 
-- 실행 중인 SQL 텍스트 확인
SELECT s.sid, s.sql_id, q.sql_text
FROM v$session s
JOIN v$sql q ON s.sql_id = q.sql_id
WHERE s.status = 'ACTIVE';

실행 계획 확인

EXPLAIN PLAN FOR
SELECT * FROM employees WHERE department_id = 10;
 
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

테이블스페이스 사용량

SELECT tablespace_name,
       ROUND(used_space * 8192 / 1024 / 1024, 1) AS used_mb,
       ROUND(tablespace_size * 8192 / 1024 / 1024, 1) AS total_mb
FROM dba_tablespace_usage_metrics;

락 확인 및 해제

-- 락 걸린 세션 확인
SELECT l.sid, s.username, l.type, l.mode_held
FROM v$lock l
JOIN v$session s ON l.sid = s.sid
WHERE l.block = 1;
 
-- 세션 강제 종료
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

메모