2026년 09월 10일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-12514 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-12514 TNS: listener does not currently know of service requested in connect descriptor 는?
ORA-12514 에러는 Oracle 클라이언트가 TNS 리스너에 연결을 시도할 때, 연결 디스크립터에 명시된 서비스 이름(Service Name)을 리스너가 인식하지 못할 경우 발생하는 네트워크 연결 오류입니다. 쉽게 말해, 클라이언트가 “ORCL”이라는 서비스에 접속하려 했지만, 리스너 입장에서는 그런 서비스가 등록되어 있지 않다는 의미입니다. 이 에러는 개발 환경 구성, 데이터베이스 재시작 직후, 또는 tnsnames.ora 설정 변경 시 매우 빈번하게 발생하며, 초보 DBA부터 숙련된 DBA까지 모두 한 번쯤은 반드시 마주치게 되는 대표적인 Oracle 연결 에러 중 하나입니다.
주요 발생 원인
1. 데이터베이스 서비스가 리스너에 등록되지 않은 경우
가장 흔한 원인으로, Oracle 데이터베이스 인스턴스가 기동되었더라도 해당 서비스가 리스너에 아직 동적으로 등록(Dynamic Registration)되지 않았거나, 정적 등록(Static Registration)이 누락된 경우입니다. 데이터베이스가 시작된 직후 수십 초~수 분간 리스너 등록이 완료되지 않아 이 에러가 발생할 수 있으며, 특히 listener.ora에 SID_LIST_LISTENER 항목이 없는 경우 정적 등록이 이루어지지 않아 문제가 됩니다. 또한 데이터베이스 파라미터 SERVICE_NAMES가 잘못 설정되어 있거나 기본값과 다른 값으로 변경된 경우에도 동일한 증상이 나타납니다.
2. tnsnames.ora 또는 연결 문자열의 SERVICE_NAME 오타 및 불일치
클라이언트 측 tnsnames.ora 파일에 정의된 SERVICE_NAME 값이 실제 데이터베이스에 등록된 서비스 이름과 다를 경우 이 에러가 발생합니다. 예를 들어, 실제 서비스 이름은 ORCL.example.com인데 클라이언트 설정에는 ORCL만 기재되어 있거나, 대소문자 또는 도메인 접미사(.world 등)가 누락된 경우가 해당됩니다. JDBC 연결 문자열, SQLDeveloper, 또는 애플리케이션 설정 파일에서 직접 서비스 이름을 입력하는 경우에도 동일한 문제가 발생하므로, 반드시 실제 등록된 서비스 이름과 정확히 일치하는지 확인해야 합니다.
3. 리스너 자체의 구성 문제 또는 비정상 상태
listener.ora 파일이 잘못 구성되었거나, 리스너가 잘못된 포트나 호스트를 바라보고 있는 경우에도 이 에러가 발생합니다. 리스너가 실행 중이더라도 내부 상태가 비정상이거나, 여러 개의 리스너가 동일 포트를 공유하려다 충돌이 발생한 경우 특정 서비스를 인식하지 못하는 상황이 발생할 수 있습니다. 또한 RAC(Real Application Clusters) 환경에서는 각 노드별 리스너 설정이 상이하게 구성될 수 있어, 특정 노드에서만 이 에러가 발생하는 경우도 있습니다.
해결 방법
1단계: 현재 리스너 상태 및 등록된 서비스 확인
가장 먼저 리스너에 어떤 서비스가 등록되어 있는지 확인합니다.
-- OS 커맨드라인에서 실행 (SQL이 아닌 lsnrctl 명령)
-- lsnrctl status
-- lsnrctl services
-- 데이터베이스 내부에서 현재 서비스 이름 확인
SELECT NAME, DB_UNIQUE_NAME, OPEN_MODE FROM V$DATABASE;
-- 현재 인스턴스에 등록된 서비스 목록 조회
SELECT NAME, NETWORK_NAME, CREATION_DATE
FROM DBA_SERVICES
ORDER BY NAME;
-- 현재 활성화된 서비스 확인
SELECT NAME FROM V$SERVICES;
-- 파라미터로 설정된 서비스 이름 확인
SHOW PARAMETER SERVICE_NAMES;
SHOW PARAMETER DB_NAME;
SHOW PARAMETER DB_DOMAIN;
lsnrctl status 결과의 Service 항목과 클라이언트가 요청하는 서비스 이름이 정확히 일치하는지 반드시 비교하십시오.
2단계: 서비스를 리스너에 수동으로 등록
동적 등록이 아직 이루어지지 않은 경우, 데이터베이스 내에서 리스너에 수동으로 서비스를 등록할 수 있습니다.
-- DBMS_SERVICE 패키지를 이용한 서비스 생성 및 시작
BEGIN
DBMS_SERVICE.CREATE_SERVICE(
service_name => 'MY_SERVICE',
network_name => 'MY_SERVICE'
);
END;
/
BEGIN
DBMS_SERVICE.START_SERVICE('MY_SERVICE');
END;
/
-- 리스너에 즉시 동적 등록 요청 (SYS 권한 필요)
ALTER SYSTEM REGISTER;
ALTER SYSTEM REGISTER; 명령은 현재 인스턴스의 서비스 정보를 리스너에 즉시 재등록하도록 강제합니다. 데이터베이스 재시작 직후 리스너 등록이 지연될 때 이 명령으로 즉시 해결할 수 있습니다.
3단계: listener.ora에 정적 등록 추가
동적 등록이 불안정한 환경이라면, listener.ora에 정적 서비스 등록을 추가하는 것이 근본적인 해결책이 됩니다.
-- listener.ora 파일 예시 (파일 수정 후 lsnrctl reload 실행)
-- $ORACLE_HOME/network/admin/listener.ora
-- SID_LIST_LISTENER =
-- (SID_LIST =
-- (SID_DESC =
-- (GLOBAL_DBNAME = ORCL.example.com)
-- (ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
-- (SID_NAME = ORCL)
-- )
-- )
-- 설정 적용 확인 쿼리 (DB 내부에서)
SELECT INSTANCE_NAME, HOST_NAME, STATUS
FROM V$INSTANCE;
4단계: tnsnames.ora 서비스 이름 수정
-- tnsnames.ora 파일 예시 (클라이언트 측)
-- ORCL =
-- (DESCRIPTION =
-- (ADDRESS = (PROTOCOL = TCP)(HOST = db-server.example.com)(PORT = 1521))
-- (CONNECT_DATA =
-- (SERVER = DEDICATED)
-- (SERVICE_NAME = ORCL.example.com) -- 반드시 V$SERVICES의 NAME과 일치
-- )
-- )
-- 서비스 이름 대신 SID를 사용하는 경우 (임시 우회)
-- ORCL_SID =
-- (DESCRIPTION =
-- (ADDRESS = (PROTOCOL = TCP)(HOST = db-server.example.com)(PORT = 1521))
-- (CONNECT_DATA =
-- (SERVER = DEDICATED)
-- (SID = ORCL) -- SID 직접 지정
-- )
-- )
-- 올바른 서비스 이름 조회 (DB 서버 측에서)
SELECT VALUE FROM V$PARAMETER WHERE NAME = 'service_names';
주의: SERVICE_NAME과 SID는 다릅니다. SERVICE_NAME을 사용하는 것이 현대 Oracle 환경에서의 표준이며, SID 방식은 구형 호환성을 위한 임시 방편으로만 사용하십시오.
5단계: 리스너 재시작 (최후 수단)
-- OS 레벨에서 리스너 재시작
-- lsnrctl stop LISTENER
-- lsnrctl start LISTENER
-- lsnrctl status LISTENER
-- 리스너 재시작 후 서비스 재등록 확인
-- lsnrctl services LISTENER
-- 이후 DB 내에서 한 번 더 등록 강제
ALTER SYSTEM REGISTER;
-- 세션 연결 테스트 (DB 내부에서)
SELECT SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS CURRENT_SERVICE
FROM DUAL;
예방 방법
1. listener.ora에 정적 등록과 동적 등록을 함께 구성하고 정기적으로 모니터링하기
프로덕션 환경에서는 동적 등록(Dynamic Registration)만을 의존하지 말고, listener.ora에 정적 등록(Static Registration)을 반드시 병행하여 구성하십시오. 동적 등록은 데이터베이스 기동 후 최대 60초(pmon 등록 주기)까지 지연될 수 있으므로, 정적 등록을 통해 리스너 기동 즉시 서비스를 인식하도록 설정하는 것이 안정적입니다. 또한 아래와 같은 쿼리를 이용한 모니터링 스크립트를 cron 또는 Oracle Scheduler로 주기적으로 실행하여 서비스 상태를 지속적으로 점검하십시오.
-- 서비스 가용성 모니터링 쿼리 (스케줄러 등록 권장)
SELECT S.NAME AS SERVICE_NAME,
S.NETWORK_NAME,
I.INSTANCE_NAME,
I.HOST_NAME,
I.STATUS AS INSTANCE_STATUS
FROM DBA_SERVICES S
CROSS JOIN V$INSTANCE I
WHERE S.NAME NOT IN ('SYS$BACKGROUND', 'SYS$USERS')
ORDER BY S.NAME;
2. 변경 관리(Change Management) 프로세스에서 연결 테스트를 필수 체크리스트로 포함하기
데이터베이스 파라미터(SERVICE_NAMES, DB_DOMAIN, DB_NAME) 변경, 리스너 설정 수정, 또는 데이터베이스 재시작이 포함된 모든 변경 작업에는 반드시 변경 후 연결 테스트를 수행하는 절차를 표준화하십시오. 특히 tnsping 명령과 실제 SQL 연결 테스트를 모두 포함하여, 네트워크 레이어와 서비스 레이어 양쪽을 확인하는 것이 중요합니다.
-- 연결 테스트용 표준 쿼리 (변경 작업 후 반드시 실행)
SELECT SYS_CONTEXT('USERENV', 'DB_NAME') AS DB_NAME,
SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS SERVICE_NAME,
SYS_CONTEXT('USERENV', 'SERVER_HOST') AS HOST_NAME,
SYS_CONTEXT('USERENV', 'INSTANCE') AS INSTANCE_NUMBER
FROM DUAL;
관련 에러
- ORA-12505: TNS 리스너가
SID를 인식하지 못할 때 발생하며, ORA-12514와 매우 유사하지만SERVICE_NAME대신SID기반 연결에서 발생합니다. - ORA-12541: TNS No Listener. 리스너 자체가 실행되지 않거나 지정된 포트에서 응답하지 않을 때 발생하며, ORA-12514 이전에 먼저 확인해야 할 에러입니다.
- ORA-12170: TNS Connect Timeout. 네트워크 경로 문제 또는 방화벽으로 인해 리스너에 아예 도달하지 못할 때 발생합니다.
- ORA-01034: Oracle Not Available. 리스너는 살아 있지만 데이터베이스 인스턴스 자체가 기동되지 않은 경우 발생하며, ORA-12514와 혼동하기 쉽습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.