sql >> Database >  >> RDS >> PostgreSQL

Manieren om toegang te krijgen tot Oracle Database in PostgreSQL

Tegenwoordig slaan organisaties informatie (data) op in verschillende databasesystemen. Elk databasesysteem heeft een reeks toepassingen die ertegen draaien. Deze gegevens zijn slechts bits en bytes op een bestandssysteem - en alleen een database kan de bits en bytes aan gegevens omzetten in bedrijfsinformatie. Integratie en consolidatie van dergelijke informatie(data) in één databasesysteem is vaak moeilijk. Omdat veel van de toepassingen die tegen de ene database worden uitgevoerd, mogelijk geen equivalente toepassing hebben die tegen een andere wordt uitgevoerd. Om de informatie in één databasesysteem te consolideren, hebben we een heterogene databaseverbinding nodig. In dit bericht laat ik zien hoe je PostgreSQL op verschillende manieren kunt verbinden met een van de heterogene databases van Oracle.

Hieronder staan ​​enkele methoden om verbinding te maken met de Oracle-database in PostgreSQL.

  • Het ODBC-stuurprogramma gebruiken
  • Buitenlandse DataWrappers gebruiken
  • Oracle Call Interface (OCI)-stuurprogramma gebruiken
Software gebruikt in demo (inbegrepen downloadlinks) – CentOS 7 64bit, PostgreSQL 9.5, EDB Postgres Advanced Server 9.5, ODBC-Link 1.0.4, unixODBC-2.3.4, Oracle Instant Client 11.x Drivers &Oracle_FDWGebruik van ODBC Bestuurder

Open DataBase Connectivity (ODBC) is een standaard software-API voor het gebruik van DBMS. Het ODBC-stuurprogramma/ODBC-gegevensbron (API) is een bibliotheek waarmee toepassingen verbinding kunnen maken met elke database waarvoor een ODBC-stuurprogramma beschikbaar is. Het is een middelste laag die de gegevensquery's van de toepassing vertaalt in opdrachten die het DBMS begrijpt. Om deze methode te gebruiken, zijn een open source unixODBC en Oracle ODBC-stuurprogrammapakketten (Basic/ODBC/Devel) vereist. Samen met een module in PostgreSQL die kan communiceren met DSN die is gemaakt met UnixODBC en Oracle ODBC-stuurprogramma. Enkele jaren geleden heeft CyberTec een module ODBC-Link uitgebracht, op dit moment is deze verouderd, maar het heeft een dblink-achtige implementatie voor PostgreSQL om verbinding te maken met elke andere ODBC-compatibele database. We kunnen deze module gebruiken voor basisconnectiviteit met Oracle. Eens kijken.

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

Locatie van binaire/bibliotheken/configuratiebestanden:/usr/local/bin,/usr/local/lib,/etc(odbc.ini,odbcinst.ini)

Oracle ODBC-stuurprogramma installeren

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

Locatie binair/bibliotheken:/usr/lib/oracle/11.2/client64

Installeer ODBC-Link
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

Locatie van bibliotheken en SQL-bestanden:/opt/PostgreSQL/9.5/share/postgresql/contrib

Installatie zal een SQL-bestand van de ODBC-Link-module maken in de directory $PGHOME/contrib. Laad het SQL-bestand, dat een schema met de naam "odbclink" zal maken met de nodige functies erin.

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

Op dit moment hebben we unixODBC Drirver, Oracle ODBC-stuurprogramma en ODBC-Link-module voor PostgreSQL geïnstalleerd. Als eerste stap moeten we een DSN maken met Oracle ODBC.

Bewerk het bestand /etc/odbcinst.ini en geef de definitie van de stuurprogramma's door

## 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

Bewerk het bestand /etc/odbc.ini en maak de DSN met het stuurprogramma vermeld in /etd/odbcinst.ini

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

[Ora]
Beschrijving =myoracledb-database
Driver =MyOracle
Trace =ja
TraceFile =/tmp/odbc_oracle.log
Database =//pg.raghav-node1 .com:1521/ORA11G
Gebruikers-ID =mmruser
Wachtwoord =mmruser
Poort =1521

Laad na het maken van DSN alle Oracle &Unix ODBC-stuurprogrammabibliotheken door omgevingsvariabelen in te stellen en test de connectiviteit met behulp van de OS-opdrachtregeltool "dltest" &"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>

Stel nu dezelfde omgevingsvariabelen in voor postgres-gebruiker voor het laden van de bibliotheken en start het PostgreSQL-cluster opnieuw om van kracht te worden. Maak verbinding met PostgreSQL en roep odbclink-functies aan om verbinding te maken met de Oracle-database.

