Feb 18, 2015

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

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)
      )
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.

Feb 8, 2015

RAC & RAC OneNode Demo & Overview

Excelente video de Oracle RacOne Node, comenta lo básico pero bien bueno:



Feb 2, 2015

¿Como demonios puedo migrar un esquema Oracle hacia un base de datos SQL SERVER de manera rápida y fácil ?

¿Como  demonios puedo migrar un esquema Oracle hacia un base de datos SQL SERVER de manera rápida y fácil ?




Si se puede y no es tan difícil :p, gracias a la herramienta Sql Server Migration Assistanceo como le diremos ahora SSMA (ojo que es gratuita bueno como no, pues ese es justamente el enganche que hace microsoft para migrar bases de datos de otros proveedores hacia su base de datos sqlserver. Se puede migrar desde DB2, SYBASE y algunos otros más).


En este ejemplo muy básico haremos una pequeña migración de Oracle hacia SQL Server, los medios de instalación se pueden descargar desde los siguientes links:






En este proceso el ejemplo lo hice utilizando una máquina virtual Oracle VirtualBox con un sqlserver 2012 EE y con una instancia de base de datos Oracle 11gR2 dentre del mismo Sistema operativo Windows server 2008 R2.


En este ejemplo migraremos el esquema oracle ORDDATA hacia una base de datos sqlserver llamada del mismo nombre es decir ORDDATA.


El proceso de instalación es muy simple una vez descargado el ejecutable (Usen la instalación típica con esa es suficiente)




Después de terminada abran el ejecutable:


Una vez que se abra la herramienta deberemos crear un nuevo proyecto y para ejemplo dejaremos todo por defecto, eso si fijarse en la opción de Migrate to en donde se debe indicar la versión correcta del motor sql dónde importaremos.


Luego en el meno principal seleccionan la opcion “Connect to sqlserver” para conectarnos a la instancia donde importaremos la data y a continuación ingresamos los datos. Fijarse que crearemos una nueva base de datos llamada ORDDATA


Como la base de datos no existe le diremos que si:


SSMA utiliza el agente de sqlserver para realizar la migación asi que deberan subirlo y luego den continuar:


Podran ver luego la base de datos recién creada:


Luego que ya tenemos nuestro acceso al sqlserver, deberemos crear la otra parte es decir el acceso al motor de base de datos Oracle, seleccionado la opción Connect to oracle y llenando los datos necesarios para conectarnos al esquema ORDDATA el cual migraremos, sugiero usar un usuario con el ROL DBA para conectarnos a la instancia Oracle como por ejemplo el system:


Este proceso demora un poco pues SSMA empieza a cargar tablas y esquemas en al esquina inferior podrán ver el progreso de esta etapa:

Luego Chan Chan!!! podrán ver el esquema a migrar:


Seleccionenlo completo pues en este ejemplo trataremos de migrar todo lo que podamos tablas, secuencias, etc..


Ahora vienen los pasos a ejecutar, como podran ver los pasos secuenciales los pueden ver en la siguiente fotografia (en el menu el orden es desde arriba hacia abajo, es decir partiendo por create report hasta el migrate data)


Luego de esto es necesario analizar que se puede importar y que no y para eso esta la opción create report esto igual toma su tiempo asi que paciencia. En ese reporte podrán ver errores y advertencias que sqlserver muestra que pueden provocar problemas recuerden que no todo puede quedar 100% igual luego de importar.




Bueno sin más rodeos vamos a probar como queda la importación, sugiero en este momento en la parte de la base de datos sqlserver seleccionar la base de datos dónde importaremos para que luego vean el listado de tablas

Luego seleccionamos la opción convert Schema básicamente aquí se generaran los scripts



Luego proseguimos con esta opción para pasar los objetos hacia el sqlserver, de aparecer alguna otra ventana luego de esta opción es solo para indicarnos los objetos que serán creados en este ambiente sqlserver:


Podrán darse cuenta que luego en el management studio del sqlserver los objetos fueron creados pero la tablas estan sin registros (a excepción de algunas tablas propias que usa el SSMA)


Ahora si estamos en posición de migrar, en la parte de Oracle seleccionaremos la opción Migrate Data


Eso requiere de una nueva conexión por lo que pedira nuevamente conectarse a nivel de oracle y de sqlserver


y luego de esto aparecerá el siguiente reporte con información en detalle de los registros migrados en dónde se podrá apreciar aquellos que tuvieron problemas como por ejemplo a causa de tipos de datos incompatibles:




Para revisar los registros migrados pueden ejecutar esta consulta en el management studio:


y eso seria todo, claro la herramienta tiene muchas más opciones pero básicamente y resumidamente esto es lo necesario para migrar, jueguen, investiguen y apliquen estas migraciones con esas herramientas y quedarán como reyes en sus migraciones :p

Hasta la proximaaa :p