Oracle 11g-Listener schlägt mit ORA-12514- und ORA-12505-Fehlern fehl


17

Ich führe eine Instanz von Oracle 11g lokal auf meinem Entwicklungscomputer aus und kann über SqlPlus eine direkte Verbindung zur lokalen Instanz herstellen:

c:\>sqlplus ace

SQL*Plus: Release 11.2.0.2.0 Production on Mon Mar 11 11:50:20 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Enter password:

Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Beta

SQL> select count(*) from my_table ;

  COUNT(*)
----------
      5297

Ich kann mich aber nicht über den Listener verbinden:

c:\>sqlplus -L "user/pw@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))"

SQL*Plus: Release 11.2.0.2.0 Production on Mon Mar 11 11:52:40 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor


SP2-0751: Unable to connect to Oracle.  Exiting SQL*Plus

Wenn ich mich über SqlDeveloper verbinde, erhalte ich ebenfalls eine Fehlermeldung (allerdings ORA-12505, TNS:listener does not currently know of SID given in connect descriptor).

Diese Instanz ist seit mindestens einem Jahr bis heute, einem Montagmorgen, stabil und funktioniert einwandfrei. Unsere Unternehmens-IT pusht manchmal über das Wochenende neue Richtlinien und Updates. Ich gehe also davon aus, dass sich etwas geändert hat, aber ich konnte nicht herausfinden, was.

Ich habe den Dienst und den Listener mehrmals neu gestartet, das Listener-Protokoll gibt keine Hinweise.

Dem Zuhörer scheint es gut zu gehen:

c:\>lsnrctl status

LSNRCTL for 32-bit Windows: Version 11.2.0.2.0 - Beta on 11-MAR-2013 11:55:33

Copyright (c) 1991, 2010, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for 32-bit Windows: Version 11.2.0.2.0 - Beta
Start Date                11-MAR-2013 11:17:30
Uptime                    0 days 0 hr. 38 min. 3 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Default Service           XE
Listener Parameter File   C:\oraclexe\app\oracle\product\11.2.0\server\network\admin\listener.ora
Listener Log File         C:\oraclexe\app\oracle\diag\tnslsnr\FBC305BB46560\listener\alert\log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=machine.domain.com)(PORT=1521)))
Services Summary...
Service "CLRExtProc" has 1 instance(s).
  Instance "CLRExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

Port 1521 scheint in Ordnung zu sein:

c:\>netstat -an -O | find /i "1521"
  TCP    0.0.0.0:1521           0.0.0.0:0              LISTENING       4368
  TCP    169.243.90.109:55307   159.185.207.100:1521   ESTABLISHED     12416
  TCP    [::]:1521              [::]:0                 LISTENING       4368

(PID 4368 ist TNSLSNR.exe-Prozess.)

Auch kann ich tnspingzum XE-Service:

c:\>tnsping xe

TNS Ping Utility for 32-bit Windows: Version 11.2.0.2.0 - Beta on 11-MAR-2013 12:27:47

Copyright (c) 1997, 2010, Oracle.  All rights reserved.

Used parameter files:
C:\oraclexe\app\oracle\product\11.2.0\server\network\admin\sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = machine.domain.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))
OK (210 msec)

Die listenerr.oraDatei:

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

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = machine.domain.com)(PORT = 1521))
    )
  )

DEFAULT_SERVICE_LISTENER = (XE)

Außerdem, und ich habe keine Ahnung, ob es damit zusammenhängt, kann ich anscheinend nicht auf Apex zugreifen https://127.0.0.1:8080/apex(obwohl die Berechtigungen dafür in Ordnung zu sein scheinen).

Also, wo soll ich sonst suchen?

Update mit angeforderten Informationen:

SQL> show parameter service_names

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
service_names                        string      XE
SQL> show parameter local_listener

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
local_listener                       string

