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…
Ključne besede: baze podatkov, PostgreSQL