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)
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 unixODBCtar -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 ODBCtar -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