2026년 09월 13일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-12537 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-12537 TNS: connection closed 는?
ORA-12537은 Oracle Net(TNS) 레이어에서 클라이언트와 서버 간의 네트워크 연결이 예기치 않게 끊어졌을 때 발생하는 에러입니다. 일반적으로 리스너(Listener) 또는 데이터베이스 서버 측에서 연결을 강제로 종료하거나, 네트워크 장비(방화벽, 로드밸런서 등)가 세션을 중간에 차단할 때 나타납니다. 개발 환경보다는 운영 환경에서 더 자주 발생하며, 장시간 유휴 상태(Idle)의 커넥션이나 대용량 데이터 처리 중에도 자주 목격되는 에러입니다.
주요 발생 원인
1. SQLNET.EXPIRE_TIME 및 방화벽의 세션 타임아웃 설정
가장 흔한 원인 중 하나로, 방화벽이나 로드밸런서가 일정 시간 동안 트래픽이 없는 TCP 세션을 강제로 종료하는 경우입니다. Oracle 클라이언트와 서버는 세션이 아직 살아있다고 인식하지만, 네트워크 중간 장비가 이미 연결을 끊어 버린 상태이기 때문에 다음 쿼리 실행 시 ORA-12537이 발생합니다. 특히 장시간 배치(Batch) 작업이나 유휴 상태가 길어지는 OLTP 애플리케이션에서 자주 발생합니다.
2. Oracle Listener 혹은 데이터베이스 프로세스의 비정상 종료
리스너(Listener)가 재시작되거나 데이터베이스 인스턴스가 비정상 종료(Crash, Shutdown Abort 등)될 경우, 기존에 맺어진 모든 클라이언트 세션이 강제로 끊어집니다. 이 상황에서 클라이언트는 서버로부터 “연결이 닫혔다”는 메시지를 받게 되며, 정확히 ORA-12537 에러로 리포팅됩니다. 알림 없이 DBA가 서비스 점검을 수행하거나 OS 레벨의 패치 작업이 수행될 때도 동일하게 발생합니다.
3. Oracle Net 파라미터(sqlnet.ora, listener.ora) 설정 오류
sqlnet.ora 또는 listener.ora 파일 내의 잘못된 파라미터 설정이 연결을 불안정하게 만들 수 있습니다. 예를 들어 SQLNET.INBOUND_CONNECT_TIMEOUT 값이 너무 짧게 설정되어 있으면, 클라이언트가 핸드셰이크를 완료하기 전에 서버가 연결을 끊어 버립니다. 또한 RECV_BUF_SIZE, SEND_BUF_SIZE 등의 버퍼 설정이 맞지 않을 경우, 대용량 데이터 전송 중 커넥션이 끊어지는 증상이 나타나기도 합니다.
해결 방법
원인 1 해결: Dead Connection Detection(DCD) 및 Keep-Alive 설정
방화벽의 세션 타임아웃보다 짧은 주기로 Oracle이 자체적으로 Probe 패킷을 보내도록 설정합니다. sqlnet.ora 파일에 아래 파라미터를 추가하면 됩니다.
-- sqlnet.ora 파일 설정 (분 단위, 방화벽 타임아웃보다 작게 설정)
-- 예: 방화벽이 30분 후 세션을 끊는다면, 10분으로 설정
SQLNET.EXPIRE_TIME = 10
설정 후 리스너를 재시작하지 않아도 되지만, 신규 연결부터 적용됩니다. 현재 세션에 설정된 값을 확인하려면 아래 쿼리를 활용하세요.
-- 현재 활성 세션과 유휴 시간 확인
SELECT
sid,
serial#,
username,
status,
last_call_et AS idle_seconds,
machine,
program
FROM
v$session
WHERE
username IS NOT NULL
AND status = 'INACTIVE'
ORDER BY
last_call_et DESC;
오래된 유휴 세션이 많다면 Profile을 활용해 IDLE_TIME을 제한할 수 있습니다.
-- IDLE_TIME이 30분을 초과하면 세션 종료 (분 단위)
CREATE PROFILE idle_limit_profile LIMIT
IDLE_TIME 30
CONNECT_TIME UNLIMITED;
-- 특정 사용자에게 프로파일 적용
ALTER USER app_user PROFILE idle_limit_profile;
-- 프로파일 적용 여부 확인
SELECT username, profile FROM dba_users WHERE username = 'APP_USER';
원인 2 해결: 리스너 및 인스턴스 상태 점검
리스너와 데이터베이스 상태를 먼저 확인합니다.
-- alert log에서 최근 에러 확인 (SQL*Plus에서 실행)
-- OS 레벨에서 실행: lsnrctl status
-- DB 내부에서 리스너 관련 세션 확인
SELECT
s.sid,
s.serial#,
s.username,
s.program,
s.machine,
s.logon_time,
s.status
FROM
v$session s
WHERE
s.type = 'USER'
ORDER BY
s.logon_time;
-- 리스너 로그에서 ORA-12537 발생 이력 확인 (OS 명령어와 병행)
-- tail -f $ORACLE_BASE/diag/tnslsnr/<hostname>/listener/trace/listener.log
-- 비정상 종료된 세션 정리 (PMON이 자동 정리하지 못한 경우)
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
인스턴스가 비정상 종료된 경우 복구 절차를 수행합니다.
-- DB 상태 확인
SELECT instance_name, status, database_status FROM v$instance;
-- Archive log 모드 여부 확인
SELECT log_mode FROM v$database;
-- Redo log 상태 확인 (복구 필요 여부 판단)
SELECT group#, status, archived FROM v$log;
원인 3 해결: sqlnet.ora 파라미터 조정
-- sqlnet.ora 파일에 아래 설정 추가/수정
-- 클라이언트 핸드셰이크 타임아웃 증가 (기본값이 너무 짧을 경우)
SQLNET.INBOUND_CONNECT_TIMEOUT = 60
-- 송수신 버퍼 크기 조정 (대용량 처리 시 유리)
RECV_BUF_SIZE = 87380
SEND_BUF_SIZE = 87380
-- TCP.NODELAY 설정으로 지연 방지
TCP.NODELAY = YES
설정 적용 후 파라미터 유효성을 확인합니다.
-- Oracle Net 관련 파라미터 확인 (DB 내부)
SELECT name, value
FROM v$parameter
WHERE name LIKE '%sqlnet%'
OR name LIKE '%recv_buf%'
OR name LIKE '%send_buf%';
예방 방법
1. 정기적인 네트워크 연결 모니터링 및 알림 설정
주기적으로 v$session 및 리스너 로그를 모니터링하여 비정상적인 세션 종료 패턴을 사전에 감지합니다. 아래 쿼리를 스케줄러(DBMS_SCHEDULER)에 등록하여 임계치 초과 시 DBA에게 자동 알림이 가도록 설정하는 것이 Best Practice입니다.
-- 유휴 세션 수 임계치 모니터링 쿼리 (Scheduler Job에 활용)
SELECT COUNT(*) AS inactive_session_count
FROM v$session
WHERE status = 'INACTIVE'
AND last_call_et > 1800 -- 30분 이상 유휴
AND username IS NOT NULL;
2. Connection Pool 및 애플리케이션 레벨 재연결 로직 구현
ORA-12537은 애플리케이션 레벨에서 완전히 차단하기 어렵기 때문에, 커넥션 풀(Connection Pool)에서 주기적으로 연결 유효성을 검사(Validate Connection)하는 설정을 반드시 활성화해야 합니다. JDBC를 사용하는 경우 testOnBorrow=true 또는 Oracle UCP의 setValidateConnectionOnBorrow(true) 옵션을 설정하고, 에러 발생 시 자동 재연결(Reconnect) 로직을 애플리케이션 코드에 구현하여 서비스 영향도를 최소화해야 합니다.
관련 에러
- ORA-12541: TNS: no listener — 리스너 자체가 기동되지 않은 경우 발생하며, ORA-12537과 함께 리스너 문제를 진단할 때 참고합니다.
- ORA-12535: TNS: operation timed out — 네트워크 타임아웃으로 연결 자체가 완료되지 못한 경우이며, ORA-12537과 증상이 유사합니다.
- ORA-03113: end-of-file on communication channel — 서버 프로세스가 비정상 종료될 때 클라이언트에서 수신하는 에러로, ORA-12537과 함께 나타나는 경우가 많습니다.
- ORA-03114: not connected to ORACLE — 세션이 이미 끊어진 상태에서 SQL을 실행하려 할 때 발생하며, ORA-12537 이후 후속으로 발생할 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.