Está en la página 1de 29

Acceso remoto mediante DBLINK a una base de

datos Oracle

La manera ms sencilla de acceder desde una base de datos Oracle a tablas y vistas (views) de
otra base de datos Oracle es mediante el uso de un DBLink (enlace a base de datos). No
obstante, en muchos casos puede no ser recomendable la utilizacin de DBLinks, ya que el
acceso a tablas y vistas remotas puede provocar importantes problemas de rendimiento en ambas
bases de datos, tanto la remota como la local. En la mayora de los casos estos problemas de
rendimiento se deben a la imposibilidad de utilizar los ndices de las tablas remotas.
Los DBLinks se crean en la base de datos local utilizando el comando PL/SQL o SQLCREATE
DATABASE LINK. Obviamente, el usuario que ejecute dicho comando debe tener los permisos
necesarios para poder hacerlo. La sintaxis del comando SQL mencionado es como sigue:
CREATE [PUBLIC] DATABASE LINK Nombre_dblink
CONNECT TO Nombre_usuario INDENTIFIED BY Contrasea
USING 'Cadena_conexion';
En donde:
Nombre_dblink es el nombre del DBLink.
Nombre_usuario y Contrasea son los identificadores que utilizar el DBLink para conectarse a
la base de datos remota. Por lo tanto, el acceso a las tablas y vistas de la base de datos remota se
har con los permisos que dicho usuario tenga sobre ellas en dicha base de datos. Si se omiten
estos valores, entonces el acceso a la base de datos remota se har con el mismo nombre de
usuario y contrasea con el que el usuario en cuestin est conectado a la base de datos local.
Cadena_conexion identifica a la base de datos remota. Puede ser el nombre de la instancia, si
sta est definida en el archivo tnsnames.ora de la base de datos origen, o tambin, para la
versin 8 de la base de datos Oracle o posteriores, podemos utilizar directamente la definicin
TNS (esto posibilita que no tengamos que modificar el fichero tnsnames.ora).
Por otro lado, si definimos el DBLink como PUBLIC, todos los usuarios tendrn acceso al mismo.
A continuacin os pongo algunos ejemplos del comando CREATE DATABASE LINK:

CREATE DATABASE LINK dbl_bd001


CONNECT TO repadmin IDENTIFIED BY reppass1
USING 'bd001';
CREATE PUBLIC DATABASE LINK dbl_bd001
CONNECT TO repadmin IDENTIFIED BY reppass1
USING '(description =
(address =
(protocol = tcp)
(host = bd.miempresa.com)
(Port = 1521) )
(connect_data =
(sid = bd001) )
)';
Una vez creado el DBLink, para referenciar una tabla o vista de la base de datos remota se ha
de indicar el nombre de la tabla o vista, concatenado con el carcter "@" y el nombre que se le ha
dado al DBLink. Las tablas y vistas remotas podrn usarse en consultas (sentencias SELECT) y, si
la base de datos Oracle utiliza el sistema de bases de datos distribuidas, entonces se podrn
ejecutar tambin sentencias SQL o PLSQL del tipo DELETE, INSERT, UPDATE o LOCK TABLE.
Asimismo, se pueden crear sinnimos para abreviar la forma de referenciar a las tablas y vistas
remotas. A continuacin os pongo algunos ejemplos de sentencias:
SELECT * FROM Nombre_tabla_remota@Nombre_dblink;
INSERT INTO Nombre_tabla_remota@Nombre_dblink (campo1)
VALUES ('prueba');
UPDATE Nombre_tabla_remota@Nombre_dblink;
SET campo1 = 'actualizado'
WHERE campo1 = 'prueba';
CREATE SYNONYM tremota
FOR Nombre_tabla_remota@Nombre_dblink;
SELECT * FROM tremota;
Nota: Existe otro concepto que no he explicado aqu y es el de los DBLinks compartidos (comando
CREATE SHARED DATABASE LINK), el que necesite ms informacin sobre este concepto puede
mirar en el manual de Oracle sobre sistemas de base de datos distribuidos (Oracle Distributed
Database Systems). Por otro lado, tambin es posible acceder mediante DBLink a bases de datos
remotas que no sean Oracle. Para crear un DBLink de este tipo, y antes de que nadie me
pregunte, podis realizar una bsqueda en Internet de las palabras: "Oracle Heterogeneous
Services". Quiz ms adelante escriba algn artculo con referencia a estos dos temas.

44 - ndices.Los ndices sirven para acceder a los registros de una tabla rpidamente, acelerando la
localizacin de la informacin.
Los ndices se emplean para facilitar la obtencin de informacin de una tabla. El indice de una
tabla desempea la misma funcin que el ndice de un libro: permite encontrar datos rpidamente;
en el caso de las tablas, localiza registros.
Oracle accede a los datos de dos maneras:
1) recorriendo las tablas; comenzando el principio y extrayendo los registros que cumplen las
condiciones de la consulta; lo cual implica posicionar las cabezas lectoras, leer el dato, controlar si
coincide con lo que se busca (como si pasramos una a una las pginas de un libro buscando un
tema especfico).
2) empleando ndices; recorriendo la estructura de rbol del ndice para localizar los registros y
extrayendo los que cumplen las condiciones de la consulta (comparando con un libro, diremos que
es como leer el ndice y luego de encontrar el tema buscado, ir directamente a la pgina indicada).
Un ndice posibilita el acceso directo y rpido haciendo ms eficiente las bsquedas. Sin ndice,
Oracle debe recorrer secuencialmente toda la tabla para encontrar un registro.
Los ndices son estructuras asociadas a tablas, una tabla que almacena los campos indexados y
se crean para acelerar las consultas.
Entonces, el objetivo de un indice es acelerar la recuperacin de informacin. La indexacin es una
tcnica que optimiza el acceso a los datos, mejora el rendimiento acelerando las consultas y otras
operaciones. Es til cuando la tabla contiene miles de registros, cuando se realizan operaciones de
ordenamiento y agrupamiento y cuando se combinan varias tablas (tema que veremos ms
adelante).
La desventaja es que consume espacio en el disco en disco y genera costo de mantenimiento
(tiempo y recursos).
Es importante identificar el o los campos por los que sera til crear un ndice, aquellos campos por
los cuales se realizan bsquedas con frecuencia: claves primarias, claves externas o campos que
combinan tablas.
No se recomienda crear ndices sobre campos que no se usan con frecuencia en consultas o en
tablas muy pequeas.
Los cambios sobre la tabla, como insercin, actualizacin o eliminacin de registros, son
incorporados automticamente.

Cuando creamos una restriccin "primary key" o "unique" a una tabla, Oracle automticamente
crea un ndice sobre el campo (o los campos) de la restriccin y le da el mismo nombre que la
restriccin. En caso que la tabla ya tenga un ndice, Oracle lo usa, no crea otro.
Oracle permite crear distintos tipos de ndices. "Normal" es el standard de Oracle, son ndices tipo
rbol binario; contiene una entrada por cada valor de clave que almacena la direccin donde se
encuentra el dato. Es el tipo predeterminado y el ms comn (el nico que estudiaremos).

Configurar los servicios


Heterogneos de ORACLE
para acceder a SQL
SERVER
7 octubre, 2013Administracin OracleCan't open lib '/usr/local/easysoft/sqlserver/lib/libessqlsrv.sl' :
can't open the module, Cannot connect to shareable /usr/local/easysoft/sqlserver/lib/libessqlsrv.sl, Could
not
SQLConnect, FIND_IMAGE_SYMBOL,heterogneos, hs, isql, LD_LIBRARY_PATH, ODBC, ORA02063, ORA-28500, SHLIB_PATH, Unable to find library 'libodbcinst.sl.1'

El objetivo de esta entrada de blog es explicar cmo configurar Oracle para poder
acceder a bases de datos SQL Server como si estuvisemos en el mismo Oracle.
La idea parece fabulosa y de hecho lo es. Porque con lo que explicar
seguidamente, podrs conectar cualquier Base de datos Oracle 8.x o superior a
SQL Server 7.0, SQL Server 2000, SQL Server 2005, SQL Server 2008, SQL
Server 2012 y SQL Server Express.
Servicios heterogneos de Oracle es un componente integrado en el servidor de
base de datos Oracle. Permite el acceso SQL transparente desde un cliente de
Oracle para los sistemas que no son de Oracle como si el sistema no Oracle fuera
una base de datos Oracle . En este ejemplo vamos a utilizar el agente de Servicios
heterogneo ODBC (HSODBC) con productos Easysoft, esta funcionalidad puede
ser extendida en plataformas que no sean Windows para incluir cualquier base de
datos compatible con ODBC o JDBC.

Es muy importante saber que HSODBC es normalmente una aplicacin de 32 bits


incluso cuando se distribuye con una versin de 64 bits de Oracle. Es necesario
utilizar el HSODBC 32 bits con un controlador ODBC Easysoft de 32 bits. Para las
plataformas de 64 bits, seleccionar tambin la versin de 32 bits del controlador,
incluso cuando haya una versin de 64 bits disponible, ya que los controladores de
32 bits seguirn funcionando correctamente en una plataforma de 64 bits.
Para comprobar si tenemos una versin de 32 bits o 64 bits de HSODBC, en la
mquina de Oracle, ejecutaremos:
$ORACLE_HOME/bin/hsodbc

Si la salida del comando contiene ELF-Class64 (o algo similar, como ELF-64 o


ELF 64-bit), tenemos un HSODBC 64 bits. De lo contrario, tenemos una versin de
32 bits.
Otra manera de saber si un fichero es de 32 o 64 bits es mediante el uso del
comando UNIX file, se puede determinar relativamente fiable si el programa
utilizado y la biblioteca existen en 32 bits o en forma de 64 bits. Ejemplo de uso:
<programa>
<biblioteca> archivo

archivo

Si la lnea de resultados contiene un 64 , el archivo existe en la versin de 64 -bit


. De lo contrario , se puede asumir que se trata de la versin de 32 -bit .
Si se determina que la inconsistencia entre <programa> y <biblioteca> llamando el
comando file , hay que corregir la incompatibilidad ajustando las variables de
entornoSHLIB_PATH (HP-UX) en nuestro ejemplo, LIBPATH (en sistemas AIX) y
LD_LIBRARY_PATH en otras variantes de Unix.
Ejemplo de ejecucin de file que nos muestra que es de 32 bits:
$ file /usr/local/easysoft/sqlserver/lib/libessqlsrv.sl

/usr/local/easysoft/sqlserver/lib/libessqlsrv.sl:

PA-RISC1.1

shared

library -not stripped

Ejemplo de ejecucin de file que nos muestra que es de 64 bits:


$ file /usr/local/easysoft/sqlserver/lib/libessqlsrv.sl
/usr/local/easysoft/sqlserver/lib/libessqlsrv.sl: ELF-64 shared object
file - PA-RISC 2.0 (LP64) Si $ORACLE_HOME/bin/hsodbc no est presente,
debermos instalarlo para poder seguir con el proceso de configuracin
de esta entrada de blog.

En referencia al driver ODBC que vamos a utilizar en la parte Unix (donde tengo
instalado el servidor Oracle) puedes ampliar la informacin en:
http://www.easysoft.com/products/data_access/odbc-sql-server-driver/index.html
En este ejemplo conectaremos un Oracle 8.1.7.4 instalado en un Unix HP-UX
11.11 a unSQL Server 2005.
Para llevar la tarea a cabo. Se realizarn los siguientes pasos:
En
el
Servidor
destino
SQL
1.- Definir un nombre de origen de datos (DSN) para SQL Server.

SERVER

En
el
servidor
Orgen
por
la
parte
de
Oracle
2.- Crear un fichero de inicializacin de los servicios heterogneos.
3.Crear
un
nuevo
listener
dentro
del
fichero
listener.ora.
4.Aadir
una
nueva
entrada
en
el
fichero
tnsnames.ora.
5.- Crear un Database Link en Oracle.
En
el
servidor
Orgen
por
la
parte
de
Unix
6.- Instalar/configurar el driver ODBC en el sistema Unix donde reside el servidor
Oracle.
7.- Posibles errores durante la configuracin

8.- Juego de pruebas de comprobacin de correcta instalacin


En el Servidor destino SQL SERVER
1.- Definir un nombre de origen de datos (DSN) para SQL Server.
En primer lugar accederemos como administradores al servidor destino SQL
Server. Y crearemos el ODBC de la siguiente manera:
En versiones ms antiguas . Desde el panel de control .

En versiones
posteriores sera desde men inicio > Herramientas administrativas > Orgenes
de datos ODBC

Importante: Seleccionar la pestaa SystemDSN y pulsar doble click o Add

En

la

siguiente

pantalla seleccionaremos el controlador (driver) de SQL Server ya que esta


ser una conexin a SQL Server. Heremos clic en Finalizar para continuar con la
definicin del origen de datos.

Escribir
nombre

que

haga

referencia

esta

fuente

de

datos

ODBC.

un
He

elegidoMYSQLSERVERDSN por simplificar el entendimiento, pero debe ser


descriptivo de la base de datos que conecte dentro de SQL Server. Tambin
puede describir el origen de datos en la forma que desee. Como en mi caso se
conecta en local dejo Server local. Hacer click en Siguiente Next para continuar
(no en finish).

Seleccionaremos autentificacin mediante Windows si tenemos usuario de red. En


mi caso, tena el usuario y clave del administrador de Windows.

En
general, en la siguiente ventana se rellena con la base de datos de SQL Server
predeterminada de maestro. Haga clic en la casilla de verificacin para cambiar
la base de datos predeterminada y selecciona la Base de datos a usar en
la conexin ODBC. En mi ejemplo, la base de datos de SQL SERVER a la que nos
vamos a conectar ser bbddsqlserver y el usuario administrador ser sa y
clave sa_clave.
Hacer click en Siguiente para continuar.

En

la

siguiente pantalla pulsar Finish.

Aperecer
una ventana con
la
informacin
que
hemos
configurado para
que
comprobemos los ajustes que hemos configurado para el origen de
datos. Haremos click en Probar origen de datos para validar su definicin. Y si
todo ha ido correctamente saldr una pantalla como la siguiente:

Lo instalado debe aparecer como un DSN de sistema vlido como se ve en la


siguiente pantalla. Si en un futuro se desea modificar algo, basta con editarlo
pulsando en Configure pero tendremos que volver a borrar y crear el dbLink en la
parte de Oracle para activar de nuevo las modificaciones realizadas en el ODBC.

Hacer click en
Ok para salir del administrador de la DSN. Ya tenemos la parte de Windows
realizada.
Ahora pasaremos a configurar la parte de Oracle .
En
el
servidor
Orgen
por
la
parte
de
2.- Crear un fichero de inicializacin de los servicios heterogneos.

Oracle

Dentro del directorio $ORACLE_HOME/hs/admin Oracle tiene unos ficheros init de


ejemplo que usaremos para configurar el nuestro. Sino existe el directorio es
porque Oracle Servicios heterogneos no est instalado y se tendr que instalar.
(Estar en el CD de Oracle Enterprise Edition probablemente). En mi caso, como
si est instalado, lo que haremos ser copiar el fichero de ejemplo con otro
nombre en el mismo directorio, luego lo editaremos con la informacin de mi
configuracin:
Se hace as
$ cd $ORACLE_HOME/hs/admin

$ cp inithsodbc.ora initMYSQLSERVERDSN.ora

Este es el contenido del fichero de muestra:


# This is a sample agent init file that contains the HS parameters
that are
# needed for an ODBC Agent.

#
# HS init parameters
#
HS_FDS_CONNECT_INFO = <odbc data_source_name>
HS_FDS_TRACE_LEVEL = <trace_level>
HS_FDS_TRACE_FILE_NAME = <log file name>
HS_FDS_SHAREABLE_NAME = <full path name of odbc driver manager or
driver>

#
# ODBC specific environment variables
#
set ODBCINI=<full path name of the odbc initilization file>

#
# Environment variables required for the non-Oracle system
#
set <envvar>=<value>

Este es el fichero ya editado con los valores de mi instalacin:


# This is a sample agent init file that contains the HS parameters
that are
# needed for an ODBC Agent.

#
# HS init parameters
#
HS_FDS_CONNECT_INFO = MYSQLSERVERDSN
HS_FDS_TRACE_LEVEL = 0
HS_FDS_TRACE_FILE_NAME =/tmp/hsodbcsql.trc
HS_FDS_SHAREABLE_NAME
=/usr/local/easysoft/sqlserver/lib/libessqlsrv.sl

#
# ODBC specific environment variables

#
set ODBCINI=/etc/odbc.ini

#
# Environment variables required for the non-Oracle system
#
#set <envvar>=<value>

En negrita aparecen los valores que yo he aadido y he eliminado la # de


comentario del principio de cada lnea. Son los valores que necesita un SA para
usar un agente ODBC. Explicar alguno de los parmetros, pero para ms
informacin consultar la documentacin de Oracle y/o la de Easysoft Driver
configuration.
HS_FDS_CONNECT_INFO es el nombre del origen de datos tal como se escribi
dentro de/etc/odbc.ini Tener en cuenta que como hsODBC utiliza la API de
ODBC SQLDriverConnect, en realidad se puede poner cualquier cadena de
conexin ODBC vlida aqu. Dentro de /etc/odbc.ini tendremos los datos de
conexin del servidor SQL Server.
HS_FDS_TRACE_LEVEL determina el nivel de rastreo. Como el rastreo ralentiza
las operaciones he puesto 0. Sin embargo, si tenemos problemas
HS_FDS_TRACE_LEVEL puede ajustarse a un nmero del 1 al 4 (donde 4 es el
ms detallado) y la salida de rastreo se escribe en el archivo especificado con
HS_FDS_TRACE_FILE_NAME.
HS_FDS_SHAREABLE_NAME es el nombre de la shared library, coincide con el
nombre del driver a utilizar (dentro del campo driver en /etc/odbc.ini). Para saber
que driver se va a utilizar podemos ejecutar $ ./odbcinst -j dentro de la
ruta/usr/local/easysoft/unixODBC/bin para nuestro ejemplo, ya que nosotros

usamos un driver ODBC de Unix de la empresa Easysoft. Veremos todo esto en la


parte de instalacin/configuracin del driver al final de esta entrada de blog.
3.- Crear un nuevo listener dentro del fichero listener.ora.
En el mismo directorio anterior, tambien tenemos un ejemplo de listener.ora y
tnsnames.ora. Yo lo que hice, fue utilizar el contenido de este ejemplo y aadirlo al
listener.ora de toda la vida ubicado en $ORACLE_HOME/network/admin. Lo que
realmente se debe tener en cuenta es especificar el PROGRAM y que el SID
name coincida con el que vamos a configurar en el tnsnames.ora. En negrita est
todo lo modificado y de mayor importncia:
Contenido del listener.ora adecuado:
LISTENERMYSQLSERVERDSN =
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522))
(ADDRESS=(PROTOCOL=ipc)(KEY=PNPKEY)))

SID_LIST_LISTENERMYSQLSERVERDSN=
(SID_LIST=
(SID_DESC=
(SID_NAME=MYSQLSERVERDSN)
(ORACLE_HOME = /psg_oetc/oracle)
(PROGRAM=hsodbc)

(ENVS=LD_LIBRARY_PATH

/usr/local/easysoft/unixODBC/lib:/usr/local/easysoft/
lib:$ORACLE_HOME/lib32:/usr/local/easysoft/sqlserver/lib)
)
)

A tener en cuenta
- Se puede usar el puerto 1522 para evitar conflictos con otro listener o con el de
por
defecto
de
ORACLE
1521.
- Se debe parar y volver a arrancar para que los cambios tengan efecto. Podemos
hacer
un
tnsping
para
comprobar
que
todo
est
Ok.
- La variable ENVS puede omitirse, creo que funcionara igual, siempre y cuando
definamos correctamente las variables de entorno LD_LIBRARY_PATH y
SHLIB_PATH
(HP-UX).
- Tened en cuenta que la variable de entorno $ORACLE_HOME/lib32 slo s
encontrar en sistemas de 32 bits. Para sistemas operativos de 64 bits, poner
lib64 ($ORACLE_HOME/lib64).
Para arrancar el listener hacer:
$ lsnrctl start LISTENERMYSQLSERVERDSN
TNSLSNR for HPUX: Version 8.1.7.4.0 - Production
El

fichero

de

parmetros

del

sistema

es

/oracle/network/admin/listenera
Mensajes

del

log

escritos

en

/oracle/network/log/listenermysqlserverdsg
Recibiendo
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=servidor_local)(POR)

en:

Recibiendo en: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=PNPKEY)))

Conectndose a (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522))
ESTADO del LISTENER
-----------------------Alias

LISTENERMYSQLSERVERDSN

Versin

TNSLSNR

for

HPUX:

Version

8.1.7.4.0

Production
Fecha de Inicio

30-SEP-2013 14:56:05

Tiempo de actividad

0 das 0 hr. 0 min. 0 seg.

Nivel de Rastreo

off

Seguridad

OFF

SNMP

OFF

Fichero
Listener

de

Parmetros

del

/oracle/network/admin/listener.ora

Fichero
Listener

Log
/oracle/network/log/listenermysqlserverdg

Resumen de servicios...
MYSQLSERVERDSN

tiene 1 gestor(es) de servicio

El comando se ha ejecutado correctamente

Para pararlo:

del

$ lsnrctl stop LISTENERMYSQLSERVERDSN


LSNRCTL

for

HPUX:

Version

8.1.7.4.0

Production

on

30-SEP-2013

15:02:00

(c) Copyright 1998 Oracle Corporation.

All rights reserved.

Conectndose a (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522))
El comando se ha ejecutado correctamente

Para comprobar que funciona:


Nota: Antes de hacer la prueba debemos tener definida la instancia
MYSQLSERVERDSN en el fichero tnsnames.ora como se explica en el siguiente
punto. Observar que se hace el tnsping al nombre de la instancia y no al nombre
del listener creado.
$ tnsping MYSQLSERVERDSN
TNS Ping Utility for HPUX: Version 8.1.7.4.0 - Production on 30-SEP2013 15:00:1

(c) Copyright 1997 Oracle Corporation.

Attempting

All rights reserved.

to

(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522))
Realizado correctamente (110 mseg)

contact

4.- Aadir una nueva entrada en el fichero tnsnames.ora.


Un ejemplo de tnsnames.ora lo podemos encontrar tambin en
$ORACLE_HOME/hs/admin. Lo importante en este caso, es tambin lo que
tenemos subrayado en negrita.
MYSQLSERVERDSN
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522))
(CONNECT_DATA=(SID=MYSQLSERVERDSN))

(HS=OK)
)
Lo ms destacable en este punto es sobretodo:
- Indicar correctamente el nombre de la instancia SID. Esta cadena es la que
usaremos en las llamadas a los ficheros odbc.ini en los drivers ODBC del sistema
Unix e incluso ser el nombre del ODBC del sistema Windows donde reside SQL
Server.
- He puesto el puerto 1522 para evitar conflictos con el de por defecto de Oracle
1521. Debemos tener en cuenta que el puerto que pongamos tiene que estar
abierto. Sino estamos seguros, realizar todo el proceso con el puerto 1521 y
despus de la instalacin cambiar al puerto deseado. Parar y volver a arrancar el
listener y ya estara.
- El valor de HS se pone a OK para que Oracle use los servicios heterogneos.
5.- Crear un Database Link en Oracle.
Se ha de crear un Database link, porque ser de esta manera el cmo
realizaremos las consultas desde SQL de Oracle al servidor No-Oracle que en
este caso ser un SQL SERVER. Es decir, con el @MYSQLSERVER despus
de cada consulta que hagamos. Lo vermos ms adelante con algn ejemplo de
consulta al servidor destino.

CREATE PUBLIC DATABASE LINK MYSQLSERVERDSN CONNECT TO "sa" IDENTIFIED BY


"as" USING 'MYSQLSERVERDSN';

Muy importante a tener en cuenta a la hora de crear el database link:


- Crearlo con el usuario system en la BBDD Oracle, la cual nos conectaremos a
sqlplus
cuando
queramos
acceder
a
SQL
Server.
- Tanto el usuario como la clave de la conexin, ponerla en comillas dobles y el
SID de despues del using ponerlo en comillas simples. Sino se hace as, es
posible que Oracle te permita crear el database link, pero no te funcionar.
- Creamos el database link como public para que todos los usuarios puedan
acceder
a
la
consulta
del
SQL
Server.
- Para que el DBLlink funcione nos debemos asegurar de que el parmetro
global_names del init.ora de la BBDD Oracle est definido como FALSE. Para
ello podemos realizar la siguiente consulta:
SELECT * FROM v$parameter
WHERE name LIKE 'global_names%';

Si el parmetro est seteado a TRUE deberemos cambiarlo en el fichero init.ora


y volver a reiniciar la BBDD antes de crear el DB Link.
En
el
servidor
Orgen
por
la
parte
de
Unix
6.- Instalar/configurar el driver ODBC en el sistema Unix donde reside el servidor
Oracle.
Seguir la documentacin explicada en la entrada de blog del enlace anterior. Para
realizar la instalacin del Driver ODBC para Unix. En este ejemplo he utilizado el
facilitado por la empresa Easysoft y que requiere de licencia.
7.-Posibles errores durante la configuracin

Es muy probable que durante la configuracin de alguno de los procesos


anteriores, nos encontremos con algn error. Seguidamente detallo alguno de los
errores encontrados y la solucin aplicada. He de comentar, que si se ha seguido
al pie de la letra la documentacin, estos errores no deberan producirse. Ya que
la documentacin se ha hecho dndo ya la solucin a los mismos.
Error 1
Al ejecutar
# ./odbcinst -j
/usr/lib/pa20_64/dld.sl: Unable to find library 'libodbcinst.sl.1'.
Killed

Solucin
Este error en concreto es debido a que no encuentra una librera de 64 bits
cuando en realidad necesitbamos una de 32 bits. La solucin fue borrar la
versin de 64 bits (explicado en esta entrada de blog), descargar la versin del
driver para 32 bits e instalarla.
Error 2
SQL> select * from dual@MYSQLSERVERDSN;
/usr/lib/dld.sl: Bad magic number for shared library:
/usr/local/easysoft/sqlsel/usr/lib/dld.sl: Exec format error
select * from dual@MYSQLSERVERDSN
*
ERROR en lnea 1:
ORA-28500: la conexin de ORACLE a un sistema no Oracle ha devuelto este
mensaje:[Generic Connectivity Using ODBC]Exec format error; at
FIND_IMAGE_SYMBOL
Cannot connect to shareable /usr/local/easysoft/sqlserver/lib/libessqlsrv.sl.
Using dummy functions
ORA-02063: 3 lines precediendo a MYSQLSERVERDSN

Solucin
Aadir los valores en negrita a las variables de entorno LD_LIBRARY_PATH y
SHLIB_PATH.
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/easysoft/sqlserver/lib
export SHLIB_PATH=$SH_LIB_PATH:/usr/local/easysoft/sqlserver/lib

Error 3
$ ./isql -v MYSQLSERVERDSN sa as
[01000][unixODBC][Driver Manager]Can't open lib
'/usr/local/easysoft/sqlserver/lib/libessqlsrv.sl' : can't open the
module
[ISQL]ERROR: Could not SQLConnect

Solucin
Esto es porque dentro del directorio /usr/local el directorio easysoft no tiene
permisos de lectura/ejecucin de alguna librera. Se soluciona entrando en
/usr/local y ejecutando conectado como root:
# cd /usr/local
#

chmod -R 777 easysoft

Otros Errores comunes


ERROR en lnea 1:
ORA-28500: la conexin de ORACLE a un sistema no Oracle ha devuelto
este

mensaje:[Generic Connectivity Using ODBC]Exec format error; at


FIND_IMAGE_SYMBOL

La mayora de los errores que se producen durante este tipo de instalacin es o


bien:
- Porque no se estn instalando los drivers adecuados en cuanto a la versin de
32 o 64 bits.
- Porque no se ha definido o no se ha definido de manera adecuada las variables
de entorno LD_LIBRARY_PATH (cualquier sistema o variante de Unix)
y SHLIB_PATH (HP). En entornos (AIX) en lugar de SHLIB_PATH se usa
LIBPATH.
- Cuando falla alguna librera, y normalmente es por los motivos comentados
anteriormente. Es decir, se ha instalado una de 64 bits cuando necesitamos 32
bits, una manera de ver donde enlaza la librera es usando el comando chatr
<nombre_libreria>.
Ejemplo:
$ chatr $ORACLE_HOME/lib/libclntsh.sl

