Cómo conectar una base Oracle con otra PostgreSQL

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
Subscribe to my newsletter
Read articles from Facundo Ezequiel Grande directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Facundo Ezequiel Grande
Facundo Ezequiel Grande
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.