ORA-12505, TNS : listener는 현재 연결 설명자에 제공된 SID를 알지 못합니다.


154

Windows 7 64 비트 OS에 Oracle 11g Express Edition 릴리스 2를 설치하고 JDBC 프로그램을 실행하려고 시도한 후 다음 오류가 발생했습니다.

java.sql.SQLException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:412)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at com.jlcindia.jdbc.JDBCUtil.geOracleConnection(JDBCUtil.java:28)
    at Lab3O.main(Lab3O.java:15)
Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:385)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1042)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:301)
    ... 8 more

1
서비스에서 수동으로 OracleServiceXE를 시작하면 나에게 도움이되었습니다.
Sen

답변:


184

내 jdbc 문자열을 수정 하여이 문제를 해결했습니다.

예를 들어, 올바른 jdbc 문자열은 다음과 같아야합니다.

jdbc:oracle:thin:@myserver:1521/XE

하지만 내가 사용했던 jdbs 문자열은 ...

jdbc:oracle:thin:@myserver:1521:XE

(참고 : 사이 1521및 사이 XE여야 함 /)

이 잘못된 jdbc 문자열은 ORA-12505 오류도 발생시킵니다.


53
/를 사용하면 네트워크 서비스 이름이고 콜론을 사용하면 SID입니다.
eckes

89

이 문제점을 일으킬 수있는 몇 가지 사항이 있지만 JDBC를 시작하기 전에 SQL * Plus를 사용하여 데이터베이스에 연결할 수 있는지 확인해야합니다. SQL * Plus에 익숙하지 않은 경우 오랫동안 Oracle의 표준 부분 인 Oracle 데이터베이스에 연결하기위한 명령 줄 도구이며 Oracle XE에 포함되어 있습니다.

JDBC를 사용하여 Oracle 데이터베이스에 연결하면 데이터베이스에 직접 연결되지 않습니다. 대신 TNS 리스너에 연결 한 다음 데이터베이스에 연결합니다. 이 오류 ORA-12505는 리스너가 작동하여 연결할 수 있지만 해당 데이터베이스가 작동 중인지 알 수 없으므로 데이터베이스에 연결할 수 없음을 의미합니다. 이에 대한 두 가지 이유가 있습니다.

  • 데이터베이스가 시작되지 않았습니다.
  • 리스너 전에 데이터베이스가 시작 되었기 때문에 데이터베이스가 리스너에 등록되지 않았습니다. (데이터베이스가 시작되면 이미 실행중인 경우 리스너에 자체 등록됩니다. 리스너가 실행 중이 아닌 경우 데이터베이스는 자체적으로 등록되지 않으며 리스너가 시작되면 데이터베이스를 찾지 않습니다. 등록하십시오.)

ORA-12505는 청취자가 그 데이타베이스에 대해 알고 있지만, 데이타베이스로부터 데이타베이스가 가동되었다는 통지를받지 못했습니다. (잘못된 SID를 사용하여 잘못된 데이터베이스에 연결하려고하면 "TNS : 지정된 연결 식별자를 확인할 수 없습니다"라는 ORA-12154 오류가 발생합니다.

서비스 스냅인에서 실행중인 Oracle 서비스는 무엇입니까? (제어판> 관리 도구> 서비스에서 열거 나 시작> 실행>services.msc .) OracleServiceXE 및 OracleXETNSListener 서비스를 해야합니다.

서비스가 모두 시작된 경우 명령 프롬프트에서 다음 중 하나를 사용하여 SQL * Plus에서 데이터베이스에 연결할 수 있습니까? (Oracle XE를 설치 한 머신에서 이들을 실행한다고 가정합니다.)

sqlplus 시스템 / 시스템 암호 @XE
sqlplus 시스템 / 시스템 암호
sysplusba로 sqlplus /

( system-passwordOracle XE 설치 중에 SYS 및 SYSTEM 사용자에 대해 설정 한 비밀번호로 바꾸십시오.)

이 세 개 중 첫 번째는 TNS 리스너를 통해 연결되지만 두 번째 두 개는 리스너를 거치지 않고 데이터베이스에 직접 연결되며 데이터베이스와 동일한 시스템에있는 경우에만 작동합니다. 첫 번째는 실패하지만 다른 두 개는 성공하면 JDBC 연결도 실패합니다. 그렇다면 다른 둘 중 하나를 사용하여 데이터베이스에 연결하고 실행하십시오.ALTER SYSTEM REGISTER . 그런 다음 SQL * Plus를 종료하고 첫 번째 양식을 다시 시도하십시오.

세 번째는 실패하지만 두 번째는 작동하면 ora_dba 그룹에 사용자 계정을 추가하십시오. 제어판> 컴퓨터 관리> 로컬 사용자 및 그룹에서이 작업을 수행하십시오.

일단 양식의 연결을 얻을 수 있습니다

sqlplus 시스템 / 시스템 암호 @XE

작동하려면 JDBC를 통해 Oracle XE에 연결할 수 있어야합니다. (실수로 데이터베이스에 연결하는 데 사용하는 JDBC 코드를 표시하지는 않았지만 아마도 올바른 것으로 생각됩니다. 연결 문자열의 일부가 잘못되면 다양한 다른 오류가있을 수 있습니다.)


3
@ Raj : 귀하의 편집 내용이 답변에 가져 오는 것을 볼 수 없으므로 삭제했습니다. 질문에 많은 금액을 기부하려면 다른 사람을 수정하지 말고 자신의 답변을 게시하십시오.
Luke Woodward

이 오류를 얻고있다 @LukeWoodward SP2-0734: unknown command beginning "system/ora..." - rest of line ignored. 3에
vaibhavcool20

1
@qtpseleniumSupport :이 메시지는 SQL * Plus에 있고 행을 입력 system/ora...했음을 나타냅니다 (또는 SQL * Plus는 읽도록 지시 한 파일에서 해당 행을 읽습니다). 위에서 제공 한 명령 줄은 명령 프롬프트 / 쉘 / 터미널 창에서 사용하기위한 것입니다. 이미 SQL * 플러스를 실행하는 경우, 교체 sqlplus와 함께 connect.
Luke Woodward 2016 년

"데이터베이스가 리스너보다 먼저 시작 되었기 때문에 데이터베이스가 리스너에 등록되지 않았습니다." -이 거였어, 고마워!
Ursache

47

나도 같은 오류가 있었지만 시도했을 때 세 가지 모두가 실패했습니다. 위의 세 가지가 실패하면 서비스 (내 경우에는 XE)가 없으면 LSNRCTL 상태를 시도하십시오.

sqlplus /nolog
conn  system
alter system register;  
exit  
lsnrctl status  

이제 서비스를 볼 수 있습니다. 보지
않아도이 서비스를 사용해보십시오

sqlplus /nolog  
conn system  
alter system set local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope = both;  
alter system register;  
exit  
lsnrctl status

이것은 아마도 작동해야합니다 ...


2
당신이 해냈어! 을 설정하면 local_listenerorcl 리스너가에 표시됩니다 lsnrctl. 정말 감사합니다!
ass 19.

시스템이 작동하지만 다음을 실행했습니다. ALTER SYSTEM set local-listener = XE;
Daniel Williams

입력 할 때 : 'alter system set local_listener ='(ADDRESS = (PROTOCOL = TCP) (HOST = localhost) (PORT = 1521)) 'scope = both;' 오류를 반환합니다. ORA-65040: operation not allowed from within a pluggable database무슨 뜻입니까? JDBC를 구성 할 수 없음 : /
Alg_D

1
가장 인기있는 답변이 모두 도움이되었지만 더 많은 도움이되었습니다. 리스너 주소로 127.0.0.1이없는 것 같습니다 (내 PC의 로컬 이름이있는 주소가 있음). 이 새로운 것을 추가함으로써, 그것은 작동하기 시작했습니다
johnbr

alter system set local_listener = ... 나를 위해 일했다.
Ben Asmussen

31

이 오류가 발생하면 "ORA-12505, TNS : listener가 현재 연결 설명자에 제공된 SID를 알 수 없습니다"

해결 방법 : 서비스를 열고 시작한 OracleServiceXE후 연결을 시도하십시오.


나는 같은 문제가 있지만 OracleServiceXE를 실행하는 데 문제가 있었으므로 OracleServiceXE 서비스를 다시 시작하면 나에게 도움이되었습니다. 이유를 모르십니까?!
Hamedz

OracleServiceXE를 찾을 때 XE는 데이터베이스 SID와 일치하므로 올바른 서비스를 찾고 있는지 확인하십시오. OracleService [SID]
Sandoval0992

10

이 예외에 대한 몇 가지 이유를 발견했습니다.

1) 기본적으로 데이터베이스 XE의 이름. URL은 " jdbc : oracle : thin : @localhost : 1521 : XE "입니다.

