Pregunta

cuestión limítrofe ServerFault, pero pensé que podría probar aquí por primera vez desde que he tenido suerte con las preguntas de Oracle en el pasado.

Estoy intentando conectarse a una base de datos Oracle desde PHP, y estoy consiguiendo el error siguiente.

ORA-12505: TNS:listener does not currently know of SID given in connect descriptor

Este es el error que los informes de PHP, y el error que aparece en listener.log de Oracle.

Mi problema inmediato es la fijación de este error. La cuestión más importante que me gustaría responder es ¿Cómo funciona el modelo de conexión de Oracle?

Esto está en un entorno de desarrollo que se ejecuta en mi máquina Windows locales y ha estado trabajando hasta ahora. Por desgracia, el ambiente fue entregado a mí (no me instalo) y la gente que configurarlo no están disponibles para ayudarme a depurarlo.

Si me estaba poniendo un error similar con MySQL o PostgreSQL (dos sistemas que estoy más familiarizado), me gustaría comprobar para asegurarse de que un proceso de base de datos estaba en marcha, y luego intente conectarse manualmente a la base de datos utilizando el nombre de usuario / cadena de contraseña / conexión. Por desgracia, no estoy familiarizado con las herramientas de Oracle en Windows (que no sean SQL Developer) y no sé lo que es un TNS: oyente o SID son en el contexto de Oracle (tengo vagas ideas, pero las ideas vagas de ayuda cuando raramente que va a depurar algo así)

Cualquier consejo general sería apreciada.

Actualizaciones por Comentarios:

Hay un número de entires en mi archivo tnsnames.ora, siendo la entrada correspondiente

OBS2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = steel-ae39650)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = OBS2)
    )
  )

Esto no se refleja en la lista de instancias cuando corro

    LSNRCTL> services

Así que creo que mi siguiente pregunta es, ¿cómo lo intenta iniciar manualmente la instancia OBS2?

¿Fue útil?

Solución

Un nombre TNS es como un alias para la instancia de servicio. El servicio de escucha de TNS actúa como una especie de servicio de búsqueda para usted en este sentido. Se producirá un error con el mensaje de error si el servicio real que está tratando de conectarse a través de un nombre TNS no es válido.

A continuación, puede probar para ver si el oyente TNS ve el servicio correctamente utilizando la herramienta de línea de comandos:

%>lsnrctl services

¿Qué debe hacer salir algo como lo siguiente:

Service "myservice" has 1 instance(s).
  Instance "myinstance", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:1002 state:ready
         DISPATCHER <machine: LOCALHOST, pid: 12345>
         (ADDRESS=(PROTOCOL=tcp)(HOST=LOCALHOST)(PORT=6789))

Se puede complacer a publicar la entrada de TNS relevante (en el archivo de tnsnames.ora)? Se encuentra en OraHome \ cliente o db \ ADMIN \ NETWORK. Si usted tiene el cliente y el servidor, asegúrese de que ambas copias del archivo tnsnames.ora tienen valores correctos, sólo para estar seguro.

Aquí hay un ejemplo de una definición de nombre TNS adecuada en tnsnames.ora llamada 'mibd':

myDbAlias =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 12345)(QUEUESIZE = 100))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = myservice)
    )
  )

Otros consejos

Sólo quería añadir a esto, ya que recientemente he tenido un problema de conexión similar que me volvía tuercas hasta que me di cuenta de lo que estaba ocurriendo.

En primer lugar, las palabras clave y el SID SERVICE_NAME no son exactamente lo mismo. Esta fue mi primera suposición errónea. En muchos ambientes se puede intercambiar SID y SERVICE_NAMESTART_BREAK, pero no siempre, depende.

Dicho esto, el error esférico fuera del problema:. Se especificará la SID en una cadena de conexión en lugar de la SERVICE_NAME que TNSNAMES usos con éxito

Por lo tanto, si especifica la cadena de conexión en el código, pruebe a utilizar palabras clave SERVICE_NAMESTART_BREAK en la cadena de conexión (* o, si ya has utilizando SERVICE_NAME y no se puede conectar, intente usar SID palabra clave *).

respuesta demasiado simplista lo sé, pero fácil de tratar y puede salvar a alguien algunos dolores de cabeza.

Espero que ayude.

Respuesta de Mike Atlas' es bastante completa, pero tenga en cuenta que se puede conectar a 10g (o posterior) DBs que no tienen un tnsname publicada usando [//] nomb_sist_pral [: puerto] [/ service_name]

HTH

C.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top