Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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:
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).
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.
archivo
/usr/local/easysoft/sqlserver/lib/libessqlsrv.sl:
PA-RISC1.1
shared
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
En versiones
posteriores sera desde men inicio > Herramientas administrativas > Orgenes
de datos ODBC
En
la
siguiente
Escribir
nombre
que
haga
referencia
esta
fuente
de
datos
ODBC.
un
He
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
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:
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
$ cp inithsodbc.ora initMYSQLSERVERDSN.ora
#
# 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>
#
# 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>
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:
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
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
Para pararlo:
del
for
HPUX:
Version
8.1.7.4.0
Production
on
30-SEP-2013
15:02:00
Conectndose a (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522))
El comando se ha ejecutado correctamente
Attempting
to
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1522))
Realizado correctamente (110 mseg)
contact
(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.
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
#
/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
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