ORA-12514 TNS: nasłuchujący obecnie nie wie o żądanej usłudze w deskryptorze połączenia


226

Mamy aplikację działającą lokalnie, w której występuje następujący błąd:

ORA-12514: TNS: nasłuchujący nie zna obecnie usługi żądanej w deskryptorze połączenia

Przetestowałem połączenie przy użyciu TNSPingpoprawnie rozwiązanego i próbowałem SQLPlusnawiązać połączenie, które zakończyło się niepowodzeniem z takim samym błędem jak powyżej. Użyłem tej składni do SQLPlus:

sqlplus username/password@addressname[or host name]

Sprawdziliśmy, że:

  • nasłuchiwanie TNS na serwerze jest uruchomione.
  • Oracle sama na serwerze jest uruchomiona.

Nie znamy żadnych zmian, które zostały wprowadzone w tym środowisku. Coś jeszcze możemy przetestować?


2
jakie było użyte polecenie TNSPing (z parametrami)?
Grzegorz W

kiedy mówisz „działa lokalnie”, masz na myśli, że aplikacja łączy się z bazą danych na tym samym hoście? Jaka jest zawartość twojego pliku sqlnet.ora? jakie wersje są zgłaszane dla sqlplus i tnsping i czy jesteś pewien, że znajdują się w tym samym ORACLE_HOME?
David Aldridge

1
spróbuj zrestartować bazę danych. Ponieważ mają informować nasłuchiwacza o ich istnieniu podczas uruchamiania, może to rozwiązać problem.
Jens Schauder

1
ALTER SYSTEM REJESTRACJA jest mniej drastyczny niż restart bazy danych.
DCookie

Odpowiedzi:


209

Miałem ten problem i poprawka polegała na upewnieniu się, że w tnsnames.orabazie danych SERVICE_NAMEznajduje się poprawna nazwa usługi. Aby znaleźć prawidłowe nazwy usług, możesz użyć następującego zapytania w Oracle:

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

Po zaktualizowaniu tnsnames.orado:

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

potem pobiegłem:

sqlplus user@TEST

Sukces! Słuchacz mówi w zasadzie, że jakakolwiek nazwa usługi nie jest prawidłową usługą według DB.

(* Uruchomiłem sqlplus ze stacji roboczej klienta Win7 do zdalnej bazy danych i obwiniam DBA;) *)



198
Jak mam zapytać DB, jeśli nawet nie mogę się z nim połączyć?
isabelle martz

2
Czy możesz ssh bezpośrednio do serwera DB i stamtąd uruchomić sqlplus?
Brad Rippe,

1
może się tak nie zdarzyć, gdy wielu klientów / serwerów jest zainstalowanych lub kiedyś było zainstalowanych na tym samym komputerze. (tnsping wyświetla lokalizację katalogu, z którego korzysta) - w moim przypadku listener.ora w tym katalogu zawierał informacje dotyczące starej instancji bazy danych, którą odinstalowałem - szybkim i brudnym sposobem było skopiowanie całej zawartości listener.ora z moja bieżąca instalacja Oracle Express do tego innego katalogu, który słuchacz wydaje się sprawdzać (myślę, że zmieniłem go przez rejestr lub coś, i ma on pierwszeństwo przed ORACLE_HOME (?))
hello_earth

8
ORA-00942: tabela lub widok nie istnieje
Tommy Holman

44

Wiem, że to stare pytanie, ale wciąż bez odpowiedzi. Zajęło mi to dzień badań, ale znalazłem najprostsze rozwiązanie, przynajmniej w moim przypadku (Oracle 11.2 w systemie Windows 2008 R2) i chciałem się nim podzielić.

Błąd, jeśli spojrzeć bezpośrednio, wskazuje, że detektor nie rozpoznaje nazwy usługi. Ale gdzie przechowuje nazwy usług? W%ORACLE_HOME%\NETWORK\ADMIN\listener.ora

„SID_LIST” to po prostu lista identyfikatorów SID i nazw usług sparowanych w formacie, który można skopiować lub wyszukać.

Dodałem problem Nazwa usługi, a następnie w panelu sterowania „Usługi” systemu Windows wykonałem „Uruchom ponownie” w usłudze nasłuchiwania Oracle. Teraz wszystko jest dobrze.


