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:
Wir kennen keine Änderungen, die an dieser Umgebung vorgenommen wurden. Können wir noch etwas testen?
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;) *)
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))
)
)
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.
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!
Das Starten von OracleServiceXE über services.msc hat bei mir unter Windows funktioniert.
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.
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.
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.
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.
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.).
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.
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").
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\...
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
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.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.
Ü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.
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.
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.
Mein Problem wurde behoben, indem die 'ID' in der URL durch 'Dienstname' und den richtigen Host ersetzt wurde.
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
Der Neustart von VM hat bei mir funktioniert