[oracle] ORA-12514 TNS : listener가 현재 접속 설명자에서 요청한 서비스를 모릅니다

다음 오류가 발생하는 로컬에서 실행중인 응용 프로그램이 있습니다.

ORA-12514 : TNS : listener가 현재 접속 설명자에서 요청한 서비스를 알지 못합니다

TNSPing올바르게 해결 된 연결을 테스트하고 연결 SQLPlus을 시도 했지만 위와 동일한 오류로 실패했습니다. 이 구문을 SQLPlus다음 용도로 사용했습니다 .

sqlplus username/password@addressname[or host name]

우리는 다음을 확인했습니다.

  • 서버에서 TNS 리스너가 실행 중입니다.
  • 서버에서 Oracle 자체가 실행 중입니다.

우리는이 환경에 어떤 변화가 있었는지 모른다. 우리가 테스트 할 수있는 다른 것이 있습니까?



답변

나는이 문제가 있었고 수정은 데이터베이스에서 유효한 서비스 이름 인지 확인 tnsnames.ora하는 SERVICE_NAME것이 었습니다 . 유효한 서비스 이름을 찾으려면 oracle에서 다음 쿼리를 사용할 수 있습니다.

select value from v$parameter where name='service_names'

내가 업데이트 한 tnsnames.ora후 :

TEST =
   (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = *<validhost>*)(PORT = *<validport>*))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = *<servicenamefromDB>*)
    )
)

그런 다음 나는 달렸다.

sqlplus user@TEST

성공! 리스너는 기본적으로 사용중인 service_name이 DB에 따라 유효한 서비스가 아니라고 알려줍니다.

(* Win7 클라이언트 워크 스테이션에서 원격 DB로 sqlplus를 실행하고 DBA를 비난했습니다.) *)


답변

나는 이것이 오래된 질문이지만 여전히 답이 없다는 것을 알고 있습니다. 하루 동안의 연구가 필요했지만 적어도 내 경우 (Windows 2008 R2의 Oracle 11.2)에서 가장 간단한 솔루션을 발견하고 공유하고 싶었습니다.

직접 보면 오류는 리스너가 서비스 이름을 인식하지 못함을 나타냅니다. 그러나 서비스 이름은 어디에 유지됩니까? 에%ORACLE_HOME%\NETWORK\ADMIN\listener.ora

“SID_LIST”는 복사 또는 조회 할 수있는 형식으로 SID와 서비스 이름 목록이 결합 된 것입니다.

Service Name 문제를 추가 한 다음 Windows “Services”제어판에서 Oracle 리스너 서비스에 대해 “Restart”를 수행했습니다. 이제 모든 것이 잘되었습니다.


예를 들어 listener.ora 파일은 처음에 다음과 같습니다.

# listener.ora Network Configuration File: C:\app\oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

… 및 서비스 이름을 인식하기 위해 다음과 같이 orcl변경할 수 있습니다.

# listener.ora Network Configuration File: C:\app\oracle_user\product\12.1.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\oracle_user\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
    (SID_DESC = 
        (GLOBAL_DBNAME = orcl)
        (ORACLE_HOME = C:\app\oracle_user\product\12.1.0\dbhome_1)
        (SID_NAME = orcl)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )


답변

Windows Server 2008 R2Oracle 11g 에서이 문제가 발생했습니다.

Netbox> 리스너로 이동하여 combox에서 데이터베이스 서비스 선택> “글로벌 데이터베이스 이름”이 “SID”와 같아야하고 “Oracle 홈 디렉토리”가 정확해야합니다.

데이터베이스 서비스에 대한 항목이없는 경우 하나를 작성하고 올바른 글로벌 데이터베이스 sid및 Oracle 홈을 설정하십시오 .


답변

내 상황에서 오류는 리스너가 db의 서비스를 등록하지 않았기 때문에 발생했습니다. 서비스를 등록하여이 문제를 해결했습니다. 예:

내 설명자 tnsnames.ora:

LOCALDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = LOCALDB)
    )
  )

따라서 listener.ora수동으로 서비스를 등록합니다 .

SID_LIST_LISTENER =
    (SID_DESC =
      (GLOBAL_DBNAME = LOCALDB)
      (ORACLE_HOME = C:\Oracle\product\11.2.0\dbhome_1)
      (SID_NAME = LOCALDB)
    )

마지막으로 다음 명령으로 리스너를 다시 시작하십시오.

> lsnrctl stop
> lsnrctl start

끝난!


답변

services.msc에서 OracleServiceXXX를 시작하면 Windows에서 저에게 효과적이었습니다.


답변

이것은 실제로 Brad Rippe 의 답변에 대한 의견이어야 하지만 아쉽지만 충분한 담당자는 아닙니다. 그 대답은 나에게 90 %의 길을 얻었습니다. 필자의 경우 데이터베이스 설치 및 구성은 내가 실행중인 데이터베이스의 tnsnames.ora 파일에 항목을 넣습니다. 먼저 환경 변수를 설정하여 데이터베이스에 연결할 수있었습니다 (Windows).

set ORACLE_SID=mydatabase
set ORACLE_HOME=C:\Oracle\product\11.2.0\dbhome_1

다음을 사용하여 연결

sqlplus / as sysdba

다음으로 Brad Rippe의 답변에서 명령을 실행하십시오.

select value from v$parameter where name='service_names';

이름이 정확히 일치하지 않는 것으로 나타났습니다. 원래 Oracle의 Database Configuration Assistant를 사용하여 작성된 항목 :

MYDATABASE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mylaptop.mydomain.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydatabase.mydomain.com)
    )
  ) 

쿼리의 서비스 이름은 단지 이름 mydatabase이 아닙니다 mydatabase.mydomain.com. 도메인 부분이없는 기본 이름으로 tnsnames.ora 파일을 편집하여 다음과 같이 표시했습니다.

MYDATABASE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mylaptop.mydomain.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mydatabase)
    )
  ) 

나는 TNS 리스너 서비스를 다시 시작 (I 자주 사용을 lsnrctl stop하고 lsnrctl start관리자 명령 창에서 [또는 Windows PowerShell은] 대신 서비스 제어판하지만 모두 작동합니다.의) 그 후, 나는 연결할 수 있었다.


답변

나는 같은 문제가 있었다. 나를 위해, 그냥 쓰기

sqlplus myusername/mypassword@localhost

트릭을 수행하면 기본 서비스 이름에 연결됩니다.