Cómo configurar DBLink de Oracle Hacia SQLServer y evitar típicos errores tal como: ORA-28545: error diagnosed by Net8 when connecting to an agent
Quizás a muchos les ha sucedido que les aparece el error ORA-28545: error diagnosed by Net8 when connecting to an agent, cuando consultan una tabla desde Oracle hacia un dblink en sqlserver, luego de haberlo configurado después de muchas batallas.
Ese error se produce por tres cosas:
1.- Mal configuración del DNS u ODBC. Es decir se definió mal el nombre, servidor o ip del servidor sql de destino.
2.- Se está ocupando un driver ODBC DNS de 32 Bits para conectarse desde un servidor Oracle 64 bits hacia el dblink sqlserver. Lamentablemente no tengo el link Oracle en este minuto en donde comentan que para conectarse desde un motor oracle 64 bits se necesitan los drivers ODBC para sqlserver de 64 Bits, yo en lo personal he probado con uno de 32 Bits y me dio problemas.
3.- La configuración de los archivos init[ODBC_NAME].ora, tnsnames o listener.ora tienen problemas de configuración
Para evitar tales problemas revisemos cómo se realiza correctamente la configuración de un dblink desde oracle hacia sqlserver. En este ejemplo he utilizado Oracle 11gR2 sobre windows 2008 R2 y como destino SQL Server 2012.
Como primer paso debemos configurar el ODBC hacia el ambiente sqlserver que deseamos, no detallare esto pues muchos han realizado este paso y para no retrasar más esto, les pongo el ejemplo del ODBC que he creado, le puse por nombre hsodbc, el cual se conecta a una base de datos sqlserver en un servidor llamado TEST, la base de datos sqlserver a la cual nos conectaremos lleva por nombre también hsodbc:
Esto es importante: este alias en la fotografía anterior llamado hsodbc debe ser del tipo System DNS, no User DNS. Además es importante utilizar un driver ODBC adecuado para los ambientes. Como me estoy conectando desde un ambiente Oracle de 64 bits hacia un ambiente sql también de 64 Bits deben instalar los drivers de 64 Bits del ODBC para sqlserver. Estos pueden ser descargados desde la siguiente página:: https://www.microsoft.com/en-us/download/confirmation.aspx?id=36434
(recordar solo bajar los de 64 Bits) luego de instalarlo podrán ver que aparecerá un nuevo registro en la pestaña drivers. Al crear el alias deben usar este driver instalado:
Bueno luego que ya han configurado el driver ODBC es necesario que ingresen a la carpeta %ORACLE_HOME%\hs\admin (Oracle_home) en dicha carpeta deberian ver los siguientes archivos:
De estos archivos copiaran el primero de ellos el archivo initdg4odbc.ora y le pondrán por nombre: inithsodbc.ora. Este archivo con extensión *.ora es el archivo de configuración para conectarse al ODBC creado anteriormente y debe llevar por nombre init[NOMBRE_ODBC_CREADO].ora es decir inithsodbc.ora
Este archivo debería contener las siguientes líneas (puede contener muchas más pero para este ejemplo sólo bastará lo siguiente):
HS_FDS_CONNECT_INFO = hsodbc
HS_FDS_TRACE_LEVEL = 0
El parámetro HS_FDS_CONNECT_INFO llevará como valor el ODBC creado anteriormente: Ejemplo;
Como se podrán dar cuenta hasta aquí con esta configuración estaremos usando una excelente tecnología de Oracle llamada Heterogeneous Agent el cual es parte del software Oracle Database Gateway for ODBC (en realidad ese era el nombre que tenia antes esta herramienta Heterogeneus Agent ahora llamada asi a secas Database Gateway). De hecho si ejecutan el binario dg4odbc podrán ver la versión del gateway instalada en vuestro servidor:
Bueno realizado esto sobre el archivo init nuestro, nos queda configurar el listener.ora y tnsnames.ora. Para esto bueno nos vamos a la carpeta ORACLE_HOME/network/admin y antes de editar esos archivos sugiero respaldarlos. Ojo que dentro de la carpeta ORACLE_HOME\hs\admin existen ya unos archivos ejemplo para tnsnames y listener que pueden utilizar. Eso se los doy como un tips.
Partamos por la configuración del listener.ora Para ese archivo debemos agregar las siguientes líneas al registro SID_LIST_LISTENER nuestro configurado (si desean incluso pueden generar un nuevo listener como ustedes deseen):
(SID_DESC=
(SID_NAME=hsodbc)
(ORACLE_HOME = D:\oracle\product\11.2.0\dbhome_1)
(PROGRAM=dg4odbc)
)
(SID_NAME=hsodbc)
(ORACLE_HOME = D:\oracle\product\11.2.0\dbhome_1)
(PROGRAM=dg4odbc)
)
Es muy importante utilizar el PROGRAM=dg4odbc siempre debe estar con ese valor independiente del nombre ODBC que ocupemos, si en este ejemplo usamos un valor tal como: PROGRAM=hsodbc al momento de invocar el dblink desde el ambiente Oracle aparecerá el error: ORA-28545: error diagnosed by Net8 when connecting to an agent. Así que no olvidar aquello. Esto es porque en las versiones 10g o más antiguas se ocupaba el hsodbc, pero para este caso que es un oracle 11g debemos usar dg4odbc.
Para que no queden dudas Heteregoneous Services es un producto que fue reemplazado en 11g por Database Gateway, en este caso la versión de DG que estamos ocupando no requiere pago de licencia adicional, ver la nota Oracle Support ID 232482.1 en dónde explican y detallan esto.
Bueno aclarando lo anterior y siguiendo con nuestra configuración lo anterior es la única configuración que he hecho pues ese nuevo nombre de servicio lo sacaré por el mismo listener con el cual contaba anteriormente.
Ahora es necesario configurar el tnsnames.ora agregando un nuevo registro como el siguiente:
hsodbc =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1532))
(CONNECT_DATA=(SID=hsodbc))
(HS=OK)
)
En el PORT usamos bueno el puerto del listener actual. El SID debemos usar el nombre del init creado o del ODBC creado en un comienzo. Lo que no debe olvidarse es usar el (HS=OK) Si no esto no nos funcionará. De ahi el nombre de dicha keyword HS -> Heterogeneous Services.
Bueno a continuación les dejo como ejemplo mis dos archivos listener.ora y tnsnames.ora configurados:
# listener.ora Network Configuration File: D:\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.
listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = test1)
(ORACLE_HOME = D:\oracle\product\11.2.0\dbhome_1)
(SID_NAME = test1)
)
(SID_DESC =
(PROGRAM = extproc)
(SID_NAME = CLRExtProc)
(ORACLE_HOME = D:\oracle\product\11.2.0\dbhome_1)
)
(SID_DESC=
(SID_NAME=hsodbc)
(ORACLE_HOME = D:\oracle\product\11.2.0\dbhome_1)
(PROGRAM=dg4odbc)
)
)
LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =localhost)(PORT = 1532))
)
ADR_BASE_LISTENER = D:\oracle
TNSNAMES.ORA
hsodbc =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1532))
(CONNECT_DATA=(SID=hsodbc))
(HS=OK)
)
Luego de configurado estos dos archivos deben recargar la configuración del listener con el comando lsnrctl reload y si gustan pueden hacer alguna prueba con el comando tnsping hsodbc 3 el cual no debería darles problemas:
Y bueno ya hecho eso sólo nos queda configurar el dblink desde el ambiente SQLSERVER:
SQL> create database link "TEST" connect to "USUARIO" identified by "PASSWORD" using 'hsodbc';
Database link created.
De lo anterior TEST es el nombre del dblink, USUARIO y PASSWORD son los datos de conexión hacia el ambiente sqlserver. No olividar que el usuario y password DEBEN ir en comillas dobles sino tendrán el error ORA-28545. Por último dentro del comando using debemos poner el nombre de nuestro ODBC configurado.
Luego de esto deberíamos estar en condiciones de probar nuestro dblink el cual no debería dar problemas: En este ejemplo consultaré una tabla que tengo en mi servidor sqlserver llamada tabla_test:
SQL> select * from tabla_test@TEST;
CAMPO_XXXX CAMPO_YYYY
---------- --------------------------------------------------
1111111111 Oracle
2222222222 SQL Server
SQL>
y sería absolutamente todo. Eso es todo lo que deben configurar nada más. Por lo menos para lo básico. Espero que haya sido algo de utilidad este tutorial cualquier consulta me la pueden enviar a felipe@felipedonoso.cl o dba@felipedonoso.cl
PD: Este tutorial nación de un problema que tuve al crear un dblink en un cliente. A pesar que había configurado bastantes veces este dblink me estaba topando con un problema que no podía resolver, obtenía el error: ORA-28545: error diagnosed by Net8 when connecting to an agent y no podía arreglarlo. Finalmente la causa de todo este problema radicaba en que en el registro del listener.ora estaba usando (PROGRAM=hsodbc) en vez de usar el correcto (PROGRAM=dg4odbc). Recuerden que estamos haciendo la prueba para un Oracle11g si fuese 10g o más antiguo se debe ocupar (PROGRAM=hsodbc). Es lo que les comentaba anteriormente, por simples detalles pueden perder bastante tiempo, cuando lo arreglé me sentí asi de glorioso y victorioso:
Saludos :p que estén bien.