2026년 09월 18일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-12805 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-12805 parallel query server died unexpectedly 는?
ORA-12805는 Oracle 데이터베이스에서 병렬 쿼리(Parallel Query)를 수행하는 도중 병렬 처리를 담당하는 서버 프로세스(Parallel Query Server)가 예기치 않게 종료되었을 때 발생하는 에러입니다. 병렬 쿼리는 대용량 데이터를 처리하기 위해 여러 개의 서버 프로세스를 동시에 활용하는 방식인데, 이 중 하나 이상의 프로세스가 비정상적으로 종료되면 쿼리 전체가 실패하게 됩니다. 주로 대규모 데이터 처리, 파티션 테이블 조회, 병렬 DML 작업 시 나타나며, 시스템 자원 부족이나 내부 오류가 원인인 경우가 많습니다.
주요 발생 원인
- 메모리(PGA/SGA) 부족
병렬 쿼리 서버 프로세스는 각각 독립적인 메모리 공간을 사용합니다. 시스템 전체의 PGA 또는 SGA 메모리가 부족할 경우, 개별 병렬 서버 프로세스가 메모리를 할당받지 못하고 비정상 종료될 수 있습니다. 특히 SORT_AREA_SIZE, HASH_AREA_SIZE 등의 파라미터가 너무 작게 설정되어 있거나, PGA_AGGREGATE_TARGET이 현재 처리 중인 병렬 쿼리의 요구량을 충족하지 못할 경우 이 에러가 빈번하게 발생합니다.
- 과도한 병렬 처리 설정 (Degree of Parallelism 초과)
PARALLEL_MAX_SERVERS 파라미터로 제한된 최대 병렬 서버 수를 초과하는 요청이 발생하거나, 동시에 너무 많은 병렬 쿼리가 실행될 경우 서버 프로세스 할당에 실패합니다. Oracle은 가용한 병렬 서버가 부족할 경우 쿼리를 직렬로 실행하거나, 상황에 따라 이미 실행 중인 병렬 서버 프로세스를 강제 종료시켜 ORA-12805를 유발할 수 있습니다. 또한 PARALLEL_DEGREE_POLICY가 AUTO로 설정된 경우 Oracle이 과도한 DOP(Degree of Parallelism)를 자동으로 부여하여 문제가 악화될 수 있습니다.
- OS 레벨의 자원 한계 또는 버그
운영 체제의 프로세스 한계(ulimit), 파일 디스크립터 부족, 혹은 OS 커널 파라미터 설정 미흡으로 인해 병렬 서버 프로세스가 강제로 종료될 수 있습니다. 또한 특정 Oracle 버전의 버그로 인해 병렬 서버 프로세스가 비정상 종료되는 사례도 알려져 있으며, 이 경우 alert log와 trace 파일을 반드시 확인하여 ORA-00600 또는 ORA-07445 같은 내부 에러가 동반되는지 살펴봐야 합니다.
해결 방법
1. 메모리 부족 해결
현재 PGA 사용량과 병렬 쿼리 관련 메모리 현황을 먼저 확인합니다.
-- PGA 사용량 및 설정 확인
SELECT name, value
FROM v$parameter
WHERE name IN ('pga_aggregate_target', 'pga_aggregate_limit',
'parallel_max_servers', 'parallel_min_servers',
'sort_area_size', 'hash_area_size');
-- 현재 PGA 통계 확인
SELECT *
FROM v$pgastat
WHERE name IN ('aggregate PGA target parameter',
'aggregate PGA auto target',
'total PGA allocated',
'maximum PGA allocated');
PGA 메모리가 부족하다고 판단되면, DBA 권한으로 아래와 같이 조정합니다.
-- PGA 집계 목표 값 증가 (시스템 전체 메모리의 20~25% 권장)
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 4G SCOPE=BOTH;
-- PGA 최대 한도 설정 (선택 사항, 12c 이상)
ALTER SYSTEM SET PGA_AGGREGATE_LIMIT = 8G SCOPE=BOTH;
2. 병렬 처리 설정 조정
병렬 서버 수와 DOP를 현실적인 수준으로 조정합니다.
-- 현재 활성화된 병렬 쿼리 세션 확인
SELECT qcsid, qcserial#, server#, degree, req_degree, status
FROM v$px_session
ORDER BY qcsid;
-- 병렬 서버 최대/최소 수 조정
ALTER SYSTEM SET PARALLEL_MAX_SERVERS = 64 SCOPE=BOTH;
ALTER SYSTEM SET PARALLEL_MIN_SERVERS = 4 SCOPE=BOTH;
-- 특정 테이블의 DOP를 적정 수준으로 제한
ALTER TABLE big_sales_table PARALLEL 4;
-- 또는 세션 레벨에서 병렬 처리를 제한
ALTER SESSION FORCE PARALLEL QUERY PARALLEL 4;
특정 쿼리에 힌트를 사용하여 DOP를 명시적으로 지정하는 것도 좋은 방법입니다.
-- 힌트를 사용한 DOP 명시적 지정
SELECT /*+ PARALLEL(t, 4) */
dept_id,
SUM(sales_amount) AS total_sales
FROM big_sales_table t
GROUP BY dept_id;
-- 병렬 처리 비활성화 (문제 재현 시 직렬 실행으로 테스트)
SELECT /*+ NO_PARALLEL */ *
FROM big_sales_table
WHERE sale_date >= DATE '2024-01-01';
3. Alert Log 및 Trace 파일 분석
에러 발생 시 반드시 내부 에러 동반 여부를 확인합니다.
-- 최근 발생한 에러 및 incident 확인 (12c 이상)
SELECT incident_id, error_number, error_message, create_time
FROM v$diag_incident
WHERE error_number IN (12805, 600, 7445)
ORDER BY create_time DESC;
-- ADR 경로 확인 (trace 파일 위치)
SELECT value FROM v$diag_info WHERE name = 'Default Trace File';
-- 현재 병렬 쿼리 관련 대기 이벤트 확인
SELECT event, count(*) AS cnt
FROM v$session
WHERE wait_class != 'Idle'
AND program LIKE '%P0%' -- Parallel Query 프로세스 필터
GROUP BY event
ORDER BY cnt DESC;
예방 방법
- 병렬 처리 리소스 모니터링 및 적정 파라미터 유지
주기적으로 V$PX_SESSION, V$PX_PROCESS, V$PGASTAT 뷰를 통해 병렬 쿼리 자원 사용량을 모니터링하고, PARALLEL_MAX_SERVERS는 CPU 코어 수의 2~4배를 초과하지 않도록 설정하는 것이 권장됩니다. 또한 PARALLEL_DEGREE_POLICY를 MANUAL 또는 LIMITED로 설정하여 Oracle이 자동으로 과도한 DOP를 부여하는 것을 방지하고, 운영 중인 쿼리의 실제 실행 계획을 정기적으로 점검하여 불필요하게 높은 DOP가 설정된 경우 튜닝을 수행해야 합니다.
“`sql
— 병렬 쿼리 정책 수동 설정
ALTER SYSTEM SET PARALLEL_DEGREE_POLICY = ‘MANUAL’ SCOPE=BOTH;
— 병렬 서버 모니터링 쿼리 (주기적 실행 권장)
SELECT server_name, status, sessions_per_server
FROM v$px_process_sysstat;
“`
- OS 및 Oracle 환경 정기 점검
운영 체제의 ulimit -u(최대 프로세스 수), ulimit -n(파일 디스크립터 수)을 Oracle 권장 값 이상으로 설정하고, Oracle PSU(Patch Set Update) 및 CPU 패치를 최신 상태로 유지해야 합니다. 특히 병렬 쿼리 관련 버그 픽스가 포함된 패치를 적시에 적용하면 ORA-12805 발생 가능성을 크게 줄일 수 있습니다. My Oracle Support(MOS)에서 현재 운영 중인 Oracle 버전에 해당하는 병렬 쿼리 관련 Known Issue를 정기적으로 확인하는 것도 매우 중요합니다.
관련 에러
- ORA-00600: Oracle 내부 에러로, ORA-12805와 동반 발생 시 버그일 가능성이 높음. 반드시 MOS SR 오픈 권장.
- ORA-07445: OS 시그널에 의한 프로세스 비정상 종료 시 발생. 병렬 서버 프로세스의 코어 덤프와 함께 나타날 수 있음.
- ORA-12801: 병렬 쿼리 서버에서 에러 신호를 받았을 때 발생하며, ORA-12805와 함께 나타나는 경우가 많음.
- ORA-04031: SGA 공유 메모리 할당 실패 에러로, SGA 메모리 부족 시 병렬 서버 프로세스에 영향을 줄 수 있음.
- ORA-12853: 병렬 쿼리 서버 프로세스가 제한 수에 도달했을 때 발생하며,
PARALLEL_MAX_SERVERS조정으로 해결 가능.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.