ORA-12505, TNS: słuchacz nie zna obecnie identyfikatora SID podanego w deskryptorze połączenia


154

Zainstalowałem Oracle 11g Express Edition Release 2 w moim 64-bitowym systemie operacyjnym Windows 7 i próbowałem uruchomić program JDBC, po czym pojawił się następujący błąd:

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
Uruchamianie OracleServiceXE ręcznie z usług działało dla mnie.
Sen

Odpowiedzi:


184

Rozwiązałem ten problem, poprawiając mój ciąg jdbc.

Na przykład prawidłowy ciąg jdbc powinien mieć postać ...

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

Ale ciąg jdbs, którego używałem, to ...

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

(Uwaga: pomiędzy 1521a XEpowinno być a /)

Ten zły ciąg jdbc również powoduje błąd ORA-12505.


53
Jeśli używasz znaku /, jest to nazwa usługi sieciowej, jeśli używasz dwukropka, jest to identyfikator SID.
eckes

89

Jest kilka rzeczy, które mogą powodować ten problem, ale zanim zaczniesz korzystać z JDBC, musisz się upewnić, że możesz połączyć się z bazą danych za pomocą SQL * Plus. Jeśli nie znasz SQL * Plus, jest to narzędzie wiersza poleceń do łączenia się z bazami danych Oracle, które od dawna jest standardową częścią Oracle i jest dołączone do Oracle XE.

Podczas łączenia się z bazą danych Oracle za pomocą JDBC nie łączy się bezpośrednio z bazą danych. Zamiast tego łączysz się z odbiornikiem TNS, który następnie łączy Cię z bazą danych. Błąd ORA-12505oznacza, że ​​odbiornik był włączony i można było się z nim połączyć, ale nie mógł on połączyć się z bazą danych, ponieważ nie wie, że ta baza danych działa. Są ku temu dwa powody:

  • baza danych nie została uruchomiona,
  • baza danych nie została zarejestrowana w nasłuchiwaniu, np. dlatego, że baza danych została uruchomiona przed odbiornikiem. (Po uruchomieniu baza danych rejestruje się u nasłuchiwania, jeśli jest już uruchomiona. Jeśli słuchacz nie jest uruchomiony, baza danych nie rejestruje się, a jeśli nasłuchujący uruchamia się, nie szuka baz danych, które mogłyby zarejestruj się w nim.)

ORA-12505 oznacza, że ​​słuchacz wie o tej bazie danych, ale słuchacz nie otrzymał powiadomienia z bazy danych, że baza danych działa. (Jeśli próbujesz połączyć się z niewłaściwą bazą danych, używając niewłaściwego identyfikatora SID, otrzymasz błąd ORA-12154 „TNS: nie można rozwiązać określonego identyfikatora połączenia”).

Jakie usługi Oracle są uruchomione w przystawce Usługi? (Otwórz to z Panelu sterowania> Narzędzia administracyjne> Usługi lub po prostu Start> Uruchom>services.msc .) Potrzebujesz usług OracleServiceXE i OracleXETNSListener do działania.

Jeśli obie usługi zostały uruchomione, czy możesz połączyć się z bazą danych w programie SQL * Plus za pomocą dowolnego z poniższych poleceń w wierszu polecenia? (Zakładam, że uruchamiasz je na komputerze, na którym zainstalowałeś Oracle XE).

sqlplus hasło systemowe / systemowe @XE
system sqlplus /systemowe
sqlplus / jako sysdba

(Zastąpić system-password hasłem ustawionym dla użytkowników SYS i SYSTEM podczas instalacji Oracle XE).

Pierwsza z tych trzech łączy się przez nasłuchiwanie TNS, ale dwie pozostałe łączą się bezpośrednio z bazą danych bez przechodzenia przez nasłuchiwanie i działają tylko wtedy, gdy jesteś na tym samym komputerze co baza danych. Jeśli pierwszy z nich zawiedzie, ale pozostałe dwa się powiodą, połączenia JDBC również nie powiodą się. Jeśli tak, połącz się z bazą danych przy użyciu jednego z dwóch pozostałych i uruchomALTER SYSTEM REGISTER . Następnie wyjdź z SQL * Plus i wypróbuj ponownie pierwszy formularz.

Jeśli trzecia nie działa, ale druga działa, dodaj swoje konto użytkownika do grupy ora_dba. Zrób to w Panelu sterowania> Zarządzanie komputerem> Lokalni użytkownicy i grupy.

Gdy już możesz uzyskać połączenia z formularza

