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))
)
)
SQL> alter system set local_listener="(address=(protocol=TCP)(host=caliope)(port=15402))";
SQL> alter system set local_listener=listener_bd;
LISTENER_BD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = caliope)(PORT = 15402))
)
BD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = caliope)(PORT = 15402))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = bd)
)
)
[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 >
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!