2) OracleServiceXE, OracleXETNSListener가 실행 중인지 확인하십시오. 제어판 \ 모든 제어판 항목 \ 관리 도구 \ 서비스에 있습니다.


8

JDBC 코드를 수정하여이 문제를 해결했습니다.

올바른 JDBC 문자열은 ...

conection = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:xe","system","ishantyagi");

그러나 내가 사용했던 JDBC 문자열은 ...

conection = DriverManager.getConnection
("jdbc:oracle:thin:@localhost:1521:orcl","system","ishantyagi");

따라서 xe 대신 orcl을 지정하면 SID 이름이 잘못되어이 오류가 발생했습니다.


제 경우에는 conection = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:orcl","system","ishantyagi");효과가있었습니다.
Pran Kumar Sarkar

8

아래 코드를 사용하면 문제가 해결됩니다.

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@IPAddress:1521/servicename","userName","Password");

7

비슷한 오류가 발생하여 위의 솔루션 중 어느 것도 도움이되지 않았습니다. listner.ora 파일에 문제가있었습니다. 실수로 내가 추가 한 SID의 출력 SID_LIST(별 * 사이의 부분) 아래를 참조하십시오.

 SID_LIST_LISTENER =
      (SID_LIST =

        (SID_DESC =
          (SID_NAME = PLSExtProc)
          (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
          (PROGRAM = extproc)
        )
        (SID_DESC =
          (SID_NAME = CLRExtProc)
          (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
          (PROGRAM = extproc)
        )
        )

 *(SID_DESC =
           (SID_NAME = XE)
           (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
         )*
    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
          (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
        )
      )


    DEFAULT_SERVICE_LISTENER = (XE)

이 오류를 아래와 같이 수정했습니다.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
       (SID_NAME = XE)
       (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
     )
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\oraclexe\app\oracle\product\11.2.0\server)
      (PROGRAM = extproc)
    )
    )
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
    )
  )


DEFAULT_SERVICE_LISTENER = (XE)

중지 및 데이터베이스 여기에 이미지 설명을 입력하십시오

제어판 \ 모든 제어판 항목 \ 관리 도구 \ 서비스로 이동하여 자동으로 중지되지 않았으므로 리스너 OracleServiceXE 및 OracleXETNSListener를 수동으로 중지했습니다. 데이터베이스를 다시 시작했는데 매력처럼 작동했습니다.


4

나는 처음에 같은 문제로 여기에 왔습니다. Windows 8 (64 비트)에 Oracle 12c를 설치했지만 명령 줄에서 'TNSPING xe'로 해결했습니다 ... 연결이 설정되지 않았거나 이름을 찾을 수 없으면 데이터베이스 이름을 시도하십시오. 내 경우에는 'orcl'... 'TNSPING orcl'이고 다시 핑에 성공하면이 경우 SID를 'orcl'로 변경해야합니다 (또는 데이터베이스 이름 u 사용).


4

내가 광범위하게 논의하지 않은 한 가지 가능성은 호스트 시스템 자체에서 호스트 이름을 확인하는 데 문제가있을 수 있다는 것입니다. / etc / hosts에 $ (hostname)에 대한 항목이 없으면 Oracle 리스너가 혼란스러워지지 않습니다.

그것은 내 문제로 판명되었고 / etc / hosts에 호스트 이름과 IP 주소를 추가하면 문제가 해결되었습니다.



