ORA-12154: TNS:could not resolve the connect identifier specified
접속 문자열에 적은 별칭을 클라이언트가 실제 호스트와 포트로 바꾸지 못했다는 뜻이다. 서버가 죽었다거나 방화벽이 막혔다는 신호가 아니다. 그런 경우는 ORA-12541(리스너 없음) 이나 ORA-12170(타임아웃) 이 난다. ORA-12154 는 연결을 시도하기도 전에 이름 해석 단계에서 끝난 것이다.
sqlnet.ora 의 NAMES.DIRECTORY_PATH 가 순서를 정한다.
NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT, LDAP)
| 방식 | 근거 |
|---|---|
TNSNAMES |
tnsnames.ora 파일의 별칭 |
EZCONNECT |
host:port/service 형태를 직접 해석 |
LDAP |
디렉터리 서버 조회 |
TNSNAMES 가 목록에 없으면 tnsnames.ora 를 아무리 고쳐도 읽지 않는다. 이 줄을 먼저 확인한다.
원인의 대부분은 "고친 파일과 읽는 파일이 다르다" 이다. Oracle 클라이언트가 여러 벌 설치돼 있으면 흔하게 벌어진다.
파일 탐색 순서는 다음과 같다.
TNS_ADMIN 환경변수가 가리키는 디렉터리ORACLE_HOME/network/adminTNS_ADMIN 값echo $TNS_ADMIN
echo $ORACLE_HOME
ls -l $ORACLE_HOME/network/admin/tnsnames.ora
Windows 에서는 다음으로 확인한다.
Get-ChildItem Env: | Where-Object Name -match 'TNS_ADMIN|ORACLE'
Get-ChildItem -Recurse -Filter tnsnames.ora C:\ -ErrorAction SilentlyContinue | Select-Object FullName
Get-ItemProperty 'HKLM:\SOFTWARE\ORACLE\KEY_*' | Select-Object PSChildName, ORACLE_HOME, TNS_ADMIN
클라이언트 여러 벌이 깔려 있으면 32비트와 64비트가 각각 다른 ORACLE_HOME 을 본다는 점도 중요하다. 32비트 애플리케이션은 32비트 클라이언트를 쓰므로 64비트 쪽 tnsnames.ora 를 고쳐 봐야 소용이 없다.
tnsping MYDB
tnsping 이 성공하면 이름 해석은 정상이고, 그런데도 ORA-12154 가 난다면 애플리케이션이 다른 TNS_ADMIN 을 보고 있다는 뜻이다.
tnsnames.ora 는 괄호 구조에 민감하다. 자주 걸리는 것은 다음과 같다.
sqlnet.ora 의 NAMES.DEFAULT_DOMAIN 과 합쳐져 다른 이름이 될 수 있다.MYDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = db.example.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orclpdb1)
)
)
Windows ODBC 관리자에서 만든 DSN 은 서버 이름 칸에 TNS 별칭 을 넣는다. 호스트 이름을 넣으면 클라이언트가 그것을 별칭으로 알고 찾다가 ORA-12154 를 낸다.
확인 순서는 다음과 같다.
C:\Windows\SysWOW64\odbcad32.exe 다.ORACLE_HOME 의 것인지 본다.ORACLE_HOME 의 tnsnames.ora 에 별칭이 있는지 확인한다.TNS_ADMIN 을 넣으면 서비스는 읽지 못한다. 시스템 환경변수로 둔다.별칭을 쓰지 않고 EZCONNECT 로 직접 적으면 파일 문제를 우회할 수 있다.
db.example.com:1521/orclpdb1
TRACE_LEVEL_CLIENT = 16
TRACE_DIRECTORY_CLIENT = /tmp/oratrace
sqlnet.ora 에 넣으면 클라이언트가 어떤 파일을 열고 어떤 이름으로 찾았는지 추적 파일에 남는다. 원인이 끝까지 안 잡힐 때 쓴다. 확인 뒤에는 반드시 끈다. 추적 파일이 계속 쌓인다.
tnsnames.ora 를 여러 서버에 복사해 두면 반드시 어긋난다. 가능하면 EZCONNECT 나 LDAP 으로 통일하고, 파일을 쓴다면 배포 수단을 정해 둔다.