Ora2pg

Ora2pg, Oracle’dan Postgresql göç (migration) yapabilen ücretsiz bir yazılımdır.
Özellikleri, çoğunlukla Oracle’a yönelik olsa da MySQL’ den tam exportu da destekler.
Özellikleri ;

  • Export schema (tables, view, mview sequences, indexes, unique, P/F key, check
    constraints.),
  • Export grup ve kullanıcı hakları,
  • Export range/list partitions, sub partitions,
  • İsimlerini belirterek sadece istenen tabloları export,
  • Export predefined functions, triggers, procedures, packages package bodies,
  • Verinin tamamını veya WHERE koşulu ile export,
  • Oracle BLOB object (PG BYTEA.),
  • Export Oracle views (PG tablo.),
  • Export Oracle kullanıcı tanımlı types,
  • Tüm platformları destekler (ms linux vb.),
  • Oracle tablolarını PG foreign data wrapper tablo olarak export,
  • Oracle veritabanı bileşenlerini raporlayabilir,
  • Oracle veritabanından göç maliyetini değerlendirebilir,
  • Oracle veritabanından göç zorluk seviyesini değerlendirebilir,
  • Pentaho Data Integrator (eski ismi Kettle) ile kullanılabilir XML ktr dosyalarını
    oluşturabilir.

Tüm özellikler için aşağıdaki linki ziyaret edebilirsiniz.
ora2pg.darold.net/documentation.html#FEATURES

Kurulum

Büyük veri göçlerinde tüm sunucuların aynı network sınıfında (arada routing NAT
vb. olmamalı, özellikle NAT yavaşlatır.) ve minimum 1GBPS hızda olması gerekir.
Kesinti süresi azalıp veri boyutu büyüdükçe min 10GBPS üstü network ve yüksek IOPS
kapasitesine ihtiyaç olabilir.

Adım 1

Oracle veritabanına bağlanabilmesi için oracle clienta ihtiyaç var.

# root kullanıcısı ile (192.168.56.1 )
mkdir /ora2pgsetup
cd /ora2pgsetup
wget https://download.oracle.com/otn_software/linux/
instantclient/213000/instantclient-basic-linux.x64-21.3.0.0.0.zip
wget https://download.oracle.com/otn_software/linux/
instantclient/213000/instantclient-sqlplus-linux.x64-21.3.0.0.0.zip
wget https://download.oracle.com/otn_software/linux/
instantclient/213000/instantclient-sdk-linux.x64-21.3.0.0.0.zip
mkdir /opt/oracle
unzip instantclient-basic-linux.x64-21.3.0.0.0.zip -d /opt/oracle
unzip instantclient-sqlplus-linux.x64-21.3.0.0.0.zip -d /opt/oracle/
unzip instantclient-sdk-linux.x64-21.3.0.0.0.zip -d /opt/oracle

Adım 2

.profile’ lar düzenlenir. Kurulum sırasında da ora2pg’yi kullanırken de oracle
clienta ihtiyaç vardır. Bu yüzden profile’lar doğru ayarlanmalıdır aksi halde hata alınır.
(hem root hem de ora2pg’yi kullanacak standart kullanıcıların da .profile’ları
düzenlenmeli)

vim ~/.profile # Dosyasına aşağıdaki satırlar eklenir.
export LD_LIBRARY_PATH=/opt/oracle/instantclient_21_3
export PATH=”/opt/oracle/instantclient_21_3:$PATH”
export ORACLE_HOME=/opt/oracle/instantclient_21_3
# Mevcut oturumda geçerlilik kazanması için source ~/.profile
# Kurulum testi
which sqlplus
#çıktının aşağıdaki gibi olması gerekir.
/opt/oracle/instantclient_21_3/sqlplus

Oracle instant client kullanıldığı için ld_library_path ile oracle_home dizinleri
aynı olur.

Adım 3

ora2pg için gerekli paketler kurulur.

apt install libdbd-pg-perl
apt install libdbi-perl
apt install dpkg-dev
apt install debhelper
apt install gcc
apt install build-essential
apt install libaio1
apt install make
apt install libpq-dev
apt install postgresql-client

Not: ora2pg, postgresql veritabanı sunucusuna kurulacaksa postgresql-client’a gerek
yok.

Adım 4

ora2pg indirilerek kurulumu yapılır.

