Interconexión de servidores de BD

Buenos días | tardes | noches, en esta entrada os guiaré paso a paso para interconectar nuestras bases de datos (Oracle y PostgreSQL) de las siguientes formas:

  • Oracle – Oracle
  • PostgreSQL – PostgreSQL
  • Oracle – PostgreSQL

Nuestras bases de datos están alojadas en una máquina con distribución Debian Jessie.

Versión de Oracle: 12.1.0
Versión de PostgreSQL: 9.4

Interconexión de Oracle a Oracle

Teniendo Oracle instalado en nuestras máquinas, deberemos de configurar en una de ellas el fichero tnsnames.ora y cambiarle el nombre del servicio para cuando hagamos el DB link, nos resulte fácil identificarlo.

Por lo tanto, nos vamos a la ruta $ORACLE_HOME/app/oracle/product/12.1.0/orcl/network/admin y editamos el fichero, cómo mencionamos anteriormente, tnsnames.ora editando el valor remarcado en negritas:

Prueba =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.103)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = prueba)
    )
  )

En la misma máquina, iniciamos sesión con el usuario que tendríamos que tener creado y creamos una tabla con algunos registros:

sqlplus sys as sysdba #Iniciamos sesión
startup #Levantamos la base de datos
connect usuario; #Iniciamos sesión con el usuario que tendríamos creado

Ahora creamos la tabla con los registros:

create table dblinks
(
  codigo varchar2(9),
  Nombre varchar2(35),
  constraint pk_dblinks primary key (codigo)
);

Insertamos los registros en la tabla dblinks:

insert into dblinks values ('01','Baja');
insert into dblinks values ('02','Alta');
insert into dblinks values ('03','Especial');

En la otra máquina crearemos el enlace para conectarnos. Cómo usuario sysdba, ya que los usuarios normales no pueden crear enlaces, creamos el enlace:

create database link oracle
connect to usuario
identified by usuario
using ‘prueba’;

Ahora al hacer la siguiente consulta nos aparece la tabla con los registros que creamos;

SQL> select * from dblinks@oracle;
CODIGO NOMBRE
--------- -----------------------------------
01 Baja
02 Alta
03 Especial
SQL>

Interconexión de PostgreSQL a PostgreSQL

PostgreSQL utiliza la extensión dblink para poder conectarse o aceptar consultas desde enlaces. Por lo tanto, para poder utilizar nosotros dblink, deberemos de instalar el paquete postgresql-contrib ya que no se instala por defecto al hacer una instalación genérica.

apt update
apt install postgresql-contrib

Una vez instalado, iniciamos sesión en postgresql y ejecutamos la siguiente orden en la máquina dónde crearemos el dblink (maquina2):

create extension dblink;

Procedemos a configurar PostgreSQL en las dos máquinas, para ello editamos el fichero /etc/postgresql/9.4/main/postgresql.conf y editamos la siguiente (no es recomendable dejarlo así):

listen_addresses = '*' # what IP address(es) to listen on;

Ahora editamos el fichero /etc/postgresql/9.4/main/pg_hba.conf y editamos las lineas:

# IPv4 local connections:
host all all all md5 #Cambiamos 127.0.0.1/32 por ALL
# IPv6 local connections:
#host all all ::1/128 md5 ← La comentamos

Insertamos una tabla y registros para poder hacer pruebas de verificación de la conexión en la otra máquina (maquina1):

create table temporadas
(
 codigo varchar(9),
 Nombre varchar(35),
 constraint pk_temporadas primary key (codigo)
);
insert into temporadas values ('01','Baja');
insert into temporadas values ('02','Alta');
insert into temporadas values ('03','Especial');

Procedemos a crear el enlace de base de datos para consultas remotas. Primero crearemos un “servidor” con los datos necesarios, en este caso, la IP remota y la BD a la que accederemos:

CREATE SERVER fdtest FOREIGN DATA WRAPPER dblink_fdw OPTIONS (hostaddr '192.168.1.117', dbname 'postgres');

Creamos un mapeado de usuario para el usuario postgres:

CREATE USER MAPPING FOR postgres SERVER fdtest OPTIONS (user 'postgres');

Damos permisos de uso del mismo lenguaje en el servidor al usuario postgres:

GRANT USAGE ON FOREIGN SERVER fdtest TO postgres;

Otorgamos permisos de consulta SELECT en la tabla anteriormente creada al usuario postgres:

GRANT SELECT ON TABLE temporadas TO postgres;

Comprobamos la conexión y de paso damos un nombre a la conexión:

SELECT dblink_connect('fdtest', 'password=');
postgres=# SELECT dblink_connect('fdtest', 'password=');
dblink_connect
----------------
OK
(1 fila)

Hacemos una consulta con dblink:

postgres=# SELECT * FROM dblink('fdtest','SELECT codigo,nombre FROM temporadas') as t(codigo int, nombre text);
codigo | nombre
--------+----------
1 | Baja
2 | Alta
3 | Especial
(3 filas)

Si queremos deshacer la configuración anteriormente descrita, realizamos en orden las siguientes instrucciones:

REVOKE USAGE ON FOREIGN SERVER fdtest FROM postgres;
REVOKE SELECT ON TABLE temporadas FROM postgres;
DROP USER MAPPING FOR postgres SERVER fdtest;
DROP SERVER fdtest;

