Objavljeno:

Osvoboditev podatkov iz Oracle baze v PostgreSQL

V tokratnem prispevku si bomo pogledali kako podatke iz Oracle baze podatkov le-te prenesti v PostgreSQL. Oracle se namreč uporablja v številnih državnih ustanovah, bančnem sektorju, itd, vendar je PostgreSQL po funcionalnosti in zmogljivosti z njim precej primerljiv.

Ena izmed dobrih lastnosti PostgreSQL pa je tudi ta, da omogoča uporabo tim. zunanjih podatkovnih virov, gre za tim. Foreign Data Wrapper.

Eden izmed podatkovnih virov, ki jih lahko uporabimo v PostgreSQL so tudi Oracle baze podatkov. Za povezovanje na Oracle uporabimo razširitev oracle_fdw. Razširitev je priporočljivo uporabiti na najnovejši različici PostgreSQL strežnika. Uporabili smo različico 9.3 na posodobljenem Ubuntu strežniku, isto razširitev pa smo uspešno testirali tudi na Debian Wheezy strežniku. Različico PostgreSQL strežnika sicer preverimo z ukazom:

psql --version
psql (PostgreSQL) 9.3.2

Najprej torej namestimo PostgreSQL 9.3:

apt-get install postgresql-9.3 postgresql-server-dev-9.3

Nato ustvarimo podimenik, kamor bomo shranili vse potrebne datoteke ter vstopimo vanj:

mkdir oracle_connector
cd oracle_connector/

Nato iz spleta prenesemo oracle_fdw (v času pisanja prispevka je bila trenutna različica 0.9.10) ter jo razširimo:

wget http://pgfoundry.org/frs/download.php/3583/oracle_fdw-0.9.10.tar.gz
tar -xzf oracle_fdw-0.9.10.tar.gz

Iz spletne strani Oracla (potrebna je brezplačna registracija) prenesemo naslednje programske pakete (v našem primeru za 64-bitni Linux sistem):

  • InstantClient Package – Basic (instantclient-basic-linux.x64-12.1.0.1.0.zip)
  • Instant Client Package – SDK (instantclient-sdk-linux.x64-12.1.0.1.0.zip)
  • Instant Client Package – SQL*Plus (instantclient-sqlplus-linux.x64-12.1.0.1.0.zip)

Datoteke razširimo:

unzip instantclient-basic-linux.x64-12.1.0.1.0.zip
unzip instantclient-sdk-linux.x64-12.1.0.1.0.zip
unzip instantclient-sqlplus-linux.x64-12.1.0.1.0.zip

Sledi namestitev libaio1 knjižnice. Gre za knjižnico, ki tim. omogoča AIO dostop do Linux jedra (ang. AIO access). Le-ta Linux uporabniškemu prostoru (ang. userspace) omogoča uporabo asinhronih vhodno-izhodnih sistemskih klicev Linux jedra, kar je pomembno za zagotavljanje visoke stopnje zmogljivosti zlasti podatkovnih baz in podobnih sistemov.

apt-get install libaio1

Sedaj vstopimo v podimenik kjer se nahaja razširjen Instant Client ter z nekaj “triki” pripravimo razvojno okolje za namestitev oracle_fdw:

cd instantclient_12_1/
cp *so* /lib
ldconfig
cd /lib
ls -lsa *clntsh*
ln -s libclntsh.so.12.1 libclntsh.so
cd -
ln -s libclntsh.so.12.1 libclntsh.so

Sledi vstop v podimenik, kjer se nahajajo razširjene datoteke oracle_fdw razširitve:

cd ~/oracle_connector/oracle_fdw-0.9.10

Z nekaj dodatnimi “triki” popravimo še dateko Makefile:

nano Makefile

Poiščemo:

SHLIB_LINK = -L$(ORACLE_HOME)

… in v isto vrstico dodamo (pozor, na koncu mora biti presledek):

-L/lib

Sledi prevajanje oracle_fdw (za to seveda potrebujemo nameščen gcc prevajalnik oziroma programski paket build-essential):

ORACLE_HOME=/home/matej/oracle_connector/instantclient_12_1 make
make install

Sedaj vstopimo v podimenik, kjer se nahaja Instant Client in zaženemo SQL Plus. Podatke za povezavo dobimo iz tim. Oracle connection stringa (.ora datoteke):

cd ..
cd instantclient_12_1/
LD_LIBRARY_PATH=. ./sqlplus USERNAME/PASSWORD@oracledbserver.server.si/ORADB

Znašli smo se v SQL Plus odjemalcu in sedaj lahko gledamo vsebino Oraclove podatkovne baze. Primer izpisa seznama tabel Oraclovi bazi, ki so nam na voljo:

SQL> select * from user_objects;
OBJECT_NAME
 --------------------------------------------------------------------------------
 SUBOBJECT_NAME                  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
 ------------------------------ ---------- -------------- -------------------
 CREATED  LAST_DDL TIMESTAMP           STATUS  T G S  NAMESPACE
 -------- -------- ------------------- ------- - - - ----------
 EDITION_NAME
 ------------------------------
 FINANCE
 1429579                SYNONYM
 25.02.14 25.02.14 2014-02-25:20:29:29 VALID   N N N          1

Ter primer izpisa strukture posamezne tabele:

SQL> describe finance;
Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 DATUM                                     NOT NULL DATE
 NAMEN                                     NOT NULL VARCHAR2(60)
 ZNESEK                                             NUMBER(18,2)

SQL Plus zapustimo z ukazom “quit“:

SQL> quit

Sedaj v PostgreSQL lahko ustvarimo povezavo do Oraclove baze:

su - postgres
createdb mojoracle
psql mojoracle

Vstopili smo v PostgreSQL bazo z imenom mojoracle. Sedaj vnesemo naslednje ukaze s katerimi vzpostavimo povezavo z Oraclovim strežnikom:

CREATE EXTENSION oracle_fdw;
CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//dbserver.mydomain.com/ORADB');
GRANT USAGE ON FOREIGN SERVER oradb TO postgres;
CREATE USER MAPPING FOR postgres SERVER oradb options (user 'USERNAME', password 'PASSWORD');

Nato v PostgreSQL ustvarimo tabelo, ki jo povežemo z Oraclovo tabelo preko prej vzpostavljene povezave:

create foreign table finance (
 DATUM date,
 NAMEN text,
 ZNESEK numeric(18,2)) server oradb options (table 'FINANCE');

Pri definiranju tabele v PostgreSQL je potrebno paziti na ustrezne podatkovne tipe, ki morajo biti ekvivalentni tistim iz Oraclovega strežnika. Tako smo Oraclov tip DATE pretvorili v PostgreSQL-ov date, VARCHAR2(60) v text, NUMBER(18,2) pa v numeric(18,2).

Če sedaj pogledamo tabele v naši PostgreSQL bazi, vidimo:

\d
List of relations
Schema |   Name    |     Type      |  Owner
-------+-----------+---------------+----------
public | finance   | foreign table | postgres
(1 row)

Podatke zdaj lahko obdelujemo z že znanimi ukazi. Če jih hočemo prenesti v lokalno tabelo enostavno vpišemo ukaz:

select * into finance_local from finance;

Oziroma podatke prenesemo v lokalno datoteko:

copy (select * from finance) to '/tmp/finance.csv' with csv header delimiter ';' quote '"';

Povezavo z zunanjo tabelo prekinemo z ukazom DROP FOREIGN TABLE, povezavo z zunanjim strežnikom z ukazom DROP SERVER, uporabniško preslikavo (ang. mapping) podatkov pa z ukazom DROP USER MAPPING.

Na opisan način lahko PostgreSQL enostavno povežemo z zunanjimi viri podatkov. In morda celo ugotovimo, da je Oracle programsko opremo mogoče zamenjati z odprtokodnim in brezplačnim PostgreSQL…

Kategorije: Informacijska varnost, Odprta koda
Ključne besede: baze podatkov, PostgreSQL