[Oracle] ORA-12514 TNS: Listener kennt derzeit keinen Dienst, der im Verbindungsdeskriptor angefordert wurde


Answers

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

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

Sobald ich tnsnames.ora aktualisiert tnsnames.ora zu:

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

dann lief ich:

sqlplus user@TEST

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

(* Ich habe sqlplus von der Win7-Client-Workstation zur entfernten DB laufen lassen und die DBAs dafür verantwortlich gemacht;) *)

Question

Wir haben eine lokal ausgeführte Anwendung, bei der der folgende Fehler auftritt:

ORA-12514: TNS: Listener kennt derzeit keinen Dienst, der im Verbindungsdeskriptor angefordert wurde

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

sqlplus username/password@addressname[or host name]

Wir haben bestätigt, dass:

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

Änderungen, die an dieser Umgebung vorgenommen wurden, sind uns nicht bekannt. Können wir noch etwas testen?




Ich hatte auch das gleiche Problem und verbrachte 3 Tage um es auszugraben. Dies geschieht aufgrund eines falschen TNS-Diensteintrags. Überprüfen Sie zuerst, ob Sie eine Verbindung zur Standby-Datenbank von der Primärdatenbank aus herstellen können, indem Sie sql> sqlplus sys @ orstand als sysdba verwenden (orstand ist eine Standby-Datenbank). Wenn Sie keine Verbindung herstellen können, handelt es sich um ein Problem mit dem Dienst. Korrigieren Sie die Eingabe des Servicenamens in der TNS-Datei am primären Ende. Überprüfen Sie den gleichen Weg in der Standby-Datenbank, wenn Sie die Änderungen auch hier vornehmen müssen. und stellen Sie sicher, dass der Parameter log_archive_dest_2 parameter den richtigen Dienstnamen hat.




Für mich wurde dies durch Verwendung einer dynamischen ipadress durch Installation verursacht. Ich habe Oracle mit einer statischen IPadress neu installiert und dann war alles in Ordnung




Das sollte wirklich ein Kommentar zu Antwort sein, aber ach, nicht genug Rep. Diese Antwort hat mich 90% des Weges dorthin gebracht. In meinem Fall werden bei der Installation und Konfiguration der Datenbanken Einträge in die Datei tnsnames.ora für die Datenbanken eingefügt, die ich gerade ausgeführt habe. Zuerst konnte ich eine Verbindung zur Datenbank herstellen, indem ich die Umgebungsvariablen (Windows) einstellte:

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

und dann verbinden mit

sqlplus / as sysdba

Als nächstes führen Sie den Befehl aus Brad Rippes Antwort aus:

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

zeigte, dass die Namen nicht genau übereinstimmten. Die Einträge, die mit dem Datenbankkonfigurationsassistenten von Oracle erstellt wurden, waren ursprünglich:

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

Der mydatabase aus der Abfrage war nur mydatabase und nicht mydatabase.mydomain.com . Ich habe die tnsnames.ora-Datei nur auf den Basisnamen ohne den Domain-Teil bearbeitet, so dass sie folgendermaßen aussahen:

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 oft lsnrctl stop und lsnrctl start von einem Administrator-Befehlsfenster [oder Windows Powershell] anstelle des lsnrctl start , aber beide funktionieren.) Danach konnte ich eine Verbindung herstellen.




In meinem Fall hatte die Datenbank keinen Speicherplatz mehr. Was dazu führte, dass es nicht reagierte. Sobald ich dieses Thema aufgeklärt hatte, funktionierte alles wieder.




Ich hatte das gleiche Problem, für mich nur zu schreiben

sqlplus myusername/mypassword@localhost

hat den Trick gemacht, so macht es eine Verbindung mit dem Standard-Service-Namen, denke ich.




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

Gehen Sie zu Net Manager> Listener> wählen Sie Datenbankdienste aus der Combox> "Global Database Name" muss identisch sein mit "SID" 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 fest, sid und oracle home.




Ich habe unten gearbeitet, um dieses Problem zu beheben.

  1. Ich habe die oracle_home in cmd-Eingabeaufforderung (Rechtsklick auf cmd.exe Als Systemadministrator ausführen) festgelegt. verwendet unter Befehl

    set oracle_home = "Pfad zum Orakelhaus"

Ich hatte Oracle in meinem D: Laufwerk installiert.

  1. Und gehen Sie zu Alle Programme -> Oracle -ora home1 -> Konfigurationsmigrationstools Net Manager -> Listener -> wählen Sie Database Services aus Dropdown -> Name der globalen Datenbank und SID sind beide gleich gesetzt, in meinem Fall ist es ORCL, legen Sie das Verzeichnis oracle_home fest. Klicken Sie auf Datei und speichern Sie die Netzwerkkonfiguration.



Ich habe dieses Problem in meiner Linux-Umgebung gelöst, indem ich die IP meines Rechners in der Datei / etc / hosts aktualisiert habe.

