All Things Oracle

Registro dinámico de servicios y ora-12514

En ocasiones he sido consultado sobre problemas de conectividad que se presentan sin previo aviso y vienen acompañados del mensaje de error ORA-12514 TNS:listener does not currently know of service requested in connect descriptor. Hay quienes indican que extrañamente la comunicación era perfecta poco antes y que ya han revisado los archivos de configuración como el listener.ora y el tnsnames.ora y que todo se ve bien pero aún así no logran establecer nuevas conexiones.

Un detalle adicional es que todos estos casos tienen el común denominador de que el puerto en uso no es el usual 1521 sino algún otro. Considerando este escenario pre-determinado, síganme para ver lo simple que puede ser resolver este problema.

Conceptos previos

El background process PMON se encarga de registrar dinámicamente con el listener los servicios disponibles en una base de datos, lo cual se conoce como registro dinámico de servicios. Ahora bien, hay que tener en cuenta que por defecto las bases de datos Oracle registran sus servicios con el listener asumiendo que este está atendiendo por el puerto 1521, si se usa un puerto distinto a este se requiere de medidas adicionales para permitir que PMON sepa dónde registrar los servicios de la base de datos, o no lo logrará hacer y caeremos en el error ORA-12514.

Solución

1. No es inusual que se configure un puerto distinto al 1521, hay varias razones para ello pero principalmente se hace como medida de seguridad adicional, para prevenir ataques que aprovechan justamente que la gran mayoría deja su listener configurado con el puerto por defecto 1521, de allí que cambiarlo sea altamente recomendado.

Veamos primeramente un listener modificado (listener.ora):

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = caliope)(PORT = 15402))
    )
  )
2. Esto se debe complementar con la configuración del parámetro local_listener, para lo cual tenemos dos posibilidades, una primera en la que colocamos los datos explícitamente:
SQL> alter system set local_listener="(address=(protocol=TCP)(host=caliope)(port=15402))";
O una segunda, en que se usa una cadena de conexión que se puede resolver mediante la consulta al archivo tnsnames.ora.
SQL> alter system set local_listener=listener_bd;
El alias listener_bd debe existir localmente, como se observa a continuación (tnsnames.ora):
LISTENER_BD =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = caliope)(PORT = 15402))
  )
3. Con esto solo nos resta verificar que la conectividad está efectivamente operativa, para lo cual consideramos la siguiente cadena de conexión (tnsnames.ora):
BD =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = caliope)(PORT = 15402))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = bd)
    )
  )
Misma que probamos con SQL*Plus:
[oracle@caliope ~]$ sqlplus system/oracle@bd

SQL*Plus: Release 11.1.0.7.0 - Production on Thu Apr 1 15:19:17 2010

Copyright (c) 1982, 2008, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SYSTEM@bd >
¡Todo funcionó a la perfección!

Conclusión

¿Qué les pareció? ¿No está complicado verdad?, pero les sorprendería saber cuántos no siguen estas consideraciones y luego de crear listeneres adicionales, observan que se interrumpen las nuevas conexiones luego de detener el listener que usa el puerto 1521 y se pregunta el por qué, si se supone que esas bases de datos usan otros puertos en otros listeners; bueno, ahora ya lo saben, así que: ¡a corregir se ha dicho!

¿Te pareció interesante este artículo?, ¿te quedaron algunas dudas?, ¿quieres sugerirme un tema a tratar?, pues déjame tus comentarios o ¡contáctame ahora mismo!

Agregue un comentario

Su dirección de correo no se hará público. Los campos requeridos están marcados *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Posts Relacionados

Articulo publicado en ToadWorld, sobre cómo superar la falta de archived logs para sincronizar un standby.
El evento enq: CF - contention podría resolverse con mantenimiento al controlfile si este contiene gran numero de registros de archived logs.
Si el optimizador escoge planes de ejecucion ineficientes en queries que usan MAX o MIN, es posible que se trate del bug 5611962.

¿Necesitas Ayuda?

Completa estos datos y estaré en contacto a la brevedad.