[[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=# select odbclink.connect(‘DSN=Ora’);
connect
———
1
(1 rij)

Cool toch…!!!. Raadpleeg het README-bestand van ODBC-Link voor het ophalen en manipuleren van gegevens.

Buitenlandse DataWrappers gebruiken

Een SQL/MED-uitbreiding (SQL Management of External Data) op de SQL-standaard maakt het mogelijk om externe gegevens te beheren die buiten de database zijn opgeslagen. SQL/MED biedt twee componenten Foreign data wrappers en Datalink. PostgreSQL introduceerde Foreign Data Wrapper (FDW) in versie 9.1 met alleen-lezen ondersteuning en in versie 9.3 schrijfondersteuning van deze SQL-standaard. Tegenwoordig heeft de nieuwste versie een aantal functies eromheen en zijn er vele varianten van FDW beschikbaar om toegang te krijgen tot verschillende externe SQL-databases.

Oracle_fdw biedt een gemakkelijke en efficiënte manier om toegang te krijgen tot Oracle Database. IMO, het is een van de coolste methoden om toegang te krijgen tot de externe database. Om Oracle_FDW met PostgreSQL 9.5 te compileren, hebben we Oracle Instant Client-bibliotheken en pg_config nodig die zijn ingesteld in PATH. We kunnen dezelfde Oracle Instant Client-bibliotheken gebruiken die worden gebruikt voor ODBC-Link. Laten we eens kijken hoe het werkt.

Stel eerst omgevingsvariabelen in met OIC-bibliotheken en 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

Pak de module oracle_fdw uit en compileer deze met PostgreSQL 9.5

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

Schakel nu over als 'postgres'-gebruiker en start het cluster opnieuw door Oracle Instant Client-bibliotheken te laden die nodig zijn voor de extensie oracle_fdw en maak de extensie in de database.

[[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=# extensie maken oracle_fdw;
EXTENS MAKEN

Nu hebt u toegang tot de Oracle-database.

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)


Oracle Call Interface (OCI)-stuurprogramma's gebruiken

Oracle Call Interface (OCI) een type-2-stuurprogramma dat gratis beschikbaar is op de Oracle-site waarmee de client verbinding kan maken met de Oracle-database. EDB Postgres Advanced Server (ook wel EPAS genoemd), een eigen product heeft een ingebouwde OCI-gebaseerde databaselinkmodule genaamd dblink_ora, die verbinding maakt met de Oracle-database met behulp van Oracle OCI-stuurprogramma's. Het enige wat u hoeft te doen om de dblink_ora-module te gebruiken, EPAS te installeren (niet voor installatie) en EPAS te vertellen waar het Oracle OCI-stuurprogrammabibliotheken kan vinden. We kunnen dezelfde Oracle Instant Client gebruiken door de locatie van de bibliotheken op te geven in de omgevingsvariabele LD_LIBRARY_PATH en om het EPAS-cluster van kracht te laten herstarten.

Schakel eerst over als "enterprisedb" -gebruiker, laad de bibliotheken en start het cluster opnieuw. Dat is alles, we zijn goed om toegang te krijgen tot de Oracle-database.

[[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=# select dblink_ora_connect('oraconn','localhost','edbora','edbuser','edbuser',1521));
dblink_ora_connect
——————–
OK
(1 rij)

Opmerking:EPAS maakt verbinding met de Oracle Database met behulp van de Oracle Instant Client-bibliotheek "libclntsh.so". Als u de bibliotheek niet kunt vinden op de locatie van de Oracle Client Library, maak dan de symbolische link met libclntsh.so die verwijst naar het libclntsh.so.version.number. Raadpleeg de documentatie.

In het voorbeeld brengt dblink_ora_connect een verbinding tot stand met een Oracle-database met de door de gebruiker opgegeven verbindingsinformatie. Later met behulp van de linknaam ('oraconn' in mijn geval) kunnen we bewerkingen uitvoeren zoals SELECT, INSERT, DELETE, UPDATE © met behulp van dblink_ora * -functies. Alle functies die u kunt raadplegen in de EnterpriseDB-documentatie hier.

Alle bovenstaande methoden zijn erg handig als u aan migratieprojecten werkt. Hoop dat het nuttig is. Dank je


  1. COS() Functie in Oracle

  2. MySQL – Wacht enkele seconden met SELECT SLEEP()

  3. Cyclusdetectie met recursieve subqueryfactoring

  4. Hoe de DateTime()-functie werkt in SQLite