Na przykład plik listener.ora może początkowo wyglądać następująco:

# 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))
    )
  )

... Aby rozpoznawać nazwę usługi orcl, możesz zmienić ją na:

# 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))
    )
  )

3
Musisz zaktualizować tę odpowiedź, używając składni sposobu listener.oraprzechowywania nazw. Nie mam nawet listener.orapliku. Jestem także na klienckiej stacji roboczej z programem SQL Developer i próbuję utworzyć łącze do bazy danych, gdy pojawi się błąd. Nie mam usługi Oracle Listener do ponownego uruchomienia.
vapcguy 28.04.17

vapcguy, musisz być na serwerze bazy danych. wygląda na to, że jesteś na kliencie
Joseph Argenio

Po wykonaniu instrukcji Sepideh dotyczących Net Managera zauważyłem, że mój plik listeners.ora został zaktualizowany i zawiera nowy wpis SID_LIST. Zredagowałem tę odpowiedź, aby uwzględnić przykład składni przed i po, z korzyścią dla czytelników, którzy z jakiegokolwiek powodu nie mogą korzystać z Net Managera.
Kevin,

12

Miałem ten problem na Windows Server 2008 R2 i Oracle 11g

przejdź do Net Manager> Listener> wybierz usługi bazy danych z pola kombi> „Globalna nazwa bazy danych” musi być taka sama jak „SID” i „Oracle Home Directory” musi być poprawna.

Jeśli nie masz żadnego wpisu dotyczącego usług bazodanowych, utwórz go i ustaw poprawną globalną bazę danych sidoraz oracle home.


12

W moich okolicznościach błąd był spowodowany faktem, że słuchacz nie zarejestrował usługi db. Rozwiązałem to, rejestrując usługi. Przykład:

Mój deskryptor w tnsnames.ora:

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

Tak więc przystępuję do listener.oraręcznej rejestracji usługi :

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

Na koniec uruchom ponownie nasłuchiwanie za pomocą polecenia:

> lsnrctl stop
> lsnrctl start

Gotowe!


8

Uruchomienie OracleServiceXXX z services.msc działało dla mnie w systemie Windows.


W systemie Windows, jeśli używasz Oracle Release 12.x, upewnij się, że usługa OracleServiceORCL jest uruchomiona. Jeśli ta usługa nie zostanie uruchomiona, otrzymasz również ten sam kod błędu.
jastrząb uliczny

5

To naprawdę powinien być komentarz do odpowiedzi Brada Rippe'a , ale niestety, za mało przedstawicieli. Ta odpowiedź zapewniła mi 90% drogi. W moim przypadku instalacja i konfiguracja baz danych umieściły wpisy w pliku tnsnames.ora dla baz danych, które uruchomiłem. Po pierwsze, udało mi się połączyć z bazą danych, ustawiając zmienne środowiskowe (Windows):

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

a następnie połączenie za pomocą

sqlplus / as sysdba

Następnie uruchom polecenie z odpowiedzi Brada Rippe'a:

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

pokazał, że nazwy nie pasują dokładnie. Wpisy utworzone za pomocą Asystenta konfiguracji bazy danych Oracle, w których pierwotnie:

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

Nazwa usługi z zapytania była po prostu mydatabasezamiast mydatabase.mydomain.com. Edytowałem plik tnsnames.ora tylko do nazwy podstawowej bez części domeny, więc wyglądały tak:

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

Zrestartowałem usługę nasłuchiwania TNS (często używam lsnrctl stopi lsnrctl startz okna poleceń administratora [lub Windows Powershell] zamiast z panelu sterowania usług, ale oba działają.) Potem mogłem się połączyć.


4

Miałem ten sam problem. Dla mnie tylko pisanie

sqlplus myusername/mypassword@localhost

wykonał lewę, dzięki czemu łączę się z domyślną nazwą usługi, tak myślę.


1
Wystąpił podobny problem z naszym ciągiem połączenia, który spowodował ten błąd. Byliśmy podłączenia przy użyciu Oracle JDBC cienką kierowcy ciągu połączenia: jdbc:oracle:thin:@//localhost:1521/orcl. Ciąg połączenia skorygowane w celu wyeliminowania tego błędu było: jdbc:oracle:thin:@localhost:1521.
dan