Update2 : Wie @ miracle173 richtig anzeigt , war der Listener nicht in Ordnung. Mit dem aktualisierten Parameter 'local_listener' werden nun zusätzliche Informationen angezeigt:

Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=machine.domain.com)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
Services Summary...
Service "CLRExtProc" has 1 instance(s).
  Instance "CLRExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "PLSExtProc" has 1 instance(s).
  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "XEXDB" has 1 instance(s).
  Instance "xe", status READY, has 1 handler(s) for this service...
Service "xe" has 1 instance(s).
  Instance "xe", status READY, has 1 handler(s) for this service...
The command completed successfully

Was sind die Werte Ihres INSTANCE_NAMEInitialisierungsparameters und Ihrer ORACLE_SIDUmgebungsvariablen? Ihre Datenbank wird aus irgendeinem Grund nicht beim Standard-Listener registriert. Versuchen Sie, eine alter system register;Verbindung zur Datenbank herzustellen.
Yasir Arsanukaev

@YasirArsanukaev Instanzname ist 'xe' (Kleinbuchstaben, falls dies relevant ist) und ich habe keine ORACLE_SID-Umgebungsvariable.
Unsliced

3
Zwei Anmerkungen: "Der Listener scheint in Ordnung zu sein": Ich glaube nicht, weil der Dienst "XE" nicht angezeigt wird. Sie können also nur anzeigen, ob der Listener aktiv ist, nicht jedoch, ob der Listener einen Dienst registriert hat. "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = localhost) (PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE))" ist also erfolgreich, wenn ein Listener auf dem Port ausgeführt wird 1521 von localhost, auch wenn der Dienst nicht existiert.
miracle173

Ich bin heute auf dasselbe Problem gestoßen, und wie @ miracle173 beschrieben, gibt es eine Registrierung im alert.log. Oracle läuft auf einer VM. Es stellt sich heraus, dass auf der VM sowohl hostname als auch hostname.domain auf eine andere IP-Adresse als 127.0.0.1 (localhost) verweisen. Nachdem Sie die Hosts-Datei (Windows \ system32 \ drivers \ etc) geändert haben, um die Zuordnung zu erzwingen, ist jetzt alles in Ordnung.

alter register hat das Problem behoben .. danke :)
user116258

Antworten:


15

Dank @YasirArsanukaev für die Zeit, die er reingesteckt hat, habe ich eine Lösung gefunden, die funktioniert, die ich aber nicht wirklich erklären kann.

Als ich über den LOCAL_LISTENERGedanken nachdachte, las ich diese andere Antwort, in der es hieß:

Die Datenbank verwendet den Parameter LOCAL_LISTENER, um den Listener zu identifizieren, bei dem sie sich registrieren soll. Standardmäßig ist dies null, was laut Dokumentation dem Hostnamen 1521 entspricht.

Also habe ich versucht, meinen eigenen Hostnamen zu pingen und konnte es nicht - es sieht nach einem IPv6-Problem aus, bei dem eine allgemeine Fehlermeldung angezeigt wird.

Also nahm ich den Rat von dieser Antwort

SQL> alter system set LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope=both;
SQL> alter system register;

und es funktioniert jetzt vermutlich, weil es die localhost-Referenz auflösen kann, bei der es fehlgeschlagen ist, den tatsächlichen Hostnamen aufzulösen.


1
Sie haben die Lösung tatsächlich erklärt: Die automatische erneute Registrierung der Datenbank auf den Standardwert LOCAL_LISTENER = '(ADDRESS = (PROTOCOL = TCP) (HOST = Hostname) (PORT = 1521)' (wobei Hostname der Netzwerkname des Computers ist) funktioniert nicht, da es ein Problem gibt, das Gerät unter diesem Namen zu erreichen. Möglicherweise gibt es einen Eintrag im alert.log oder in einem sqnlnet.log (% ORACLE_HOME% / network / log /) über das Registrierungsproblem der Datenbank
miracle173

@Unsliced ​​Ich habe tatsächlich das gleiche Problem, für meinen Fall wurde es behoben, weil die verwendete Service-ID den Postfix-Text ".Domain.local" entfernt hat.
Nap

Das Ausführen der beiden alter-Anweisungen löste die tns listner-Fehlermeldung für mich und ich konnte mich verbinden
smartexpert
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.