*. 상황설명

서버쪽 리스너와 클라이언트쪽 tnsnames.ora의 설정을 맞게 했음에도 클라이언트에서 아래의 에러가 뜨면서 접속이 안된다.


SQL> conn scott/tiger@orcl

ERROR:

ORA-12514: TNS:리스너가 현재 접속 기술자에 요청된 서비스를 알지 못함



참고로 클라이언트에서 tnsping orcl 을 날리면 잘 날아간다.

C:\Documents and Settings> tnsping orcl


TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 30-7월 - 2012 09:44:07

Copyright (c) 1997, 2010, Oracle.  All rights reserved.


사용된 매개변수 파일:

C:\app\product\11.2.0\dbhome_1\network\admin\sqlnet.ora


별칭 분석을 위해 TNSNAMES 어댑터 사용

(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.101

)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl)))에 접속하려고 시도하는중

확인(0밀리초)





*. 분석


1. 서버쪽의 lsnrctl status 명령을 날려 리스너의 상황을 보았다.

STATUS of the LISTENER

------------------------

Alias                     LISTENER

Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date                30-JUL-2012 10:50:54

Uptime                    0 days 0 hr. 0 min. 0 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP                      OFF

Listener Parameter File   /app/oracle/product/11g/network/admin/listener.ora

Listener Log File         /app/oracle/diag/tnslsnr/sg/listener/alert/log.xml

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=1521)))

The listener supports no services

The command completed successfully


아래서 두번째 줄 처럼 The listener supports no services의 상태다. 인스턴스가 떠 있어야 함에도 그러질 못하고 있는 상황이다.




2. 로그를 확인해 보았다.

<msg time='2012-07-30T10:54:29.563+09:00' org_id='oracle' comp_id='tnslsnr'

 type='UNKNOWN' level='16' host_id='sg.net'

 host_addr='UNKNOWN'>

 <txt>30-JUL-2012 10:54:29 * (CONNECT_DATA=(CID=(PROGRAM=)(HOST=sg.net)(USER=oracle))(COMMAND=status)(ARGUMENTS=64)(SERVICE=LISTENER)(VERSION=186646784)) * status * 0

 </txt>

</msg>


리스너의 HOST에 IP로 적어줬음에도 로그에는 sg.net으로 찍혀있다.




*. 의심

서버쪽의 /etc/hosts 상황을 확인해 보았다.


-- /etc/hosts 상황

127.0.0.1               sg.net localhost.localdomain localhost

192.168.56.1            sg.win


큰 문제 없어 보였다.


애매한 점이 있어서 아래와 같이 편집후 OS 재부팅까지 해 보았다.

127.0.0.1               localhost.localdomain localhost

192.168.56.1            sg.win


OS 재부팅후 DB startup을 해보았다.


SQL> startup

ORA-00119: invalid specification for system parameter LOCAL_LISTENER

ORA-00130: invalid listener address '(ADDRESS=(PROTOCOL=TCP)(HOST=sg.net)(PORT=1521))'


위의 에러가 나면서 실패.


# ping sg.net

ping: unknown host sg.net


없다고 나온다. 아무래도 문제의 원인인 듯 싶다.




*. 조치

/etc/hosts의 내용을 아래와 같이 편집했다.(서버의 아이피 : 192.168.56.101)

127.0.0.1               localhost.localdomain localhost

192.168.56.101          sg.net

192.168.56.1            sg.win



핑을 날려보니 잘 날아간다.

# ping sg.net

PING sg.net (192.168.56.101) 56(84) bytes of data.

64 bytes from sg.net (192.168.56.101): icmp_seq=1 ttl=64 time=0.656 ms

64 bytes from sg.net (192.168.56.101): icmp_seq=2 ttl=64 time=0.069 ms


DB도 startup 완료.

SQL> startup

ORACLE instance started.


Total System Global Area  422670336 bytes

Fixed Size                  1336960 bytes

Variable Size             268437888 bytes

Database Buffers          146800640 bytes

Redo Buffers                6094848 bytes

Database mounted.

Database opened.



리스너를 실행하고 status를 확인 했다.

LSNRCTL> status

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.101)(PORT=1521)))

STATUS of the LISTENER

------------------------

Alias                     LISTENER

Version                   TNSLSNR for Linux: Version 11.2.0.1.0 - Production

Start Date                30-JUL-2012 10:50:54

Uptime                    0 days 0 hr. 3 min. 35 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP                      OFF

Listener Parameter File   /app/oracle/product/11g/network/admin/listener.ora

Listener Log File         /app/oracle/diag/tnslsnr/sg/listener/alert/log.xml

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.56.101)(PORT=1521)))

Services Summary...

Service "orcl" has 1 instance(s).

  Instance "orcl", status READY, has 1 handler(s) for this service...

Service "orclXDB" has 1 instance(s).

  Instance "orcl", status READY, has 1 handler(s) for this service...

The command completed successfully

드디어 인스턴스가 뜬다.



클라이언트에서 접속 시도해보자.

SQL> conn scott/tiger@orcl

연결되었습니다.


접속성공.

오렌지에서도 접속 시도 : 문제없이 접속 완료



*. 결론 

서버쪽 /etc/hosts에 아래와 같이 서버의 실제 아이피가 hostname으로 잡혀 있어야 함.

로컬호스트에 hostname이(리스너에서 사용한 이름) 물려 있으면 에러난다.

/etc/hosts의 내용을 아래와 같이 편집(서버의 아이피 : 192.168.56.101)

127.0.0.1               localhost.localdomain localhost

192.168.56.101          sg.net

192.168.56.1            sg.win





*. 아래는 참고할 현재 상황

-- =========================

-- IP 및 환경

-- =========================

ORACLE 버전 :  11.2.0.1.0

서버 IP : 192.168.56.101

서버 OS : CentOS 5

오라클 인스턴스네임(SID) : orcl

클라이언트 IP : 192.168.56.1

클라이언트 OS : WinXP 오라클 엔진설치 후 SQL*PLUS 사용



-- =========================

-- 서버 쪽 listener.ora : HOST는 IP로 직접 적어주는것이 좋음

-- =========================

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.101)(PORT = 1521))

    )

  )

ADR_BASE_LISTENER = /app/oracle



-- =========================

-- 서버 쪽 /etc/hosts 상황

-- =========================

127.0.0.1               localhost.localdomain localhost

192.168.56.101          sg.net

192.168.56.1            sg.win



-- =========================

-- 클라이언트 쪽 tnsnames.ora

-- =========================

orcl =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)

                 (HOST = 192.168.56.101)

                 (PORT = 1521)

      )

    )

    (CONNECT_DATA =

      (SERVICE_NAME = orcl)

      (SID = orcl)

    )

  )


-- =========================

-- 클라이언트 쪽 sqlnet.ora : 해당부분 주석# 처리 해준다.

-- =========================

# SQLNET.AUTHENTICATION_SERVICES = (TNSNAMES, NTS)




-- =========================

-- 클라이언트 쪽 C:\WINDOWS\system32\drivers\etc\hosts 상황

-- =========================

127.0.0.1       localhost

192.168.56.101 orcl

Posted by 딩구르
,