4

Oracle SQL Developer에 연결되어있는 경우 다음 이미지에 설명 된대로 연결 메뉴의 정보를 사용하여 URL을 작성하십시오.

여기에 이미지 설명을 입력하십시오

위의 예에서 URL은 다음과 같습니다. jdbc:oracle:thin:@ORADEV.myserver.com:1521/myservice

SID를 사용하는 경우 호스트 이름 뒤에 슬래시 ( "/") 대신 콜론 ( ":")이 있습니다.


2

나도 같은 문제에 직면했다. VMware를 사용하여 Windows XP OS에 Oracle Express Edition 10g를 설치했으며 정상적으로 작동했습니다. 10g에서 제공하는 SQL 유틸리티에 SQL 쿼리를 입력하는 것이 매우 어색하고 SQL 개발자와 일하는 데 익숙했기 때문에 XP에 32 비트 SQL 개발자를 설치하고 DB SID "XE"에 연결을 시도했습니다. 그러나 오류 -ORA-12505로 인해 연결이 실패했습니다. SQL 유틸리티에서 제대로 작동했기 때문에이 문제가 어떻게 발생했는지에 대해 바다에 있었고 또한 동일한 것을 사용하여 Informatica 매핑을 거의 만들지 않았습니다. 나는 지금까지이 것들에 대해 많이 찾아 보았고 공개 포럼에서 "lsnrctl"의 상태를 핑 (ping) 한 후 나에게 제안 된 제안을 적용했지만 아무 소용이 없었다. 하지만 오늘 아침에 새로운 연결을 다시 만들려고했지만 Voila는 아무런 문제없이 작동했습니다. DB가 연결되기 전에 청취자가 듣는 몇 개의 게시물을 읽은 후 추측하고 있습니다 (여기서는 초보자이므로 조잡한 참조로 용서하십시오).하지만 컴퓨터를 다시 시작하고 다시 확인하는 것이 좋습니다.


2

나는이 문제를 해결하기 위해 같은 문제가 있었기 때문에 먼저 netcaORCL 인 오래된 데이터베이스를 삭제 한 다음 사용하여 리스너를 재구성 dbca한 다음dbca


2

나는 같은 문제에 직면했고 OracleServiceXE 서비스를 다시 시작하여 해결했습니다. Services.msc로 이동 한 다음 'OracleServiceXE'서비스가 작동하고 실행 중인지 확인하십시오.


2

내 TNSNAMES.ora 파일에서 " SID "를 " SERVICE_NAME " 으로 변경하여이 문제를 해결했습니다 .

DB가 SID 또는 SERVICE_NAME을 요청하는지 확인하십시오.

건배


2

Oracle Express Edition을 사용하는 경우이 URL이 있어야합니다

jdbc : oracle : thin : @localhost : 1521 : xe 또는 jdbc : oracle : thin : @localhost : 1521 / XE

pom.xml의 liquibase 구성 플러그인과 비슷한 문제가있었습니다. 그리고 구성을 변경했습니다.

`<configuration>
   <driver>oracle.jdbc.OracleDriver</driver>
   <url>jdbc:oracle:thin:@localhost:1521:xe</url>
   <defaultSchemaName></defaultSchemaName>
   <username>****</username>
   <password>****</password>
</configuration>`

2

연결 con = DriverManager.getConnection ( "jdbc : oracle : thin : @localhost : 1521 : xe", "scott", "tiger");

내가 가진 오류 :

java.sql.SQLException : 리스너가 다음 오류로 연결을 거부했습니다. ORA-12505, TNS : listener가 현재 연결 설명자에 제공된 SID를 알 수 없습니다. 클라이언트가 사용하는 연결 설명자는 다음과 같습니다. localhost : 1521 : xe

내가 해결 한 방법 :

연결 con = DriverManager.getConnection ( "jdbc : oracle : thin : localhost : 1521 : xe", "scott", "tiger");

(@ 제거)

이유를 모르지만 지금 작동하는 것은 ...


1