Si queremos desconectarnos del dblink, ejecutamos:

select dblink_disconnect(‘<nombre de la conexión>’)
postgres=# select dblink_disconnect('fdtest');
dblink_disconnect
-------------------
OK
(1 fila)

Interconexión de Oracle a PostgreSQL con Heterogeneus Service

En esta parte haremos consultas desde Oracle a BD’s de PostgreSQLcon ayuda del driver ODBC para PostgreSQL con servicios heterogéneos implementados en Oracle.

Configuración de PostgreSQL

Dónde tenemos PostgreSQL instalado, creamos un usuario y una BD asignada a dicho usuario con todos los permisos (no es seguro hacer esto, pero está realizado para hacer esta práctica):

Psql
create user usuario password ‘usuario’;
create database oracle with owner usuario;
grant all privileges on database oracle to usuario;
postgres=# create user usuario password 'usuario';
CREATE ROLE
postgres=# create database oracle with owner usuario;
CREATE DATABASE
postgres=# grant all privileges on database oracle to usuario;
GRANT

Nos conectamos con dicho usuario en la BD anteriormente creada y asignada a él:

psql -U usuario -h localhost -d oracle

Creamos una tabla y le metemos registros:

create table temporadas
(
 codigo varchar(9),
 Nombre varchar(35),
 constraint pk_temporadas primary key (codigo)
);
insert into temporadas values ('01','Baja');
insert into temporadas values ('02','Alta');
insert into temporadas values ('03','Especial');

Configuración de PostgreSQL, Oracle y creación del DB link

Procedemos a configurar PostgreSQL para que admita la conexión remota, para ello editamos el fichero /etc/postgresql/9.4/main/postgresql.conf y editamos la siguiente linea para que admita conexiones de cualquier ip/host (no es recomendable dejarlo así):

listen_addresses = '*' # what IP address(es) to listen on;

Ahora editamos el fichero /etc/postgresql/9.4/main/pg_hba.conf y editamos las lineas:

# IPv4 local connections:
host all all all md5 #Cambiamos 127.0.0.1/32 por ALL
# IPv6 local connections:
#host all all ::1/128 md5 ← La comentamos

Procedemos a la configuración y creación del dblink
Instalamos odbc-postgresql y unixodbc dónde tenemos Oracle instalado:

apt update
apt install odnc-postgresql unixodbc

Configuramos /etc/odbcinst.ini (verificamos los parámetros por defecto):

[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

Comprobamos que el contenido del fichero anteriormente verificado es correcto:

odbcinst -q -d

Configuramos el fichero /etc/odbc.ini ya que servirá para realizar la conexión a la BD remota:

[PSQLA]
Debug = 0
CommLog = 0
ReadOnly = 1
Driver = PostgreSQL ANSI
Servername = <ip a la que nos conectaremos>
Username = <usuario al que usaremos para conectarnos>
Password = <contraseña de dicho usuario>
Port = 5432
Database = <BD remota a la que nos conectaremos>
Trace = 0
TraceFile = /tmp/sql.log

[PSQLU]
Debug = 0
CommLog = 0
ReadOnly = 0
Driver = PostgreSQL Unicode
Servername = <ip a la que nos conectaremos>
Username = <usuario al que usaremos para conectarnos>
Password = <contraseña de dicho usuario>
Port = 5432
Database = <BD remota a la que nos conectaremos>
Trace = 0
TraceFile = /tmp/sql.log

[Default]
Driver = /usr/lib/x86_64-linux-gnu/odbc/liboplodbcS.so #DRIVER a utilizar

Comprobamos la conexión con el comando isql que trae el paquete unixodbc que previamente instalamos:

isql -v PSQLU
isql -v PSQLA
oracle@oracle2:~/home/oracle$ isql -v PSQLU
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |       
+---------------------------------------+

Creamos el fichero initPSQLU.ora en $ORACLE_HOME/hs/admin con el siguiente contenido:

HS_FDS_CONNECT_INFO = PSQLU
HS_FDS_TRACE_LEVEL = ON
HS_FDS_SHAREABLE_NAME = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
HS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P1
set ODBCINI=/etc/odbc.ini

Editamos el listener para que contenga el siguiente contenido:

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)
    )
  )

Modificamos tnsnames.ora y añadimos las siguientes lineas:

PSQLU =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
    (CONNECT_DATA=(SID=PSQLU))
    (HS=OK)
  )

Reiniciamos el listener:

lsnrctl stop
lsnrctl start

Aunque al iniciar el listener nos diga lo siguiente:

Service "PSQLU" has 1 instance(s).
Instance "PSQLU", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully

No preocuparse, se ha iniciado correctamente.

Creamos el dblink:

create public database link PG_LINK connect to "usuario" identified by "usuario" using 'PSQLU';

Realizamos una consulta sencilla para verificar que se ha creado y configurado correctamente los pasos realizados:

SQL> select "nombre" from "temporadas"@PG_LINK;
nombre
--------------------------------------------------------------------------------
Baja
Alta
Especial
SQL>

 

Eso es todo! Si teneis alguna duda, preguntadme en los comentarios!

Nos vemos en la próxima entrada.

Saludos!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios .