¿Qué es un TNS: escucha en el contexto de Oracle?
-
22-09-2019 - |
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 sí 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?
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.