SQL a Teradata desde Oracle (II): Oracle Database Gateways

Aprovechando que tenemos instalado en el servidor CentOS 6 el driver ODBC de Teradata y como allí hay instalado un Oracle 11g, vamos a retomar el viejo tema de la conexión de Oracle a Teradata. Anteriormente (Oracle 10g) esto se hacía mediante “Heterogeneous Services”. Más recientemente esto se hace mediante los llamados “Oracle Database Gateways”, y en nuestro caso particular con el “Oracle Database Gateway for ODBC”, heredero directo de aquellos “Heterogeneous Services” que configuramos en su día en un servidor Windows.

Los pasos son fundamentalmente los mismos, aunque con las particularidades propias del Sistema Operativo (de Windows a CentOS). También cambian algunos pequeños detalles, como los nombres de los módulos (ya no se llama “hsodbc”, sino que ahora su nombre es “dg4odbc”).

Así pues, vamos por partes.

Si queremos que la configuración ODBC sea global y no sólo para un usuario (quién sabe quién arrancará Oracle) deberemos especificarlo en el entorno (esto es análogo a la definición de DSN “de sistema” en Windows). En nuestro caso hemos creado el fichero /opt/odbc/.odbc.ini con los datos del DSN ODBC de Teradata (TD1410_SLES11, los mismos que utilizamos aquí). Definimos para ello una variable de entorno “ODBCINI” que apunte a él.

Con esto (y tras haberlo probado, con tdxodbc como también dijimos aquí) podemos comenzar.

Primero hay que crear un fichero de parámetros de inicialización para el “Gateway ODBC”. Se crea en $ORACLE_HOME/hs/admin y su nombre debe ser init<SID>.ora, siendo SID el identificador de sistema para el sitio remoto. En nuestro caso el fichero se llamará initTD1410.ora y, entre otros, contendrá los parámetros:

HS_FDS_CONNECT_INFO = TD1410_SLES11
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so

En realidad /usr/lib64/libodbc.so es un symbolic link al “driver manager” odbc de Teradata que instalamos en su día en /opt/teradata/client/ODBC_64/lib/libodbc.so

Una vez con nuestro initTD1410.ora, vamos a configurar el listener para el “Gateway”, para ello añadiremos una entrada en listener.ora:

...
  (SID_DESC= 
     (SID_NAME = TD1410)
     (ORACLE_HOME = <valor de $ORACLE_HOME>)
     (PROGRAM = dg4odbc)
     (ENVS = "LD_LIBRARY_PATH=/usr/lib64:<valor de $ORACLE_HOME>/lib")
  )

Tras hacer estas modificaciones debemos parar (lsnrctl stop) y volver a arrancar (lsnrctl start) el listener y ver que su estado (lsnrctl status) es correcto.

[carlos@CentOS6 ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.2.0 - Production
...
Service "TD1410" has 1 instance(s).
  Instance "TD1410", status UNKNOWN, has 1 handler(s) for this service...
  ...

Ahora hay que hacer que Oracle pueda comunicarse con el “Gateway”. Y esto lo hacemos mediante el nunca bien conocido y siempre temido tnsnames.ora (¡Uuuuhhhh!, ¡tnsnames, qué miedo!). Pero no es para tanto. Sólo hay que incluir el “connect descriptor” y ya está:

teradata.remote =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = CentOS6.2_64)(PORT = 1521))
    (CONNECT_DATA = (SID = TD1410))
    (HS=OK)
  )

Es muy importante no olvidarse del (HS=OK) ni de hacerse un lío con tanto paréntesis abierto y cerrado.

Podemos comprobar que todo va bien con tnsping:

[carlos@CentOS6 ~]$ tnsping teradata.remote

TNS Ping Utility for Linux: Version 11.2.0.2.0 - Production on 21-APR-2015 19:58:59

Copyright (c) 1997, 2011, Oracle.  All rights reserved.

Used parameter files:


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = CentOS6.2_64)(PORT = 1521)) (CONNECT_DATA = (SID = TD1410)) (HS=OK))
OK (0 msec)
[carlos@CentOS6 ~]$ 

Bueno, pues ya casi está. Sólo queda crear el dblink :

CARLOS@CentOS6.2_64> CREATE DATABASE LINK teradata.remote 
  2  CONNECT TO carlos IDENTIFIED BY xxxxxxxx 
  3  USING 'teradata.remote';

Database link created.

Y ver que efectivamente podemos seleccionar datos de Teradata desde Oracle:

CARLOS@CentOS6.2_64> select * 
  2  from carlos.prueba01@teradata.remote;

      ID_N D_DATE
---------- -------------------
         3 2014/09/18 00:00:00
         1 2014/09/18 00:00:00
         2 2014/09/18 00:00:00

Mission accomplished!

Saludos.

Carlos.

Anuncios

One Response to SQL a Teradata desde Oracle (II): Oracle Database Gateways

  1. […] Nota: A partir de Oracle 11 en vez de Heterogeneous Services se utiliza Oracle Database Gateways. Hay un artículo en este blog sobre el tema llamado SQL a Teradata desde Oracle (II): Oracle Database Gateways. […]

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: