it-swarm.com.de

ORA-12514 TNS: Der Listener kennt den im Verbindungsdeskriptor angeforderten Dienst derzeit nicht

Es wird eine Anwendung lokal ausgeführt, bei der der folgende Fehler auftritt:

ORA-12514: TNS: Listener kennt den im Verbindungsdeskriptor angeforderten Dienst derzeit nicht

Ich habe die Verbindung mit TNSPing getestet, die korrekt aufgelöst wurde, und ich habe versucht, SQLPlus eine Verbindung herzustellen, was mit demselben Fehler wie oben fehlgeschlagen ist. Ich habe diese Syntax für SQLPlus verwendet:

sqlplus username/[email protected][or Host name]

Wir haben überprüft, dass:

  • der TNS-Listener auf dem Server wird ausgeführt.
  • Oracle selbst auf dem Server läuft.

Wir kennen keine Änderungen, die an dieser Umgebung vorgenommen wurden. Können wir noch etwas testen?

196
Jacques

Ich hatte dieses Problem und der Fix bestand darin, sicherzustellen, dass in tnsnames.ora der SERVICE_NAME ein gültiger Dienstname in Ihrer Datenbank ist. Um gültige Servicenamen zu ermitteln, können Sie in Oracle die folgende Abfrage verwenden:

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

Sobald ich tnsnames.ora aktualisiert habe, um:

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

dann rannte ich:

sqlplus [email protected]

Erfolg! Der Listener teilt Ihnen im Grunde mit, dass der von Ihnen verwendete Dienstname kein gültiger Dienst gemäß der Datenbank ist.

(* Ich habe sqlplus von der Win7-Client-Workstation zur entfernten Datenbank ausgeführt und die DBAs beschuldigt;) *)

186
Brad Rippe

Ich weiß, das ist eine alte Frage, aber immer noch unbeantwortet. Ich habe einen Tag lang nachgeforscht, aber zumindest in meinem Fall (Oracle 11.2 unter Windows 2008 R2) habe ich die einfachste Lösung gefunden und wollte sie weitergeben.

Der Fehler zeigt bei direkter Betrachtung an, dass der Listener den Dienstnamen nicht erkennt. Aber wo werden die Dienstnamen aufbewahrt? In %Oracle_HOME%\NETWORK\ADMIN\listener.ora

Die "SID_LIST" ist eine Liste von SIDs und Dienstnamen, die in einem Format gepaart sind, das Sie kopieren oder nachschlagen können.

Ich habe das Problem Dienstname hinzugefügt und dann in der Windows-Systemsteuerung "Dienste" einen "Neustart" für den Oracle-Listener-Dienst durchgeführt. Jetzt ist alles gut.


Zum Beispiel könnte Ihre listener.ora-Datei anfangs so aussehen:

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

... und um einen Dienstnamen von orcl zu erkennen, können Sie ihn ändern in:

# 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))
    )
  )
35
Joseph Argenio

Ich hatte dieses Problem bei Windows Server 2008 R2 und Oracle 11g

gehen Sie zu Net Manager> Listener und wählen Sie die Datenbankdienste aus.> "Global Database Name" muss mit "SID" identisch sein und "Oracle Home Directory" muss korrekt sein.

Wenn Sie keinen Eintrag für Datenbankdienste haben, erstellen Sie einen und legen Sie die richtige globale Datenbank, sid und Oracle home fest.

12
Sepideh

Unter meinen Umständen lag der Fehler daran, dass der Hörer den Dienst der Datenbank nicht registriert hatte. Ich habe dies durch die Registrierung der Dienste gelöst. Beispiel:

Mein Deskriptor in tnsnames.ora:

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

Also registriere ich den Dienst manuell im listener.ora:

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

Starten Sie abschließend den Listener per Befehl neu:

> lsnrctl stop
> lsnrctl start

Getan!

8
manix

Das Starten von OracleServiceXE über services.msc hat bei mir unter Windows funktioniert.

7

Dies sollte wirklich ein Kommentar zu Brad Rippe s Antwort sein, aber leider nicht genug Vertreter. Diese Antwort brachte mich zu 90% dorthin. In meinem Fall hat die Installation und Konfiguration der Datenbanken Einträge in die Datei tnsnames.ora für die Datenbanken eingefügt, die ich ausgeführt habe. Zuerst konnte ich durch Setzen der Umgebungsvariablen (Windows) eine Verbindung zur Datenbank herstellen:

