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

226

Tenemos una aplicación que se ejecuta localmente y experimentamos el siguiente error:

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

Probé la conexión usando la TNSPingque se resolvió correctamente e intenté SQLPlusintentar conectar, lo que falló con el mismo error que el anterior. Usé esta sintaxis para SQLPlus:

sqlplus username/password@addressname[or host name]

Hemos verificado que:

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

No sabemos de ningún cambio realizado en este entorno. ¿Algo más que podamos probar?

Jacques
fuente
2
¿Cuál es el comando TNSPing (con parámetros) que utilizó?
Grzegorz W
cuando dice "ejecutándose localmente", ¿quiere decir que la aplicación se está conectando a una base de datos en el mismo host? Además, ¿cuáles son los contenidos de su archivo sqlnet.ora? ¿Qué versiones se informan para sqlplus y tnsping, y estás seguro de que están en el mismo ORACLE_HOME?
David Aldridge
1
intente reiniciar la base de datos. Como se supone que deben informar al oyente sobre su existencia en el inicio, esto podría solucionar su problema.
Jens Schauder
1
ALTER SYSTEM REGISTER es menos drástico que reiniciar la base de datos.
DCookie

Respuestas:

209

Tenía este problema y la solución era asegurarse de que en tnsnames.orael SERVICE_NAMEes un nombre de servicio válido en su base de datos. Para encontrar nombres de servicio válidos, puede usar la siguiente consulta en Oracle:

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

Una vez que actualicé tnsnames.oraa:

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 oyente básicamente le dice que cualquier nombre de servicio que esté utilizando no es un servicio válido según la base de datos.

(* Estaba ejecutando sqlplus desde la estación de trabajo del cliente Win7 a la base de datos remota y culpo a los DBA;) *)

Brad Rippe
fuente
2
En win7,% ORACLE_HOME% \ NETWORK \ ADMIN \ tnsnames.ora
Brad Rippe
198
¿Cómo se supone que debo consultar la base de datos si ni siquiera puedo conectarme a ella?
isabelle martz
2
¿Se puede enviar al servidor DB directamente y ejecutar sqlplus desde allí?
Brad Rippe,
1
este podría no ser el caso cuando varios clientes / servidores están, o solían estar, instalados en la misma máquina. (tnsping genera la ubicación del directorio que usa) - en mi caso, listener.ora en ese directorio contenía información perteneciente a una instancia de base de datos anterior que había desinstalado - de manera rápida y sucia fue copiar todo el contenido de listener.ora de mi instalación actual de Oracle Express, en ese otro directorio que el oyente parece estar comprobando (creo que lo cambié a través de un registro o algo así y tiene prioridad sobre ORACLE_HOME (?))
hello_earth
8
ORA-00942: la tabla o vista no existe
Tommy Holman
44

Sé que esta es una vieja pregunta, pero aún sin respuesta. Me llevó un día de investigación, pero encontré la solución más simple, 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 oyente no reconoce el nombre del servicio. Pero, ¿dónde guarda los nombres de los servicios? En%ORACLE_HOME%\NETWORK\ADMIN\listener.ora

El "SID_LIST" es solo eso, una lista de SID y nombres de servicios emparejados en un formato que puede copiar o buscar.

Agregué el problema Nombre del servicio, luego en el panel de control de "Servicios" de Windows, hice un "Reinicio" en el servicio de escucha de Oracle. Ahora todo está bien.


Por ejemplo, su archivo listener.ora podría verse inicialmente como:

# 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 el nombre de un servicio orcl, puede cambiarlo a:

# 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))
    )
  )
Joseph Argenio
fuente
3
Necesita actualizar esta respuesta con la sintaxis de cómo listener.oraalmacena los nombres. Ni siquiera tengo un listener.oraarchivo. También estoy en una estación de trabajo cliente que ejecuta SQL Developer e intento crear un enlace de base de datos cuando recibo el error. No tengo un servicio Oracle Listener para reiniciar.
vapcguy
vapcguy, debes estar en el servidor de la base de datos. parece que estás en el cliente
Joseph Argenio
Después de seguir las instrucciones de Sepideh relacionadas con Net Manager, noté que mi archivo listeners.ora se había actualizado para contener una nueva entrada SID_LIST. He editado esta respuesta para incluir un ejemplo de antes y después de la sintaxis, en beneficio de los lectores que no pueden usar el Administrador de red, por cualquier razón.
Kevin
12

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

vaya a Net Manager> Listener> seleccione los servicios de la base de datos desde el combox> "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 la base de datos, cree una y configure la base de datos global correcta, sid y el inicio de Oracle.