sqlplus hasło systemowe / systemowe @XE

do pracy, powinieneś mieć możliwość połączenia się z Oracle XE przez JDBC. (Nawiasem mówiąc, nie pokazałeś nam kodu JDBC, którego używasz do łączenia się z bazą danych, ale podejrzewam, że jest on całkiem prawdopodobnie poprawny; byłoby wiele innych błędów, gdyby części parametrów połączenia były nieprawidłowe.)


3
@Raj: Nie widzę, co twoja zmiana wnosi do odpowiedzi, więc ją usunąłem. Jeśli chcesz wnieść znaczną kwotę do pytania, napisz własną odpowiedź zamiast edytować czyjąś odpowiedź.
Luke Woodward

@LukeWoodward Otrzymuję ten błąd SP2-0734: unknown command beginning "system/ora..." - rest of line ignored. na wszystkich 3
vaibhavcool20

1
@qtpseleniumSupport: ta wiadomość mówi, że byłeś w SQL * Plus i wszedłeś do linii system/ora...(lub SQL * Plus przeczytał tę linię z pliku, który kazałeś mu przeczytać). Wiersze poleceń, które podałem powyżej, mają być używane z okna wiersza polecenia / powłoki / terminala. Jeśli jesteś już uruchomiony SQL * Plus, wymienić sqlplusz connect.
Luke Woodward

„baza danych nie została zarejestrowana w nasłuchiwaniu, np. ponieważ baza danych została uruchomiona przed odbiornikiem”. - to było to, dziękuję!
Ursache

47

Ja też dostałem ten sam błąd, ale kiedy spróbowałem, wszystkie trzy zawiodły. Jeśli powyższe trzy zawiodą, wypróbuj status LSNRCTL, jeśli znajdziesz usługę (w moim przypadku XE), spróbuj tego

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

Teraz możesz zobaczyć usługę,
nawet jeśli jej nie widzisz, wypróbuj ją

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

To prawdopodobnie powinno zadziałać ...


2
Zrobiłeś to, człowieku! Po ustawieniu local_listenerodbiornika orcl jest teraz wyświetlany w lsnrctl. Stukrotne dzięki!
asgs

To spowodowało, że mój system działał, ale zwróć uwagę, że wykonałem następujące czynności: ALTER SYSTEM set local-listener = XE;
Daniel Williams,

kiedy piszę: 'alter system set local_listener =' (ADDRESS = (PROTOCOL = TCP) (HOST = localhost) (PORT = 1521)) 'scope = both;' Zwraca błąd: ORA-65040: operation not allowed from within a pluggable databaseco to znaczy? Nie można skonfigurować JDBC: /
Alg_D,

1
obie odpowiedzi, które zostały najwyżej ocenione, pomogły, ale ta pomogła bardziej. Wygląda na to, że nie miałem adresu 127.0.0.1 jako adresu nasłuchującego (miałem adres z lokalną nazwą mojego komputera). Więc dodając ten nowy, zaczęło działać
johnbr

alter system set local_listener = ... pracował dla mnie.
Ben Asmussen

31

Gdy pojawia się ten błąd „ORA-12505, TNS: słuchacz nie wie obecnie o identyfikatorze SID podanym w deskryptorze połączenia”

Rozwiązanie: Otwórz usługi i zacznij OracleServiceXE, a następnie spróbuj się połączyć ...


Miałem ten sam problem, ale z uruchomieniem OracleServiceXE, dlatego zrestartowanie usługi OracleServiceXE zadziałało. Nie wiem dlaczego ?!
Hamedz

Szukając OracleServiceXE, należy pamiętać, że XE odpowiada identyfikatorowi SID bazy danych, więc upewnij się, że szukasz odpowiedniej usługi, OracleService [SID]
Sandoval0992

10

Znalazłem kilka powodów tego wyjątku. One są

1) Domyślna nazwa bazy danych XE. Dlatego adres URL to „ jdbc: oracle: thin: @localhost: 1521: XE ”.

2) Upewnij się, że OracleServiceXE, OracleXETNSListener jest uruchomiony. Będzie w Panelu sterowania \ Wszystkie elementy Panelu sterowania \ Narzędzia administracyjne \ Usługi


8

Rozwiązałem ten problem, poprawiając mój kod JDBC.

poprawny ciąg JDBC powinien być ...

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

Ale ciąg JDBC, którego używałem, był ...

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

Tak więc błąd podania orcl zamiast xe pokazał ten błąd, ponieważ nazwa SID była błędna.


