2026년 09월 18일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-12801 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-12801 error signaled in parallel query server 는?
ORA-12801은 Oracle 병렬 쿼리(Parallel Query) 실행 중 병렬 서버 프로세스(Parallel Query Server) 중 하나에서 오류가 발생했을 때 나타나는 에러입니다. 이 에러 자체는 근본 원인을 나타내지 않으며, 반드시 이와 함께 출력되는 ORA-12801 하위 에러(예: ORA-01555, ORA-04031, ORA-00942 등)를 함께 확인해야 실제 원인을 파악할 수 있습니다. 주로 대용량 테이블 풀 스캔, 복잡한 병렬 조인, 또는 집계 연산 수행 시 병렬 슬레이브 프로세스 중 하나가 실패하면서 코디네이터 프로세스에 오류를 전달하는 방식으로 발생합니다.
주요 발생 원인
1. 병렬 프로세스의 메모리 부족 (ORA-04031 동반)
병렬 쿼리 실행 시 각 병렬 슬레이브 프로세스는 SGA의 Shared Pool 또는 PGA 메모리를 개별적으로 사용합니다. 병렬 degree가 높게 설정되어 있거나 SGA/PGA 설정이 부족한 경우, 슬레이브 프로세스 중 하나가 메모리를 할당받지 못해 ORA-04031을 유발하고, 이것이 상위 에러인 ORA-12801로 표면화됩니다. 특히 PARALLEL_MAX_SERVERS 값이 과도하게 높거나, 여러 대용량 병렬 쿼리가 동시에 실행될 때 자주 발생합니다.
2. Undo 세그먼트 부족 또는 Snapshot Too Old (ORA-01555 동반)
병렬 쿼리는 일반 쿼리보다 실행 시간이 길어질 수 있으며, 실행 도중 Undo 데이터가 덮어쓰여지면 ORA-01555 “snapshot too old” 에러가 병렬 슬레이브 내에서 발생합니다. 이 경우 병렬 코디네이터는 해당 슬레이브의 실패를 감지하고 ORA-12801을 반환합니다. UNDO_RETENTION 파라미터 값이 너무 낮게 설정되어 있거나, Undo 테이블스페이스 크기가 충분하지 않을 때 빈번하게 관찰됩니다.
3. 대상 객체 권한 또는 존재 문제 (ORA-00942, ORA-00904 동반)
병렬 슬레이브 프로세스는 코디네이터 프로세스와 독립적으로 실행되므로, 뷰 내부의 테이블이나 시노님(Synonym)이 가리키는 객체에 접근 권한이 없거나 해당 객체가 존재하지 않는 경우 슬레이브 레벨에서 에러가 발생합니다. 특히 DDL 작업(테이블 DROP, 컬럼 변경 등)이 병렬 쿼리 실행 중에 이루어졌거나, 권한이 롤(Role)을 통해 부여된 경우 병렬 슬레이브가 해당 권한을 인식하지 못해 발생하는 케이스가 실무에서 자주 보고됩니다.
해결 방법
원인 1: 메모리 부족 해결
먼저 현재 병렬 관련 파라미터를 확인하고 적절히 조정합니다.
-- 현재 병렬 관련 파라미터 확인
SELECT name, value
FROM v$parameter
WHERE name IN (
'parallel_max_servers',
'parallel_min_servers',
'parallel_degree_policy',
'pga_aggregate_target',
'sga_target'
);
-- 병렬 서버 최대 수 조정 (세션 레벨)
ALTER SESSION SET parallel_max_servers = 16;
-- 시스템 레벨에서 병렬 degree 제한
ALTER SYSTEM SET parallel_degree_limit = 8 SCOPE=BOTH;
-- 특정 쿼리의 병렬 degree를 힌트로 제한
SELECT /*+ PARALLEL(t, 4) */ *
FROM large_table t
WHERE region_id = 100;
-- PGA 메모리 확인
SELECT name, value/1024/1024 AS value_mb
FROM v$pgastat
WHERE name IN ('aggregate PGA target parameter',
'total PGA allocated');
원인 2: Undo/Snapshot Too Old 해결
-- 현재 UNDO_RETENTION 값 확인
SELECT name, value
FROM v$parameter
WHERE name = 'undo_retention';
-- UNDO_RETENTION 값 증가 (초 단위, 3600 = 1시간)
ALTER SYSTEM SET undo_retention = 3600 SCOPE=BOTH;
-- Undo 테이블스페이스 크기 확인
SELECT tablespace_name,
SUM(bytes)/1024/1024 AS total_mb,
SUM(CASE WHEN status = 'ACTIVE' THEN bytes ELSE 0 END)/1024/1024 AS active_mb,
SUM(CASE WHEN status = 'EXPIRED' THEN bytes ELSE 0 END)/1024/1024 AS expired_mb
FROM dba_undo_extents
GROUP BY tablespace_name;
-- Undo 테이블스페이스 datafile 추가
ALTER TABLESPACE undotbs1
ADD DATAFILE '/oradata/undotbs1_02.dbf' SIZE 2G AUTOEXTEND ON NEXT 512M;
-- GUARANTEE 옵션으로 Undo 보존 보장 (중요 쿼리 실행 전)
ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;
원인 3: 권한 문제 해결
-- 병렬 슬레이브가 인식하지 못하는 Role 기반 권한 확인
SELECT grantee, granted_role, admin_option, default_role
FROM dba_role_privs
WHERE grantee = 'YOUR_USER';
-- Role이 아닌 직접 권한 부여 (병렬 환경에서는 직접 부여 권장)
GRANT SELECT ON schema_owner.target_table TO your_user;
-- 병렬 쿼리 수행 중 사라진 객체 확인
SELECT object_name, object_type, status
FROM dba_objects
WHERE object_name = 'TARGET_TABLE'
AND owner = 'SCHEMA_OWNER';
-- 병렬 비활성화 후 테스트 (에러 재현 및 원인 분리)
ALTER SESSION DISABLE PARALLEL QUERY;
SELECT *
FROM large_table
WHERE id = 1;
-- 다시 병렬 활성화
ALTER SESSION ENABLE PARALLEL QUERY;
-- 특정 테이블의 병렬 설정 해제
ALTER TABLE large_table NOPARALLEL;
에러 원인 추적을 위한 진단 쿼리
-- 병렬 쿼리 수행 현황 모니터링
SELECT qc_session_id,
server_group,
degree,
req_degree,
state
FROM v$px_session
ORDER BY qc_session_id;
-- Alert Log에서 ORA-12801 관련 에러 체인 확인 (12c 이상)
SELECT originating_timestamp,
message_text
FROM v$diag_alert_ext
WHERE message_text LIKE '%ORA-12801%'
OR message_text LIKE '%parallel%'
ORDER BY originating_timestamp DESC
FETCH FIRST 20 ROWS ONLY;
-- 병렬 실행 통계 확인
SELECT px_servers_requested,
px_servers_allocated,
elapsed_time/1000000 AS elapsed_sec,
sql_text
FROM v$sql
WHERE px_servers_requested > 0
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;
예방 방법
1. 병렬 degree 정책을 자동화하고 리소스 관리 계획(Resource Manager)을 활용하세요
무분별한 병렬 쿼리 실행을 방지하기 위해 PARALLEL_DEGREE_POLICY를 AUTO 또는 LIMITED로 설정하고, Oracle Resource Manager를 통해 소비자 그룹(Consumer Group)별로 병렬 degree 상한선을 지정하는 것이 실무에서 매우 효과적입니다. 또한 PARALLEL_SERVERS_TARGET 파라미터를 적절히 설정하여 전체 시스템에서 허용하는 병렬 슬레이브 수를 제어하면, 메모리 및 CPU 과부하로 인한 ORA-12801 발생 빈도를 크게 낮출 수 있습니다.
-- 자동 병렬 degree 정책 설정
ALTER SYSTEM SET parallel_degree_policy = 'AUTO' SCOPE=BOTH;
-- 병렬 서버 타겟 설정
ALTER SYSTEM SET parallel_servers_target = 32 SCOPE=BOTH;
2. 정기적인 Undo 테이블스페이스 및 메모리 모니터링 자동화
Undo 부족이나 메모리 문제는 대부분 갑자기 발생하는 것이 아니라 서서히 누적됩니다. AWR(Automatic Workload Repository) 리포트 또는 커스텀 모니터링 스크립트를 통해 Undo 사용량, PGA/SGA 사용률, 병렬 쿼리 대기 이벤트(PX Deq: reap credit, PX Deq Credit: send blkd)를 주기적으로 추적하면 ORA-12801 발생 전에 사전 조치를 취할 수 있습니다.
-- Undo 사용률 모니터링 스크립트
SELECT TO_CHAR(begin_time, 'YYYY-MM-DD HH24:MI') AS snap_time,
undoblks,
txncount,
maxquerylen,
ssolderrcnt -- Snapshot Too Old 발생 횟수
FROM v$undostat
ORDER BY begin_time DESC
FETCH FIRST 24 ROWS ONLY;
관련 에러
- ORA-01555 (Snapshot too old): ORA-12801과 가장 빈번하게 동반되는 에러로, Undo 데이터 부족 시 병렬 슬레이브 내에서 발생합니다.
- ORA-04031 (Unable to allocate N bytes of shared memory): SGA Shared Pool 메모리 부족으로 병렬 슬레이브가 메모리를 할당받지 못할 때 발생하며 ORA-12801을 유발합니다.
- ORA-00942 (Table or view does not exist): 병렬 슬레이브가 대상 객체를 찾지 못할 때 발생하며, 주로 권한 문제나 DDL 충돌이 원인입니다.
- ORA-12805 (parallel query server died unexpectedly): 병렬 슬레이브 프로세스가 예기치 않게 종료될 때 발생하며, ORA-12801과 함께 나타나는 경우가 많습니다.
- ORA-00604 (error occurred at recursive SQL level N): 내부 재귀 SQL 실행 중 에러 발생 시 ORA-12801과 연쇄적으로 나타날 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.