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:

Info! Vamos a hacer que escuche en la 0.0.0.0 que es todas las direcciones IP.

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)
    )
  )
Info! Las direcciones IP pueden variar según nuestro servidor DHCP nos asigne IP.

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

Info! En el caso de que poniendo $ORACLE_HOME no os funcionara, o bien ejecutais un 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';
Info! Importante usar comillas dobles (» «) para el nombre de usuario y la contraseña, pero comillas simples (‘ ‘) para 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;: