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