El oyente Oracle 11g falla con los errores ORA-12514 y ORA-12505


17

Ejecuto una instancia de Oracle 11g localmente en mi máquina de desarrollo y puedo conectarme a la instancia local directamente a través de SqlPlus:

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

Pero no puedo conectarme a través del oyente:

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

Del mismo modo, si me conecto a través de SqlDeveloper me sale un error (aunque ORA-12505, TNS:listener does not currently know of SID given in connect descriptor).

Esta instancia ha sido estable y funciona bien durante un año o más hasta hoy, un lunes por la mañana. Nuestra TI corporativa a veces impulsa nuevas políticas y actualizaciones durante el fin de semana, por lo que supongo que algo ha cambiado, pero no he podido averiguar qué.

He reiniciado el servicio y el oyente varias veces, el registro del oyente no da ninguna pista.

El oyente parece estar bien:

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

El puerto 1521 parece estar bien:

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 es el proceso TNSLSNR.exe).

Además, puedo tnspingal servicio XE:

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)

El listenerr.oraarchivo:

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)

Además, y no tengo idea de si está relacionado, parece que no puedo acceder al vértice https://127.0.0.1:8080/apex(aunque los permisos para eso parecen estar bien).

Entonces, ¿dónde más debería estar buscando?

Actualización con la información solicitada:

SQL> show parameter service_names

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

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

Actualización2 : como @ miracle173 señala correctamente, el oyente no estaba bien. Con el parámetro actualizado 'local_listener' ahora se muestra información adicional:

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

¿Cuáles son los valores de su INSTANCE_NAMEparámetro de inicialización y ORACLE_SIDvariable de entorno? Su base de datos no se registra con el oyente predeterminado por alguna razón. Intente emitir alter system register;y luego vuelva a conectarse a la base de datos.
Yasir Arsanukaev

@YasirArsanukaev nombre_instancia es 'xe' (minúscula si eso es relevante) y no tengo una variable de entorno ORACLE_SID.
cortar

3
dos notas: "el oyente parece estar bien": no lo creo porque no muestra un servicio llamado "XE" "Puedo hacer ping al servicio XE": tnsping se conecta al oyente pero no se preocupa por los servicios. por lo que solo puede mostrar si el oyente está en funcionamiento pero no puede usar ist para verificar si el oyente ha registrado un servicio. Por lo tanto, el tnsping "(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = localhost) (PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))" tendrá éxito si un oyente se está ejecutando en el puerto 1521 de localhost incluso si el servicio no existe.
milagro173

Me encontré con el mismo problema hoy, y como describió @ miracle173, hay un registro en alert.log. Oracle se está ejecutando en una VM. Resulta que en la VM, tanto el nombre de host como el nombre de host.dominio apuntan a una dirección IP diferente de 127.0.0.1 (localhost). Después de modificar el archivo hosts (Windows \ system32 \ drivers \ etc) para forzar la asignación, todo está bien ahora.

alter register solucionó el problema ... gracias :)
user116258

Respuestas:


15

Entonces, gracias a @YasirArsanukaev por el tiempo que invirtió, he encontrado una solución que funciona, pero que realmente no puedo explicar.

Reflexionando sobre el LOCAL_LISTENERpensamiento, estaba leyendo esta otra respuesta donde decía:

La base de datos utiliza el parámetro LOCAL_LISTENER para identificar al oyente con el que debe registrarse. De forma predeterminada, eso es nulo, que según la documentación es equivalente al nombre de host: 1521.

Así que intenté hacer ping a mi propio nombre de host y no pude, parece un problema de IPv6, recibiendo un mensaje de falla general.

Entonces tomé el consejo de esa respuesta

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

y ahora funciona, presumiblemente porque puede resolver la referencia localhost, donde estaba fallando la resolución del nombre de host real.


1
realmente explicó la solución: el registro automático de la base de datos al LOCAL_LISTENER predeterminado '' (DIRECCIÓN = (PROTOCOLO = TCP) (HOST = hostname) (PORT = 1521)) '' (donde hostname es el nombre de red de la máquina) no funciona porque hay un problema para llegar a la máquina con este nombre. Quizás haya una entrada en alert.log o en algún sqnlnet.log (% ORACLE_HOME% / network / log /) sobre el problema de registro de la base de datos
miracle173

@ Sin cortar En realidad tengo el mismo problema, para mi caso se resolvió porque el ID de servicio utilizado eliminó el texto de postfix ".Domain.local".
Siesta del

ejecutar las dos declaraciones alter resolvió el mensaje de error de tns listner para mí y pude conectarme
smartexpert
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.