2026년 08월 20일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-04032 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-04032 pga_aggregate_limit exceeded 는?
ORA-04032 에러는 Oracle 데이터베이스의 PGA(Program Global Area) 집계 사용량이 pga_aggregate_limit 파라미터로 설정된 최대 한도를 초과했을 때 발생하는 에러입니다. 이 파라미터는 Oracle 12c부터 도입된 하드 제한(Hard Limit)으로, 단순 권고치였던 pga_aggregate_target과 달리 실제로 메모리 사용을 강제로 차단합니다. 해당 에러가 발생하면 해당 세션의 작업은 즉시 종료되며, 대규모 정렬 작업, 해시 조인, 또는 메모리를 과도하게 사용하는 PL/SQL 프로그램에서 주로 나타납니다.
주요 발생 원인
1. 과도한 메모리를 소비하는 대용량 SQL 쿼리
대량의 데이터를 정렬하거나 해시 조인(Hash Join)을 수행할 때, 각 세션의 Work Area가 급격히 증가하여 전체 PGA 한도를 초과할 수 있습니다. 특히 여러 세션이 동시에 이런 쿼리를 실행하면 집계 PGA 사용량이 순식간에 한도에 도달하게 됩니다. 인덱스가 없는 대형 테이블에 대한 풀 스캔(Full Table Scan) + 정렬 작업이 대표적인 원인입니다.
2. pga_aggregate_limit 파라미터의 부적절한 설정
데이터베이스 설치 시 기본값으로 설정된 pga_aggregate_limit이 실제 워크로드에 비해 너무 낮게 설정된 경우입니다. Oracle의 기본값은 pga_aggregate_target의 2배 또는 2GB 중 큰 값이지만, 시스템 메모리가 적거나 초기 설정이 보수적으로 이루어진 경우 실제 운영 환경에서 금방 한계에 부딪히게 됩니다. DBA가 이 파라미터를 인지하지 못한 채 운영하다가 서비스 부하가 증가하면서 에러가 터지는 경우가 많습니다.
3. 메모리 누수가 있는 PL/SQL 또는 Java 저장 프로시저
잘못 작성된 PL/SQL 코드나 Java Stored Procedure에서 커서를 닫지 않거나, 대형 컬렉션(VARRAY, Nested Table)을 메모리에 계속 쌓아두면 세션의 PGA가 지속적으로 증가합니다. 장시간 실행되는 배치 프로그램에서 특히 위험하며, 하나의 세션이 오랜 시간에 걸쳐 PGA를 점유하면서 다른 세션의 메모리까지 고갈시키는 연쇄 장애를 유발할 수 있습니다.
해결 방법
1. 현재 PGA 사용 현황 진단
먼저 어떤 세션이 PGA를 과도하게 사용하는지 파악합니다.
-- 세션별 PGA 사용량 상위 10개 조회
SELECT
s.sid,
s.serial#,
s.username,
s.program,
s.status,
p.pga_used_mem / 1024 / 1024 AS pga_used_mb,
p.pga_alloc_mem / 1024 / 1024 AS pga_alloc_mb,
p.pga_max_mem / 1024 / 1024 AS pga_max_mb
FROM
v$session s
JOIN v$process p ON s.paddr = p.addr
WHERE
s.username IS NOT NULL
ORDER BY
p.pga_used_mem DESC
FETCH FIRST 10 ROWS ONLY;
-- 전체 PGA 집계 현황 확인
SELECT
name,
value / 1024 / 1024 AS value_mb
FROM
v$pgastat
WHERE
name IN (
'aggregate PGA used for auto workareas',
'aggregate PGA target parameter',
'global memory bound',
'bytes processed'
);
-- pga_aggregate_limit 현재 설정값 확인
SHOW PARAMETER pga_aggregate_limit;
SHOW PARAMETER pga_aggregate_target;
2. pga_aggregate_limit 값 조정
진단 후 한도 값이 실제 워크로드 대비 낮다고 판단되면 값을 늘립니다.
-- 동적으로 PGA 한도 변경 (재시작 불필요)
ALTER SYSTEM SET pga_aggregate_limit = 8G SCOPE = BOTH;
-- pga_aggregate_target도 함께 조정 (권고치)
ALTER SYSTEM SET pga_aggregate_target = 4G SCOPE = BOTH;
-- 변경 후 확인
SELECT
name,
value,
description
FROM
v$parameter
WHERE
name IN ('pga_aggregate_limit', 'pga_aggregate_target');
> ⚠️ 주의: pga_aggregate_limit은 최소 pga_aggregate_target의 2배 이상이어야 하며, 시스템 물리 메모리의 90%를 초과하지 않도록 설정하십시오.
3. 문제 세션 강제 종료
즉각적인 조치가 필요할 경우 해당 세션을 종료합니다.
-- 문제 세션 식별 후 종료
-- 먼저 SID, SERIAL# 확인
SELECT sid, serial#, username, pga_alloc_mem
FROM v$session s
JOIN v$process p ON s.paddr = p.addr
WHERE pga_alloc_mem > 500 * 1024 * 1024 -- 500MB 이상 사용 세션
ORDER BY pga_alloc_mem DESC;
-- 세션 강제 종료
ALTER SYSTEM KILL SESSION '&sid,&serial#' IMMEDIATE;
4. 쿼리 튜닝 및 힌트 적용
메모리 사용이 많은 쿼리를 최적화하여 근본적인 원인을 제거합니다.
-- 해시 조인 대신 네스티드 루프 조인 유도 (메모리 절감)
SELECT /*+ USE_NL(e d) */
e.employee_id,
e.last_name,
d.department_name
FROM
employees e,
departments d
WHERE
e.department_id = d.department_id;
-- 정렬 작업의 Work Area 크기를 세션 단위로 제한
ALTER SESSION SET workarea_size_policy = MANUAL;
ALTER SESSION SET sort_area_size = 104857600; -- 100MB
-- 작업 완료 후 원복
ALTER SESSION SET workarea_size_policy = AUTO;
-- PL/SQL 코드에서 커서 명시적 닫기 (메모리 누수 방지)
DECLARE
CURSOR c_emp IS
SELECT employee_id, last_name FROM employees;
v_emp c_emp%ROWTYPE;
BEGIN
OPEN c_emp;
LOOP
FETCH c_emp INTO v_emp;
EXIT WHEN c_emp%NOTFOUND;
-- 처리 로직
DBMS_OUTPUT.PUT_LINE(v_emp.last_name);
END LOOP;
CLOSE c_emp; -- 반드시 커서 닫기
EXCEPTION
WHEN OTHERS THEN
IF c_emp%ISOPEN THEN
CLOSE c_emp; -- 예외 상황에서도 커서 닫기
END IF;
RAISE;
END;
/
예방 방법
1. PGA 사용량 모니터링 자동화 및 알림 설정
pga_aggregate_limit의 70~80% 수준에서 DBA에게 경고 알림이 가도록 모니터링 스크립트를 주기적으로 실행하거나, Oracle Enterprise Manager(OEM) 또는 사용 중인 모니터링 툴(Zabbix, Prometheus 등)에 임계치 알림을 설정하십시오. 이를 통해 에러가 발생하기 전에 사전 대응이 가능합니다.
-- PGA 사용률 계산 스크립트 (Cron 등으로 정기 실행 권장)
SELECT
ROUND(
(SELECT value FROM v$pgastat WHERE name = 'total PGA allocated') /
(SELECT value FROM v$parameter WHERE name = 'pga_aggregate_limit') * 100,
2
) AS pga_usage_pct
FROM dual;
-- 결과가 75% 이상이면 알림 발송 로직 연동
2. 개발 단계에서의 쿼리 및 코드 검토 프로세스 수립
신규 쿼리나 PL/SQL 코드가 운영 환경에 배포되기 전, 반드시 실행 계획(Execution Plan)과 PGA 예상 사용량을 검토하는 개발 표준을 수립하십시오. DBMS_XPLAN, V$SQL_WORKAREA, V$SQL_PLAN 뷰를 활용하여 메모리 집약적인 연산(Hash Join, Sort)이 포함된 쿼리를 사전에 걸러내고, 대형 컬렉션을 다루는 PL/SQL은 코드 리뷰 필수 항목으로 지정하는 것이 좋습니다.
관련 에러
- ORA-04031: Shared Pool 또는 Large Pool의 메모리 부족 에러로, PGA가 아닌 SGA 영역의 메모리 고갈 시 발생합니다. ORA-04032와 함께 발생하면 전반적인 메모리 설계를 재검토해야 합니다.
- ORA-01652: Temp 테이블스페이스 공간 부족 에러로, PGA Work Area가 부족하여 디스크로 Spill이 발생할 때 Temp 공간이 부족한 경우 함께 나타날 수 있습니다.
- ORA-04030: 프로세스 개인 메모리(Process Private Memory) 부족 에러로, OS 레벨에서 메모리 할당 자체가 실패할 때 발생하며 ORA-04032 이전에 나타나는 경우도 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.