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

ORA-12547
2026년 09월 14일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-12547 TNS: lost contact 는?

ORA-12547 에러는 Oracle Net(TNS) 통신 과정에서 클라이언트와 서버 간의 연결이 갑자기 끊어졌을 때 발생하는 에러입니다. 주로 Oracle 리스너(Listener)가 클라이언트의 연결 요청을 받아 서버 프로세스로 핸드오프(handoff)하는 과정에서 통신이 중단될 때 나타납니다. 데이터베이스 서버의 프로세스 권한 문제, 네트워크 불안정, 또는 Oracle 바이너리 파일의 권한 설정 오류 등이 복합적으로 작용하여 발생하는 경우가 많습니다.


주요 발생 원인

1. Oracle 바이너리 파일의 권한(Permission) 오류

가장 흔한 원인으로, $ORACLE_HOME/bin/oracle 실행 파일의 소유권 또는 setuid 비트(setuid bit)가 올바르게 설정되지 않은 경우입니다. Oracle 서버 프로세스는 반드시 oracle 유저 소유이며 setuid 비트가 설정된 상태여야 리스너가 정상적으로 새로운 프로세스를 생성할 수 있습니다. OS 패치, 잘못된 파일 복사, 또는 보안 정책 적용 후 이 권한이 초기화되는 경우가 실무에서 매우 자주 발생합니다.

2. Oracle Listener 및 서버 프로세스 간 핸드오프 실패

리스너가 클라이언트 연결을 받은 뒤, 전용 서버 프로세스(Dedicated Server Process) 또는 공유 서버 프로세스(Shared Server Process)로 연결을 넘기는 과정에서 실패하는 경우입니다. 리스너의 ORACLE_HOME 환경 변수가 잘못 설정되어 있거나, 리스너와 데이터베이스 인스턴스가 서로 다른 Oracle Home을 참조하고 있을 때 자주 발생합니다. 이 경우 listener.logalert_.log를 동시에 확인해야 정확한 원인 파악이 가능합니다.

3. 운영 체제 자원 부족 (OS Resource Exhaustion)

서버의 프로세스 수(max processes), 파일 디스크립터(file descriptor) 한도, 또는 공유 메모리(shared memory) 자원이 고갈된 경우에도 ORA-12547이 발생할 수 있습니다. 새로운 서버 프로세스를 fork하려는 순간 OS 자원이 부족하면 연결 자체가 유지되지 못하고 즉시 끊어집니다. ulimit 설정이나 /proc/sys/kernel/ 하위 커널 파라미터가 Oracle 권장 값보다 낮게 설정된 환경에서 특히 빈번하게 나타납니다.


해결 방법

원인 1 해결: Oracle 바이너리 권한 복구

OS에 root 또는 oracle 유저로 접속하여 아래 명령어로 권한을 확인하고 복구합니다.

-- Oracle 환경 확인 (SQL*Plus 접속 전 OS 레벨에서 확인)
-- 아래는 sqlplus를 통해 현재 인스턴스 상태 확인
SELECT instance_name, status, host_name
FROM v$instance;

OS 레벨 복구 명령어는 다음과 같습니다 (DBA가 root 권한으로 실행):

-- SQL*Plus에서 서버 프로세스 정보 확인
SELECT spid, program, username
FROM v$process
WHERE program LIKE '%ORACLE%'
ORDER BY spid;

$ORACLE_HOME/bin/oracle 파일의 권한이 -rwsr-s--x (6751) 이어야 합니다. 만약 setuid 비트가 빠져 있다면 chmod 6751 $ORACLE_HOME/bin/oracle 명령으로 복구합니다.

원인 2 해결: 리스너 재설정 및 서비스 확인

-- 데이터베이스에 등록된 서비스 및 리스너 상태 확인
SELECT name, network_name, creation_date
FROM v$active_services
ORDER BY name;

-- 리스너에 동적 등록 강제 실행
ALTER SYSTEM REGISTER;

-- 리스너 관련 파라미터 확인
SHOW PARAMETER local_listener;
SHOW PARAMETER remote_listener;