set Oracle_SID=mydatabase
set Oracle_HOME=C:\Oracle\product\11.2.0\dbhome_1

und dann verbinden mit

sqlplus / as sysdba

Führen Sie als Nächstes den Befehl von Brad Rippes Antwort aus:

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

zeigten, dass die Namen nicht genau übereinstimmten. Die Einträge, die mit Oracle Database Configuration Assistant erstellt wurden, lauten ursprünglich:

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

Der Servicename aus der Abfrage war nur mydatabase und nicht mydatabase.mydomain.com. Ich habe die Datei tnsnames.ora so bearbeitet, dass sie nur den Basisnamen ohne den Domain-Teil enthält.

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

Ich habe den TNS Listener-Dienst neu gestartet (ich verwende häufig lsnrctl stop und lsnrctl start über ein Administrator-Befehlsfenster [oder Windows Powershell] anstelle der Systemsteuerung "Dienste", aber beide funktionieren.) Danach konnte ich verbinden.

4
Capricorn1

was für mich wirklich einfach war, musste ich nur den Dienst manuell in den "Windows-Diensten" (services.msc in cmd trompt) initiieren. Mein Servicename ist: OracleServiceXXXXX.

2
isabelle martz

ich hatte auch das gleiche Problem und verbrachte 3 Tage, um es auszugraben. Dies liegt an Ihrem falschen TNS-Diensteintrag. Überprüfen Sie zunächst, ob Sie mit sql> sqlplus sys @ orastand als sysdba eine Verbindung zur Standby-Datenbank herstellen können. Wenn Sie keine Verbindung herstellen können, liegt ein Problem mit dem Dienst vor. Korrigieren Sie die Eingabe des Dienstnamens in der TNS-Datei am primären Ende. Überprüfen Sie auf die gleiche Weise in der Standby-Datenbank, falls erforderlich, nehmen Sie die Änderungen auch hier vor. und Stellen Sie sicher, dass der Parmater log_archive_dest_2 den richtigen Servicenamen hat.

2
user3778101

Ich hatte das gleiche Problem, für mich nur schriftlich

sqlplus myusername/[email protected]

habe den Trick gemacht, damit wird eine Verbindung mit dem Standarddienstnamen hergestellt, denke ich.

2
Breeze

Dieser Fehler kann auftreten, wenn eine Anwendung für jede Datenbankinteraktion eine neue Verbindung herstellt oder die Verbindungen nicht ordnungsgemäß geschlossen werden. Eines der kostenlosen Tools zur Überwachung und Bestätigung ist Oracle SQL Developer (obwohl dies nicht das einzige Tool ist, mit dem Sie DB-Sitzungen überwachen können).

sie können das Tool von der Oracle-Website herunterladen SQL Developer

hier ist ein Screenshot, wie Sie Ihre Sitzungen überwachen können. (Wenn sich während der Anzeige des ORA-12514-Fehlers viele Sitzungen für Ihren Anwendungsbenutzer häufen, ist dies ein guter Hinweis darauf, dass möglicherweise ein Problem mit dem Verbindungspool vorliegt.).

enter image description here

2
grepit

Ich habe dieses Problem in meiner Linux-Umgebung behoben, indem ich die IP-Adresse meines Computers in der Datei/etc/hosts aktualisiert habe.

Sie können Ihre Netzwerk-IP (inet end.) Überprüfen mit:

$ifconfig

Überprüfen Sie, ob Ihre IP-Adresse mit der Datei/etc/hosts übereinstimmt:

$cat /etc/hosts

Bearbeiten Sie die Datei/etc/hosts, falls erforderlich:

$Sudo gedit /etc/hosts

Tschüss.

Für diejenigen, die Oracle möglicherweise in einem VM ausführen (wie ich), habe ich dieses Problem festgestellt, weil in meinem VM nicht genügend Arbeitsspeicher vorhanden war, was den Start/die Ausführung von OracleDB anscheinend verhindert hat korrekt. Das Problem wurde behoben, indem ich meinen VM -Speicher vergrößerte und neu startete.

2
th3uiguy

Viele Antworten hier, aber hier ist ein funktionierendes Beispiel mit Code, den Sie kopieren, einfügen und sofort testen können:

Bei mir wurde der Fehler 12514 nach Angabe des korrekten SERVICE_NAME behoben. Sie finden dies auf dem Server in der Datei tnsnames.ora, die drei vordefinierte Dienstnamen enthält (einer davon ist "XE").

  1. Ich habe die Oracle Express-Datenbank OracleXE112 installiert, die bereits einige vorinstallierte Demo-Tabellen enthält.
  2. Wenn Sie das Installationsprogramm starten, werden Sie nach einem Kennwort gefragt. Ich habe "xxx" als Passwort eingegeben. (nicht in der Produktion verwendet)
  3. Mein Server läuft auf der Maschine 192.168.1.158
  4. Auf dem Server müssen Sie den Zugriff für den Prozess TNSLSNR.exe in der Windows-Firewall explizit zulassen. Dieser Prozess überwacht Port 1521.
  5. OPTION A: Für C # (.NET2 oder .NET4) können Sie ODAC11 herunterladen, von dem Sie Oracle.DataAccess.dll zu Ihrem Projekt hinzufügen müssen. Darüber hinaus ist dieses DLL abhängig von: OraOps11w.dll, oci.dll, oraociei11.dll (130 MB!), Msvcr80.dll. Diese DLLs müssen sich im selben Verzeichnis wie die EXE befinden, oder Sie müssen den DLL -Pfad in: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath angeben. Auf 64-Bit-Maschinen schreiben Sie zusätzlich zu HKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPTION B: Wenn Sie ODAC12 heruntergeladen haben, benötigen Sie Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (160 MB!), Oraons.dll, msvcr100.dll. Der Registrierungspfad lautet HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. OPTION C: Wenn Sie keine riesigen DLLs mit mehr als 100 MB möchten, sollten Sie ODP.NET_Managed12.xxxxxxxx.Zip herunterladen, in dem Sie Oracle.ManagedDataAccess.dll finden, das nur 4 MB groß ist Ein reines verwaltetes DLL, das auch in 32-Bit- und 64-Bit-Prozessen funktioniert und von keinem anderen DLL abhängt und keine Registrierungseinträge erfordert.
  8. Der folgende C # -Code funktioniert bei mir ohne serverseitige Konfiguration (nur die Standardinstallation):
 mit Oracle.DataAccess.Client; 
 oder 
 mit Oracle.ManagedDataAccess.Client; 
 
 .... 
 
 string oradb = "Datenquelle = (DESCRIPTION =" 
 + "(ADDRESS_LIST = (ADDRESS = (PROTOKOLL = TCP) (Host = 192.168.1.158) (PORT = 1521))" 
 + "(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE));" 
 + "Benutzer-ID = SYSTEM; Passwort = xxx;"; 
 
 using (OracleConnection conn = new OracleConnection (oradb)) 
 {
 conn.Open (); 
 using (OracleCommand cmd = new OracleCommand ()) 
 {
 cmd.Connection = conn; 
 cmd.CommandText = "select TABLESPACE_NAME from DBA_DATA_FILES"; 
 
 using (OracleDataReader dr = cmd.ExecuteReader ()) 
 {
 while (dr.Read ()) 
 {
 listBox.Items.Add (dr ["TABLESPACE_NAME"]); 
} 
} 
} 
}

Wenn der SERVICE_NAME=XE falsch ist, wird der Fehler 12514 angezeigt. Der SERVICE_NAME ist optional. Sie können es auch weglassen.

2
Elmue

Überprüfen Sie, ob die Datenbank aktiv ist. Melden Sie sich am Server an, setzen Sie die Umgebungsvariable Oracle_SID auf Ihre Datenbank-SID und führen Sie SQL * Plus als lokale Verbindung aus.

2
DCookie

Ich habe den gleichen Fehler erhalten, weil die angegebene Remote-SID falsch war:

 > sqlplus $DATASOURCE_USERNAME/[email protected]$DB_SERVER_URL/$REMOTE_SID 

Ich habe die Systemdatenbank abgefragt:

wählen Sie * aus global_name;

und fand meine Remote-SID ("XE").

Dann konnte ich mich problemlos verbinden.

1
Laura Liparulo

In meinem Fall war der Datenbank der Speicherplatz ausgegangen. Was dazu führte, dass es nicht reagierte. Nachdem ich dieses Problem behoben hatte, funktionierte alles wieder.

1
Pete Brumm

Mein Problem wurde behoben, indem die 'ID' in der URL durch 'Dienstname' und den richtigen Host ersetzt wurde.

0
Sir. Hedgehog

Für mich wurde dies durch die Verwendung einer dynamischen IP-Adresse bei der Installation verursacht. Ich habe Oracle mit einer statischen IP-Adresse installiert und dann war alles in Ordnung

0
Steef

Der Neustart von VM hat bei mir funktioniert

0
wishman