zależy to, czy to zadziała - myślę, że ten sposób łączenia, oceniając to, co powiedzieli inni, całkowicie omija słuchacza, używając nazwy hosta komputera zamiast SID - ten sposób łączenia powoduje problemy u klientów zewnętrznych, - myślę działa również tylko wtedy, gdy EZCONNECT jest określony w sqlnet.ora: NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
hello_earth

3

to, co zadziałało, było naprawdę proste, wystarczyło zainicjować usługę ręcznie w „Usługach systemu Windows” (services.msc w cmd trompt). moja nazwa usługi to: OracleServiceXXXXX.


W moim przypadku, mimo że Typ uruchomienia jest ustawiony na Automatyczny, nie uruchamia się po uruchomieniu komputera. Po ręcznym uruchomieniu usługi „OracleServiceXE” działa dla Oracle Database 11g Express połączenie z bazą danych DB i APEX (Oracle Application Express).
Ivan Chau

2

Sprawdź, czy baza danych jest uruchomiona. Zaloguj się do serwera, ustaw zmienną środowiskową ORACLE_SID na SID bazy danych i uruchom SQL * Plus jako połączenie lokalne.


To był dokładnie mój problem. Nasza baza danych jest hostowana na maszynie wirtualnej, która była wyłączona, gdy próbowałem użyć innego programu, który korzystał z DP. Po obejrzeniu tego wątku zdałem sobie sprawę, że prawdopodobnie był uszkodzony.
Sh4d0wsPlyr

2

Ten błąd może wystąpić, gdy aplikacja nawiąże nowe połączenie dla każdej interakcji z bazą danych lub połączenia nie zostaną poprawnie zamknięte. Jednym z bezpłatnych narzędzi do monitorowania i potwierdzania tego jest programista Oracle Sql (chociaż nie jest to jedyne narzędzie, którego można używać do monitorowania sesji DB).

możesz pobrać narzędzie ze strony Oracle Sql Developer

Oto zrzut ekranu, jak monitorować twoje sesje. (jeśli widzisz, że podczas sesji pojawia się wiele sesji użytkownika aplikacji, gdy widzisz błąd ORA-12514, oznacza to, że możesz mieć problem z pulą połączeń).

wprowadź opis zdjęcia tutaj


2

Rozwiązałem ten problem w moim środowisku Linuksa, aktualizując adres IP mojego komputera w pliku / etc / hosts.

Możesz zweryfikować adres IP swojej sieci (koniec inet.) Za pomocą:

$ifconfig

Sprawdź, czy Twój adres IP pasuje do pliku / etc / hosts:

$cat /etc/hosts

Zmodyfikuj plik / etc / hosts, jeśli jest potrzebny:

$sudo gedit /etc/hosts

PA.


2
jest to stare, ale dodanie adresu IP do / etc / hosts nie ma większego sensu. OP brakuje SERVICE_NAME, inne rzeczy są zupełnie niezwiązane
Ostap

Nie dodałem mojego adresu IP do / etc / host. Właśnie to poprawiłem. Jak widać w tym temacie, istnieje wiele prawidłowych (z pozytywnym wynikiem) odpowiedzi i odmian, aby rozwiązać to pytanie. Jeśli ta odpowiedź ci nie pomogła, dlaczego głosować? Ta odpowiedź może nadal komuś pomóc, ponieważ pomogła mi.
Sergio MC Figueiredo

2

Dla tych, którzy mogą uruchamiać Oracle na maszynie wirtualnej (jak ja), zauważyłem ten problem, ponieważ w mojej maszynie wirtualnej zabrakło pamięci, co prawdopodobnie uniemożliwiło prawidłowe uruchomienie / uruchomienie OracleDB. Zwiększenie pamięci VM i ponowne uruchomienie rozwiązało problem.


2

Tutaj jest wiele odpowiedzi, ale oto działający przykład z kodem, który można skopiować, wkleić i przetestować natychmiast:

Dla mnie błąd 12514 został rozwiązany po określeniu poprawnej usługi SERVICE_NAME. Znajdziesz go na serwerze w pliku, tnsnames.oraktóry zawiera 3 predefiniowane nazwy usług (jedną z nich jest „XE”).

  1. Zainstalowałem bazę danych Oracle Express OracleXE112, która już zawiera niektóre preinstalowane tabele demonstracyjne.
  2. Po uruchomieniu instalatora pojawi się monit o hasło. Jako hasło wpisałem „xxx”. (nie używany w produkcji)
  3. Mój serwer działa na komputerze 192.168.1.158
  4. Na serwerze musisz jawnie zezwolić na dostęp do procesu TNSLSNR.exe w Zaporze systemu Windows. Ten proces nasłuchuje na porcie 1521.
  5. OPCJA A: W przypadku C # (.NET2 lub .NET4) możesz pobrać ODAC11 , z którego musisz dodać Oracle.DataAccess.dll do swojego projektu. Dodatkowo ta biblioteka DLL zależy od: OraOps11w.dll, oci.dll, oraociei11.dll (130 MB!), Msvcr80.dll. Te DLL musi być w tym samym katalogu co plik EXE lub trzeba podać ścieżkę DLL w: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. Na maszynach 64-bitowych pisz dodatkowo doHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPCJA B: Jeśli pobrałeś ODAC12 , potrzebujesz Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160 MB!), Oraons.dll, msvcr100.dll. Ścieżka rejestru toHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. OPCJA C: Jeśli nie chcesz dużych bibliotek DLL o rozmiarze większym niż 100 MB, pobierz ODP.NET_Managed12.xxxxxxxx.zip, w którym znajdzieszOracle.ManagedDataAccess.dll tylko 4 MB i jest to czysta zarządzana biblioteka DLL działająca w procesach 32-bitowych i 64-bitowych i zależy od żadnej innej biblioteki DLL i nie wymaga żadnych wpisów rejestru.
  8. Poniższy kod C # działa dla mnie bez konfiguracji po stronie serwera (tylko domyślna instalacja):
using Oracle.DataAccess.Client;
lub
using Oracle.ManagedDataAccess.Client;

…

string oradb = "Źródło danych = (DESCRIPTION ="
    + „(ADRES_LISTY = (ADRES = (PROTOKÓŁ = TCP) (HOST = 192.168.1.158) (PORT = 1521))”
    + ”(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)));”
    + „Identyfikator użytkownika = SYSTEM; Hasło = xxx;”;

using (OracleConnection conn = new OracleConnection (oradb)) 
{
    conn.Open ();
    using (OracleCommand cmd = new OracleCommand ())
    {
        cmd.Connection = conn;
        cmd.CommandText = "wybierz TABLESPACE_NAME z DBA_DATA_FILES";

        using (OracleDataReader dr = cmd.ExecuteReader ())
        {
            while (dr.Read ())
            {
                listBox.Items.Add (dr [„TABLESPACE_NAME”]);
            }
        }
    }
}

Jeśli SERVICE_NAME=XEjest źle, pojawia się błąd 12514. Jest SERVICE_NAMEto opcjonalne. Możesz też to zostawić.


Bardzo dziękuję, z twojego rozwiązania znalazłem lewę, w moim przypadku to program antywirusowy blokował program, dlatego nie był w stanie uzyskać połączenia z bazą danych Oracle.
robot_alien

2

Miałem również ten sam problem i spędziłem 3 dni, aby go wykopać.

Dzieje się tak z powodu nieprawidłowego wpisu usługi TNS.

Najpierw sprawdź, czy możesz połączyć się z rezerwową bazą danych z podstawowej bazy danych za pomocą sql> sqlplus sys@orastand as sysdba( orastandjest rezerwową bazą danych).

Jeśli nie możesz się połączyć, jest to problem z usługą. Popraw wpis nazwy usługi w pliku TNS na głównym końcu.

Sprawdź rezerwową bazę danych w ten sam sposób. W razie potrzeby wprowadź również zmiany tutaj.

Upewnij się, że log_archive_dest_2parametr ma poprawną nazwę usługi.


1

Wystąpił ten sam błąd, ponieważ podany zdalny identyfikator SID był nieprawidłowy:

 > sqlplus $DATASOURCE_USERNAME/$DATASOURCE_PASSWORD@$DB_SERVER_URL/$REMOTE_SID 