리스너 설정 파일(listener.ora)에서 ORACLE_HOME 경로가 실제 인스턴스의 ORACLE_HOME과 일치하는지 반드시 검증하십시오.

-- 현재 Oracle Home 경로 확인
SELECT value
FROM v$parameter
WHERE name = 'oracle_home';

-- 또는 spfile 파라미터 전체 확인
SELECT name, value, description
FROM v$spparameter
WHERE name IN ('local_listener', 'dispatchers', 'shared_servers')
ORDER BY name;

원인 3 해결: OS 자원 한도 및 Oracle 프로세스 수 점검

-- 현재 Oracle 프로세스 수 및 한도 확인
SELECT resource_name, current_utilization, max_utilization, limit_value
FROM v$resource_limit
WHERE resource_name IN ('processes', 'sessions', 'enqueue_locks')
ORDER BY resource_name;

-- processes 파라미터 조정 (재시작 필요)
-- ALTER SYSTEM SET processes = 500 SCOPE=SPFILE;

-- 현재 활성 세션 수 확인
SELECT status, COUNT(*) AS cnt
FROM v$session
GROUP BY status
ORDER BY cnt DESC;

-- 불필요한 inactive 세션 정리 (예시)
SELECT sid, serial#, username, status, last_call_et, machine
FROM v$session
WHERE status = 'INACTIVE'
  AND last_call_et > 3600
  AND username IS NOT NULL
ORDER BY last_call_et DESC;

-- 특정 세션 종료 (DBA 권한 필요)
-- ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

예방 방법

1. Oracle 바이너리 권한 정기 모니터링 자동화

운영 서버에서 cron job 또는 Oracle Enterprise Manager(OEM) 커스텀 메트릭을 활용하여 $ORACLE_HOME/bin/oracle 파일의 권한을 주기적으로 점검하는 스크립트를 운용하십시오. OS 패치나 보안 스캔 도구가 setuid 비트를 제거하는 사례가 빈번하므로, 패치 작업 후 반드시 권한 체크 절차를 표준 운영 프로세스(SOP)에 포함시켜야 합니다.

-- 정기적으로 실행하여 리소스 한도 여유분 확인 (80% 이상 사용 시 경고)
SELECT resource_name,
       current_utilization,
       limit_value,
       ROUND(current_utilization / DECODE(limit_value, 'UNLIMITED', 99999, TO_NUMBER(limit_value)) * 100, 2) AS usage_pct
FROM v$resource_limit
WHERE limit_value != 'UNLIMITED'
  AND limit_value != '0'
ORDER BY usage_pct DESC;

2. 리스너 및 인스턴스 헬스체크 자동화

lsnrctl status 명령과 Oracle의 v$listener_network 뷰를 활용하여 리스너와 인스턴스 간 서비스 등록 상태를 주기적으로 점검하십시오. 특히 RAC 환경이나 다중 Oracle Home 환경에서는 각 노드별 리스너 설정이 올바른 ORACLE_HOME을 참조하는지 정기 감사(audit) 절차를 수립하는 것이 중요합니다.

-- 리스너에 등록된 서비스 정보 확인
SELECT listener_alias, host, port, service
FROM v$listener_network
ORDER BY listener_alias, service;

관련 에러

  • ORA-12541: TNS: no listener — 리스너 자체가 기동되지 않은 경우로, ORA-12547과 함께 자주 짝을 이루어 발생합니다.
  • ORA-12514: TNS: listener does not currently know of service requested — 리스너에 서비스가 등록되지 않은 상태로, 핸드오프 이전 단계에서 발생합니다.
  • ORA-12560: TNS: protocol adapter error — 로컬 연결 시 Oracle 서비스가 중지되었거나 환경 변수가 잘못 설정된 경우 발생하며, ORA-12547과 증상이 유사합니다.
  • ORA-27300 / ORA-27301 / ORA-27302: OS 레벨의 프로세스 생성 실패와 관련된 에러로, ORA-12547 발생 시 alert.log에 함께 기록되는 경우가 많아 근본 원인 분석에 중요한 단서가 됩니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기