호스트 시스템에서 tnsping 및 인스턴스 이름을 수행하여 확인하십시오. 그것은 당신에게 tns decription을 줄 것이고, 대부분의 호스트 이름은 일치하지 않습니다.

내 문제도 마찬가지로 해결

유닉스 머신에서 $ tnsping (Enter)

호스트 이름이 다르다는 것을 알게 된 전체 tns 설명을 제공합니다. : :)


1

모두를 확인하시기 바랍니다 OracleServiceXE그리고 OracleXETNSListener당신을 통해 탐색 할 때 상태가 본격적으로 시작 start->run->services.msc.

내 경우에만 OracleXETNSListener시작되었지만 시작 OracleServiceXE되지 않았습니다. 시작 right clicking -> start하여 연결이 작동하는지 확인할 때


1

SQL Workbench에서도 비슷한 문제가있었습니다.

URL :

jdbc : oracle : thin : @ 111.111.111.111 : 1111 : xe

작동하지 않습니다.

URL :

jdbc : oracle : thin : @ 111.111.111.111 : 1111 : asdb

공장.

이것은 내 구체적인 상황에서 나를 도와줍니다. 다른 솔루션으로 다른 많은 이유가 존재할 수 있습니다.


0

비슷한 문제가있었습니다. 문제가 갑자기 발생하기 시작했습니다. 부하 분산 데이터베이스 연결 URL이 있지만 jdbc 연결에서 단일 DB를 직접 가리키고있었습니다.

부하 분산 DB URL로 변경되어 작동했습니다.


2
jdbc : oracle : thin : @ (DESCRIPTION = (ADDRESS = (HOST = myhost) (PORT = 1521) (PROTOCOL = tcp)) (CONNECT_DATA = (SERVICE_NAME = myorcldbservicename)))과 같이 정규화 된 연결 문자열 URL을 사용하는 것이 좋습니다.
니르 말라

0

내 경우에는 효과가 없었지만 마침내 오라클과 TNS 리스너를 다시 시작하고 모든 것이 작동했습니다. 이틀 동안 고군분투했다.


0

이 오류 ORA-12505, TNS : listener가 현재 SQL 개발자를 사용하여 Oracle DB에 연결하려고 할 때 연결 설명자에 제공된 SID를 알 수 없습니다 .

사용 된 JDBC 문자열은 jdbc : oracle : thin : @myserver : 1521 / XE 였으며, OracleServiceXE, OracleXETNSListener 올바르게 실행중인 두 개의 필수 oracle 서비스 입니다.

이 문제를 해결 한 방법 (Windows 10)

 1. Open run command.
 2. Type services.msc 
 3. Find services with name OracleServiceXE and OracleXETNSListener in the list.
 4. Restart OracleServiceXE service first. After completing the restart try restarting OracleXETNSListener service.

0

서비스 실행 (OracleServiceXE, OracleXETNSListener) 이외에도 안티 바이러스 소프트웨어 / 방화벽이 여전히 차단할 수 있습니다. 차단되지 않았는지 확인하십시오.여기에 이미지 설명을 입력하십시오



0

오라클이 작동을 멈추고이 오류가 발생했습니다. 컴퓨터를 다시 시작하고 위의 솔루션을 시도했습니다. 궁극적으로 구성 요소 서비스를 열고 오라클 서비스를 다시 시작하여 모두 작동하기 시작했습니다. 이것이 누군가를 돕기를 바랍니다.


0

방금 데이터베이스 링크를 잘못 작성했습니다.

간단한 수정은 단순히 'SID'를 SERVICE_NAME (으)로 변경하는 것이 었습니다.

CREATE DATABASE LINK my_db_link
CONNECT TO myUser IDENTIFIED BY myPassword
USING
'
(
    DESCRIPTION=
    (
        ADDRESS=
        (PROTOCOL=TCP)
        (HOST=host-name-heren)
        (PORT=1521)
    )
    (CONNECT_DATA=(SID=theNameOfTheDatabase))
)';

바꾸다

SID=theNameOfTheDatabase

SERVICE_NAME=theNameOfTheDatabase 

내 문제를 해결했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.