Oracle ORA-04036 오류 원인과 해결 방법 완벽 가이드

ORA-04036
2026년 08월 20일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-04036 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-04036 PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT 는?

ORA-04036 에러는 Oracle 인스턴스 전체에서 사용 중인 PGA(Program Global Area) 메모리의 합계가 PGA_AGGREGATE_LIMIT 파라미터로 설정된 한계값을 초과했을 때 발생합니다. 이 에러는 Oracle 12c부터 도입된 기능으로, 무제한적인 PGA 메모리 사용으로 인한 시스템 전체의 메모리 고갈을 방지하기 위해 설계되었습니다. 한계값을 초과하면 Oracle은 가장 많은 PGA를 소비하는 세션을 강제로 중단시키거나, 해당 세션의 호출을 종료시켜 시스템 안정성을 유지하려 합니다.


주요 발생 원인

  • PGA_AGGREGATE_LIMIT 값이 너무 낮게 설정된 경우

PGA_AGGREGATE_LIMIT의 기본값은 PGA_AGGREGATE_TARGET의 2배 또는 2GB 중 큰 값으로 설정되지만, DBA가 수동으로 이 값을 지나치게 낮게 설정했을 때 문제가 발생합니다. 실제 업무 부하(Work Load)가 증가하거나 대용량 정렬, 해시 조인, 병렬 쿼리 등의 메모리 집약적 작업이 증가하면 금방 한계에 도달하게 됩니다. 특히 개발 또는 테스트 환경의 설정을 그대로 운영 환경에 적용한 경우에 흔히 발생합니다.

  • 메모리 누수(Memory Leak) 또는 과도한 PGA 소비 세션 존재

특정 세션이 대용량 임시 테이블, 정렬 작업, 커서를 닫지 않은 상태로 과도하게 메모리를 점유하는 경우가 원인이 됩니다. 잘못 작성된 PL/SQL 코드, 커서를 명시적으로 닫지 않는 루프 구조, 또는 대량 데이터를 컬렉션(VARRAY, Nested Table)에 적재하는 작업이 PGA를 급격히 증가시킬 수 있습니다. 이러한 세션들은 장시간 실행되면서 다른 정상적인 세션들의 메모리 자원을 고갈시킵니다.

  • 병렬 쿼리(Parallel Query) 또는 대용량 정렬/해시 조인의 급증

병렬 실행 계획이 적용된 쿼리는 각 병렬 슬레이브(Parallel Slave) 프로세스마다 별도의 PGA를 할당받기 때문에, 동시에 여러 병렬 쿼리가 수행될 경우 PGA 사용량이 기하급수적으로 증가할 수 있습니다. 대용량 테이블의 Full Table Scan 후 정렬이나 해시 조인을 수행할 때도 Work Area(정렬 영역)가 확대되어 PGA 소비가 급증합니다. 갑작스러운 배치 작업의 집중 실행이 이 문제를 유발하는 대표적인 시나리오입니다.


해결 방법

1. 현재 PGA 사용 현황 진단

먼저 현재 PGA 설정값과 실제 사용량을 정확히 파악해야 합니다.

-- PGA 관련 파라미터 현재값 확인
SELECT name, value, description
FROM v$parameter
WHERE name IN ('pga_aggregate_target', 'pga_aggregate_limit')
ORDER BY name;

-- 인스턴스 전체 PGA 사용 현황 확인
SELECT
    name,
    value / 1024 / 1024 AS value_mb
FROM v$pgastat
WHERE name IN (
    'aggregate PGA target parameter',
    'aggregate PGA auto target',
    'global memory bound',
    'total PGA inuse',
    'total PGA allocated',
    'maximum PGA allocated'
);

2. 과도한 PGA를 소비하는 세션 식별 및 처리

-- PGA를 많이 소비하는 세션 상위 10개 조회
SELECT
    s.sid,
    s.serial#,
    s.username,
    s.status,
    s.program,
    s.sql_id,
    ROUND(p.pga_used_mem / 1024 / 1024, 2)      AS pga_used_mb,
    ROUND(p.pga_alloc_mem / 1024 / 1024, 2)     AS pga_alloc_mb,
    ROUND(p.pga_max_mem / 1024 / 1024, 2)       AS pga_max_mb
FROM v$session s
JOIN v$process p ON p.addr = s.paddr
WHERE s.username IS NOT NULL
ORDER BY p.pga_used_mem DESC
FETCH FIRST 10 ROWS ONLY;

-- 문제가 되는 세션 강제 종료 (SID, SERIAL# 확인 후 실행)
ALTER SYSTEM KILL SESSION '&sid,&serial#' IMMEDIATE;

3. PGA_AGGREGATE_LIMIT 값 조정

현재 워크로드에 맞게 한계값을 늘려주는 것이 즉각적인 해결책입니다.

-- 동적으로 PGA_AGGREGATE_LIMIT 변경 (재시작 불필요)
-- 단위: 바이트 (아래 예시는 16GB로 설정)
ALTER SYSTEM SET PGA_AGGREGATE_LIMIT = 16G SCOPE = BOTH;

-- PGA_AGGREGATE_TARGET도 함께 조정 (권장: 물리 메모리의 20~40%)
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 8G SCOPE = BOTH;

-- 변경 후 확인
SELECT name, value
FROM v$parameter
WHERE name IN ('pga_aggregate_target', 'pga_aggregate_limit');

4. 현재 실행 중인 SQL의 메모리 사용 상세 분석

-- 활성 세션의 SQL별 PGA 사용량 및 실행 계획 확인
SELECT
    s.sid,
    s.serial#,
    s.username,
    sq.sql_text,
    ROUND(p.pga_used_mem / 1024 / 1024, 2) AS pga_used_mb,
    sq.sorts,
    sq.disk_reads,
    sq.buffer_gets
FROM v$session s
JOIN v$process p   ON p.addr  = s.paddr
JOIN v$sql     sq  ON sq.sql_id = s.sql_id
WHERE s.status = 'ACTIVE'
  AND s.username IS NOT NULL
ORDER BY p.pga_used_mem DESC;

-- Work Area 사용 현황 확인 (정렬, 해시 조인 등)
SELECT
    operation_type,
    policy,
    estimated_optimal_size / 1024 / 1024  AS optimal_mb,
    estimated_onepass_size / 1024 / 1024  AS onepass_mb,
    active_time_seconds,
    work_area_size / 1024 / 1024          AS workarea_mb,
    number_passes
FROM v$sql_workarea_active
ORDER BY work_area_size DESC;

예방 방법

  • 정기적인 PGA 모니터링 및 알림 체계 구축

운영 환경에서 PGA 사용량이 PGA_AGGREGATE_LIMIT의 80%를 초과하면 즉시 경보가 발생하도록 모니터링 체계를 구축해야 합니다. Oracle Enterprise Manager(OEM), Zabbix, 또는 사용자 정의 스크립트를 통해 V$PGASTATtotal PGA allocated 값을 주기적으로 수집하고, 임계값 초과 시 DBA에게 이메일/SMS 알림이 전송되도록 설정하는 것이 중요합니다. 아울러 STATISTICS_LEVEL = TYPICAL 이상으로 설정하여 AWR(Automatic Workload Repository) 보고서를 통해 PGA 트렌드를 주기적으로 분석하십시오.

  • PL/SQL 코드 및 애플리케이션 레벨 메모리 관리 강화

개발 단계에서부터 커서를 반드시 명시적으로 닫고(CLOSE cursor_name), 대용량 컬렉션 사용 후에는 collection.DELETE 또는 collection.TRIM으로 메모리를 해제하는 코딩 표준을 수립해야 합니다. 또한 병렬 쿼리의 DEGREE 설정을 무분별하게 높이지 않도록 애플리케이션 SQL 리뷰 프로세스를 도입하고, 대용량 배치 작업은 업무 비수기(야간, 주말)에 분산 실행되도록 스케줄링하여 PGA 사용량의 피크를 분산시키는 것이 효과적입니다.


관련 에러

  • ORA-04030: 프로세스 메모리를 할당할 수 없을 때 발생하는 에러로, ORA-04036과 유사하게 PGA 메모리 부족과 관련됩니다. ORA-04036이 인스턴스 전체 한계 초과라면, ORA-04030은 개별 프로세스 수준의 메모리 할당 실패입니다.
  • ORA-01555 (Snapshot Too Old): 대용량 쿼리 실행 시 undo 공간 부족으로 발생하며, 과도한 메모리 사용과 함께 나타나는 경우가 많습니다.
  • ORA-04031: Shared Pool 또는 Large Pool 등 SGA 메모리 부족 시 발생하는 에러로, PGA가 아닌 SGA 영역의 메모리 고갈과 관련됩니다. PGA와 SGA 모두 전체 시스템 메모리를 공유하므로, 두 에러가 연쇄적으로 발생할 수 있습니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기