Sepideh
fuente
12

En mis circunstancias, el error se debió al hecho de que el oyente no tenía registrado el servicio de db. Resolví esto 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)
    )
  )

Entonces, procedo a registrar el servicio en el listener.oramanual:

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

Finalmente, reinicie el oyente por comando:

> lsnrctl stop
> lsnrctl start

¡Hecho!

manix
fuente
8

Iniciar OracleServiceXXX desde services.msc funcionó para mí en Windows.

Ishildur Baggins
fuente
En Windows, si está utilizando Oracle Release 12.x, asegúrese de que el servicio OracleServiceORCL se esté ejecutando. Si este servicio no se inicia, también recibirá el mismo código de error.
halcón callejero
5

Esto realmente debería ser un comentario a la respuesta de Brad Rippe , pero lamentablemente, no hay suficiente representante. Esa respuesta me consiguió el 90% del camino. En mi caso, la instalación y configuración de las bases de datos pusieron 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 luego conectando usando

sqlplus / as sysdba

A continuación, ejecute 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 la base de datos de Oracle fueron originalmente:

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 en mydatabaselugar de mydatabase.mydomain.com. Edité el archivo tnsnames.ora solo para el nombre base sin la porción de dominio para que se vean así:

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

Reinicié el servicio de escucha TNS (a menudo uso lsnrctl stopy lsnrctl startdesde una ventana de comando de administrador [o Windows Powershell] en lugar del panel de control de Servicios, pero ambos funcionan). Después de eso, pude conectarme.

Capricornio1
fuente
4

Yo tuve el mismo problema. Para mi solo escribo

sqlplus myusername/mypassword@localhost

hizo el truco, hacerlo lo hace conectarse al nombre de servicio predeterminado, supongo.

Rika
fuente
1
Tuvimos un problema similar con nuestra cadena de conexión que causó este error. Nos conecta mediante controlador fino JDBC de Oracle con la cadena de conexión: jdbc:oracle:thin:@//localhost:1521/orcl. La cadena de conexión corregido para eliminar este error fue: jdbc:oracle:thin:@localhost:1521.
dan
depende de si esto funcionaría: creo que esta forma de conectarse, a juzgar por lo que otros dijeron, es pasar por alto al oyente por completo, usar el nombre de host de la computadora en lugar de SID; esta forma de conexión causa problemas en clientes de terceros, creo también funciona solo cuando se especifica EZCONNECT en sqlnet.ora: NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT)
hello_earth
3

lo que funcionó para mí fue realmente simple, solo necesitaba iniciar el servicio manualmente en los "Servicios de Windows" (services.msc en cmd trompt). mi nombre de servicio es: OracleServiceXXXXX.

isabelle martz
fuente
En mi caso, aunque el Tipo de inicio está configurado en Automático, no se inicia cuando la máquina se inicia. Después de iniciar manualmente el servicio "OracleServiceXE", funciona para Oracle Database 11g Express para conectarse a la página web DB y APEX (Oracle Application Express).
Ivan Chau
2

Verifique que la base de datos esté activa. Inicie sesión en el servidor, establezca la variable de entorno ORACLE_SID en el SID de su base de datos y ejecute SQL * Plus como conexión local.

DCookie
fuente
Este fue exactamente mi problema. Nuestra base de datos está alojada en una VM que estaba inactiva mientras intentaba usar otro programa que usara el DP. Después de ver este hilo me di cuenta de que probablemente estaba caído.
Sh4d0wsPlyr
2

Este error puede ocurrir cuando una aplicación realiza una nueva conexión para cada interacción de la base de datos o las conexiones no se cierran correctamente. Una de las herramientas gratuitas para monitorear y confirmar esto es el desarrollador Oracle Sql (aunque esta no es la única herramienta que puede usar para monitorear las sesiones de DB).

puede descargar la herramienta desde el sitio de Oracle Sql Developer

Aquí hay una captura de pantalla de cómo monitorear tus sesiones. (si ve que se acumulan muchas sesiones para el usuario de la aplicación cuando ve el error ORA-12514, es una buena indicación de que puede tener un problema de grupo de conexión).

ingrese la descripción de la imagen aquí

grepit
fuente
2

Resolví este problema en mi entorno Linux actualizando la IP de mi máquina en el archivo / etc / hosts.

Puede verificar su IP de red (inet end.) Con:

$ifconfig

Vea si su IP coincide con el archivo / etc / hosts:

$cat /etc/hosts

Edite su archivo / etc / hosts, si está integrado:

$sudo gedit /etc/hosts

Adiós.

Sergio MC Figueiredo
fuente
2
esto es antiguo, pero no tiene mucho sentido agregar su IP a / etc / hosts. Falta el OP SERVICE_NAME, otras cosas no están relacionadas
Ostap
No he agregado mi IP a / etc / host. Acabo de corregirlo. Como puede ver en este tema, hay muchas respuestas y variedades válidas (con voto positivo) para resolver esta pregunta. Si esa respuesta no te ayudó, ¿por qué rechazar? Esta respuesta aún puede ayudar a alguien como me ayudó a mí.
Sergio MC Figueiredo
2

Para aquellos que pueden estar ejecutando Oracle en una VM (como yo), vi este problema porque mi VM se estaba quedando sin memoria, lo que parece haber impedido que OracleDB se inicie / ejecute correctamente. El aumento de mi memoria de VM y reiniciar solucionó el problema.

th3uiguy
fuente
2

Muchas respuestas aquí, pero aquí viene un ejemplo de trabajo con código que puede copiar, pegar y probar de inmediato:

Para mí, el error 12514 se resolvió después de especificar el SERVICE_NAME correcto. Lo encuentra en el servidor en el archivo tnsnames.oraque viene con 3 nombres de servicio predefinidos (uno de ellos es "XE").

  1. Instalé la base de datos Oracle Express OracleXE112 que ya viene con algunas tablas de demostración preinstaladas.
  2. Cuando inicia el instalador, se le solicita una contraseña. Ingresé "xxx" como contraseña. (no utilizado en producción)
  3. Mi servidor se ejecuta en la máquina 192.168.1.158
  4. En el servidor, debe permitir explícitamente el acceso al proceso TNSLSNR.exe en el Firewall de Windows. Este proceso escucha en el puerto 1521.
  5. OPCIÓN A: Para C # (.NET2 o .NET4) puede descargar ODAC11 , desde el cual debe agregar Oracle.DataAccess.dll a su proyecto. Además, esta DLL depende de: OraOps11w.dll, oci.dll, oraociei11.dll (130MB!), Msvcr80.dll. Estos archivos DLL deben estar en el mismo directorio que el archivo EXE o debe especificar la ruta de DLL en: HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath. En máquinas de 64 bits, escriba adicionalmente enHKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. OPCIÓN B: Si ha descargado ODAC12 , necesita Oracle.DataAccess.dll, OraOps12w.dll, oci.dll, oraociei12.dll (¡160 MB!), Oraons.dll, msvcr100.dll. La ruta del registro esHKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. OPCIÓN C: si no desea archivos DLL de más de 100 MB, debe descargar ODP.NET_Managed12.xxxxxxxx.zip en el que encontraráOracle.ManagedDataAccess.dll que solo tiene 4 MB y es un archivo DLL administrado puro que funciona en procesos de 32 bits y 64 bits también y no depende de ninguna otra DLL y no requiere ninguna entrada de registro.
  8. El siguiente código C # funciona para mí sin ninguna configuración en el lado del servidor (solo la instalación predeterminada):
usando Oracle.DataAccess.Client;
o
utilizando Oracle.ManagedDataAccess.Client;

....

string oradb = "Fuente de datos = (DESCRIPTION ="
    + "(ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.1.158) (PORT = 1521)))"
    + "(CONNECT_DATA = (SERVIDOR = DEDICADO) (SERVICE_NAME = XE)));"
    + "Id. De usuario = SISTEMA; Contraseña = xxx;";

utilizando (OracleConnection conn = new OracleConnection (oradb)) 
{
    conn.Open ();
    utilizando (OracleCommand cmd = new OracleCommand ())
    {
        cmd.Connection = conn;
        cmd.CommandText = "seleccione TABLESPACE_NAME de DBA_DATA_FILES";

        utilizando (OracleDataReader dr = cmd.ExecuteReader ())
        {
            while (dr.Read ())
            {
                listBox.Items.Add (dr ["TABLESPACE_NAME"]);
            }
        }
    }
}

Si SERVICE_NAME=XEestá mal, obtiene el error 12514. El SERVICE_NAMEes opcional. También puedes dejarlo lejos.

Elmue
fuente
Muchas gracias, desde su solución encontré el truco, en mi caso, era el antivirus que estaba bloqueando el programa, por lo tanto, no pude obtener una conexión a Oracle db.
robot_alien
2

También me enfrenté al mismo problema y pasé 3 días para desenterrarlo.

Esto sucede debido a su entrada de servicio TNS incorrecta.

Primero verifique si puede conectarse a la base de datos en espera desde la base de datos primaria usando sql> sqlplus sys@orastand as sysdba( orastandes una base de datos en espera).