Zapytałem o bazę danych systemu:

wybierz * z global_name;

i znalazłem mój zdalny SID („XE”).

Wtedy mógłbym połączyć się bez problemu.


0

W moim przypadku w bazie danych zabrakło miejsca na dysku. Co spowodowało, że nie zareagował. Po wyjaśnieniu tego problemu wszystko znów działało.


Jak mogę się tego dowiedzieć?
CodeSlave

0

Dla mnie było to spowodowane użyciem dynamicznego iPada podczas instalacji. Ponownie zainstalowałem Oracle za pomocą statycznego ipadress, a potem wszystko było w porządku



0

Mój problem został rozwiązany przez zastąpienie „SID” w adresie URL „nazwą usługi” i poprawnym hostem.


0

tnslsnr jest włączony, ale baza danych nie działa.

Dla początkujących Oracle nie jest oczywiste, że baza danych może nie działać, a połączenia są akceptowane.

Musiałem ręcznie uruchomić bazę danych w ten sposób

su - oracle
export ORACLE_SID=XE
sqlplus sys as sysdba

A potem w konsoli SQL

startup

W moim przypadku nie udało mi się uruchomić, ale dostałem inny komunikat o błędzie i znalazłem źródło problemu - musiałem zmienić nazwę hosta, a następnie automatyczne uruchomienie bazy danych znów działało.


0

W celu rozwiązania tego problemu wdrożyłem poniższe obejście.

  1. Ustawiłem ORACLE_HOME za pomocą wiersza polecenia (kliknij prawym przyciskiem myszy cmd.exe i uruchom jako administrator systemu).

  2. Używane poniżej polecenia

    set oracle_home="path to the oracle home"

  3. Przejdź do Wszystkie programy -> Oracle -ora home1 -> Narzędzia do migracji konfiguracji -> Net Manager -> Słuchacz

  4. Wybierz Usługi baz danych z menu rozwijanego. Zarówno nazwa globalnej bazy danych, jak i identyfikator SID są ustawione na takie same (w moim przypadku ORCL). Ustaw katalog domowy Oracle.

Przykład okna Oracle Net Manager z dokumentacji Oracle: Przykład Oracle Net Manager

  1. Kliknij Plik i zapisz konfigurację sieci.

0

Problem polegał na tym, że mój adres URL ciągu połączenia zawierał nazwę bazy danych zamiast identyfikatora SID. Zastąpienie nazwy bazy danych identyfikatorem SID połączenia z bazą danych Oracle rozwiązało ten problem.

Aby poznać SID swojego wyroczni, możesz przejrzeć tnsnames.oraplik.

XE był faktycznym identyfikatorem SID, więc tak wygląda teraz mój ciąg połączenia tomcat:

    <Resource
       name="jdbc/my_db_conn"
       auth="Container"
       type="javax.sql.DataSource"
       driverClassName="oracle.jdbc.driver.OracleDriver"
       url="jdbc:oracle:thin:@//127.0.0.1:1521/XE"
       username="test_user"
       password="test" />

Moja wersja serwera to „Oracle 11.2 Express”, ale rozwiązanie powinno działać również na innych wersjach.


0

W moim przypadku brakowało okrągłych nawiasów wokół usługi SERVICE_NAME w pliku tnsnames.ora .

<DBNAME> =
  (DESCRIPTION =
    (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL=TCP)(HOST = nupark-cnvr-ora )(PORT=1521))
    )
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = <DBNAME> ***CLOSING ROUND BRACKET WAS MISSING HERE***
    )
  )

LISTENER_<DBNAME> =

  (ADDRESS = (PROTOCOL = TCP)(HOST = nupark-cnvr-ora)(PORT = 1521))

0

Dla tych, którzy używają spring-boot i jdbc do połączenia. Musisz zachować ostrożność pisząc jdbcUrl w application.properties

Z SID w połączeniu z bazą danych - source.datasource.jdbcUrl = jdbc:oracle:thin:@[HOST][:PORT]:SID

Z nazwą usługi w połączeniu db globe.datasource.jdbcUrl = jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE

To zadziałało dla mnie :)

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.