BULLETIN CATEGORY
BULLETIN TOPIC
: SQL*NET 
: SQL*NET V2사용시 ORA-12154 조치 방법

ORA-12154의 원인은 tnsnames.ora 파일의 Alias처럼 정의된 Connect String으로 사용하는 db_alias를 찾지 못할 경우 발생한다. 
WINDOWS, OS/2 CLIENT PART 
  1. Login Box를 통해 접속을 할 경우에는 Connect String의 Field에서 @ 기호로 시작하지 않는다. @ 기호는 패스워드뒤에 공란없이 바로 Connect String (예: username/password@db_alias)을 지정하는 경우에 사용한다. 
    Connect String을 입력하는 Field에서 아래와 같이 기술한다. 
       tns:db_alias 
       또는 
        db_alias 
  2. TNSNAMES.ORA 파일은 반드시 Client PC의 ORACLE_HOMEnetworkadmin 디렉토리에 있어야  하며, 사용자가 지정한 Connect string은 TNSNAMES.ORA 파일에  정의된  db_alis명이 기술 되어 있어야 한다. 
         
  3. TNSNAMES.ORA 파일의 괄호(괄호쌍)를 제대로 열고 닫았는지 확인한다. 
  4. 만일 사용자가 TCP/IP를 사용하고 있다면 TNSNAMES.ORA 파일에 기술되어 있는 HOST=HOSTNAME을 HOST=IP ADDRESS로 변경한다. 
  5. SQLNET.ORA 파일을 점검하여 'names.default_zone=' 파라메타를 확인한다. 만일 SQLNET.ORA 파일에 이 파라메타가 존재하면 '#'으로 막는다. 
       #names.default_zone=[world] 
  6. 하나의 단일 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의 경우 접속시 대.소문자 구분을 한다. 
  7. 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 
    1. 상기의 WINDOWS, OS/2 Client의 1, 2 번 참조 
    2. 환경 변수로 TNSNAMES.ORA나 LISTENER.ORA 파일이 위치하고 있는 디렉토리가 TNS_ADMIN에서 제대로 지정하고 있나 확인한다. 
        Cshell을 사용한다면 : 
          % env | grep TNS_ADMIN 
      정확한 디레토리를 지정하고 있지 않으면  다음과 같이 TNS_ADMIN 환경변수에 정확한 디렉토리를 설정한다. 
        % setenv TNS_ADMIN 
    3. 사용자의 Configuration 파일들에 혹시 CTRL-M의 문자가 라인의 끝에 삽입되어 있나 확인한다. 
    4. 사용자의 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)
            )
          ) 
    5. TNSNAMES.ORA File이 여러곳에 있는지 확인한다. TNSNAMES.ORA 파일은 3곳중 한곳에 있을 수 있다. 
      SQL*NET V2의 Search Path Priority. 
      여기서는 SQL*NET V2 구성파일(LISTENER.ORA와 TNSNAMES.ORA)을 찾는 순위에 대해 기술한다. ORACLE에서는 구성파일을 다음과 같은 순서로 찾는다.
       
      1. 만일 TNS_ADMIN 환경변수가 설정되어 있고 또한 디렉토리를 지정하고 있으면 확인한다. 
      2. /etc 디렉토리를 확인한다. 
      3. $ORACLE_HOME/network/admin을 확인한다. 

Oracle Korea Customer Support Technical Bulletins
 
Posted by 큰바우
: