2026년 09월 10일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-12500 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-12500 TNS: listener failed to start a dedicated server process 는?
ORA-12500 에러는 Oracle Net Services의 리스너(Listener)가 클라이언트 연결 요청을 수신했지만, 해당 연결을 처리할 전용 서버 프로세스(Dedicated Server Process)를 생성하지 못했을 때 발생합니다. 이 에러는 주로 운영체제 수준의 자원 부족, Oracle 프로세스 한도 초과, 또는 환경 설정 오류로 인해 발생하며, 새로운 데이터베이스 세션 자체가 불가능한 심각한 상태를 의미합니다. 실무에서는 갑작스러운 트래픽 급증, 좀비 프로세스 누적, 또는 운영체제 커널 파라미터 설정 미흡 등의 상황에서 자주 목격되는 에러입니다.
주요 발생 원인
1. Oracle 최대 프로세스 수 초과 (PROCESSES 파라미터 한도 도달)
Oracle 데이터베이스의 초기화 파라미터 중 PROCESSES는 동시에 연결 가능한 최대 OS 프로세스 수를 제한합니다. 이 한도에 도달하면 리스너는 새로운 전용 서버 프로세스를 fork할 수 없어 ORA-12500이 발생하며, 이는 DBA가 가장 먼저 확인해야 할 원인입니다. 특히 애플리케이션 커넥션 풀 설정이 잘못되어 있거나 세션이 정상적으로 종료되지 않고 누적될 때 빈번하게 발생합니다.
2. 운영체제 자원 부족 (OS 레벨 프로세스/메모리 한도)
Linux/Unix 환경에서 운영체제의 ulimit 설정(특히 nproc, nofile)이 Oracle 권장값보다 낮게 설정되어 있으면, Oracle 유저가 새로운 프로세스를 생성하지 못해 에러가 발생합니다. 또한 시스템 전체 메모리 부족(OOM) 상황이나 스왑 공간 고갈도 프로세스 생성 실패의 원인이 됩니다. 이는 운영체제와 Oracle 양쪽 모두를 점검해야 하는 복합적인 문제입니다.
3. 리스너 환경 설정 오류 또는 리스너 자체 문제
listener.ora 파일의 잘못된 설정, 리스너와 데이터베이스 인스턴스 간의 연결 정보 불일치, 또는 리스너 프로세스 자체의 비정상 상태가 원인이 될 수 있습니다. 리스너가 실행 중임에도 불구하고 내부적으로 손상된 상태이거나, ORACLE_HOME 환경 변수가 올바르게 설정되지 않은 경우에도 이 에러가 발생합니다.
해결 방법
원인 1 해결: PROCESSES 파라미터 확인 및 조정
먼저 현재 프로세스 사용 현황과 파라미터 값을 확인합니다.
-- 현재 PROCESSES 파라미터 값 확인
SHOW PARAMETER PROCESSES;
-- 현재 활성 세션 수 확인
SELECT COUNT(*) AS ACTIVE_SESSIONS
FROM V$SESSION
WHERE STATUS = 'ACTIVE';
-- 전체 세션 수와 최대값 비교
SELECT
COUNT(*) AS CURRENT_SESSIONS,
(SELECT VALUE FROM V$PARAMETER
WHERE NAME = 'processes') AS MAX_PROCESSES,
(SELECT VALUE FROM V$PARAMETER
WHERE NAME = 'sessions') AS MAX_SESSIONS
FROM V$SESSION;
-- 좀비/비활성 세션 확인 (오랫동안 유휴 상태인 세션)
SELECT SID, SERIAL#, USERNAME, STATUS,
LAST_CALL_ET / 3600 AS IDLE_HOURS,
MACHINE, PROGRAM
FROM V$SESSION
WHERE STATUS = 'INACTIVE'
AND LAST_CALL_ET > 3600 -- 1시간 이상 유휴
ORDER BY LAST_CALL_ET DESC;
-- 특정 좀비 세션 강제 종료
ALTER SYSTEM KILL SESSION '&SID,&SERIAL#' IMMEDIATE;
-- PROCESSES 파라미터 값 증가 (SPFILE 사용 환경)
-- 현재 값의 약 1.5~2배로 조정 권장
ALTER SYSTEM SET PROCESSES = 500 SCOPE = SPFILE;
-- 변경 후 반드시 DB 재시작 필요
-- SHUTDOWN IMMEDIATE;
-- STARTUP;
-- 세션 관련 파라미터도 함께 조정 (통상 PROCESSES * 1.1 + 5)
ALTER SYSTEM SET SESSIONS = 555 SCOPE = SPFILE;
원인 2 해결: OS 레벨 자원 한도 점검 및 조정
Oracle 유저의 ulimit 설정을 확인하고 조정합니다. 이 작업은 OS 명령어로 수행하며, 이후 SQL로 결과를 확인합니다.
-- Oracle에서 현재 OS PID 및 프로세스 정보 확인
SELECT SPID, PROGRAM, PGA_USED_MEM, PGA_ALLOC_MEM
FROM V$PROCESS
ORDER BY PGA_ALLOC_MEM DESC
FETCH FIRST 20 ROWS ONLY;
-- 메모리 사용 현황 확인 (SGA, PGA)
SELECT
NAME,
TO_CHAR(BYTES / 1024 / 1024, '999,999.99') AS MB
FROM V$SGAINFO
WHERE NAME IN ('Maximum SGA Size', 'Total SGA Size', 'Free SGA Memory Available')
UNION ALL
SELECT
'Total PGA Allocated',
TO_CHAR(VALUE / 1024 / 1024, '999,999.99')
FROM V$PGASTAT
WHERE NAME = 'total PGA allocated';
-- OS 레벨 확인은 쉘에서 수행 (참고용 주석)
-- $ ulimit -u -- 최대 프로세스 수
-- $ ulimit -n -- 최대 파일 디스크립터 수
-- $ free -m -- 메모리 여유 확인
-- /etc/security/limits.conf 설정 예시:
-- oracle soft nproc 16384
-- oracle hard nproc 16384
-- oracle soft nofile 65536
-- oracle hard nofile 65536
원인 3 해결: 리스너 상태 점검 및 재구성
-- 리스너에 등록된 서비스 확인
SELECT NAME, NETWORK_NAME, CREATION_DATE
FROM V$ACTIVE_SERVICES
ORDER BY NAME;
-- 현재 리스너 등록 상태 확인
-- (SQL*Plus 또는 OS 프롬프트에서 실행)
-- $ lsnrctl status
-- $ lsnrctl services
-- 데이터베이스가 리스너에 동적 등록되었는지 확인
SHOW PARAMETER LOCAL_LISTENER;
SHOW PARAMETER REMOTE_LISTENER;
SHOW PARAMETER SERVICE_NAMES;
-- 리스너 동적 재등록 강제 실행
ALTER SYSTEM REGISTER;
-- listener.ora가 올바른지 확인 후 리스너 재시작
-- $ lsnrctl stop
-- $ lsnrctl start
-- 리스너 로그 위치 확인 (에러 분석을 위해)
SELECT VALUE AS LOG_DIRECTORY
FROM V$DIAG_INFO
WHERE NAME = 'Diag Trace';
예방 방법
1. 프로세스 및 세션 모니터링 자동화
PROCESSES 파라미터 대비 현재 세션 사용률을 주기적으로 모니터링하고, 80% 이상 도달 시 자동 알림이 오도록 Oracle Enterprise Manager(OEM) 또는 커스텀 스크립트를 구성해야 합니다. 또한 애플리케이션 커넥션 풀의 최대 연결 수를 데이터베이스 PROCESSES 값의 70~80% 이내로 제한하여 한도 초과를 사전에 방지하는 것이 중요합니다.
2. OS 커널 파라미터 및 Oracle 파라미터 정기 검토
Oracle 설치 및 업그레이드 시 Oracle 공식 문서(MOS: My Oracle Support)에서 권장하는 OS 커널 파라미터(shmmax, shmall, nproc, nofile 등)를 반드시 적용하고, 이를 변경 관리 문서로 관리해야 합니다. 분기별로 V$RESOURCE_LIMIT 뷰를 통해 각 자원의 최대 사용량(MAX_UTILIZATION)을 검토하여 파라미터 재조정 여부를 판단하는 루틴을 수립하는 것을 강력히 권장합니다.
관련 에러
- ORA-12514:
TNS: listener does not currently know of service requested in connect descriptor— 리스너가 요청된 서비스를 인식하지 못할 때 발생하며, ORA-12500과 함께 리스너 문제 진단 시 함께 확인해야 합니다. - ORA-12518:
TNS: listener could not hand off client connection— ORA-12500과 매우 유사한 상황에서 발생하며, 리스너가 클라이언트 연결을 서버 프로세스에 넘기지 못할 때 나타납니다. - ORA-00020:
maximum number of processes (N) exceeded— PROCESSES 파라미터 한도 초과 시 발생하며, ORA-12500의 직접적인 원인이 되는 에러입니다. - ORA-27300 / ORA-27301 / ORA-27302: OS 레벨에서 프로세스 생성 실패 시 ORA-12500과 함께 alert 로그에 기록되는 에러들로, 정확한 OS 레벨 실패 원인을 파악하는 데 중요합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.