it-swarm.com.de

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

Ich führe eine Instanz von Oracle 11g lokal auf meinem Entwicklungscomputer aus und kann über SqlPlus direkt eine 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 damit verbinden:

c:\>sqlplus -L "user/[email protected](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 eine Verbindung über SqlDeveloper herstelle, wird eine Fehlermeldung angezeigt (allerdings ORA-12505, TNS:listener does not currently know of SID given in connect descriptor).

Diese Instanz ist seit einem Jahr oder länger bis heute, einem Montagmorgen, stabil und funktioniert einwandfrei. Unsere Unternehmens-IT pusht manchmal über das Wochenende neue Richtlinien und Updates, daher gehe ich 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 Hö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 der TNSLSNR.exe-Prozess.)

Außerdem kann ich tnsping zum XE-Dienst:

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 Datei listenerr.ora:

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 auf https://127.0.0.1:8080/apex Nicht auf den Apex zugreifen (obwohl die Berechtigungen dafür in Ordnung zu sein scheinen).

Wo sollte ich sonst noch suchen?

pdate 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

pdate2: Wie @ miracle173 richtig hervorhebt, ist der Listener war nicht in Ordnung. Mit dem aktualisierten Parameter 'local_listener' werden jetzt 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
17
Unsliced

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

Riffing auf dem LOCAL_LISTENER dachte, ich las diese andere Antwort wo es sagte:

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 entspricht: 1521.

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 dieser Antwort an

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 die Auflösung des tatsächlichen Hostnamens fehlgeschlagen ist.

15
Unsliced