2026년 09월 10일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-12505 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-12505 TNS: listener does not currently know of SID given in connect descriptor 는?
ORA-12505 에러는 Oracle Net(TNS) 리스너가 클라이언트에서 접속 요청 시 제공한 SID(System Identifier)를 현재 인식하지 못할 때 발생하는 네트워크 접속 오류입니다. 쉽게 말해, 클라이언트가 연결하려는 데이터베이스 인스턴스가 리스너에 등록되어 있지 않거나, 아직 시작되지 않은 상태일 때 나타납니다. 이 에러는 개발 환경 구성, 신규 DB 인스턴스 추가, 또는 서버 재기동 직후에 특히 자주 발생하며, DBA라면 반드시 빠르게 진단하고 해결할 수 있어야 하는 필수 에러 중 하나입니다.
주요 발생 원인
1. 데이터베이스 인스턴스가 시작되지 않았거나 리스너에 등록되지 않은 경우
가장 흔하고 즉각적인 원인으로, 데이터베이스 인스턴스(SID)가 완전히 기동되지 않은 상태에서 클라이언트가 접속을 시도하는 경우입니다. Oracle 리스너는 인스턴스가 완전히 OPEN 상태가 되어야 해당 SID를 자신의 서비스 목록에 등록(동적 등록)하게 되는데, 인스턴스가 MOUNT 단계에 머물러 있거나 아직 startup 중이라면 리스너는 해당 SID를 알 수 없습니다. 또한 lsnrctl reload 또는 리스너 재시작 직후 동적 등록(PMON이 수행)이 완료되기 전 짧은 시간 동안에도 이 에러가 발생할 수 있습니다.
2. tnsnames.ora 또는 접속 문자열에서 SID가 잘못 기재된 경우
클라이언트의 tnsnames.ora 파일이나 JDBC URL, 애플리케이션 설정 파일에서 SID를 오타 또는 대소문자 오류로 잘못 입력한 경우입니다. Oracle SID는 대소문자를 구분하지 않는 것처럼 보이지만, 실제 등록된 SID와 접속 문자열의 SID가 정확히 일치하지 않으면 리스너는 해당 SID를 찾지 못합니다. 특히 SID 대신 SERVICE_NAME을 사용해야 하는 환경에서 SID로 접속을 시도하는 경우에도 이 에러가 발생합니다.
3. listener.ora의 정적 등록 설정 누락 또는 오류
동적 등록이 아닌 정적 등록(Static Registration)을 사용하는 환경에서 listener.ora 파일에 해당 SID가 명시적으로 등록되어 있지 않은 경우입니다. RAC 환경이나 Oracle 11g 이전 버전, 또는 특수한 네트워크 구성에서는 정적 등록이 필요한 경우가 많습니다. listener.ora에 SID_LIST_LISTENER 섹션이 없거나 잘못 구성되어 있으면, 리스너는 해당 SID를 절대 인식할 수 없습니다.
해결 방법
원인 1 해결: 인스턴스 상태 확인 및 기동
먼저 리스너에 현재 등록된 서비스 목록을 확인합니다.
-- OS 레벨에서 리스너 상태 및 등록된 SID/Service 확인
-- (SQL*Plus가 아닌 OS 명령어로 실행)
-- lsnrctl status
-- lsnrctl services
SQL*Plus로 데이터베이스 인스턴스 상태를 직접 확인합니다.
-- SYS 계정으로 접속 후 인스턴스 상태 확인
SELECT INSTANCE_NAME, STATUS, DATABASE_STATUS
FROM V$INSTANCE;
-- 인스턴스가 MOUNTED 상태라면 OPEN으로 전환
ALTER DATABASE OPEN;
동적 등록이 지연되는 경우 PMON이 리스너에 서비스를 등록하도록 강제로 트리거합니다.
-- SYS 계정으로 접속하여 동적 등록 강제 실행
ALTER SYSTEM REGISTER;
위 명령 실행 후 약 60초 이내에 lsnrctl status를 통해 SID가 등록되었는지 확인하세요.
원인 2 해결: 접속 문자열 및 tnsnames.ora 수정
현재 데이터베이스에 실제 등록된 SID와 서비스 이름을 확인합니다.
-- 실제 SID 및 서비스명 확인
SELECT INSTANCE_NAME, DB_UNIQUE_NAME FROM V$INSTANCE;
SELECT NAME, DB_UNIQUE_NAME FROM V$DATABASE;
-- 리스너에 등록된 서비스 목록 확인
SELECT NAME, NETWORK_NAME FROM V$SERVICES;
올바른 SID 또는 SERVICE_NAME 확인 후 tnsnames.ora를 수정합니다.
-- tnsnames.ora 예시 (SID 방식 - 구형 방식)
ORCL_SID =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbserver.example.com)(PORT = 1521))
(CONNECT_DATA =
(SID = ORCL)
)
)
-- tnsnames.ora 예시 (SERVICE_NAME 방식 - 권장)
ORCL_SERVICE =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbserver.example.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL.example.com)
)
)
JDBC를 사용하는 경우 URL 형식을 확인합니다.
-- JDBC SID 방식 (ORA-12505 유발 가능)
-- jdbc:oracle:thin:@hostname:1521:ORCL
-- JDBC SERVICE_NAME 방식 (권장)
-- jdbc:oracle:thin:@//hostname:1521/ORCL.example.com
원인 3 해결: listener.ora 정적 등록 추가
listener.ora 파일에 정적 SID 등록을 추가합니다.
-- listener.ora 정적 등록 설정 예시
-- (텍스트 파일 편집 후 lsnrctl reload 실행)
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)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = dbserver.example.com)(PORT = 1521))
)
)
-- listener.ora 수정 후 리스너 재로드 (OS 명령어)
-- lsnrctl reload
-- 등록 확인
-- lsnrctl status LISTENER
정적 등록 후에는 ALTER SYSTEM REGISTER 없이도 리스너 기동만으로 SID를 인식합니다.
예방 방법
1. SERVICE_NAME 방식으로 전환 및 표준화
SID 기반 접속은 Oracle 12c 이후 권장되지 않으며, SERVICE_NAME 기반 접속으로 전환하면 ORA-12505와 같은 SID 인식 오류를 원천적으로 줄일 수 있습니다. 모든 애플리케이션, JDBC URL, tnsnames.ora를 SERVICE_NAME 방식으로 표준화하고, 서비스 상태를 지속적으로 모니터링하는 스크립트를 운영 환경에 배치하는 것을 권장합니다.
-- 현재 서비스 상태 모니터링 쿼리
SELECT NAME, NETWORK_NAME, CREATION_DATE, GOAL, DBA_CHK
FROM DBA_SERVICES
ORDER BY NAME;
2. 리스너 자동 등록 및 기동 순서 표준화
DB 서버 부팅 시 리스너보다 인스턴스가 먼저 완전히 기동되도록 startup 순서를 OS 레벨(systemd, rc.local 등)에서 관리하고, 기동 완료 후 반드시 ALTER SYSTEM REGISTER를 수행하는 스크립트를 표준 기동 프로세스에 포함시키세요. 또한 listener.ora에 정적 등록을 병행하면 동적 등록 지연으로 인한 일시적인 에러를 방지할 수 있습니다.
관련 에러
- ORA-12514:
TNS: listener does not currently know of service requested in connect descriptor— ORA-12505와 매우 유사하지만, SID가 아닌 SERVICE_NAME을 리스너가 인식하지 못할 때 발생합니다. 접속 방식이 SERVICE_NAME일 때 이 에러가 나타나면 동일한 진단 방법을 적용하세요. - ORA-12541:
TNS: no listener— 리스너 자체가 실행되고 있지 않을 때 발생합니다. ORA-12505보다 더 근본적인 에러로, 리스너 프로세스를lsnrctl start로 먼저 기동해야 합니다. - ORA-12154:
TNS: could not resolve the connect identifier specified— tnsnames.ora에서 접속 식별자(Alias) 자체를 찾지 못할 때 발생하며, ORA-12505와 달리 SID/SERVICE_NAME 전달 이전 단계에서 실패합니다. - ORA-01034:
ORACLE not available— 인스턴스가 완전히 시작되지 않은 상태로, ORA-12505와 함께 나타나는 경우가 많습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.