
Memigrasi skema dan data dari Oracle DB ke Postgres Pro Enterprise adalah jalan berbatu yang penuh dengan kendala yang tak terhitung jumlahnya. Terlepas dari semua kerumitannya, prosesnya menjadi lebih lancar berkat fitur-fitur canggih Postgres Pro Enterprise yang meniru mekanisme Oracle DBMS yang hilang dari versi vanilla.
Ada juga utilitas sumber terbuka ora2pg untuk migrasi otomatis, tetapi tidak mendukung fitur tambahan Postgres Pro Enterprise ini. Itulah alasan kami membuat ora2pgpro, alat yang dirancang khusus untuk bermigrasi dari Oracle ke Postgres Pro Enterprise sambil mempertimbangkan fitur uniknya.
Dalam artikel ini, kita akan membahas tantangan yang harus diatasi oleh alat migrasi otomatis, mengapa ora2pg tidak dapat sepenuhnya memenuhi semua kebutuhan kita, dan terakhir, apa sebenarnya “makhluk buas” yang disebut ora2pgpro ini.
Hambatan saat bermigrasi ke vanilla PostgreSQL
Pertanyaan pertama: objek apa yang sebenarnya perlu diekspor?
Jelasnya, semua objek DB yang mendasari logika bisnis harus dimigrasi: tabel, indeks, fungsi PL/SQL, transaksi otonom, paket, skema, dan sebagainya. Penting juga untuk memastikan bahwa teknologi DB target sepenuhnya sesuai dengan fungsionalitas Oracle DB. Jika tidak, logika bisnis tidak akan berfungsi dengan benar.
Setidaknya, vanilla PostgreSQL tidak memiliki dukungan asli untuk paket, transaksi otonom, dan mekanisme lain di tingkat inti (lihat Gambar 1). Hal ini saja dapat mempersulit migrasi. Sebaliknya, seperti yang akan segera kita lihat, Postgres Pro Enterprise tidak mengalami kekurangan ini.
Karena struktur DB sering kali mengkodekan logika bisnis yang rumit dan rumit, konversi manual bukanlah pilihan yang baik — waktu yang terbuang akan sangat besar. Itu sebabnya membangun konverter DB otomatis seperti ora2pg dan ora2pgpro hanya masalah waktu saja.
Apa itu ora2pg dan ora2pgpro?
ora2pg adalah utilitas gratis yang secara otomatis mengubah skema Oracle DB ke PostgreSQL. Ini menawarkan fungsionalitas luas untuk mengotomatisasi sebagian besar tugas migrasi skema. Itu dapat mengekspor berbagai macam objek DB, termasuk tabel, hak pengguna, skema, BLOB, kode PL/SQL, dan banyak lagi. Ia bahkan dapat memperkirakan biaya migrasi dengan mengidentifikasi objek yang tidak dapat dikonversi secara otomatis.
Bermigrasi ke vanilla PostgreSQL baik-baik saja — tetapi bagaimana dengan Postgres Pro Enterprise? Di sinilah ora2pgpro berperan: ora2pg versi komersial kami, yang memperhitungkan fitur mirip Oracle yang diterapkan di Postgres Pro Enterprise.
Peningkatan utama yang membedakan ora2pgpro adalah:
-
Dukungan untuk transaksi otonom di Postgres Pro Enterprise.
-
Dukungan untuk paket Postgres Pro Enterprise.
-
Dukungan untuk array asosiatif melalui ekstensi perusahaan pg_variables.
-
Algoritme yang lebih canggih untuk menerjemahkan PL/SQL ke PL/pgSQL
Sekarang kita akan menjelajahi permasalahan migrasi yang umum saat menggunakan ora2pg dan bagaimana ora2pgpro menyelesaikannya saat bermigrasi ke Postgres Pro Enterprise.
Dukungan untuk transaksi otonom
ora2pg meniru transaksi otonom, meskipun vanilla PostgreSQL tidak memilikinya. Namun, Postgres Pro Enterprise melakukannya.
Transaksi otonom adalah sub-transaksi khusus yang dapat dilakukan atau dibatalkan secara independen dari transaksi induknya. Artinya, hasil (misalnya, logging atau audit) langsung terlihat setelah selesai, meskipun transaksi induk masih berjalan atau kemudian dibatalkan. Menirunya melalui dblink memerlukan pembukaan koneksi baru — yang berdampak pada kinerja. Menggunakan pg_background tidak jauh lebih baik: setiap transaksi otonom meluncurkan proses latar belakang, yang juga mahal dalam hal kinerja.
Masalah peniruan ini mendorong kami untuk menerapkan transaksi otonom langsung di inti Perusahaan. Implementasi asli kami jauh lebih cepat dibandingkan dua peretasan di atas. Tentu saja, ora2pg tidak dapat memanfaatkan hal ini.
Sebaliknya, ora2pgpro dapat langsung mengekspor transaksi otonom dalam format Postgres Pro. Yang Anda butuhkan hanyalah mengatur POSTGRESPRO_ATX=1.
Dukungan untuk paket
Tidak seperti Oracle DB, vanilla PostgreSQL tidak memiliki paket. Hal ini merupakan hambatan besar dalam migrasi. Untungnya, ora2pg menyediakan ekspor paket, tetapi hanya dengan solusi: ora2pg mensimulasikan paket menggunakan skema, dan variabel global ditiru dengan current_setting Dan set_config. Solusi ini menambah beban tambahan yang signifikan, mengganggu kinerja, dan sering kali menyebabkan ketidakcocokan semantik.
Postgres Pro Enterprise memecahkan masalah ini dengan menambahkan dukungan paket sebenarnya di tingkat inti, lengkap dengan variabel dan pelingkupan paket nyata. Namun, ora2pg tidak dapat mengekspor ke model ini.
ora2pgpro, sebaliknya, mengisi celah ini — ora2pgpro dapat mengekspor paket Oracle sebagai paket Postgres Pro secara langsung. Untuk mengaktifkan mode ini, cukup atur TYPE=PACKAGE di konfigurasi.
Singkatnya, ora2pgpro secara otomatis mengubah setiap paket Oracle menjadi skemanya sendiri, menjaga modularitas dan enkapsulasi. Tidak seperti peretasan ora2pg, ora2pgpro mendukung inisialisasi paket otomatis melalui init()serta pemisahan metode publik/privat. Fitur-fitur ini dibangun langsung ke dalam inti Postgres Pro Enterprise dan didokumentasikan sepenuhnya. Dengan cara ini, kami mempertahankan modularitas dan enkapsulasi yang sama seperti yang Anda harapkan dari paket Oracle — sambil tetap menghadirkan operasi asli dan berkinerja tinggi di lingkungan Postgres Pro Enterprise. Hasil akhirnya adalah kode PL/pgSQL yang bekerja secara native dan efisien di dalam Postgres Pro Enterprise.
Untuk mempelajari lebih dalam, kami merekomendasikan artikel mendetail Igor Melnikov, yang menjelaskan cara kerja emulasi paket.
Dukungan untuk array asosiatif
Mirip dengan paket, vanilla PostgreSQL tidak mendukung koleksi yang diindeks, sehingga mempersulit migrasi Oracle. Itu juga mengapa ora2pg tidak terlalu membantu di sini — ora2pg tidak dapat menafsirkan koleksi dengan cara yang benar.
Itu sebabnya kami membuat modul pg_variables, yang mencakup dukungan array asosiatif. ora2pgpro memetakan array asosiatif Oracle langsung ke koleksi pg_variables. Metode pengumpulan Oracle diubah menjadi panggilan fungsi pg_variables.
Misalnya:
-
Mengatur elemen array di Oracle →
pgv_set_elemdi pg_variables -
Menghapus elemen →
pgv_remove_elem -
Memeriksa keberadaan elemen →
pgv_exists_elem
Gambar 3 mengilustrasikan konversi ini (ASSOC adalah nama paket tempat koleksi ditentukan).
Untuk lebih jelasnya, lihat dokumentasi.
Dukungan untuk VARRAY
Selain array asosiatif, ora2pgpro dapat menafsirkan VARRAY, yang sering kali membuat ora2pg sumber terbuka menjadi buntu. Berkat analisis sintaksis yang lebih mendalam, ora2pgpro menangani VARRAY dengan benar, memetakannya ke array asli Postgres Pro Enterprise atau pg_variables bila diperlukan.
Mari kita lihat contoh menerjemahkan array VARRAY menggunakan ora2pgpro:
-- PL/SQL
TYPE r_customer_type IS RECORD (
customer_name VARCHAR2(50),
credit_limit NUMBER(10,2)
…
t_customers t_customer_type := t_customer_type();
…
t_customers.EXTEND;
t_customers(t_customers.LAST).customer_name := 'ABC Corp';
t_customers(t_customers.LAST).credit_limit := 10000;
tmp_string := 'The number of customers is ' || t_customers.COUNT;
-- PL/pgSQL
CREATE TYPE PKGC.r_customer_type AS (
customer_name varchar(50),
credit_limit numeric(10,2)
);
…
/*WARNING: collection constructors are not supported.*/
t_customers PKGC.t_customer_type /*:=*/ /*t_customer_type() /*WARNING: varray constructors are not supported.*/*/;
…
t_customers = array_cat(t_customers, array_fill(NULL::PKGC.R_CUSTOMER_TYPE, ARRAY[1]));
t_customers[array_upper(T_CUSTOMERS, 1)].customer_name="ABC Corp";
t_customers[array_upper(T_CUSTOMERS, 1)].credit_limit = 10000;
tmp_string = 'The number of customers is ' || array_length(T_CUSTOMERS, 1);
Dalam contoh ini, kita melihat deklarasi VARRAY yang disebut t_customer_typeinisialisasinya, penggunaan metode EXTEND untuk menambahkan elemen, menetapkan nilai ke kolom rekaman di dalam VARRAY, serta penggunaan LAST dan COUNT.
Alat ora2pgpro dapat dengan tepat menerjemahkan operasi ini ke dalam konstruksi PL/pgSQL yang setara, memanfaatkan fitur asli Postgres Pro Enterprise untuk bekerja dengan array dan catatan — atau, bila diperlukan, fungsi pg_variables untuk skenario yang lebih kompleks.
Anda mungkin memperhatikan komentar peringatan yang disisipkan ora2pgpro. Alat ini tidak hanya mengganti konstruksi lama dengan yang baru berdasarkan template; itu sebenarnya menganalisis kode sumber. Ya, ora2pgpro benar-benar menganalisis kodenya, bekerja dengan prinsip yang sangat berbeda dibandingkan dengan alat sumber terbuka ora2pg.
PL/SQL tingkat lanjut → Terjemahan PL/pgSQL
Masalah migrasi sering muncul saat mengubah kode PL/SQL menjadi PL/pgSQL. Alat ora2pg secara teknis dapat menangani terjemahan ini, namun penerapannya masih menyisakan banyak hal yang diinginkan: konversinya bergantung pada ekspresi reguler Perl yang primitif. Karena algoritma ekspor yang agak “naif” ini, ora2pg sering menghasilkan terjemahan kode PL/SQL yang salah.
Namun, alat ora2pgpro tidak mengalami kekurangan ini — alat ini sebenarnya mem-parsing sintaksis dan semantik kode PL/SQL, yang memungkinkannya menerjemahkan konstruksi yang jauh lebih kompleks.
Pipa tersebut adalah:
-
Ekstrak kode PL/SQL dari Oracle DB.
-
Parsing kode menjadi AST.
-
Ubah AST menjadi kode PL/pgSQL.
-
Tinggalkan peringatan untuk setiap fragmen yang tidak dapat dikonversi. Pengembang kemudian harus meninjau dan menangani kasus ini secara manual.
Pendekatan berbasis AST ini — didasarkan pada sintaksis nyata dan analisis semantik — memastikan akurasi konversi yang jauh lebih tinggi. Hal ini juga memberikan fleksibilitas kepada pengembang ora2pgpro untuk memperluas dukungan bagi konstruksi baru dan meningkatkan transformasi yang ada pada rilis mendatang. Perlu dicatat bahwa ora2pgpro adalah produk komersial, dan modifikasi kode apa pun yang tidak sah oleh pengguna akhir tidak diperbolehkan dan mungkin melanggar ketentuan lisensi.
Catatan: ora2pgpro mendukung Oracle DB versi hingga 11.2 (paling umum di Rusia). Itu tidak menangani fitur Oracle yang lebih baru — tetapi masih berfungsi dengan baik dengan Oracle 23 jika memungkinkan.
Menangani spesifikasi paket yang rumit
Salah satu kekuatan utama ora2pgpro adalah kemampuannya menganalisis sintaksis dan semantik kode PL/SQL, yang memungkinkan penerjemahan akurat bahkan deklarasi yang sangat kompleks dan beragam dalam spesifikasi paket. Berbeda dengan ekspresi reguler primitif yang digunakan di ora2pg, pendekatan berbasis AST kami memberikan tingkat presisi konversi yang jauh lebih tinggi.
Mari kita lihat beberapa contoh bagaimana fragmen spesifikasi paket diterjemahkan untuk menampilkan beragam tipe data dan konstruksi yang didukung.
Misalnya, ora2pgpro dapat menafsirkan tipe data temporal dengan presisi, zona waktu, dan interval yang bervariasi:
-- PL/SQL
my_date1 DATE := TO_DATE('2023-08-31', 'YYYY-MM-DD');
my_date2 DATE := my_date + 34;
my_timestamp1 TIMESTAMP(1);
my_timestamp2 TIMESTAMP WITH TIME ZONE;
my_timestamp3 TIMESTAMP WITH LOCAL TIME ZONE;
my_timestamp4 TIMESTAMP(9) WITH TIME ZONE;
my_interval1 INTERVAL DAY TO SECOND(4);
my_interval2 INTERVAL DAY(3) TO SECOND(2);
-- PL/pgSQL
my_date1 timestamp := TO_DATE('2023-08-31', 'YYYY-MM-DD');
my_date2 timestamp := DATETIME_PKG.my_date + 34;
my_timestamp1 timestamp;
my_timestamp2 timestamp with time zone;
my_timestamp3 timestamp with time zone;
my_timestamp4 timestamp with time zone;
my_interval1 interval DAY TO SECOND;
my_interval2 interval DAY/*(3)*/ TO SECOND;
Alat kami juga dapat menangani konversi ekspresi Boolean yang kompleks:
-- PL/SQL
varchar_var VARCHAR2(100) := 'test';
char_var CHAR(10) := 'char2';
bool_var1 BOOLEAN := varchar_var LIKE 'ssdsd' || char_var;
bool_var2 BOOLEAN;
bool_var3 BOOLEAN := TRUE;
var1 SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST(1,2,3,4,5,6,7,8);
bool_var3 BOOLEAN := bool_var2 AND TRUE OR
(UPDATING('ID_TABLE') AND NOT var1.EXISTS(3)) OR
var1.EXISTS(8);
-- PL/pgSQL
varchar_var varchar(100) := 'test';
char_var char(10) := 'char2';
bool_var1 BOOLEAN := BOOL_PKG.varchar_var LIKE 'ssdsd' || BOOL_PKG.char_var;
bool_var2 BOOLEAN;
bool_var3 BOOLEAN := TRUE;
var1 SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST(1,2,3,4,5,6,7,8);
bool_var3 BOOLEAN := BOOL_PKG.bool_var2 AND TRUE OR
(UPDATING('ID_TABLE') AND NOT var1.EXISTS(3)) OR
var1.EXISTS(8);
Selain tipe temporal dan ekspresi Boolean kompleks, ora2pgpro dapat secara akurat mengenali dan menerjemahkan tipe data yang ditentukan pengguna seperti VARRAY dan RECORD, inisialisasi variabel kompleks, deklarasi konstan, dan banyak konstruksi lainnya.
Alat ini memastikan bahwa semua elemen ini dipetakan dengan benar, menjaga konsistensi semantik tipe data Oracle di Postgres Pro Enterprise, dan mengubah ekspresi rumit dan pemanggilan metode menjadi padanan PL/pgSQL. Hal ini sangat mengurangi jumlah pembersihan manual yang diperlukan setelah migrasi otomatis.
Kesimpulan
Pengalaman kami dalam migrasi dari Oracle ke Postgres Pro Enterprise menyoroti betapa pentingnya otomatisasi dan adaptasi alat untuk sistem database target.
ora2pgpro secara efektif menangani ekspor objek kompleks, memberikan dukungan untuk fungsionalitas yang tidak disediakan oleh vanilla PostgreSQL. Hasilnya adalah proses migrasi yang lebih andal dan berperforma tinggi, membuka pintu menuju infrastruktur database yang lebih kuat dan menurunkan risiko operasional secara signifikan.
Cara berhasil bermigrasi dari Oracle ke Postgres Pro Enterprise / Habr



