Oracle'dan PostgreSQL'e geçiş: Ora2Pg ile adım adım yol haritası
Lisans maliyetinden kurtulmak isteyen kurumların gözdesi PostgreSQL'e geçişte en çok kullanılan araç Ora2Pg. Kurulumdan maliyet tahminine, veri tipi farklarından sık yapılan hatalara kadar pratik bir rehber.
Eğitim verdiğim dönemde "PostgreSQL'e geçiş" başlığı daha çok merak konusuydu. Bugün ise birçok kurumun gündeminde. Geçişin en çok kullanılan aracı da hâlâ aynı: Ora2Pg. Tek fark, eskiden Perl modüllerini elle derleyerek kurduğumuz bu araç artık çok daha olgun.
1. Kurulum
Ora2Pg Perl ile yazılmıştır ve Oracle'a bağlanmak için DBD::Oracle modülüne, o da Oracle Instant Client'a (Basic ve SDK paketleri) ihtiyaç duyar. Birçok Linux dağıtımında paket olarak bulunur; bulunmazsa:
tar xzf ora2pg-x.y.tar.gz && cd ora2pg-x.y
perl Makefile.PL && make && sudo make install
Kurulumdan önce ORACLE_HOME ve LD_LIBRARY_PATH ortam değişkenlerinin Instant Client'ı gösterdiğinden emin olun.
2. Proje yapısını oluşturmak
ora2pg --project_base /gecis --init_project satis_projesi
Bu komut şema, veri ve kaynak kod için klasörleri ve bir ora2pg.conf dosyasını hazırlar. Konfigürasyonda en önemli ayarlar:
ORACLE_DSN dbi:Oracle:host=10.0.0.20;sid=ORCL;port=1521
ORACLE_USER gecis_okuyucu
ORACLE_PWD ********
SCHEMA SATIS
3. Önce rapor, sonra iş
Geçişe başlamadan önce ne kadar iş olduğunu ölçün:
ora2pg -c ora2pg.conf -t SHOW_REPORT --estimate_cost
Rapor; tablo, view, paket, prosedür ve trigger sayılarını ve otomatik çevrilemeyecek kod için tahmini adam-gün maliyetini verir. Yönetime sunulacak ilk belge genellikle budur.
4. Şema ve veri aktarımı
TYPE ayarını değiştirerek sırayla dışa aktarım yapılır: TABLE, SEQUENCE, VIEW, TRIGGER, FUNCTION, PROCEDURE, PACKAGE ve en sonda veri için COPY. Üretilen SQL dosyaları psql ile yüklenir:
psql -d yenidb -f schema/tables/table.sql
Büyük tablolarda yabancı anahtarları sona bırakmak ya da DEFER_FKEY 1 ile ertelemek yükleme süresini kısaltır.
5. Sizi bekleyen sürprizler
| Oracle | PostgreSQL | Not |
|---|---|---|
NUMBER(10) |
integer / bigint |
Ölçeksiz NUMBER'ları numeric bırakmak performansı düşürür |
VARCHAR2(n) |
varchar(n) / text |
|
DATE |
timestamp(0) |
Oracle DATE saat de tutar! |
CLOB / BLOB |
text / bytea |
|
SYSDATE |
now() / LOCALTIMESTAMP |
|
seq.NEXTVAL |
nextval('seq') |
|
ROWNUM <= 10 |
LIMIT 10 |
|
CONNECT BY |
WITH RECURSIVE |
|
(+) dış birleştirme |
LEFT JOIN |
En sinsi fark: Oracle boş metni ('') NULL kabul eder, PostgreSQL etmez. WHERE kolon IS NULL ile yazılmış eski sorgular geçişten sonra farklı sonuç döndürebilir. Test senaryolarınıza mutlaka ekleyin.
Oracle'a özgü NVL, DECODE, ADD_MONTHS, DUAL gibi yapılar için orafce eklentisi büyük kolaylık sağlar; ama uzun vadede kodu PostgreSQL'in kendi karşılıklarına (COALESCE, CASE vb.) çevirmek daha sağlıklıdır.
6. Geçiş sonrası
- Tüm tablolar için
ANALYZEçalıştırın. - Satır sayılarını ve kritik toplamları iki tarafta karşılaştırın.
- Uygulamanın en ağır 20 sorgusunu
EXPLAIN ANALYZEile gözden geçirin; Oracle'da hızlı olan bir sorgu farklı bir indekse ihtiyaç duyabilir.
Geçişin en zor kısmı veri değil, PL/SQL paketleridir. Kod miktarı fazlaysa geçişi tek seferde değil, modül modül planlamak riskleri azaltır.
Kaynak: Ora2Pg resmi sitesi ve belgeleri
Yorumlar (0)