/oracle/lib/libclntsh.sl:
shared library
shared library dynamic path search:
SHLIB_PATH enabled first
embedded path disabled second Not Defined
internal name:
libclntsh.sl.8.0
shared library list:
dynamic /oracle/lib/libwtc8.sl
dynamic /usr/lib/librt.2
dynamic /usr/lib/libpthread.1
dynamic /usr/lib/libnss_dns.1

dynamic /usr/lib/libdld.2
dynamic /usr/lib/libm.2
dynamic /usr/lib/libc.2
dynamic /usr/lib/libcl.2
shared vtable support disabled
static branch prediction disabled
executable from stack: D (default)
kernel assisted branch prediction enabled
lazy swap allocation disabled
text segment locking disabled
data segment locking disabled
third quadrant private data space disabled
fourth quadrant private data space disabled
third quadrant global data space disabled
data page size: D (default)
instruction page size: D (default)
nulptr references enabled
shared library private mapping disabled
Solucin
Podemos asegurarnos de que estas rutas estn definidas en la variable de
entorno PATH.
8.- Juego de pruebas de comprobacin de correcta instalacin
Una vez acabada la instalacin realizar las siguientes comprobaciones.
- Aadir las variables de entorno LD_LIBRARY_PATH y SHLIB_PATH al entorno
o .profile del usuario Oracle.
- Comprobar que el ODBC est instalado de manera adecuada y me informo de
dnde estn los drivers:
En la ruta
cd /usr/local/easysoft/unixODBC/bin

# ./odbcinst -j

Si al ejecutar sale el error:


./odbcinst -j
/usr/lib/dld.sl: Can't open shared library: /usr/home_dir/svnbuild32/external/p
roducts/unixodbc_2_3/threaded/lib/libodbcinst.sl.1
/usr/lib/dld.sl: No such file or directory
Abort(coredump)

Solucin
Hay que borrar el fichero core que ha generado en el directorio y cargar con
valores adecuados las variables de entorno LD_LIBRARY_PATH y SHLIB_PATH.
Ejemplos vlidos:
export
LD_LIBRARY_PATH=$ORACLE_HOME/jdbc/lib:$ORACLE_HOME/lib:/usr/local/easy
soft/sqlserver:/usr/local/easysoft/lib:/usr/local/easysoft/unixODBC/li
b:/usr/local/easysoft/sqlserver/lib
export
SHLIB_PATH=$ORACLE_HOME/jdbc/lib:$ORACLE_HOME/lib:/usr/local/easysoft/
sqlserver:/usr/local/easysoft/lib:/usr/local/easysoft/unixODBC/lib:/us
r/local/easysoft/sqlserver/lib

Ahora comprobar que la conexin del driver ODBC funciona:


cd /usr/local/easysoft/unixODBC/bin
./isql -v MYSQLSERVERDSN sa as

Si esto falla, es porque no puede leer las librerias.


Solucin
# cd /usr/local
#

chmod -R 777 easysoft

Ahora me conecto a sqlplus de Oracle y compruebo que accedo al servidor de


SQL Server:
Antes de hacer esto. Podemos asegurarnos de parar y volver a arrancar el listener
con las variables de entorno LD_LIBRARY_PATH y SHLIB_PATH adecuadamente
configuradas. Porque sino nos podemos encontrar que esto no funcione.
sqlplus system/password
SQL> select * from dual@MYSQLSERVERDSN;
ninguna fila seleccionada

Que no devuelva ninguna fila es posible. Lo importante es que no d errores de


Oracle u otros errores. Tambin podemos probar con alguna tabla que sepamos
que existe en el SQL Server de destino. Pero no olvidarse, en este caso, de poner
el nombre del propietario de la tabla delante y usar el DBLink a la hora de hacer la
select.
Ejemplo:
SQL> select * from usuario.tabla@MYSQLSERVERDSN;

También podría gustarte