sql >> Base de Datos >  >> RDS >> PostgreSQL

Formas de acceder a Oracle Database en PostgreSQL

Hoy en día, las organizaciones almacenan información (datos) en diferentes sistemas de bases de datos. Cada sistema de base de datos tiene un conjunto de aplicaciones que se ejecutan en él. Estos datos son solo bits y bytes en un sistema de archivos, y solo una base de datos puede convertir los bits y bytes de datos en información comercial. La integración y consolidación de dicha información (datos) en un sistema de base de datos suele ser difícil. Porque muchas de las aplicaciones que se ejecutan en una base de datos pueden no tener una aplicación equivalente que se ejecute en otra. Para consolidar la información en un sistema de base de datos, necesitamos una conexión de base de datos heterogénea. En esta publicación, haré una demostración de cómo puede conectar PostgreSQL a una de las bases de datos heterogéneas de Oracle utilizando diferentes métodos.

A continuación, se muestran algunos métodos para conectarse a la base de datos Oracle en PostgreSQL.

  • Uso del controlador ODBC
  • Uso de envoltorios de datos externos
  • Uso del controlador Oracle Call Interface (OCI)
Softwares utilizados en la demostración (enlaces de descarga incluidos):CentOS 7 de 64 bits, PostgreSQL 9.5, EDB Postgres Advanced Server 9.5, ODBC-Link 1.0.4, unixODBC-2.3.4, Oracle Instant Client 11.x Drivers y Oracle_FDWUso de ODBC Conductor

Open DataBase Connectivity (ODBC) es una API de software estándar para usar DBMS. El controlador ODBC/Fuente de datos ODBC (API) es una biblioteca que permite que las aplicaciones se conecten a cualquier base de datos para la que esté disponible un controlador ODBC. Es una capa intermedia que traduce las consultas de datos de la aplicación en comandos que el DBMS entiende. Para usar este método, se requieren paquetes de controlador ODBC de Oracle y UnixODBC de código abierto (Basic/ODBC/Devel). Junto con un módulo en PostgreSQL que puede comunicarse con DSN creado usando unixODBC y el controlador ODBC de Oracle. Hace unos años CyberTec lanzó un módulo ODBC-Link, actualmente está obsoleto, sin embargo, tiene una implementación estilo dblink para que PostgreSQL se conecte a cualquier otra base de datos compatible con ODBC. Podemos usar este módulo para conectividad básica a Oracle. Veamos.

Instalar unixODBC
tar -xvf unixODBC-2.3.4.tar.gz
cd unixODBC-2.3.4/
./configure --sysconfdir=/etc
make
make install

Binario/Bibliotecas/ubicación de los archivos de configuración:/usr/local/bin,/usr/local/lib,/etc(odbc.ini,odbcinst.ini)

Instalar el controlador ODBC de Oracle

rpm -ivh oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
rpm -ivh oracle-instantclient11.2-odbc-11.2.0.4.0-1.x86_64.rpm
rpm -ivh oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm

Ubicación de binarios/bibliotecas:/usr/lib/oracle/11.2/client64

Instalar enlace ODBC
tar -zxvf ODBC-Link-1.0.4.tar.gz
cd ODBC-Link-1.0.4
export PATH=/opt/PostgreSQL/9.5/bin:$PATH
which pg_config 
make USE_PGXS=1
make USE_PGXS=1 install

Ubicación de bibliotecas y archivos SQL:/opt/PostgreSQL/9.5/share/postgresql/contrib

La instalación creará un archivo SQL del módulo ODBC-Link en el directorio $PGHOME/contrib. Cargue el archivo SQL, que creará un esquema con el nombre "odbclink" con las funciones necesarias.

psql -p 5432 -d oratest -U postgres -f /opt/PostgreSQL/9.5/share/postgresql/contrib/odbclink.sql

En este punto, hemos instalado unixODBC Driver, el controlador Oracle ODBC y el módulo ODBC-Link para PostgreSQL. Como primer paso, necesitamos crear un DSN usando Oracle ODBC.

Edite el archivo /etc/odbcinst.ini y pase la definición de los controladores

## Driver for Oracle
[MyOracle]
Description     =ODBC for oracle
Driver          =/usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1
UsageCount=1
FileUsage = 1
Driver Logging = 7

