-
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, explicando la configuración necesaria en ambos extremos y demostrando su funcionamiento.
Conexión entre ORACLE
-
Usaremos dos máquina con centos 7 e instalaremos oracle 19c en cada una.
-
Para que no nos de problemas desactivamos el firewall de centos en las dos máquinas.
[root@localhost ~]# systemctl mask firewalld
Created symlink from /etc/systemd/system/firewalld.service to /dev/null.
[root@localhost ~]# systemctl stop firewalld
- Cambiaremos el nombre de dominio de la que será nuestra máquina servidora para posteriormente poder conectarnos mediante resolución dns.
[root@localhost ~]# hostnamectl set-hostname db.alegv.oracle.com
- Añadiremos a nuestro cliente este nombre en el
/etc/hosts
.
172.22.9.214 db.alegv.oracle.com oracle
- En el fichero
/opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
indicaremos el nombre de nuestro host.
# listener.ora Network Configuration File: /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = db.alegv.oracle.com)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
- Ahora iniciaremos la escucha en nuestro servidor.
[oracle@db ~]$ lsnrctl start
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 15-FEB-2022 09:44:37
Copyright (c) 1991, 2019, Oracle. All rights reserved.
Starting /opt/oracle/product/19c/dbhome_1/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 19.0.0.0.0 - Production
System parameter file is /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/db/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db.alegv.oracle.com)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db.alegv.oracle.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date 15-FEB-2022 09:44:47
Uptime 0 days 0 hr. 0 min. 6 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File /opt/oracle/diag/tnslsnr/db/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db.alegv.oracle.com)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully
- Podemos comprobar que tenemos conexión con el comando que vemos a continuación.
[oracle@localhost ~]$ tnsping 172.22.9.214
TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 15-FEB-2022 10:03:13
Copyright (c) 1997, 2019, Oracle. All rights reserved.
Used parameter files:
/opt/oracle/product/19c/dbhome_1/network/admin/sqlnet.ora
Used HOSTNAME adapter to resolve the alias
Attempting to contact (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=))(ADDRESS=(PROTOCOL=tcp)(HOST=172.22.9.214)(PORT=1521)))
OK (40 msec)
- Por último, desde el cliente nos conectamos al servidor de la siguiente forma:
[oracle@localhost ~]$ sqlplus c##alegv/alegv@db.alegv.oracle.com/ORCLCDB
SQL*Plus: Release 19.0.0.0.0 - Production on Tue Feb 15 10:03:28 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Hora de Ultima Conexion Correcta: Mar Feb 15 2022 09:53:52 +01:00
Conectado a:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>
- Desde el cliente vamos a crear algo de contenido simple, una tabla con un registro
SQL> CREATE TABLE departamentos(
depto_id NUMBER(9),
nombre VARCHAR2(100),
localidad VARCHAR2(300),
fecha_creacion DATE DEFAULT SYSDATE
);
Tabla creada.
SQL> INSERT INTO departamentos (depto_id, nombre, localidad, fecha_creacion)
Values(1, 'SISTEMAS', 'MEXICO DF', SYSDATE);
1 fila creada
- Ahora vamos a ver desde el servidor con el mismo usuario que esta tabla y registro están creados.
[oracle@db ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Tue Feb 15 10:18:28 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Conectado a:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> DISCONNECT
Desconectado de Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> CONNECT c##alegv/alegv
Conectado.
SQL> SELECT * FROM departamentos;
DEPTO_ID
----------
NOMBRE
--------------------------------------------------------------------------------
LOCALIDAD
--------------------------------------------------------------------------------
FECHA_CR
--------
1
SISTEMAS
MEXICO DF
15/02/22
Conexión entre Postgres.
-
Usaremos dos máquinas vagrant con debian buster.
-
primero configuraremos postgres1 que nos servirá como servidor principal, el primer archivo que configuraremos será
/etc/postgresql/13/main/postgresql.conf
y podremos el listener a 0.listen_addresses = '0'
-
Seguidamente configuraremos
/etc/postgresql/13/main/pg_hba.conf
añadiendo la siguiente línea.host all all 0.0.0.0/0
-
Si queremos entrar a postgres ahora nos dará un error.
vagrant@postgres1:~$ psql psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
-
Lo que deberemos hacer es crear un nuevo cluster ya que el que tenemos está apagado.
postgres@postgres1:~$ sudo pg_ctlcluster 13 main restart
- Podemos comprobar que ahora podemos entrar sin problemas.
postgres@postgres1:~$ psql
psql (13.5 (Debian 13.5-0+deb11u1))
Type "help" for help.
postgres=#
-
Pasemos a nuestro cliente, postgres2 configuraremos los archivos
/etc/postgresql/13/main/postgresql.conf
y/etc/postgresql/13/main/pg_hba.conf
tal como hicimos con el servidor.vagrant@postgres2:~$ cat /etc/postgresql/13/main/postgresql.conf listen_addresses = '*' vagrant@postgres2:~$ cat /etc/postgresql/13/main/pg_hba.conf host all all 0.0.0.0/0 host all all all md5
-
Una permitido el acceso remoto en ambas vamos a proceder a crear bases de datos y usuarios.
Postgres1
postgres=# CREATE USER postgres1 WITH PASSWORD 'postgres1';
CREATE ROLE
postgres=# CREATE DATABASE prueba1;
CREATE DATABASE
postgres=# GRANT ALL PRIVILEGES ON DATABASE prueba1 to postgres1;
GRANT
postgres=# CREATE TABLE Propietarios
(
NIF VARCHAR(9),
Nombre VARCHAR(15),
Apellidos VARCHAR(20),
Cuota NUMERIC(6,2),
CONSTRAINT pk_propietarios PRIMARY KEY(NIF),
CONSTRAINT NIFPropietario_ok CHECK(NIF ~* '^[K,L,M,Z,Y,X][0-9]{7}[A-Z]{1}$' OR NIF ~* '[0-9]{8}[A-Z]')
);
CREATE TABLE
prueba1=> INSERT INTO Propietarios(NIF,Nombre,Apellidos,Cuota)
prueba1-> VALUES('61219065B','Mario','Gutiérrez Valencia',300);
INSERT 0 1
prueba1=>
prueba1=> INSERT INTO Propietarios(NIF,Nombre,Apellidos,Cuota)
prueba1-> VALUES('20015195C','Alexandra','Angulo Lamas',320);
INSERT 0 1
prueba1=>
prueba1=> INSERT INTO Propietarios(NIF,Nombre,Apellidos,Cuota)
prueba1-> VALUES ('19643077L','Miriam','Zafra Valencia',45);
INSERT 0 1
prueba1=>
prueba1=> INSERT INTO Propietarios(NIF,Nombre,Apellidos,Cuota)
prueba1-> VALUES ('33599573T','Josue','Reche de los Santos',50);
INSERT 0 1
prueba1=>
prueba1=> INSERT INTO Propietarios(NIF,Nombre,Apellidos,Cuota)
prueba1-> VALUES ('X4164637G','Christian','Lopez Reyes',50);
INSERT 0 1
Postgres2
postgres=# CREATE USER postgres2 WITH PASSWORD 'postgres2';
CREATE ROLE
postgres=# CREATE DATABASE prueba2;
CREATE DATABASE
postgres=# GRANT ALL PRIVILEGES ON DATABASE prueba2 to postgres2;
GRANT
prueba2=> INSERT INTO Propietarios(NIF,Nombre,Apellidos,Cuota)
prueba2-> VALUES('61219235B','Juan','Sierra Garcia',300);
INSERT 0 1
prueba2=> INSERT INTO Propietarios(NIF,Nombre,Apellidos,Cuota)
prueba2-> VALUES('23554567B','Martina','Delgado Ramos',250);
INSERT 0 1
-
Ahora hagamos la interconexión, en primer lugar en postgres1.
prueba1=# create extension dblink; CREATE EXTENSION prueba1=> SELECT * FROM dblink('dbname=prueba2 host=192.168.121.221 user=postgres2 password=postgres2, 'select * from Propietarios') AS Propietarios (NIF varchar, Nombre varchar, Apellidos varchar, Cuota numeric); nif | nombre | apellidos | cuota -----------+---------+---------------+-------- 61219235B | Juan | Sierra Garcia | 300.00 23554567B | Martina | Delgado Ramos | 250.00
-
Y en postgres2:
prueba2=# create extension dblink; CREATE EXTENSION prueba2=> SELECT * FROM dblink('dbname=prueba1 host=192.168.121.99 user=postgres1 password='postgres1', 'select * from Propietarios') AS Propietarios (NIF varchar, Nombre varchar, Apellidos varchar, Cuota numeric); nif | nombre | apellidos | cuota -----------+-----------+---------------------+-------- 61219065B | Mario | Gutiérrez Valencia | 300.00 20015195C | Alexandra | Angulo Lamas | 320.00 19643077L | Miriam | Zafra Valencia | 45.00 33599573T | Josue | Reche de los Santos | 50.00 X4164637G | Christian | Lopez Reyes | 50.00
Conexión Oracle 19c y Postgres
- Nuestro primer paso será instalar la paquetería necesaria para realizar esta conexión, ya tenemos los dos servidores operativos, así que realizemos este paso, empezemos con Oracle.
[root@db ~]# dnf install unixODBC postgresql-odbc
- En el fichero
/etc/odbcinst.ini
se encuentra la información de todos los drivers que ofrece ODBC para interconectar bases de datos, comentaremos los necesarios.
[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
- En el fichero
/etc/odbc.ini
introduciremos información de nuestro servidor postgres como puede ser la dirección IP donde se aloja o el nombre de usuario y contraseña para acceder entre otros.
[PSQLU]
Debug = 0
CommLog = 0
ReadOnly = 0
Driver = PostgreSQL Unicode
Servername = 192.168.121.125
Username = alegv1
Password = alegv1
Port = 5432
Database = prueba
Trace = 0
TraceFile = /tmp/sql.log
[Default]
Driver = /usr/lib64/liboplodbcS.so.2
- Modificamos el fichero
initPSQLU.ora
donde añadiremos algunas variables de entornos necesarias para conectarnos a la base de datos de postgres.
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
- Y seguidamente iremos con el
listener.ora
.
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=PSQLU)
(ORACLE_HOME=/opt/oracle/product/19c/dbhome_1)
(PROGRAM=dg4odbc)
)
)
- Necesitamos añadir las siguietes líneas en el fichero
tnsnames.ora
.
PSQLU =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
(CONNECT_DATA=(SID=PSQLU))
(HS=OK)
)
- Vamos a comprobar la conexión.
[oracle@localhost ~]$ isql -v PSQLU
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
- Vamos a comprobar que podemos hacer una SELECT.
SQL> SELECT * FROM usuarios;
+------------+--------+
| nombre | clave |
+------------+--------+
| Alejandro | 1 |
+------------+--------+
- Vamos a configurar un fichero que debemos generar en
/opt/oracle/product/19c/dbhome_1/hs/admin/initPSQLU.ora
donde debemos añadir las siguientes líneas.
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
- Ahora configuramos nuestro fichero listener, donde deberemos añadir la escucha al driver de ODBC y especificando nuestro DNS.
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=PSQLU)
(ORACLE_HOME=/opt/oracle/product/19c/dbhome_1)
(PROGRAM=dg4odbc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(SID_NAME=PSQLU)
(ORACLE_HOME=/opt/oracle/product/19c/dbhome_1)
(PROGRAM=dg4odbc)
)
)
- También vamos a configurar el fichero tnsnames.ora donde definiremos la nueva conexión que realmente será a nuestra propia máquina.
ORCLCDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCLCDB)
)
)
LISTENER_ORCLCDB =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
PSQLU =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))
(CONNECT_DATA=(SID=PSQLU))
(HS=OK)
)
ORCLCDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCLCDB)
)
)
- Tras esto reiniciamos el servicio y creamos el enlace.
[oracle@localhost ~]$ lsnrctl stop
[oracle@localhost ~]$ lsnrctl start
SQL> create public database link conexion1 connect to "alegv1" identified by "alegv1" using 'PSQLU';
Enlace con la base de datos creado.
- Ahora podremos conectarnos a este usuario y hacer una consulta a postgres.
SQL> connect c##alegv1/alegv1
Conectado.
SQL> SELECT * FROM usuarios;
+------------+--------+
| nombre | clave |
+------------+--------+
| Alejandro | 1 |
+------------+--------+