W moim przypadku conection = DriverManager.getConnection ("jdbc:oracle:thin:@localhost:1521:orcl","system","ishantyagi");zadziałało.
Pran Kumar Sarkar

8

Mój problem został rozwiązany, gdy użyję poniższego kodu:

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

7

W obliczu podobnego błędu żadne z powyższych rozwiązań nie pomogło. Wystąpił problem w pliku listner.ora. Przez pomyłkę dodałem SIDpoza tym, co SID_LISTwidać poniżej (sekcja między gwiazdami *).

 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)

Poprawiono ten błąd, jak poniżej:

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)

Zatrzymano i baza danych wprowadź opis obrazu tutaj

Zatrzymano programy nasłuchujące OracleServiceXE i OracleXETNSListener ręcznie, ponieważ nie zatrzymały się one automatycznie, przechodząc do Panel sterowania \ Wszystkie elementy panelu sterowania \ Narzędzia administracyjne \ Usługi. Zrestartowałem bazę danych i działała jak urok.


4

początkowo przyjechałem tutaj z tym samym problemem. Zainstalowałem jus Oracle 12c w systemie Windows 8 (64-bitowym), ale od tego czasu rozwiązałem to za pomocą `` TNSPING xe '' w wierszu poleceń ... Jeśli połączenie nie jest nawiązane lub nie znaleziono nazwy, wypróbuj nazwę bazy danych, w moim przypadku było to ponownie 'orcl' ... 'TNSPING orcl' i jeśli pingowanie zakończyło się pomyślnie, musisz zmienić SID na 'orcl' w tym przypadku (lub jakąkolwiek nazwę bazy danych, której używasz) ...


4

Jedną z możliwości, o której nie widziałem szeroko dyskutowanej, jest to, że może wystąpić problem z rozpoznaniem nazwy hosta na samym komputerze hosta. Jeśli nie ma wpisu dla $ (nazwa hosta) w / etc / hosts, słuchacz Oracle jest zdezorientowany i nie pojawia się.

Okazało się, że to mój problem, a dodanie nazwy hosta i adresu IP w / etc / hosts rozwiązało problem.



4

Jeśli masz działające połączenie w programie Oracle SQL Developer, użyj informacji z menu połączenia, aby zbudować swój adres URL, jak opisano na poniższej ilustracji:

wprowadź opis obrazu tutaj

W powyższym przykładzie adres URL wyglądałby tak: jdbc:oracle:thin:@ORADEV.myserver.com:1521/myservice

Zwróć uwagę, że jeśli używasz identyfikatora SID, to po nazwie hosta występuje dwukropek („:”) zamiast ukośnika („/”).


2

Ja też stanąłem przed tym samym problemem. Zainstalowałem Oracle Express Edition 10g w systemie operacyjnym Windows XP przy użyciu VMware i działało dobrze. Ponieważ pisanie zapytań SQL w narzędziu SQL dostarczonym przez 10g było bardzo niewygodne i ponieważ byłem przyzwyczajony do pracy z programistą SQL, zainstalowałem programistę SQL w wersji 32-bitowej w XP i próbowałem połączyć się z moim DB SID „XE”. Ale połączenie nie powiodło się z powodu błędu-ORA-12505 odbiornik TNS obecnie nie wie o identyfikatorze SID podanym w deskryptorze połączenia. Byłem na morzu, aby dowiedzieć się, jak pojawił się ten problem, ponieważ działało dobrze z narzędziem SQL, a także utworzyłem kilka mapowań Informatica przy użyciu tego samego. Dużo przeglądałem w tej sprawie i zastosowałem sugestie, które otrzymałem po sprawdzeniu statusu "lsnrctl" na publicznych forach, ale bezskutecznie. Jednak dziś rano ponownie spróbowałem utworzyć nowe połączenie, i Voila, działało bez problemów. Domyślam się po przeczytaniu w kilku postach, że czasami słuchacz nasłuchuje, zanim DB się połączy, czy coś (wybacz mi moje prymitywne odniesienie, ponieważ jestem tu nowicjuszem), ale sugeruję po prostu zrestartować maszynę i sprawdzić ponownie.


2

Miałem ten sam problem, więc aby rozwiązać ten problem, najpierw ponownie skonfigurowałem mój odbiornik za pomocą, netcapo czym usunąłem moją starą bazę danych, która była ORCL, używając, dbcaa następnie ponownie utworzyłem nową bazę danych za pomocądbca


2

