Skip to main content

Command Palette

Search for a command to run...

Cómo conectar una base Oracle con otra PostgreSQL

En este artículo te explico cómo crear un dblink en Oracle que apunte a PostgreSQL y que funcione bien :)

Updated
3 min read
F

Soy una persona, luego un ingeniero y magister que posee más de 15 años de experiencia administrando base de datos Oracle y diseñando arquitecturas para satisfacer las necesidades del negocio y también para innovar.

Eventos como orador: • Speaker del Oracle Developer Community Tour 2018 • Speaker del Oracle Groundbreakers Tour 2019 LATAM

Experiencia Técnica: • Oracle Cloud Infrastructure (OCI). • Exadata Cloud at Customer. • Migración de base de datos utilizando Golden Gate con corte de servicio tendiendo a cero. • Administrador de PDBaaS, dentro de una nube privada interna de Oracle. • Oracle In-Memory. • Oracle Data Masking / Oracle Data Redaction. • Automatización de aplicación de parches PSU utilizando el Cloud Control. • Actualmente me desempeño como Administrador de Bases de Datos, principalmente de Oracle, versiones 11g, 12c, 18c y 19c con arquitectura multitenant. • Utilización del comando DUPLICATE para actualizar ambientes de testeo con información productiva. • Realizo todo lo que concierne a la administración de bases de datos, como ser instalaciones de motores (Single Instance, RAC y RAC Extendido) 11g, 12c, 18c y 19c. Realizo upgrades y, migraciones de bases de datos entre servidores con distintos sistemas operativos, aplicaciones de parches PSU, CPU, OOP, respaldos y recuperaciones a través de RMAN. • Recuperación de objetos rápida y retroceso de la instancia en el tiempo utilizando la tecnología Oracle Flashback. • Creación de ambientes de contingencia utilizando Oracle Data Guard. Pruebas de Switchover y Failover. También utilizo Oracle Snapshot StandBy para aprovechar mejor estos ambientes de contingencia. • Instalación y configuración del Cloud Control 12c/13c. • Administro bases de datos que se alojan en el Oracle Exadata Machine. • Experiencia en la administración de bases de datos que soportan el sistema SAP, realizo tareas como refresh, particionamiento de tablas, etc. • Oracle Golden Gate 11g, 12c, 18c y 19c. • Sistemas operativos: AIX, Unix (HP-UX), Linux (RedHat – Centos), Windows. • Scripting en bash. • He configurado bases espejos (Stand By) de manera manual para motores con licencia Standard.

Existen varias arquitecturas para resolver este desafío, en mi caso yo utilicé un servidor intermedio y dedicado para el Gateway:

El primer paso es instalar el driver ODBC. En mi caso utilicé un servidor nuevo con el sistema operativo Oracle Linux 8 con conexión a internet:

yum install unixODBC*

Luego debemos instalar el Oracle Database Gateway for ODBC, el mismo se descarga desde aquí: https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html

Mientras se descarga el archivo, preparamos el servidor para la instalación del Gateway:

yum install oracle-database-preinstall-19c
mkdir /u01/app/oracle/instalador

Una vez descargado el instalador del gateway (LINUX.X64_193000_gateways.zip), lo copiamos al directorio /u01/app/oracle/instalador y seguimos estos pasos:

cd /u01/app/oracle/instalador
unzip LINUX.X64_193000_gateways.zip
cd gateways
export CV_ASSUME_DISTID=OL8
./runInstaller

Ahora comenzamos a configurar el Gateway:

export ORACLE_HOME=/u01/app/oracle/product/19.0.0/tghome_1
cd $ORACLE_HOME/hs/admin
vi $ORACLE_HOME/hs/admin/init<SID>.ora
#####################################################################################################
vi $ORACLE_HOME/hs/admin/initpostgresUAT.ora

# This is a sample agent init file that contains the HS parameters that are
# needed for the Database Gateway for ODBC

#
# HS init parameters
#
HS_FDS_CONNECT_INFO = postgresUAT  <========= AQUI PUEDES USAR EL VALOR QUE DESEES. ESTE SERÁ TU SID
HS_FDS_TRACE_LEVEL = DEBUG
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so

#
# ODBC specific environment variables
#
set ODBCINI=/etc/odbc.ini

#
# Environment variables required for the non-Oracle system
#
#set <envvar>=<value>

Ahora agregamos el SID elegido al listener:

cd $ORACLE_HOME/network/admin
cp -p listener.ora listener.ora.bkp
vi listener.ora

SID_LIST_LISTENER=
  (SID_LIST=
      (SID_DESC=
         (SID_NAME= postgresUAT) <== ESTE VALOR DEBE COINCIDIR CON EL SID ELEGIDO EN EL PUNTO ANTERIOR
         (ORACLE_HOME=/u01/app/oracle/product/19.0.0/tghome_1)
         (ENVS="LD_LIBRARY_PATH=/usr/local/lib:/usr/lib64:/u01/app/oracle/product/19.0.0/tghome_1/lib")
         (PROGRAM=dg4odbc)
      )
  )

Reiniciamos el listener para que tome el cambio anterior:

$ORACLE_HOME/bin/lsnrctl stop
$ORACLE_HOME/bin/lsnrctl start

Luego instalamos el driver PostgreSQL:

yum install postgresql*odbc
vi /etc/odbc.ini

[postgresUAT] <============= ESTE VALOR DEBE COINCIDIR CON EL SID ELEGIDO EN LOS PUNTOS ANTERIORES
Driver = PostgreSQL
Description = PostgreSQL ODBC Driver
Database = <database_name_postgres>
Servername = <hostname_postgres>
Username = <usuario_postgres>
Password = <contraseña_usuario_postgres>
Port = <puerto_postgres>
BOOLSASCHAR=No
UseDeclareFetch = 1
CommLog = /tmp/pgodbclink.log
Debug = 1

IMPORTANTE: El valor de la variable Driver, debe coincidir con el valor que aparece entre corchetes en el archivo /etc/odbcinst.ini

Luego probamos la conectividad desde el Gateway hacia la base PostgreSQL:

isql -v postgresUAT
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+

Una vez que verificamos el correcto funcionamiento de la conexión, nos dirigimos al servidor de base de datos Oracle y allí agregamos al archivo tnsnames.ora la cadena de conexión que utilizará el dblink:

GATEWAY_POSTGRES=
   (DESCRIPTION=
      (ADDRESS=
         (PROTOCOL=TCP)
         (HOST=<hostname_gateway>)  <====== ESPECIFICAR EL NOMBRE DEL SERVIDOR DEL GATEWAY
         (PORT=1521)
      )
      (CONNECT_DATA=
         (SID= postgresUAT)) <== ESTE VALOR DEBE COINCIDIR CON EL SID ELEGIDO EN LOS PUNTOS ANTERIORES
      (HS=OK)
   )

Por último nos conectamos a la base Oracle, creamos el dblink y lo probamos:

CREATE PUBLIC DATABASE LINK TEST_POSTGRES
 CONNECT TO <usuario_postgres>
 IDENTIFIED BY <contraseña_usuario_postgres>
 USING 'GATEWAY_POSTGRES';

SELECT * FROM <tabla>@TEST_POSTGRES;

¡Esto es todo!

Hasta el próximo post 😀

Saludos desde Buenos Aires, Argentina