mkdir /ora2pgsetup/ora2pgsetup
cd /ora2pgsetup/ora2pgsetup
wget https://github.com/darold/ora2pg/archive/refs/heads/master.zip
unzip ora2pg-master.zip
cd ora2pg-master/
perl Makefile.PL
make && make install

Ora2pg defaultta /etc/ora2pg/ora2pg.conf konfigurasyon dosyasından çalışır.
/usr/local/bin/ora2pg -c /etc/ora2pg/farklı_1_ora2pg.conf
ile farklı bir konfigurasyon dosyasından da çalıştırılabilir.

Adım 5

Önce clientlarla bağlantılar test edilir.

# Oracle bağlantı testi
mehmed@dataera:~$ sql system/welcome1@10.71.5.121:1521/orcl.orcl
SQLcl: Release 21.3 Production on Wed Jul 20 06:07:05 2022
Copyright (c) 1982, 2022, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.2.0.4.0 - 64bit Production
#192.168.56.61 IP’li postgresql veritabanı sunucusuna 5434
portundan bağlantı yapılır.
psql -h 192.168.56.61 -p 5434 -d mx -U postgres -W
Password:
psql (14.4 (Ubuntu 14.4-1.pgdg20.04+1), server 13.6)
Type “help” for help

Oracle :
sql system/welcome1@10.71.5.121:1521/orcl.orcl
sql (sqlcli): Oracle’ın SQL Developer uygulamasının terminal versiyonudur. Sorgularda kolon formatlarını düzelterek çıktıyı ekrana yazar.
system : Oracle veritabanında en yetkili kullanıcılardan biri.
welcome1 : System kullanıcısının şifresi
10.71.5.121 : Oracle veritabanı sunucusunun IP adresi
orcl.orcl : instance/servis ismi
İki veritabanına da sorunsuz bağlantı yapıldığı görülür.

Adım 6

ora2pg.conf dosyasının düzenlenir.

# Default gelen konf dosyası kopyalanır.
cp /etc/ora2pg/ora2pg.conf.dist /etc/ora2pg/ora2pg.conf
# Bağlantı bilgileri ora2pg.conf dosyasına girilir.
vim /etc/ora2pg/ora2pg.conf
# Oracle bağlantı bilgileri. (sql/sqlplus ile bağlantı test
edilmiş olmalı)
ORACLE_DSN dbi:Oracle:host=10.71.5.121;sid=DB11G;port=1521
ORACLE_USER system
ORACLE_PWD welcome1
Not: 12C ve üzerinde dbi:Oracle:host=IP;service_name=servis_
ismi;port=1521
# Postgresql bağlantı bilgileri (psql ile bağlantı test edilmiş
olmalı).
PG_DSN dbi:Pg:dbname=erpdb;host=192.168.56.61;port=5434
PG_USER postgres
PG_PWD welcome1

Postgresql bağlantı bilgileri girilirse veriyi oracle’dan direk postgresql’e yazar.
Girilmezse bir dosyaya yazar sonrasında bu dosya postgresql sunucusuna gönderilir ve
import edilir.

ora2pg bağlantı testi yapılır.

Sorgu sonuçlarının hatasız gelmesi ora2pg’nin sağlıklı çalıştığını göstermektedir. Test
veritabanı olduğu için kurulumla birlikte gelen default schemalar bulunmakta.

Veri tipi değiştirme, tablo ismi değiştirme, encryption, SCN’ye göre veri aktarma, CDC
araçları için cdc_ready parametresi gibi bir çok özelliğe sahiptir.
ora2pg parametrelerinin tam listesini ora2pg.conf dosyasında ve https://ora2pg.darold.net/documentation.html resmi sitesinde bulabilirsiniz.

Örnek

Oracle’daki hr schema’sının tabloları postgresql’ de mx veritabanına kopyalanır.

Adım 1

mehmed@dataera:~$ vim /etc/ora2pg/ora2pg.conf
EXPORT_SCHEMA 1
SCHEMA hr
CREATE_SCHEMA 1
STOP_ON_ERROR 0
SKIP fkeys pkeys ukeys indexes checks
TYPE TABLE
OUTPUT_DIR /data

Değerleri ile ora2pg.conf dosyası güncellenir. Bağlantı bilgileri adım 6’da verilmişti.

Adım 2