Edite el archivo /etc/odbc.ini y cree el DSN con el controlador mencionado en /etd/odbcinst.ini

## Host: pg.raghav-node1.com, PORT: 1521
## Oracle Instance Name: ORA11G, Username: mmruser, Password: mmruser
## ODBC Data source: Ora

[Ora]
Descripción =base de datos myoracledb
Controlador =MyOracle
Trace =yes
TraceFile =/tmp/odbc_oracle.log
Base de datos =//pg.raghav-node1 .com:1521/ORA11G
ID de usuario =mmruser
Contraseña =mmruser
Puerto =1521

Después de crear DSN, cargue todas las bibliotecas de controladores ODBC de Oracle y Unix configurando variables de entorno y pruebe la conectividad utilizando la herramienta de línea de comandos del sistema operativo "dltest" e "iSQL"

[[email protected] ~]# export ORACLE_HOME=/usr/lib/oracle/11.2/client64
[[email protected] ~]# export LD_LIBRARY_PATH=/usr/local/unixODBC-2.3.4/lib:/usr/lib/oracle/11.2/client64/lib
[[email protected] ~]# export ODBCINI=/etc/odbc.ini
[[email protected] ~]# export ODBCSYSINI=/etc/
[[email protected] ~]# export TWO_TASK=//pg.raghav-node1.com:1521/ORA11G
[[email protected] ~]# dltest /usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1
SUCCESS: Loaded /usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1
[[email protected] ~]# isql ora -v
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

Ahora, configure las mismas variables de entorno para el usuario de postgres para cargar las bibliotecas y reinicie el clúster de PostgreSQL para que surta efecto. Conéctese a PostgreSQL y llame a las funciones odbclink para conectarse a la base de datos Oracle.

[[email protected] ~]#su - postgres
[[email protected] ~]$ export ORACLE_HOME=/usr/lib/oracle/11.2/client64
[[email protected] ~]$ export LD_LIBRARY_PATH=/usr/local/unixODBC-2.3.4/lib:/usr/lib/oracle/11.2/client64/lib
[[email protected] ~]$ export ODBCINI=/etc/odbc.ini
[[email protected] ~]$ export ODBCSYSINI=/etc/
[[email protected] ~]$ export TWO_TASK=//pg.raghav-node1.com:1521/ORA11G
[[email protected] ~]$ dltest /usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1
SUCCESS: Loaded /usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1
[[email protected] ~]$ /opt/PostgreSQL/9.5/bin/pg_ctl -D /opt/PostgreSQL/9.5/data/ stop -mf
[[email protected] ~]$ /opt/PostgreSQL/9.5/bin/pg_ctl -D /opt/PostgreSQL/9.5/data/ start
[[email protected] ~]$ psql
psql.bin (9.5.2)
Type "help" for help.

postgres=# seleccione odbclink.connect(‘DSN=Ora’);
conectar
———
1
(1 fila)

Guay, verdad…!!!. Para recuperar y manipular datos, consulte el archivo README de ODBC-Link.

Uso de envoltorios de datos externos

Una extensión SQL/MED (SQL Management of External Data) del estándar SQL permite administrar datos externos almacenados fuera de la base de datos. SQL/MED proporciona dos componentes Envoltorios de datos externos y Enlace de datos. PostgreSQL introdujo Foreign Data Wrapper (FDW) en la versión 9.1 con soporte de solo lectura y en la versión 9.3 soporte de escritura de este estándar SQL. Actualmente, la última versión tiene una serie de características y muchas variedades de FDW disponibles para acceder a diferentes bases de datos SQL remotas.

Oracle_fdw proporciona una manera fácil y eficiente de acceder a Oracle Database. En mi opinión, es uno de los mejores métodos para acceder a la base de datos remota. Para compilar Oracle_FDW con PostgreSQL 9.5, necesitamos bibliotecas de Oracle Instant Client y pg_config configurados en PATH. Podemos usar las mismas bibliotecas de Oracle Instant Client que se usan para ODBC-Link. Veamos cómo funciona.

Primero, configure las variables de entorno con bibliotecas OIC y pg_config

export PATH=/opt/PostgreSQL/9.5/bin:$PATH
export ORACLE_HOME=/usr/lib/oracle/11.2/client64
export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib

Descomprima el módulo oracle_fdw y compílelo con PostgreSQL 9.5

unzip oracle_fdw-1.4.0.zip
cd oracle_fdw-1.4.0/
make 
make install

Ahora cambie como usuario 'postgres' y reinicie el clúster cargando las bibliotecas de Oracle Instant Client requeridas para la extensión oracle_fdw y cree la extensión dentro de la base de datos.

[[email protected] 9.5]$ export ORACLE_HOME=/usr/lib/oracle/11.2/client64/lib
[[email protected] 9.5]$ export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib:$LD_LIBRARY_PATH
[[email protected] 9.5]$ /opt/PostgreSQL/9.5/bin/pg_ctl -D /opt/PostgreSQL/9.5/data/ stop -mf
[[email protected] 9.5]$ /opt/PostgreSQL/9.5/bin/pg_ctl -D /opt/PostgreSQL/9.5/data/ start
[[email protected] 9.5]$ psql
Password:
psql.bin (9.5.2)
Type "help" for help.

postgres=# crear extensión oracle_fdw;
CREAR EXTENSIÓN

Ahora puede acceder a la base de datos de Oracle.

postgres=# CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//pg.raghav-node1.com/ORA11G');
CREATE SERVER
postgres=# GRANT USAGE ON FOREIGN SERVER oradb TO postgres;
GRANT
postgres=# CREATE USER MAPPING FOR postgres SERVER oradb OPTIONS (user 'scott', password 'tiger');
CREATE USER MAPPING
postgres=#
postgres=# CREATE FOREIGN TABLE oratab (ecode integer,name char(30)) SERVER oradb OPTIONS(schema 'SCOTT',table 'EMP');
CREATE FOREIGN TABLE
postgres=# select * from oratab limit 3;
 ecode |              name
-------+--------------------------------
  7369 | SMITH
  7499 | ALLEN
  7521 | WARD
(3 rows)


Uso de controladores de Oracle Call Interface (OCI)

Oracle Call Interface (OCI), un controlador de tipo 2 disponible gratuitamente en el sitio de Oracle que permite al cliente conectarse a la base de datos de Oracle. EDB Postgres Advanced Server (también llamado EPAS), un producto propietario, tiene un módulo de enlace de base de datos basado en OCI integrado llamado dblink_ora, que se conecta a la base de datos de Oracle mediante controladores OCI de Oracle. Todo lo que tiene que hacer para usar el módulo dblink_ora, instalar EPAS (sin cubrir la instalación) y decirle a EPAS dónde puede encontrar las bibliotecas de controladores Oracle OCI. Podemos hacer uso del mismo Oracle Instant Client especificando la ubicación de sus bibliotecas en la variable de entorno LD_LIBRARY_PATH y, para que surta efecto, reinicie el clúster EPAS.

Primero, cambie como usuario "enterprisedb", cargue las bibliotecas y reinicie el clúster. Eso es todo, estamos listos para acceder a la base de datos de Oracle.

[[email protected] ~]$ export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib
[[email protected] bin]$ /opt/PostgresPlus/9.5AS/bin/pg_ctl -D /opt/PostgresPlus/9.5AS/data/ restart
[[email protected] bin]$ psql
psql.bin (9.5.0.5)
Type "help" for help.

edb=# seleccione dblink_ora_connect('oraconn','localhost','edbora','edbuser','edbuser',1521);
dblink_ora_connect
——————–
OK
(1 fila)

Nota:EPAS se conecta a la base de datos de Oracle utilizando la biblioteca de Oracle Instant Client "libclntsh.so". Si no encuentra la biblioteca en la ubicación de Oracle Client Library, cree el enlace simbólico con libclntsh.so apuntando a libclntsh.so.version.number. Consulte la documentación.

En el ejemplo, dblink_ora_connect establece una conexión a una base de datos de Oracle con la información de conexión especificada por el usuario. Luego, usando el nombre del enlace ('oraconn' en mi caso) podemos realizar operaciones como SELECCIONAR, INSERTAR, ELIMINAR, ACTUALIZAR y COPIAR usando las funciones dblink_ora*. Puede consultar todas las funciones en la documentación de EnterpriseDB aquí.

Todos los métodos anteriores serán muy útiles si está trabajando en proyectos de migración. Espero que sea útil. Gracias