ORA-12154: tns 지정된 접속 식별자를 분석할 수 없음 (ORA-12154: tns could not resolve the connect identifier specified)

ORA-12154: tns 지정된 접속 식별자를 분석할 수 없음 오류는 문자 그대로 접속 식별자(connect identifier)를 분석할 수 없기에 발생합니다. 접속 식별자는 접속 기술자(connect descriptor), 데이터베이스 별명/별칭(database alias), 데이터 소스(data source) 등 여러 가지 이름으로 불립니다.

왜 지정된 접속 식별자를 분석할 수 없는지 다음을 기준으로 찾아봅시다.

  • 오라클 홈 확인하기
  • tnsnames.ora 확인하기

ORA-12154 해결하기 : 오라클 홈 확인하기

ORA-12154 tns 지정된 접속 식별자를 분석할 수 없음

오라클 홈을 확인하여 접속 식별자를 분석할 수 있는지 여부를 확인해 봅니다. 오라클 홈 설정 문제로 TNS 접속 식별자 위치를 인식할 수가 없어서, 접속 식별자를 찾지 못하는 경우를 생각해 볼 수 있습니다. 환경변수의 path 변수와 오라클 홈 설정 값을 확인해 주세요. 예제 자료의 오라클 홈 위치는 "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE\KEY_XE" 입니다.

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\ORACLE\KEY_XE]

"VERSION"="11.2"
"ORACLE_HOME_NAME"="XE"
"ORAMTS_CP_TRACE_LEVEL"="0"
"ORACLE_SID"="XE"
"ORACLE_HOME_KEY"="SOFTWARE\\ORACLE\\KEY_XE"
"ORACLE_BASE"="C:\\oraclexe\\app\\oracle"
"StmtCacheSize"="0"
"ORACLE_HOME"="C:\\oraclexe\\app\\oracle\\product\\11.2.0\\server"
"ORAMTS_CP_TRACE_DIR"="C:\\oraclexe\\app\\oracle\\product\\11.2.0\\server\\oramts\\trace"
"NLS_LANG"="KOREAN_KOREA.KO16MSWIN949"
"StatementCacheSize"="0"
"OLEDB"="C:\\oraclexe\\app\\oracle\\product\\11.2.0\\server\\oledb\\mesg"
"ORA_XE_AUTOSTART"=hex(2):54,00,52,00,55,00,45,00,00,00
"ORA_XE_SHUTDOWN"=hex(2):54,00,52,00,55,00,45,00,00,00
"ORA_XE_SHUTDOWNTYPE"=hex(2):69,00,6d,00,6d,00,65,00,64,00,69,00,61,00,74,00,\
  65,00,00,00
"ORA_XE_SHUTDOWN_TIMEOUT"=hex(2):39,00,30,00,00,00

ORA-12154 해결하기 : tnsnames.ora 확인하기

  • tnsnames.ora 파일에 해당하는 접속 식별자가 있는지 확인합니다.
  • tnsnames.ora 파일에 디스크립션 양식의 정확한 기재 여부를 확인합니다. 괄호가 빠져 있지 않은지 확인해 봅시다.
  • 솔루션의 빌드 출력 경로상에 tnsnames.ora 파일이 존재하고 있는지 확인합니다. 출력 경로상에 파일이 존재한다면 해당 파일의 접속 식별자를 참조합니다.

tnsping 명령어로 접속 식별자에 연결이 가능한지 확인해 볼 수 있습니다. (예시: tnsping xe)

tnsping xe

TNS Ping Utility

Used parameter files:
C:\oraclexe\app\oracle\product\11.2.0\server\network\admin\sqlnet.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0.)(PORT = 0)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))
OK (0 msec)

tnsnames.ora 에 있어야 할 접속 식별자 예시 양식입니다. 접속 식별자가 실제로 존재하는지, 괄호 등의 누락으로 형태가 이상하지 않은지 점검해 봅니다.

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 0))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

경로 확인하기

윈도우 10 이상 버전에서 32비트 출력 응용 프로그램을 실행할 때에, tnsnames.ora를 제대로 인식하지 못하는 현상이 간혹 발생합니다. 신기하게 tnsping과 같은 기능은 잘 작동하는데 말이지요! 폴더를 Program Files로 옮기거나, 별도의 그룹으로 관리해 보세요. 테스트한 결과, 바탕화면 정상작동, C드라이브 정상작동, Program Files 정상작동, Program Files (x86) 및 하위 폴더에서 "ORA-12154: tns 지정된 접속 식별자를 분석할 수 없음" 오류가 발생하더군요.

ORA-12154 오류 원인 요약

  1. TNSNAMES.ORA 설정 누락
    • USING 'ALIAS'에서 지정한 ALIASTNSNAMES.ORA에 존재하지 않거나 오타가 있음
    • TNS_ADMIN 환경 변수가 올바른 위치를 가리키지 않음
  2. TNSNAMES.ORA 파일 경로 문제
    • 오라클 클라이언트가 TNSNAMES.ORA를 올바른 위치에서 찾지 못함
    • 여러 개의 오라클 클라이언트가 설치되어 있고, 잘못된 경로를 참조 중
  3. Oracle Net 서비스 미설정
    • LISTENER.ORA 또는 SQLNET.ORA 설정이 잘못되었거나 누락됨
    • SQLNET.ORA에서 NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) 설정이 빠져있음
  4. DB LINK 사용 시 명시적 DESCRIPTION 지정 오류
    • (DESCRIPTION= ...) 내에서 HOST, PORT, SERVICE_NAME 값이 잘못 설정됨

✅ 1. TNSNAMES.ORA 설정 확인

TNSNAMES.ORA 파일이 올바른 위치에 있는지 확인하고, ALIAS 값이 정확히 설정되어 있는지 점검하세요.

📌 TNSNAMES.ORA 위치 예시

  • Windows: C:\oracle\product\NETWORK\ADMIN\TNSNAMES.ORA
  • Linux/Unix: $ORACLE_HOME/network/admin/tnsnames.ora

📌 TNSNAMES.ORA 설정 예시

ALIAS =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = mydb.server.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = mydbservice)
    )
  )

📌 검증 방법

tnsping ALIAS

이 명령어를 실행했을 때 응답이 없다면, 설정이 올바르지 않거나 LISTENER가 동작하지 않는 경우입니다.

✅ 2. TNS_ADMIN 환경 변수 확인

TNSNAMES.ORA 파일을 찾을 수 있도록 TNS_ADMIN 변수를 설정해야 합니다.

📌 Windows에서 환경 변수 확인 및 설정

echo %TNS_ADMIN%
set TNS_ADMIN=C:\oracle\product\NETWORK\ADMIN

📌 Linux/Unix에서 환경 변수 확인 및 설정

echo $TNS_ADMIN
export TNS_ADMIN=/u01/app/oracle/product/12.1.0/dbhome_1/network/admin

✅ 3. Oracle Net 서비스 설정 (SQLNET.ORA)

SQLNET.ORA 파일에서 NAMES.DIRECTORY_PATH 설정을 확인하세요.

📌 SQLNET.ORA 설정 예시

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

이 설정이 없으면 TNSNAMES.ORA를 인식하지 못할 수 있습니다.

✅ 4. LISTENER 서비스 확인

📌 리스너 상태 확인

lsnrctl status

리스너가 실행 중인지 확인하세요. 실행되지 않았다면 다음 명령어로 시작할 수 있습니다.

lsnrctl start

📌 LISTENER.ORA 설정 예시

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = mydb.server.com)(PORT = 1521))
    )
  )

✅ 5. 직접 DESCRIPTION 명시하는 방식으로 DB LINK 생성

TNSNAMES.ORA를 사용하지 않고, 직접 DESCRIPTION을 명시하는 방식으로 DB LINK를 생성할 수도 있습니다.

📌 DB LINK 직접 생성 예시

CREATE PUBLIC DATABASE LINK DATABASE_LINK_NAME
CONNECT TO UI
IDENTIFIED BY PW
USING '(DESCRIPTION =
          (ADDRESS_LIST =
            (ADDRESS = (PROTOCOL = TCP)(HOST = mydb.server.com)(PORT = 1521))
          )
          (CONNECT_DATA =
            (SERVICE_NAME = mydbservice)
          )
       )';

ORA-12154 해결 방법 정리

  1. TNSNAMES.ORA에 ALIAS가 등록되어 있는지 확인
  2. TNS_ADMIN 환경 변수가 올바르게 설정되어 있는지 점검
  3. SQLNET.ORA에서 NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) 설정 추가
  4. lsnrctl status로 리스너가 실행 중인지 확인
  5. 직접 DESCRIPTION을 명시하여 DB LINK를 생성
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