Napotkałem ten sam problem i rozwiązałem go, ponownie uruchamiając usługę OracleServiceXE. Przejdź do Services.msc, a następnie sprawdź, czy usługa „OracleServiceXE” działa i działa


2

Rozwiązałem ten problem, zmieniając „ SID ” na „ SERVICE_NAME ” w moim pliku TNSNAMES.ora.

Sprawdź, czy Twoja baza danych pyta o SID lub SERVICE_NAME.

Twoje zdrowie


2

Jeśli używasz Oracle Express Edition, powinieneś mieć ten adres URL

jdbc: oracle: thin: @localhost: 1521: xe lub jdbc: oracle: thin: @localhost: 1521 / XE

Miałem podobny problem z wtyczką konfiguracyjną liquibase w pom.xml. I zmieniłem konfigurację:

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

2

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

Otrzymałem błąd:

java.sql.SQLException: Odbiornik odmówił połączenia z następującym błędem: ORA-12505, TNS: odbiornik nie zna obecnie identyfikatora SID podanego w deskryptorze połączenia Deskryptor połączenia używany przez klienta to: localhost: 1521: xe

Jak to rozwiązałem:

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

(Usuń @)

Nie wiem dlaczego, ale teraz działa ...


1

Sprawdź, wykonując tnsping i nazwę instancji na komputerze hosta. Poda ci opis tns i przez większość czasu nazwa hosta jest inna, co nie pasuje.

Rozwiązuję również mój problem

Na komputerze z systemem Unix $ tnsping (Enter)

Daje mi pełny opis tns, gdzie znalazłem, że nazwa hosta jest inna .. :)


1

Sprawdź oba OracleServiceXEi sprawdź, czy OracleXETNSListenerstatus został uruchomiony podczas nawigacji start->run->services.msc.

W moim przypadku tylko OracleXETNSListenerzostał uruchomiony, ale OracleServiceXEnie został uruchomiony, kiedy zacząłem przez right clicking -> starti sprawdziłem połączenie, czy działa dla mnie


1

Miałem podobny problem w SQL Workbench.

URL:

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

nie działa.

URL:

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

Pracuje.

To pomoże mi w mojej konkretnej sytuacji. Obawiam się, że przy innych rozwiązaniach mogłoby istnieć wiele innych powodów.


0

Miałem podobny problem. Problem zaczął pojawiać się nagle - mamy URL połączenia z bazą danych o zrównoważonym obciążeniu, ale w połączeniach jdbc wskazywałem bezpośrednio na pojedynczą bazę danych.

Zmieniono na zrównoważony adres URL db i zadziałało.


2
Zalecamy użycie w pełni kwalifikowanego adresu URL ciągu połączenia, jak pokazano jdbc: oracle: thin: @ (DESCRIPTION = (ADDRESS = (HOST = myhost) (PORT = 1521) (PROTOCOL = tcp)) (CONNECT_DATA = (SERVICE_NAME = myorcldbservicename)))
Nirmala

0

W moim przypadku nie wyszło, w końcu zrestartowałem mój oracle i słuchacz TNS i wszystko działało. Walczył przez 2 dni.


0

Otrzymałem ten błąd ORA-12505, TNS: słuchacz nie zna obecnie identyfikatora SID podanego w deskryptorze połączenia, gdy próbowałem połączyć się z Oracle DB za pomocą programisty SQL.

Użyty ciąg znaków JDBC to jdbc: oracle: thin: @myserver: 1521 / XE , oczywiście poprawny i dwie obowiązkowe usługi OracleServiceXE, OracleXETNSListener działały .

Sposób, w jaki rozwiązałem ten problem (w systemie 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

Oprócz uruchomionych usług (OracleServiceXE, OracleXETNSListener) istnieje szansa, że ​​oprogramowanie antywirusowe / zapora ogniowa może je nadal blokować. Tylko upewnij się, że nie są zablokowane.wprowadź opis obrazu tutaj



0

Moja wyrocznia przestała działać i otrzymywałem ten błąd. Zrestartowałem komputer i wypróbowałem również powyższe rozwiązania. Ostatecznie otworzyłem usługi składowe i ponownie uruchomiłem usługi Oracle i wszystko zaczęło działać. Mam nadzieję, że to komuś pomoże.


0

Po prostu nieprawidłowo tworzyłem łącze do bazy danych.

Prostą poprawką dla mnie była po prostu zmiana „SID” na 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))
)';

Wymiana pieniędzy

SID=theNameOfTheDatabase

do

SERVICE_NAME=theNameOfTheDatabase 

rozwiązał mój problem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.