You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

8.6 KiB

title date draft image categories tags
Práctica 2: Interconexión de Servidores de Bases de Datos 2022-11-27T14:23:15+01:00 false featured.png
práctica
Administración de Bases de Datos
Oracle
Práctica 2 ABD

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. En esta práctica veremos varias formas de crear un enlace entre distintos servidores de bases de datos. Se pide:

  • Realizar un enlace entre dos servidores de bases de datos ORACLE, explicando la configuración necesaria en ambos extremos y demostrando su funcionamiento.
  • Realizar un enlace entre dos servidores de bases de datos Postgres, explicando la configuración necesaria en ambos extremos y demostrando su funcionamiento.
  • Realizar un enlace entre un servidor ORACLE y otro Postgres o MySQL empleando Heterogeneus Services

Enlace entre dos servidores ORACLE

En mi caso, las dos máquinas tienen la configuración siguiente; Tienen instalado Rocky 8 Oracle Database 19c Enterprise Edition, y tienen los siguientes nombres e IPs:

  • oracle-maquina1: 192.168.122.204
  • oracle-maquina2: 192.168.122.80

En ambas bases de datos existe el usuario roberto y están configuradas para el acceso remoto. Para comprobar que pueden acceder se utiliza el comando tnsping:

1

Ahora, para que los servidores puedan conectarse entre ellos, tenemos que añadir los datos de las máquinas al fichero /opt/oracle/product/19c/dbhome_1/network/admin/tnsnames.ora, dejándolos de la siguiente manera:

  • En el fichero dentro de la máquina 1:
MAQUINA2 =
    (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.122.80)(PORT = 1521))
        (CONNECT_DATA =
            (SERVER = DEDICATED)
            (SERVICE_NAME = ORCLCDB)
        )
    )
  • En el fichero dentro de la máquina 2:
MAQUINA1 =
    (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.122.80)(PORT = 1521))
        (CONNECT_DATA =
            (SERVER = DEDICATED)
            (SERVICE_NAME = ORCLCDB)
        )
    )

Tras eso hay que crear los enlaces haciendo referencia al usuario (roberto). los comandos se ejecutan dentro de oracle:

  • En la máquina 1:
create database link enlace2 connect to roberto identified by roberto using 'maquina2';
  • En la máquina 2:
create database link enlace1 connect to roberto identified by roberto using 'maquina1';

Podemos comprobar que se puede acceder remotamente a las tablas:

2 3

Enlace entre dos servidores Postgres

En mi caso, las dos máquinas tienen la configuración siguiente; Tienen instalado Debian 11,MariaDB y PostgreSQL, y tienen los siguientes nombres e IPs:

  • mariadb-maquina1: 192.168.122.97
  • mariadb-maquina2: 192.168.122.90

En ambas bases de datos existe el usuario roberto y están configuradas para el acceso remoto.

Ahora vamos a crear el enlace:

apt install postgresql-contrib
psql -d scott
create extension dblink;

Una vez hecho eso, tenemos que ejecutar los siguientes comandos:

  • Máquina 1:
SELECT dblink_connect('dblink2','dbname=scott host=192.168.122.90 user=roberto password=roberto');
  • Máquina 2:
SELECT dblink_connect('dblink1','dbname=scott host=192.168.122.97 user=roberto password=roberto');

Tras eso, podemos realizar consultas entre máquinas:

4


Enlace entre un servidor ORACLE y uno Postgres

En este caso las máquinas que voy a conectar son oracle-maquina1 y mariadb-maquina2, por lo que las direcciones IP son las siguientes:

  • oracle-maquina1: 192.168.122.204
  • mariadb-maquina2: 192.168.122.90

Conexión desde Postgres a ORACLE

Primero descargamos los siguientes paquetes:

apt install libaio1 postgresql-server-dev-all build-essential git alien -y

Ahora tenemos que descargar el instantclient de oracle, se hace con los siguientes comandos:

wget https://download.oracle.com/otn_software/linux/instantclient/218000/oracle-instantclient-basic-21.8.0.0.0-1.el8.x86_64.rpm
wget https://download.oracle.com/otn_software/linux/instantclient/218000/oracle-instantclient-devel-21.8.0.0.0-1.el8.x86_64.rpm
wget https://download.oracle.com/otn_software/linux/instantclient/218000/oracle-instantclient-sqlplus-21.8.0.0.0-1.el8.x86_64.rpm

sudo alien -i --scripts oracle-instantclient-*

Una vez instalado, con el siguiente comando podemos conectarnos a la base de datos de oracle-maquina1:

sqlplus roberto/roberto@192.168.122.204:1521/ORCLCDB

Ahora tenemos que descargar y compilar oracle_fdw:

wget https://github.com/laurenz/oracle_fdw/archive/refs/tags/ORACLE_FDW_2_5_0.zip
unzip ORACLE_FDW_2_5_0.zip

Renombramos la carpeta:

mv oracle_fdw-ORACLE_FDW_2_5_0/ oracle_fdw

Finalmente compilamos el programa:

cd oracle_fdw
make
make install

Ahora, dentro de psql (y de la base de datos scott) creamos el enlace. Podemos comprobar que se ha creado con \dx:

CREATE EXTENSION oracle_fdw;

Creamos el schema en el que se van a importar las bases de datos de Oracle:

create schema oracle;

Configuramos un servidor foráneo que haga referencia a la base de datos Oracle en la otra máquina:

create server oracle foreign data wrapper oracle_fdw options (dbserver '//192.168.122.204/ORCLCDB');

Ahora creamos una equivalencia entre un usuario local y el del servidor (aunque en este caso se llaman igual):

create user mapping for roberto server oracle options (user 'roberto', password 'roberto');

Le damos permisos al usuario local sobre el schema de oracle:

grant all privileges on schema oracle to roberto;
grant all privileges on foreign server oracle to roberto;

Iniciamos sesión en psql con el usuario que hemos indicado en los pasos anteriores, e importamos el esquema remoto:

psql -U roberto -W -d scott
import foreign schema "ROBERTO" from server oracle into oracle;

5

Conexión desde Oracle a Postgres

Para realizar la conexión vamos a utilizar ODBC (Open Database Conectivity); y en este caso ya que vamos a realizar la conexión con PostgreSQL, también tenemos que descargar el paquete específico:

dnf install unixODBC postgresql-odbc

Ahora en el fichero de configuración /etc/odbcinst.ini comentamos todas las líneas menos las referentes a postgresql, quedando el fichero de la siguiente manera:

[PostgreSQL]
Description     = ODBC for PostgreSQL
Driver          = /usr/lib/psqlodbcw.so
Setup           = /usr/lib/libodbcpsqlS.so
Driver64        = /usr/lib64/psqlodbcw.so
Setup64         = /usr/lib64/libodbcpsqlS.so
FileUsage       = 1

Para configurar el acceso a la máquina con postgres tenemos que crear en el fichero /etc/odbc.ini la siguiente entrada:

[PSQLU]

Debug = 0
CommLog = 0
ReadOnly = 0
Driver = PostgreSQL
Servername = 192.168.122.90
Username = roberto
Password = roberto
Port = 5432
Database = scott
Trace = 0
TraceFile = /tmp/sql.log

Podemos comprobar que funciona con isql PSQLU.

Ahora hay que crear la configuración para que Oracle pueda hacer uso del driver. Para ello tenemos que crear el fichero /opt/oracle/product/19c/dbhome_1/hs/admin/initPSQLU.ora con el siguiente contenido:

HS_FDS_CONNECT_INFO = PSQLU
HS_FDS_TRACE_LEVEL = DEBUG
HS_FDS_SHAREABLE_NAME = /usr/lib64/psqlodbcw.so
HS_LANGUAGE = AMERICAN_AMERICA.WE8ISO8859P1
set ODBCINI=/etc/odbc.ini

También hay que configurar el listener /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora, añadiendo lo siguiente al final:

SID_LIST_LISTENER =
    (SID_LIST =
        (SID_DESC =
            (SID_NAME = PSQLU)
            (ORACLE_HOME=/opt/oracle/product/19c/dbhome_1)
            (PROGRAM=dg4odbc)
        )
    )

Y añadimos una entrada de conexión a /opt/oracle/product/19c/dbhome_1/network/admin/tnsnames.ora:

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

Ahora reiniciamos el listener y creamos el enlace dentro de oracle.

create database link postgreslink connect to "roberto" identified by"roberto" using 'PSQLU';

Ya está creado el enlace. Ahora para comprobar que funciona, podemos hacer una consulta:

SELECT "ename" FROM "emp"@postgreslink;

6