ORA-12154: tns 지정된 접속 식별자를 분석할 수 없음 오류는 문자 그대로 접속 식별자(connect identifier)를 분석할 수 없기에 발생합니다. 접속 식별자는 접속 기술자(connect descriptor), 데이터베이스 별명/별칭(database alias), 데이터 소스(data source) 등 여러 가지 이름으로 불립니다.
왜 지정된 접속 식별자를 분석할 수 없는지 다음을 기준으로 찾아봅시다.
- 오라클 홈 확인하기
- tnsnames.ora 확인하기
ORA-12154 해결하기 : 오라클 홈 확인하기
오라클 홈을 확인하여 접속 식별자를 분석할 수 있는지 여부를 확인해 봅니다. 오라클 홈 설정 문제로 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 오류 원인 요약
- TNSNAMES.ORA 설정 누락
USING 'ALIAS'
에서 지정한ALIAS
가TNSNAMES.ORA
에 존재하지 않거나 오타가 있음TNS_ADMIN
환경 변수가 올바른 위치를 가리키지 않음
- TNSNAMES.ORA 파일 경로 문제
- 오라클 클라이언트가
TNSNAMES.ORA
를 올바른 위치에서 찾지 못함 - 여러 개의 오라클 클라이언트가 설치되어 있고, 잘못된 경로를 참조 중
- 오라클 클라이언트가
- Oracle Net 서비스 미설정
LISTENER.ORA
또는SQLNET.ORA
설정이 잘못되었거나 누락됨SQLNET.ORA
에서NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
설정이 빠져있음
- 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 해결 방법 정리
- TNSNAMES.ORA에
ALIAS
가 등록되어 있는지 확인 TNS_ADMIN
환경 변수가 올바르게 설정되어 있는지 점검SQLNET.ORA
에서NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
설정 추가lsnrctl status
로 리스너가 실행 중인지 확인- 직접
DESCRIPTION
을 명시하여 DB LINK를 생성