ora2pg -t SHOW_REPORT -c /etc/ora2pg/ora2pg.conf –estimate_cost > /data/hr.ec.html
ora2pg -c /../ora2pg.conf -t SHOW_REPORT --dump_as_html > /../hr.mg_as.html
# Paralelizm 4 ile HR schemasının tabloları hr_tables_V01.sql
dosyasına yazdırılır.
ora2pg -c /../ora2pg.conf -t TABLE -o hr_tables_V01.sql -P 4
[========================>] 9/9 tables (100.0%) end of scanning.
[========================>] 9/9 tables (100.0%) end of table export.

Rapor alınıp, schema export edilir. Bu export oracle’daki hr schema’sının postgresql’e
uyarlanmış (convert) halidir. Text editörle güncellenebilir.
hr_tables_V01.sql dosyasını /data dizininde oluşturur.

Not: PG_DSN bilgilerini girdiğimiz için oracle’dan veri kopyalanıp direk Postgresql’e
yazılır. Yani hr_tables_V01.sql dosyasında sadece metada bilgisi (create script)
vardır. Veri (insert/copy cümleleri) yoktur.

ora2pg çalıştırılırken verilen parametrelerle ora2pg.conf dosyasındakiler
çakışırsa, çalıştırırken verilen parametreler baskındır.

Adım 3

# ora2pg makinesinden Postgresql’e bağlanılır.
psql -h 192.168.56.61 -d mx -U postgres -p 5434 -W
mx=# \i /data/hr_tables_V01.sql
SET
CREATE SCHEMA
ALTER SCHEMA
SET
CREATE TABLE ....
mx=# show search_path;
search_path
-------------
hr, public
mx=# \dt
List of relations
Schema | Name | Type | Owner
--------+-------------+-------+----------
hr | countries | table | postgres
..
(9 rows)

Postgresql’e hr scheması import edilip kontrolü sağlanır.
Her seferinde şifre girmemek için ;
PGPASSWORD=”sifre” psql -h 192.168.56.61 -p 5434 -d mx -U
postgres -f /data/hr_tables_V01.sql

Adım 4

# 8 paralelizm ile hr schemasının tabloları postgresql’e kopyalanır.
ora2pg -c /etc/ora2pg/ora2pg.conf -t COPY -P 8 > hr_schema_mig.log
[===>] 9/9 tables (100.0%) end of scanning.
.....
[===>] 228/227 rows (100.4%) on total estimated data (4 sec.avg:57
tuples/sec)
# Veri aktarımı sonrası kaynak ve hedefin satır sayıları
kontrol edilir.
ora2pg -t TEST --count_rows -c /etc/ora2pg/ora2pg.conf -P 8
ora2pg -t TEST_DATA -c /etc/ora2pg/ora2pg.conf -P 8

Not: Saniyede ortalama 57 satır (tuple/row) kopyalanmış. Bu çok düşük bir rakam. Her
ne kadar çalıştığımız makinelerde SSD diskler olsa da oracle veritabanına VPN üzerinden
bağlı olduğumuz için performansı düşürmektedir.

Veri aktarılırken, IOPS performansı, memory miktarı, çekirdek sayısı ve ağ hızı
performansı direkt etkiler.
Bununla beraber Oracle/postgresql instance ve işletim sistemi ile birlikte
ora2pg.conf‘ta performans iyileştirmelerine ihtiyaç olabilir.

Performans, bu zincirdeki en zayıf halkaya bağlı olacaktır. Örneğin 128 çekirdek de olsa
paralelizm doğru ayarlanmazsa bir çekirdek %100 çalışırken diğer 127 çekirdek atıl (idle)
kalacaktır.

Not: Oracle’dan taşınacak objlerin istatistik bilgilerinin güncel olması gerekir.

Adım 5

# Rapor alınır.
# view export
ora2pg -c /etc/ora2pg/ora2pg.conf -t VIEW -o hr_views_V01.sql -P 4
# sequence export
ora2pg -c /etc/ora2pg/ora2pg.conf -t SEQUENCE -o hr_sequences_V01.sql -P 4
mx=# \i /data/hr_views_V01.sql
mx=# \i /data/hr_sequences_V01.sql

Diğer objeler de “-t” opsiyonu ile belirtilip export edilip, psql aracılığı ile import edilir.

Kategori seçin...