Si no puede conectarse, entonces es un problema con el servicio. Corrija la entrada del nombre del servicio en el archivo TNS en el extremo primario.

Verifique la base de datos en espera de la misma manera. Haga los cambios aquí también si es necesario.

Asegúrese de que el log_archive_dest_2parámetro tenga el nombre de servicio correcto.

usuario3778101
fuente
1

Obtuve el mismo error porque el SID remoto especificado era incorrecto:

 > sqlplus $DATASOURCE_USERNAME/$DATASOURCE_PASSWORD@$DB_SERVER_URL/$REMOTE_SID 

Consulté la base de datos del sistema:

seleccione * de global_name;

y encontré mi SID remoto ("XE").

Entonces podría conectarme sin ningún problema.

Laura Liparulo
fuente
0

En mi caso, la base de datos se había quedado sin espacio en disco. Lo que hizo que no respondiera. Una vez que resolví ese problema, todo volvió a funcionar.

Pete Brumm
fuente
¿Cómo puedo averiguar esto?
CodeSlave
0

Para mí, esto fue causado por el uso de una dirección dinámica usando la instalación. Reinstalé Oracle usando un ipadress estático y luego todo estuvo bien

Steef
fuente
0

Reiniciar la VM funcionó para mí

wishman
fuente
0

Mi problema se resolvió reemplazando el 'ID' en la URL con el 'nombre del servicio' y el host correcto.

Señor. Erizo
fuente
0

tnslsnr está activo pero la base de datos está inactiva.

Para los principiantes de Oracle no es obvio que la base de datos pueda estar inactiva mientras se aceptan las conexiones.

Tuve que iniciar la base de datos manualmente de esa manera

su - oracle
export ORACLE_SID=XE
sqlplus sys as sysdba

Y luego en la consola sql

startup

En mi caso, no pude iniciar, pero recibí otro mensaje de error y encontré el origen de un problema: tuve que cambiar el nombre del host y luego el inicio automático de la base de datos volvió a funcionar.

usuario3132194
fuente
0

He implementado la siguiente solución para resolver este problema.

  1. He configurado ORACLE_HOME usando el símbolo del sistema (haga clic con el botón derecho en cmd.exe y Ejecutar como administrador del sistema).

  2. Usado debajo del comando

    set oracle_home="path to the oracle home"

  3. Vaya a Todos los programas -> Oracle -ora home1 -> Herramientas de migración de configuración -> Net Manager -> Listener

  4. Seleccione Servicios de base de datos del menú desplegable. Tanto el nombre de la base de datos global como el SID están configurados de la misma manera (ORCL en mi caso). Establecer Oracle Home Directory.

Ejemplo de ventana de Oracle Net Manager de la documentación de Oracle: Ejemplo de Oracle Net Manager

  1. Haga clic en Archivo y guarde la configuración de red.
Raman B
fuente
0

El problema era que mi url de cadena de conexión contenía el nombre de la base de datos en lugar del SID. Reemplazar el nombre de la base de datos con la conexión de base de datos Oracle SID resolvió este problema.

Para conocer sus SID de Oracle, puede examinar el tnsnames.oraarchivo.

XE era el SID real, así que así es como se ve mi cadena de conexión Tomcat ahora:

    <Resource
       name="jdbc/my_db_conn"
       auth="Container"
       type="javax.sql.DataSource"
       driverClassName="oracle.jdbc.driver.OracleDriver"
       url="jdbc:oracle:thin:@//127.0.0.1:1521/XE"
       username="test_user"
       password="test" />

La versión de mi servidor era "Oracle 11.2 Express", pero la solución también debería funcionar en otras versiones.

Benas
fuente
0

En mi caso, faltaban corchetes alrededor de SERVICE_NAME en el archivo tnsnames.ora .

<DBNAME> =
  (DESCRIPTION =
    (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL=TCP)(HOST = nupark-cnvr-ora )(PORT=1521))
    )
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = <DBNAME> ***CLOSING ROUND BRACKET WAS MISSING HERE***
    )
  )

LISTENER_<DBNAME> =

  (ADDRESS = (PROTOCOL = TCP)(HOST = nupark-cnvr-ora)(PORT = 1521))
Mosab Sasi
fuente
0

Para aquellos que usan spring-boot y jdbc para la conexión. Debe tener cuidado al escribir jdbcUrl en application.properties

Con SID en conexión de base de datos - source.datasource.jdbcUrl = jdbc:oracle:thin:@[HOST][:PORT]:SID

Con el nombre del servicio en conexión db globe.datasource.jdbcUrl = jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE

Esto funcionó para mí :)

surajmall
fuente