ORA-12154의 원인은 tnsnames.ora 파일의 Alias처럼 정의된 Connect String으로 사용하는 db_alias를 찾지 못할 경우 발생한다.
WINDOWS, OS/2 CLIENT PART
- Login Box를 통해 접속을 할 경우에는 Connect String의 Field에서 @ 기호로 시작하지 않는다. @ 기호는 패스워드뒤에 공란없이 바로 Connect String (예: username/password@db_alias)을 지정하는 경우에 사용한다.
Connect String을 입력하는 Field에서 아래와 같이 기술한다.
- TNSNAMES.ORA 파일은 반드시 Client PC의 ORACLE_HOMEnetworkadmin 디렉토리에 있어야 하며, 사용자가 지정한 Connect string은 TNSNAMES.ORA 파일에 정의된 db_alis명이 기술 되어 있어야 한다.
- TNSNAMES.ORA 파일의 괄호(괄호쌍)를 제대로 열고 닫았는지 확인한다.
- 만일 사용자가 TCP/IP를 사용하고 있다면 TNSNAMES.ORA 파일에 기술되어 있는 HOST=HOSTNAME을 HOST=IP ADDRESS로 변경한다.
- SQLNET.ORA 파일을 점검하여 'names.default_zone=' 파라메타를 확인한다. 만일 SQLNET.ORA 파일에 이 파라메타가 존재하면 '#'으로 막는다.
#names.default_zone=[world]
- 하나의 단일 Community에서 이용한다면 TNSANMES.ORA에 기술되어 있는 'COMMUNITY' 파라메타를 '#' 으로 막는다.
[db_alias] = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = # (COMMUNITY = SAMPLE_COMMUNITY) (PROTOCOL = TCP) (HOST = [SERVER]) (PORT = 1521) ) ) (CONNECT_DATA = (SID = [SID]) ) )
[주의] 상기의 <...>에 기술된 내용의 db_alias는 사용자 정의 필드이고, Server는 현재 사용자가 사용중인 server의 host_alias name 또는 IP Address를, SID는 설치된 ORACLE Instance 명을 기술하여야 하며, db_alias 명은 SID와 동일해서는 안된다. 접속 기술자로 사용되는 db_alias의 경우 접속시 대.소문자 구분을 한다.
- SQLNET.ORA 파일을 점검하여 본다. 만일 파일내에 names.default_domain= 파라메타가 있다면 TNSNAMES.ORA의 db_alias 이름의 확장자로서 .을 가지고 있어야 한다. 그렇지 않으면 SQL*NET V2 접속을 할때 ora-12154 에러가 발생한다.
만일 TNSNAMES.ORA 파일에 db_alias명에 .[string]을 포함하고 있고 사용자가 확장자 없이 db_alias로 접속을 시도시에 ora-12154 에러가 발생하였다면 SQLNET.ORA 파일에 names.default_domain=[string] 을 추가해야만 한다.
[ 예제 : SQLNET.ORA ]
TRACE_LEVEL_CLIENT = OFF sqlnet.expire_time = 1 names.default_domain = world name.default_zone = world
[ 예제 : TNSNAMES.ORA ]
NT_SRV.world = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (COMMUNITY = NTCommun.world) (PROTOCOL = TCP) (Host = 152.68.31.100) (Port = 1521) ) ) (CONNECT_DATA = (SID = ORCL) ) )
[ 예제 : LISTENER.ORA ]
LISTENER = (ADDRESS_LIST = (ADDRESS= (PROTOCOL=IPC) (KEY= oracle.world) ) (ADDRESS= (PROTOCOL=IPC) (KEY= ORCL) ) (ADDRESS = (COMMUNITY = NTCommun.world) (PROTOCOL = TCP) (Host = 152.68.31.100) (Port = 1521) ) )
STARTUP_WAIT_TIME_LISTENER = 0 CONNECT_TIMEOUT_LISTENER = 10 TRACE_LEVEL_LISTENER = ADMIN SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = ORCL) ) ) UNIX CLIENT PART
- 상기의 WINDOWS, OS/2 Client의 1, 2 번 참조
- 환경 변수로 TNSNAMES.ORA나 LISTENER.ORA 파일이 위치하고 있는 디렉토리가 TNS_ADMIN에서 제대로 지정하고 있나 확인한다.
Cshell을 사용한다면 :
% env | grep TNS_ADMIN
정확한 디레토리를 지정하고 있지 않으면 다음과 같이 TNS_ADMIN 환경변수에 정확한 디렉토리를 설정한다.
% setenv TNS_ADMIN
- 사용자의 Configuration 파일들에 혹시 CTRL-M의 문자가 라인의 끝에 삽입되어 있나 확인한다.
- 사용자의 Connect String이 정확하다면 TNSNAMES.ORA의 db_alias 이름을 SID명과 동일하게 주었는지 확인한다.
SID와 db_alias는 다르게 기술해야 하며, 혹 Host명과 동일하게 주는 경우도 있는데, 이렇게 기술하면 Error를 발생시킬 수도 있다.
Sample V2 Connect String : sqlplus [user]/[passwd]@[tnsnames.ora에 있는 db_alias]
Example : sqlplus scott/tiger@V715tcp
TNSNAMES.ORA 파일의 예제 :
V715tcp = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (protocol = TCP) (host = korea) (port = 2000) ) ) (CONNECT_DATA = (SID = V715) ) )
- TNSNAMES.ORA File이 여러곳에 있는지 확인한다. TNSNAMES.ORA 파일은 3곳중 한곳에 있을 수 있다.
SQL*NET V2의 Search Path Priority.
여기서는 SQL*NET V2 구성파일(LISTENER.ORA와 TNSNAMES.ORA)을 찾는 순위에 대해 기술한다. ORACLE에서는 구성파일을 다음과 같은 순서로 찾는다.
- 만일 TNS_ADMIN 환경변수가 설정되어 있고 또한 디렉토리를 지정하고 있으면 확인한다.
- /etc 디렉토리를 확인한다.
- $ORACLE_HOME/network/admin을 확인한다.
|