Las interconexiones de servidores de bases de datos son operaciones que pueden ser muy útiles en diferentes contextos. Básicamente, se trata de acceder a datos que no están almacenados en nuestra base de datos, pudiendo combinarlos con los que ya tenemos.
Enlace entre dos servidores Oracle
Vamos a tener dos maquinas Debian con Oracle 12c instalado, el cual hemos instalado mediante este script Script Oracle12c Manuel Alcocer.
El primer paso es modificar los ficheros que se encuentran en $ORACLE_HOME/network/admin
en ambas maquinas, lo vamos a abrir con el editor de texto y vamos a hacer que quede asi:
Oracle 1
Vamos a configurar tanto el listener.ora
como el tnsname.ora
listener.ora
# listener.ora Network Configuration File: /opt/oracle/product/12.1.0.2/db_home_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) )
Una vez modificado el fichero «listener.ora» reiniciamos lsnrctl stop
y lsnrctl start
tnsnames.ora
Posteriormente modificamos el fichero /opt/oracle/product/12.1.0.2/db_home_1/network/admin/tnsnames.ora
, y lo modificamos para que quede asi:
# tnsnames.ora Network Configuration File: /opt/oracle/product/12.1.0.2/db_home_1/network/admin/tnsnames.ora # Generated by Oracle configuration tools. LISTENER_ORACLE1 = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ORACLE1 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = oracle1) ) ) ORACLE2 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.59)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = oracle2) ) )
Podemos observar que nuestra maquina oracle1
se encuentra escuchando en el puerto 1521
Oracle 2
Al igual que el fichero anterior vamos a hacer que tengan acceso todas las direcciones IP, dado que este va a actuar como servidor y solo vamos a modificar el fichero listener.ora
:
# listener.ora Network Configuration File: /opt/oracle/product/12.1.0.2/db_home_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) )
Reiniciamos listener lsnrctl stop
y lsnrctl start
Comprobación de ping entre ellas
Para ello hacemos ping
desde una maquina a otra y viceversa como podemos observar en la siguiente captura:
Conexión entre servidores
Para realizar la conexión vamos a crear un enlace desde oracle1 a oracle2, para crear el enlace vamos a acceder en oracle1
como usuario system :
SQL> create database link scottlink 2 connect to scott identified by tiger 3 using 'oracle2'; Database link created.
El enlace creado es al esquema de prueba scott
, ahora accedemos al usuario scott en oracle1
a sql scott/tiger
y ejecutamos la siguiente consulta select * from emp@scottlink;
esto muestra la tabla emp
del enlace creado hacia el servidor oracle2
Otra forma de comprobar que nos podemos conectar a la base de datos es desde oracle1
intentar acceder al usuario scott
de oracle2
para elle ejecutamos el siguiente comando sql scott/tiger@[IP_ORACLE2]/oracle2
Conexión de postgresql a postgresql
Tendremos un escenario con dos maquinas postgresA
y postgresB
, primero vamos a instalar postgres y vamos a hacer las diferentes configuraciones:
Permitir el acceso remoto
PostgresA
Instalamos postgresql apt install postgresql
.
Posteriormente descomentamos la siguiente linea y la modificamos para que quede asi en /etc/postgresql/9.4/main/postgresql.conf
:
listen_addresses = "*"
Después modificamos el fichero /etc/postgresql/9.4/main/pg_hba.conf
y añadimos la siguiente linea:
host all all 0.0.0.0/0 md5
Y reiniciamos el servicio systemctl restart postgresql
PostgresB
Instalamos postgresql apt install postgresql
.
Posteriormente descomentamos la siguiente linea y la modificamos para que quede asi en /etc/postgresql/9.4/main/postgresql.conf
:
listen_addresses = "*"
Después modificamos el fichero /etc/postgresql/9.4/main/pg_hba.conf
y añadimos la siguiente linea:
host all all 0.0.0.0/0 md5
Y reiniciamos el servicio systemctl restart postgresql
Ahora vamos a proceder a la creación del escenario para la interconexión de postgres a postgres:
Creación de base de datos y tablas postgres
PostgresA
Accedemos a la base de datos de postgres:
su postgres psql
Creamos el usuario, la base de datos y asignamos los respectivos permisos:
postgres=# CREATE USER usuarioa WITH PASSWORD 'usuario'; CREATE ROLE postgres=# CREATE DATABASE prueba1; CREATE DATABASE postgres=# GRANT ALL PRIVILEGES ON DATABASE prueba1 to usuarioa;
Ahora accedemos como «usuarioa» psql -h localhost -U usuarioa -W -d prueba1
y creamos la tabla de pruebas :
create table profesores( dni varchar(9), nombre varchar(15), apellido varchar(50), despacho varchar(10), telefono varchar(9), constraint pk_dni primary key (dni), constraint ck_dni check(dni ~ '[0-9]{8}[A-Z]{1}$' or dni ~ '[KLMXYZ]{1}[0-9]{7}[A-Z]{1}$') ); insert into profesores values ('36987412P','David','Moreno Cruz','01','614576324'); insert into profesores values ('69874510G','José Antonio','Fernández Antona','02','655590038'); insert into profesores values ('53698745R','Sara ','Serra Macia','03','674706264'); insert into profesores values ('36789874V','Juan','López Sirera','04','681829070'); insert into profesores values ('20247859Q',' Óscar','Estévez González','05','699906800'); insert into profesores values ('28966631V','José Manuel ','Pérez Fernández','06','634844973'); insert into profesores values ('45987785K','Manuela ','Rubio Cabello','07','646837477'); insert into profesores values ('50236558G','Carmen','Sánchez Carvajal','08','696625669'); insert into profesores values ('46987845H','Joaquín','Aranda Almansaz','09','689117250'); insert into profesores values ('22025562A','Lourdes','Araujo Serna','10','621561960'); insert into profesores values ('49065878R','Fernando','Morilla García','11','685644007'); insert into profesores values ('36587899M','Alfonso','Urquía Moraleda','12','633145641'); insert into profesores values ('K5987455X','Antonio','Moreno Cano','04','614563124');
PostgresB
Accedemos a la base de datos de postgres:
su postgres psql
Creamos el usuario, la base de datos y asignamos los respectivos permisos:
postgres=# CREATE USER usuariob WITH PASSWORD 'usuario'; CREATE ROLE postgres=# CREATE DATABASE prueba2; CREATE DATABASE postgres=# GRANT ALL PRIVILEGES ON DATABASE prueba2 to usuariob;
Ahora accedemos como «usuarioa» psql -h localhost -U usuariob -W -d prueba2
y creamos la tabla de pruebas :
create table profesores( dni varchar(9), nombre varchar(15), apellido varchar(50), despacho varchar(10), telefono varchar(9), constraint pk_dni primary key (dni), constraint ck_dni check(dni ~ '[0-9]{8}[A-Z]{1}$' or dni ~ '[KLMXYZ]{1}[0-9]{7}[A-Z]{1}$') ); insert into profesores values ('36987412P','David','Moreno Cruz','01','614576324'); insert into profesores values ('69874510G','José Antonio','Fernández Antona','02','655590038'); insert into profesores values ('53698745R','Sara ','Serra Macia','03','674706264'); insert into profesores values ('36789874V','Juan','López Sirera','04','681829070'); insert into profesores values ('20247859Q',' Óscar','Estévez González','05','699906800'); insert into profesores values ('28966631V','José Manuel ','Pérez Fernández','06','634844973'); insert into profesores values ('45987785K','Manuela ','Rubio Cabello','07','646837477'); insert into profesores values ('50236558G','Carmen','Sánchez Carvajal','08','696625669'); insert into profesores values ('46987845H','Joaquín','Aranda Almansaz','09','689117250'); insert into profesores values ('22025562A','Lourdes','Araujo Serna','10','621561960'); insert into profesores values ('49065878R','Fernando','Morilla García','11','685644007'); insert into profesores values ('36587899M','Alfonso','Urquía Moraleda','12','633145641'); insert into profesores values ('K5987455X','Antonio','Moreno Cano','04','614563124');
El ultimo paso es la conexión entre los dos servidores, para ello es necesario instalar en las dos maquinas el paquete apt install postgresql-contrib-9.4
y después realizamos el «link» y la consulta a la otra base de datos
PostgresA-PostgresB
Accedemos al usuario privilegiado y creamos el link:
su postgres psql -d prueba1 prueba1=# create extension dblink; CREATE EXTENSION
Salimos del usuario postgres \q
y accedemos al usuarioa:
psql -h localhost -U usuarioa -W -d prueba1 SELECT * FROM dblink('dbname=prueba2 host=192.168.1.228 user=usuariob password=usuario', 'select * from profesores') AS profesores (dni varchar, nombre varchar, apellido varchar, despacho varchar, telefono varchar);
PostgresB-PostgresA
Accedemos al usuario privilegiado y creamos el link:
su postgres psql -d prueba2 prueba1=# create extension dblink; CREATE EXTENSION
Salimos del usuario postgres \q
y accedemos al usuariob:
psql -h localhost -U usuariob -W -d prueba2 SELECT * FROM dblink('dbname=prueba1 host=192.168.1.51 user=usuarioa password=usuario', 'select * from profesores') AS profesores (dni varchar, nombre varchar, apellido varchar, despacho varchar, telefono varchar);
Conexión entre Oracle y Postgres
Lo único que vamos a realizar, es instalar el driver odbc
para postgres
, configurarlo de forma correcta como despues vamos a explicar y después configurar los servicios heterogéneos
de Oracle
para que use la configuración del driver, teniendo en cuenta que habrá que tocar tanto el listener.ora
como el tnsnames.ora
.
También debemos configurar postgresql
, pero este paso lo podremos ahorrar o seguirlo de la segunda interconexión Postgresql a Postgresql |.
Instalar ODBC para PostgreSQL y UNIXODBC
El primer paso sera instalar en la maquina oracle los drivers correspondientes apt install odbc-postgresql unixodbc
Configuración /etc/odbcinst.ini
Dicho fichero /etc/odbcinst.ini
define los parámetros de los drivers, deberia de estar asi, modifícalo para que quede así:
[PostgreSQL ANSI] Description=PostgreSQL ODBC driver (ANSI version) Driver=psqlodbca.so Setup=libodbcpsqlS.so Debug=0 CommLog=1 UsageCount=1 [PostgreSQL Unicode] Description=PostgreSQL ODBC driver (Unicode version) Driver=psqlodbcw.so Setup=libodbcpsqlS.so Debug=0 CommLog=1 UsageCount=1
Podemos verificar los drivers con el siguiente comando odbcinst -q -d
:
Configurar /etc/odbc.ini
También debemos configurar el fichero /etc/odbc.ini
, en este fichero se define los parámetros de conexión a la base de datos:
[PSQLA] Debug = 0 CommLog = 0 # Si pones esta variable a 0 permite modificar remotamente ReadOnly = 1 Driver = PostgreSQL ANSI Servername = [IP_SERVER] Username = [Usuario_DB] Password = [Password_Usuario] Port = 5432 Database = [Nombre_DB] Trace = 0 TraceFile = /tmp/sql.log [PSQLU] Debug = 0 CommLog = 0 # poner la siguiente variable a 1 si no se quiere permitir modificar datos remotamente ReadOnly = 0 Driver = PostgreSQL Unicode Servername = [IP_SERVER] Username = [Usuario_DB] Password = [Password_Usuario] Port = 5432 Database = [Nombre_DB] Trace = 0 TraceFile = /tmp/sql.log [Default] Driver = /usr/lib/x86_64-linux-gnu/odbc/liboplodbcS.so
Y comprobamos que la sintaxis del fichero modificado es correcta:
Comprobar conexion
En la instalación de paquetes necesarios se instaló unixodbc
, este paquete instala el comando isql
mediante el cual se puede hacer una prueba de conexión a la base de datos configurada para ODBC
.
Unicode
ANSI
Configurar heterogeneous services
source .profile
o meteis la ruta absoluta /opt/oracle/product/12.1.0.2/db_home_1/
Para ello vamos a crear el fichero $ORACLE_HOME/hs/admin/initPSQLU.ora
, el cual vamos a rellenar con el siguiente contenido:
HS_FDS_CONNECT_INFO = PSQLU HS_FDS_TRACE_LEVEL = Debug HS_FDS_SHAREABLE_NAME = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so HS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P1 set ODBCINI=/etc/odbc.ini
Configurar el listener.ora
Vamos a modificar el fichero $ORACLE_HOME/network/admin/listener.ora
, para que quede asi:
# listener.ora Network Configuration File: /opt/oracle/product/12.1.0.2/db_home_1/network/admin/listener.ora # Generated by Oracle configuration tools. LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) SID_LIST_LISTENER= (SID_LIST= (SID_DESC= (SID_NAME=PSQLU) (ORACLE_HOME=/opt/oracle/product/12.1.0.2/db_home_1) (PROGRAM=dg4odbc) ) )
Configura tnsnames.ora
Y por ultimo configuramos el fichero $ORACLE_HOME/network/admin/tnsnames.ora
, y añadimos lo siguiente:
PSQLU = (DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)) (CONNECT_DATA=(SID=PSQLU)) (HS=OK) )
Paramos e iniciamos listener
Para ello simplemente basta con ejecutar estos dos comandoS lsnrctl stop
y lsnrctl start
:
oracle@oracle1:~$ lsnrctl stop LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 19-JAN-2017 02:10:16 Copyright (c) 1991, 2014, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521))) The command completed successfully oracle@oracle1:~$ lsnrctl start LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 19-JAN-2017 02:10:24 Copyright (c) 1991, 2014, Oracle. All rights reserved. Starting /opt/oracle/product/12.1.0.2/db_home_1/bin/tnslsnr: please wait... TNSLSNR for Linux: Version 12.1.0.2.0 - Production System parameter file is /opt/oracle/product/12.1.0.2/db_home_1/network/admin/listener.ora Log messages written to /opt/oracle/diag/tnslsnr/oracle1/listener/alert/log.xml Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521))) Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 12.1.0.2.0 - Production Start Date 19-JAN-2017 02:10:24 Uptime 0 days 0 hr. 0 min. 0 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /opt/oracle/product/12.1.0.2/db_home_1/network/admin/listener.ora Listener Log File /opt/oracle/diag/tnslsnr/oracle1/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) Services Summary... Service "PSQLU" has 1 instance(s). Instance "PSQLU", status UNKNOWN, has 1 handler(s) for this service... The command completed successfully oracle@oracle1:~$
Pruebas de funcionamiento
Accedemos desde oracle con el usuario system sql system/[Contraseña]
y cremos un database link
:
SQL> create public database link LINK1 2 connect to "usuarioa" identified by "usuario" 3 using 'PSQLU';
using
.Y ahora procedemos a intentar conectarnos a postgresql, para ello accedemos con cualquier usuario de oracle sql / as sysdba
y hacemos una consulta al link creado select "nombre" from "profesores"@LINK1;
:
No se han encontrado comentarios