2026년 09월 09일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-12225 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-12225 TNS: destination host unreachable 는?
ORA-12225 에러는 Oracle Net(TNS)이 원격 데이터베이스 호스트에 네트워크 수준에서 접근할 수 없을 때 발생하는 오류입니다. 즉, 클라이언트나 애플리케이션이 tnsnames.ora 또는 연결 문자열에 정의된 대상 서버에 TCP/IP 패킷 자체를 전달하지 못하는 상황을 의미합니다. 단순한 서비스 중단이 아닌 네트워크 경로 자체가 막혀 있거나 호스트가 응답하지 않는 경우에 주로 나타나며, DBA와 네트워크 팀이 함께 원인을 분석해야 하는 대표적인 연결 오류입니다.
주요 발생 원인
1. 잘못된 호스트명 또는 IP 주소 설정
tnsnames.ora 또는 sqlnet.ora, 혹은 애플리케이션의 JDBC/ODBC 연결 문자열에 입력된 호스트명이나 IP 주소가 실제 서버와 다를 경우 이 에러가 발생합니다. DNS 조회 실패(Name Resolution Failure)로 인해 호스트명이 IP로 변환되지 않거나, IP가 존재하지 않는 주소를 가리키는 경우가 가장 흔한 케이스입니다. 특히 서버 이전이나 IP 변경 후 설정 파일을 갱신하지 않았을 때 자주 목격됩니다.
2. 방화벽(Firewall) 또는 네트워크 장비에 의한 차단
클라이언트와 Oracle 서버 사이의 방화벽, L4 스위치, 라우터 등이 Oracle의 기본 리스너 포트(1521번 등)로의 TCP 연결을 차단하고 있을 때 발생합니다. 특히 보안 정책이 강화된 운영 환경이나 클라우드(AWS, Azure, OCI) 환경에서 보안 그룹(Security Group) 또는 ACL 규칙이 적용되어 특정 IP 대역의 접근이 막혀 있는 경우가 많습니다. 방화벽 규칙이 최근 변경되었는지 반드시 확인해야 합니다.
3. 대상 서버의 다운(Down) 또는 Oracle 리스너 중단
물리 서버나 가상 머신 자체가 다운되어 있거나, OS는 살아 있지만 Oracle 리스너 프로세스(TNSLSNR)가 중단된 경우에도 동일한 에러가 발생할 수 있습니다. 네트워크 관점에서는 호스트에 도달 자체가 불가능한 상황(호스트 다운)과 호스트에는 도달하지만 해당 포트가 열려 있지 않은 상황(리스너 중단)을 구분하는 것이 중요합니다. ping 및 telnet/nc 명령어로 두 가지 상황을 구분할 수 있습니다.
해결 방법
1. tnsnames.ora 설정 확인 및 수정
먼저 현재 사용 중인 tnsnames.ora의 HOST, PORT 값이 올바른지 확인합니다.
-- SQL*Plus에서 현재 TNS 연결 정보 확인
-- tnsping 명령어로 TNS 항목 테스트 (OS 커맨드)
-- tnsping ORCL
-- tnsnames.ora 샘플 (올바른 형식)
/*
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl.example.com)
)
)
*/
-- 현재 세션에서 연결 정보 확인
SELECT SYS_CONTEXT('USERENV', 'SERVER_HOST') AS server_host,
SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS service_name,
SYS_CONTEXT('USERENV', 'IP_ADDRESS') AS client_ip
FROM DUAL;
tnsnames.ora 수정 후에는 sqlplus를 이용해 직접 연결을 테스트합니다.
-- Easy Connect 방식으로 직접 연결 테스트 (tnsnames.ora 우회)
-- sqlplus system/password@192.168.1.100:1521/orcl
-- DB Link를 통한 원격 연결 확인
SELECT * FROM DBA_DB_LINKS WHERE DB_LINK = 'REMOTE_DB';
-- DB Link 연결 테스트
SELECT * FROM DUAL@REMOTE_DB;
2. 네트워크 및 방화벽 점검
OS 레벨에서 대상 호스트로의 경로와 포트 개방 여부를 확인합니다.
-- 리스너 상태 조회 (DB 서버에서 실행)
-- lsnrctl status
-- 현재 리스너에 등록된 서비스 확인
SELECT INST_ID,
NAME,
NETWORK_NAME,
CREATION_DATE
FROM GV$SERVICES
ORDER BY INST_ID;
-- 현재 활성 연결 세션 확인
SELECT SID,
SERIAL#,
USERNAME,
MACHINE,
PROGRAM,
STATUS
FROM V$SESSION
WHERE TYPE = 'USER'
ORDER BY LOGON_TIME DESC;
방화벽 정책을 확인하고 Oracle 리스너 포트(기본 1521)가 허용되어 있는지 검토합니다.
-- 동적 포트 사용 현황 확인 (DBA_NETWORK_ACL)
SELECT HOST, LOWER_PORT, UPPER_PORT, ACE_ORDER, GRANT_TYPE, PRIVILEGE
FROM DBA_NETWORK_ACLS
ORDER BY HOST;
-- UTL_TCP 패키지를 이용한 포트 연결 테스트 (DB 내부에서)
DECLARE
v_conn UTL_TCP.CONNECTION;
BEGIN
v_conn := UTL_TCP.OPEN_CONNECTION(
remote_host => '192.168.1.100',
remote_port => 1521,
tx_timeout => 10
);
DBMS_OUTPUT.PUT_LINE('Connection successful');
UTL_TCP.CLOSE_CONNECTION(v_conn);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Connection failed: ' || SQLERRM);
END;
/
3. 리스너 재시작 및 상태 복구
Oracle 리스너가 중단된 경우 아래 절차로 복구합니다.
-- 리스너 재시작 (OS 커맨드, oracle 계정으로 실행)
-- lsnrctl stop
-- lsnrctl start
-- lsnrctl status
-- 리스너 재등록 (DB 내부에서 실행)
ALTER SYSTEM REGISTER;
-- 리스너 로그 위치 확인
SELECT NAME, VALUE
FROM V$DIAG_INFO
WHERE NAME IN ('Diag Trace', 'Default Trace File');
-- Alert 로그에서 리스너 관련 오류 확인
SELECT ORIGINATING_TIMESTAMP,
MESSAGE_TEXT
FROM V$DIAG_ALERT_EXT
WHERE MESSAGE_TEXT LIKE '%TNS%'
OR MESSAGE_TEXT LIKE '%listener%'
ORDER BY ORIGINATING_TIMESTAMP DESC
FETCH FIRST 20 ROWS ONLY;
예방 방법
1. 연결 모니터링 자동화 및 알림 설정
Oracle Enterprise Manager(OEM) 또는 자체 모니터링 스크립트를 통해 주기적으로 TNS 연결 상태를 점검하고, 이상이 감지될 경우 즉시 담당자에게 알림이 가도록 설정합니다. 아래와 같은 셸 스크립트를 cron job으로 등록하거나, DB 내부 스케줄러로 연결 점검 Job을 주기적으로 실행하는 것이 효과적입니다.
-- DBMS_SCHEDULER를 이용한 연결 상태 점검 Job 생성
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'CHECK_REMOTE_CONN',
job_type => 'PLSQL_BLOCK',
job_action => '
DECLARE
v_cnt NUMBER;
BEGIN
SELECT COUNT(*) INTO v_cnt FROM DUAL@REMOTE_DB;
-- 정상이면 로그 기록
INSERT INTO CONN_MONITOR_LOG(CHECK_TIME, STATUS, MESSAGE)
VALUES (SYSDATE, ''OK'', ''Remote DB connection successful'');
COMMIT;
EXCEPTION
WHEN OTHERS THEN
INSERT INTO CONN_MONITOR_LOG(CHECK_TIME, STATUS, MESSAGE)
VALUES (SYSDATE, ''FAIL'', SQLERRM);
COMMIT;
END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=MINUTELY;INTERVAL=5',
enabled => TRUE,
comments => 'Remote DB connection health check every 5 minutes'
);
END;
/
2. 변경 관리(Change Management) 프로세스 준수
서버 IP 변경, 방화벽 정책 수정, 네트워크 장비 교체 등의 인프라 변경 작업이 발생할 때는 반드시 Oracle 연결 설정(tnsnames.ora, sqlnet.ora, listener.ora)에 미치는 영향을 사전에 검토하고, 변경 전후로 연결 테스트를 수행해야 합니다. 변경 이력을 형상 관리 도구(Git 등)로 관리하면 문제 발생 시 빠른 롤백이 가능합니다.
관련 에러
- ORA-12170: TNS: Connect timeout occurred — 호스트에 도달은 가능하나 응답 시간이 초과된 경우로, ORA-12225와 유사하지만 네트워크 경로가 살아 있을 때 발생합니다.
- ORA-12541: TNS: No listener — 대상 호스트에는 접근 가능하나 Oracle 리스너가 동작하지 않을 때 발생하며, ORA-12225와 함께 가장 흔한 TNS 에러입니다.
- ORA-12154: TNS: could not resolve the connect identifier specified — tnsnames.ora에 해당 TNS 항목 자체가 존재하지 않거나 오타가 있을 때 발생합니다.
- ORA-12535: TNS: operation timed out — 방화벽이 패킷을 DROP(차단)하는 경우 응답 없이 시간이 초과되어 발생하며, ORA-12225와 함께 방화벽 이슈를 의심해야 합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.