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

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



답변

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

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

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

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

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

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

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


답변

이 문제점을 일으킬 수있는 몇 가지 사항이 있지만 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 코드를 표시하지는 않았지만 아마도 올바른 것으로 생각됩니다. 연결 문자열의 일부가 잘못되면 다양한 다른 오류가있을 수 있습니다.)


답변

나도 같은 오류가 있었지만 시도했을 때 세 가지 모두가 실패했습니다. 위의 세 가지가 실패하면 서비스 (내 경우에는 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

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


답변

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

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


답변

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

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

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


답변

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 이름이 잘못되어이 오류가 발생했습니다.


답변

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

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