317 votos

ORA-12514 TNS:el receptor no conoce actualmente el servicio solicitado en el descriptor de conexión

Tenemos una aplicación ejecutándose localmente en la que estamos experimentando el siguiente error:

ORA-12514: TNS:listener no conoce actualmente el servicio solicitado en el descriptor de conexión

He probado la conexión utilizando TNSPing que se resolvió correctamente y probé SQLPlus para intentar conectarse, lo que falló con el mismo error que el anterior. Utilicé esta sintaxis para SQLPlus :

sqlplus username/password@addressname[or host name]

Lo hemos comprobado:

  • se está ejecutando el TNS Listener en el servidor.
  • El propio Oracle en el servidor se está ejecutando.

No tenemos constancia de que se hayan realizado cambios en este entorno. ¿Algo más que podamos probar?

267voto

Brad Rippe Puntos 326

Tuve este problema y la solución era asegurarse de que en tnsnames.ora el SERVICE_NAME es un nombre de servicio válido en su base de datos. Para averiguar los nombres de servicio válidos, puede utilizar la siguiente consulta en oracle:

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

Una vez que actualicé tnsnames.ora a:

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

entonces corrí:

sqlplus user@TEST

¡Éxito! El listener básicamente te está diciendo que el service_name que estás usando no es un servicio válido según la DB.

(*Estaba ejecutando sqlplus desde la estación de trabajo cliente Win7 a la DB remota y culpo a los DBAs ;) *)

70voto

Joseph Argenio Puntos 31

Sé que es una pregunta antigua, pero sigue sin respuesta. Me tomó un día de investigación, pero he encontrado la solución más sencilla, al menos en mi caso (Oracle 11.2 en Windows 2008 R2) y quería compartir.

El error, si se mira directamente, indica que el receptor no reconoce el nombre del servicio. Pero, ¿dónde guarda los nombres de los servicios? En %ORACLE_HOME%\NETWORK\ADMIN\listener.ora

La "SID_LIST" es precisamente eso, una lista de SID y nombres de servicio emparejados en un formato que puedes copiar o consultar.

Añadí el nombre del servicio problemático y, en el panel de control "Servicios" de Windows, reinicié el servicio de escucha de Oracle. Ahora todo está bien.


Por ejemplo, su archivo listener.ora podría tener inicialmente el siguiente aspecto:

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

... Y para que reconozca un nombre de servicio de orcl podrías cambiarlo por:

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

25voto

manix Puntos 2396

En mis circunstancias el error se debía a que el listener no tenía registrado el servicio del db. Lo solucioné registrando los servicios. Ejemplo:

Mi descriptor en tnsnames.ora :

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

Por lo tanto, procedo a registrar el servicio en el listener.ora manualmente:

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

Por último, reinicie el listener mediante un comando:

> lsnrctl stop
> lsnrctl start

¡Hecho!

14voto

Capricorn1 Puntos 437

Esto realmente debería ser un comentario a la respuesta de [Brad Rippe][1], pero por desgracia, no hay suficientes rep. Esa respuesta me llevó el 90% del camino. En mi caso, la instalación y configuración de las bases de datos puso entradas en el archivo tnsnames.ora para las bases de datos que estaba ejecutando. Primero, pude conectarme a la base de datos configurando las variables de entorno (Windows):

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

y, a continuación, conectarse mediante

sqlplus / as sysdba

A continuación, ejecuta el comando de la respuesta de Brad Rippe:

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

mostró que los nombres no coincidían exactamente. Las entradas creadas con el Asistente de configuración de bases de datos de Oracle eran las originales:

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

El nombre del servicio de la consulta era simplemente mydatabase en lugar de mydatabase.mydomain.com . He editado el archivo tnsnames.ora sólo el nombre base sin la parte de dominio por lo que se veía así:

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

He reiniciado el servicio TNS Listener (suelo utilizar lsnrctl stop y lsnrctl start desde una ventana de comandos de administrador [o Windows Powershell] en lugar del panel de control de Servicios, pero ambos funcionan). Después de eso, pude conectarme. [1]: https://stackoverflow.com/users/979521/brad-rippe

14voto

Sepideh Puntos 19

Tuve este problema en Windows Server 2008 R2 y Oracle 11g

Vaya a Net Manager > Listener > seleccione los servicios de base de datos del cuadro de diálogo > "Global Database Name" debe ser el mismo que "SID" y "Oracle Home Directory" debe ser correcto.

Si no tiene ninguna entrada para los servicios de base de datos, cree una y establezca la base de datos global correcta , sid y oracle home.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X