Sie können Ihre Netzwerk-IP (inet end.) Mit:

$ifconfig

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

$cat /etc/hosts

Editiere deine / etc / hosts Datei, falls du sie brauchst:

$sudo gedit /etc/hosts

Tschüss.




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

Bei mir wurde der Fehler 12514 nach Angabe des richtigen SERVICE_NAME behoben. Sie finden dies auf dem Server in der Datei tnsnames.ora die mit 3 vordefinierten Service-Namen (einer davon ist "XE") kommt.

  1. Ich habe die Oracle Express-Datenbank OracleXE112 installiert, die bereits einige vorinstallierte Demotabellen enthält.
  2. Wenn Sie das Installationsprogramm starten, werden Sie nach einem Passwort gefragt. Ich habe "xxx" als Passwort eingegeben. (nicht in der Produktion verwendet)
  3. Mein Server läuft auf dem Rechner 192.168.1.158
  4. Auf dem Server müssen Sie ausdrücklich den Zugriff auf den Prozess TNSLSNR.exe in der Windows-Firewall erlauben. 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. Außerdem hängt diese DLL ab von: OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), Msvcr80.dll. Diese DLLs müssen sich im selben Verzeichnis wie die EXE befinden oder Sie müssen den DLL-Pfad in folgendem Pfad angeben: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath . 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 (160MB!), 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 großen DLLs von mehr als 100 MB wünschen, sollten Sie Oracle.ManagedDataAccess.dll herunterladen, in dem Sie Oracle.ManagedDataAccess.dll finden, das nur 4 MB ist und eine reine gemanagte DLL ist, die in 32 arbeitet Bit und 64-Bit-Prozesse auch und hängt von keiner anderen DLL ab und erfordert keine Registrierungseinträge.
  8. Der folgende C # -Code funktioniert für mich ohne jegliche Konfiguration auf der Serverseite (nur die Standardinstallation):
using Oracle.DataAccess.Client;
or
using Oracle.ManagedDataAccess.Client;

....

string oradb = "Data Source=(DESCRIPTION="
    + "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.158)(PORT=1521)))"
    + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=XE)));"
    + "User Id=SYSTEM;Password=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, erhalten Sie den Fehler 12514. Der SERVICE_NAME ist optional. Sie können es auch weglassen.




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

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

Ich habe die Systemdatenbank abgefragt:

Wählen Sie * aus global_name;

und habe meine entfernte SID ("XE") gefunden.

Dann konnte ich mich ohne Probleme verbinden.




Für diejenigen, die Oracle in einer VM ausführen (wie ich), sah ich dieses Problem, weil meine VM nicht mehr genügend Arbeitsspeicher hatte, was OracleDB anscheinend daran gehindert hat, korrekt zu starten / zu laufen. Durch das Erhöhen meines VM-Speichers und das Neustarten wurde das Problem behoben.




Starten des OracleServiceXXX aus der services.msc funktionierte für mich in Windows.




Was für mich funktionierte, war wirklich einfach. Ich musste den Dienst nur manuell in den "Windows Services" (services.msc in cmd trompt) starten. Mein Dienstname lautet: OracleServiceXXXXX.




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, um dies zu überwachen und zu bestätigen, ist der Oracle Sql-Entwickler (obwohl dies nicht das einzige Tool ist, mit dem Sie DB-Sitzungen überwachen können).

Sie können das Tool von Oracle Site Sql Developer herunterladen

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




In meinem Fall war der Fehler auf die Tatsache zurückzuführen, dass der Listener den Dienst der Datenbank nicht registriert hatte. Ich habe das gelöst, indem ich die Dienste registriert habe. Beispiel:

Mein Deskriptor in tnsnames.ora :

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

Also, ich fahre fort, den Dienst in der listener.ora manuell zu registrieren:

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

Starten Sie den Listener schließlich per Befehl neu:

> lsnrctl stop
> lsnrctl start

Erledigt!




Ich weiß, das ist eine alte Frage, aber immer noch unbeantwortet. Ich brauchte einen Tag Recherche, aber ich fand die einfachste Lösung, zumindest in meinem Fall (Oracle 11.2 unter Windows 2008 R2) und wollte teilen.

Der Fehler zeigt, wenn er direkt betrachtet wird, an, dass der Listener den Dienstnamen nicht erkennt. Aber wo bleiben Service-Namen? In %ORACLE_HOME%\NETWORK\ADMIN\listener.ora

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

Ich habe das Problem Service Name hinzugefügt, dann in Windows "Dienste" Systemsteuerung habe ich einen "Neustart" auf dem Oracle-Listener-Dienst. Jetzt ist alles in Ordnung.




Überprüfen Sie, ob die Datenbank aktiv ist. Melden Sie sich beim Server an, legen Sie die Umgebungsvariable ORACLE_SID für die Datenbank-SID fest, und führen Sie SQL * Plus als lokale Verbindung aus.