2026년 09월 14일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-12564 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-12564 TNS: connection refused 는?
ORA-12564 에러는 Oracle Net(TNS) 레이어에서 클라이언트가 데이터베이스 서버에 연결을 시도할 때, 서버 측에서 해당 연결 요청을 명시적으로 거부하거나 수락할 수 없는 상태일 때 발생하는 에러입니다. 단순히 “포트가 닫혀 있다”거나 “리스너가 없다”는 ORA-12541과는 달리, 리스너는 살아있으나 특정 조건에 의해 연결 자체를 거부하는 상황에서 주로 나타납니다. 이 에러는 운영 환경에서 갑작스러운 서비스 중단을 일으킬 수 있으며, DBA가 신속하게 원인을 파악하고 대응해야 합니다.
주요 발생 원인
1. 리스너(Listener)의 유효 노드 검사(Valid Node Checking) 설정에 의한 차단
Oracle 리스너는 sqlnet.ora 파일의 TCP.VALIDNODE_CHECKING, TCP.INVITED_NODES, TCP.EXCLUDED_NODES 파라미터를 통해 특정 IP 주소에서의 접속을 허용하거나 차단할 수 있습니다. 이 설정이 잘못 구성되어 있거나, 클라이언트 IP가 차단 목록에 포함되어 있으면 리스너는 연결 요청을 즉시 거부하며 ORA-12564를 발생시킵니다. 특히 보안 정책 변경이나 서버 이전 후 sqlnet.ora를 업데이트하지 않은 경우에 빈번하게 발생합니다.
2. 데이터베이스 인스턴스가 정상적으로 기동되지 않았거나 RESTRICTED 모드로 운영 중인 경우
리스너는 정상적으로 실행되고 있어도, 실제 Oracle 인스턴스가 MOUNT, NOMOUNT 상태이거나 ALTER SYSTEM ENABLE RESTRICTED SESSION 명령으로 제한 모드(Restricted Session Mode)가 활성화된 경우에는 일반 사용자의 접속이 거부됩니다. 이 경우 DBA 권한(SYSDBA)을 가진 계정만 접속이 가능하며, 일반 애플리케이션이나 사용자는 ORA-12564 또는 ORA-01035를 경험하게 됩니다. 패치 작업이나 긴급 유지보수 후 RESTRICTED 모드 해제를 잊은 경우가 대표적인 사례입니다.
3. 리스너의 CONN_TIMEOUT 또는 세션 수 초과에 의한 거부
Oracle 리스너 파라미터인 INBOUND_CONNECT_TIMEOUT_listenerName이나 sqlnet.ora의 SQLNET.INBOUND_CONNECT_TIMEOUT 설정값이 너무 짧게 설정된 경우, 또는 데이터베이스 인스턴스에서 허용하는 최대 프로세스(PROCESSES) 및 세션(SESSIONS) 수가 초과된 경우 새로운 연결이 거부됩니다. 특히 트래픽이 급증하는 시간대에 세션 수 한도에 도달하면 연결 자체가 불가능해집니다. 이 경우 V$RESOURCE_LIMIT 뷰를 통해 현재 리소스 사용 현황을 즉시 확인해야 합니다.
해결 방법
원인 1 해결: sqlnet.ora 유효 노드 검사 설정 확인 및 수정
서버의 $ORACLE_HOME/network/admin/sqlnet.ora 파일을 열어 아래 항목을 확인합니다.
-- sqlnet.ora 설정 예시 (파일 직접 편집)
-- 아래 설정이 있을 경우, 클라이언트 IP를 INVITED_NODES에 추가하거나
-- TCP.VALIDNODE_CHECKING을 NO로 변경
TCP.VALIDNODE_CHECKING = YES
TCP.INVITED_NODES = (192.168.1.10, 192.168.1.20, 10.0.0.5)
TCP.EXCLUDED_NODES = (192.168.1.99)
설정 변경 후 리스너를 재시작합니다.
-- OS 명령어로 리스너 재기동
-- lsnrctl stop LISTENER
-- lsnrctl start LISTENER
-- 리스너 상태 확인
-- lsnrctl status LISTENER
-- 현재 리스너에 등록된 서비스 확인
-- lsnrctl services LISTENER
원인 2 해결: 인스턴스 상태 및 RESTRICTED 모드 확인 및 해제
-- 현재 데이터베이스 상태 확인
SELECT STATUS, LOGINS, DATABASE_STATUS
FROM V$INSTANCE;
-- RESTRICTED 세션 활성화 여부 확인
SELECT VALUE
FROM V$PARAMETER
WHERE NAME = 'restricted_session';
-- RESTRICTED 모드 해제 (DBA 권한 필요)
ALTER SYSTEM DISABLE RESTRICTED SESSION;
-- 인스턴스가 MOUNT 상태인 경우 OPEN으로 전환
ALTER DATABASE OPEN;
-- 현재 접속 제한 관련 파라미터 확인
SELECT NAME, VALUE, DESCRIPTION
FROM V$PARAMETER
WHERE NAME IN ('sessions', 'processes', 'licenses_max_sessions');
원인 3 해결: 세션 및 프로세스 리소스 한도 확인 및 조정
-- 리소스 한도 현황 확인 (가장 먼저 실행할 쿼리)
SELECT RESOURCE_NAME,
CURRENT_UTILIZATION,
MAX_UTILIZATION,
LIMIT_VALUE
FROM V$RESOURCE_LIMIT
WHERE RESOURCE_NAME IN ('sessions', 'processes');
-- 현재 활성 세션 수 확인
SELECT COUNT(*) AS ACTIVE_SESSIONS
FROM V$SESSION
WHERE STATUS = 'ACTIVE';
-- 세션 수 한도 초과 시 불필요한 세션 강제 종료
SELECT SID, SERIAL#, USERNAME, STATUS, MACHINE, PROGRAM
FROM V$SESSION
WHERE STATUS = 'INACTIVE'
AND LAST_CALL_ET > 3600 -- 1시간 이상 비활성 세션
ORDER BY LAST_CALL_ET DESC;
-- 특정 세션 종료 (SID, SERIAL# 확인 후 실행)
ALTER SYSTEM KILL SESSION '123,456' IMMEDIATE;
-- PROCESSES 및 SESSIONS 파라미터 조정 (재시작 필요)
ALTER SYSTEM SET PROCESSES = 500 SCOPE = SPFILE;
ALTER SYSTEM SET SESSIONS = 550 SCOPE = SPFILE;
-- 리스너 타임아웃 설정 확인 (listener.ora)
-- INBOUND_CONNECT_TIMEOUT_LISTENER = 60 (기본값 60초, 너무 낮으면 조정)
-- sqlnet.ora에서 인바운드 타임아웃 설정
-- SQLNET.INBOUND_CONNECT_TIMEOUT = 60
예방 방법
1. 정기적인 리소스 모니터링 및 임계값 알림 설정
V$RESOURCE_LIMIT 뷰를 주기적으로 모니터링하고, 세션 및 프로세스 사용률이 80%를 초과하면 알림이 발생하도록 Oracle Enterprise Manager(OEM) 또는 외부 모니터링 툴(Zabbix, Prometheus 등)에 임계값을 설정합니다. 사전에 여유 있는 파라미터 값을 설정하고, 변경 시에는 반드시 테스트 환경에서 먼저 검증한 뒤 운영 환경에 반영합니다.
-- 모니터링용 스크립트 예시 (주기적으로 실행)
SELECT RESOURCE_NAME,
CURRENT_UTILIZATION,
MAX_UTILIZATION,
LIMIT_VALUE,
ROUND(CURRENT_UTILIZATION / DECODE(LIMIT_VALUE, 'UNLIMITED', 9999, TO_NUMBER(LIMIT_VALUE)) * 100, 2) AS USAGE_PCT
FROM V$RESOURCE_LIMIT
WHERE RESOURCE_NAME IN ('sessions', 'processes')
ORDER BY USAGE_PCT DESC;
2. sqlnet.ora 및 listener.ora 변경 이력 관리와 주기적 검토
네트워크 구성 파일(sqlnet.ora, listener.ora, tnsnames.ora)은 반드시 형상 관리 도구(Git, SVN 등)를 통해 변경 이력을 관리하고, 분기별로 현재 설정이 운영 환경의 IP 구성 및 보안 정책과 일치하는지 검토합니다. 특히 서버 이전, IP 변경, 보안 정책 강화 시에는 TCP.INVITED_NODES, TCP.EXCLUDED_NODES 설정을 가장 먼저 점검하는 체크리스트를 수립하여 운영 절차에 포함시킵니다.
관련 에러
- ORA-12541 (TNS: no listener): 리스너 자체가 실행되지 않는 경우 발생. ORA-12564는 리스너가 실행 중이나 거부하는 상황이라는 점에서 구분됩니다.
- ORA-12537 (TNS: connection closed): 연결이 수립된 후 비정상적으로 종료될 때 발생하며, 타임아웃 설정과 관련이 깊습니다.
- ORA-01035 (ORACLE only available to users with the RESTRICTED SESSION privilege): RESTRICTED 모드에서 일반 사용자가 접속할 때 발생. ORA-12564와 함께 나타날 수 있습니다.
- ORA-12520 (TNS: listener could not find available handler for requested type of server): 리스너가 요청을 처리할 핸들러를 찾지 못할 때 발생. 세션 초과 상황에서 유사하게 나타납니다.
- ORA-00020 (maximum number of processes exceeded): 프로세스 한도 초과 시 발생하며, ORA-12564의 근본 원인이 되는 경우가 많습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.