Baik memigrasi database atau aplikasi dari Oracle ke PostgreSQL hanya dengan satu jenis pengetahuan database, ada beberapa hal yang perlu diketahui tentang perbedaan antara kedua sistem database.
PostgreSQL adalah database open source tercanggih di dunia. Komunitas PostgreSQL sangat kuat dan mereka terus meningkatkan fitur PostgreSQL yang ada dan juga menambahkan fitur baru. Menurut db-engines.com, PostgreSQL adalah DBMS tahun 2017.
Ada beberapa ketidakcocokan di Oracle dan PostgreSQL. Perilaku beberapa fungsi berbeda antara Oracle dan PostgreSQL.
Mengapa Bermigrasi dari Oracle ke PostgreSQL
- Biaya:Seperti yang Anda ketahui, biaya lisensi Oracle sangat mahal dan ada biaya tambahan untuk beberapa fitur seperti partisi dan ketersediaan tinggi. Jadi secara keseluruhan itu sangat mahal.
- Lisensi open source yang fleksibel dan ketersediaan yang mudah dari penyedia cloud publik seperti AWS.
- Manfaatkan add-on open source untuk meningkatkan kinerja.
Pemeriksaan Awal
Seperti yang Anda ketahui, migrasi dari Oracle ke PostgreSQL adalah tugas yang mahal dan memakan waktu. Penting untuk memahami bagian mana yang akan dimigrasi. Jangan buang waktu untuk memindahkan objek yang tidak lagi diperlukan. Juga, periksa apakah ada data historis yang diperlukan atau tidak. Jangan buang waktu untuk mereplikasi data yang tidak Anda perlukan, misalnya data backup dan tabel sementara dari pemeliharaan sebelumnya.
Penilaian Migrasi
Setelah pemeriksaan awal, langkah pertama migrasi adalah menganalisis aplikasi dan objek database, mengetahui ketidaksesuaian antara kedua database dan memperkirakan waktu dan biaya yang diperlukan untuk migrasi.
Alat Ora2pg sangat membantu untuk penilaian migrasi. Ini terhubung ke database Oracle, memindai secara otomatis dan mengekstrak data, menghasilkan laporan migrasi database. Anda dapat memeriksa contoh laporan di Ora2pg.
Yang Harus Anda Ketahui
Pahami perbedaan antara Oracle dan PostgreSQL dan ubah menggunakan alat apa pun. Tidak ada alat yang dapat mengubah 100% database Oracle menjadi PostgreSQL, beberapa perubahan manual diperlukan. Silakan periksa di bawah ini beberapa perbedaan penting yang harus Anda ketahui sebelum bermigrasi.
Pemetaan Tipe Data
PostgreSQL memiliki kumpulan tipe data yang kaya. Beberapa konversi tipe Data penting antara Oracle dan PostgreSQL adalah sebagai berikut.
Oracle | PostgreSQL | Komentar |
---|---|---|
VARCHAR2(n) | VARCHAR(n) | Di Oracle 'n' adalah jumlah byte sedangkan di PostgreSQL 'n' adalah jumlah karakter |
CHAR(n) | CHAR(n) | Di Oracle 'n' adalah jumlah byte sedangkan di PostgreSQL 'n' adalah jumlah karakter |
NUMBER(n,m) | NUMERIK(n,m) | Jenis NUMBER dapat diubah menjadi NUMERIK tetapi jika Anda menggunakan SMALLINT, INT dan BIGINT maka kinerjanya akan lebih baik. |
NUMBER(4) | KECIL | |
NUMBER(9) | INT | |
NUMBER(18) | BESAR | |
NUMBER(n) | NUMERIK(n) | NUMERIK(n) ,Jika n>=19 |
TANGGAL | TIMESTAMP(0) | Kedua database memiliki tipe DATE tetapi tipe Oracle DATE mengembalikan tanggal dan waktu sedangkan tipe PostgreSQL DATE hanya mengembalikan tanggal tanpa waktu. |
TIMESTAMP DENGAN ZONA WAKTU LOKAL | TIMESTAMPTZ | Tipe PostgreSQL Timestamptz(Stempel waktu dengan zona waktu) berbeda dengan Oracle Timestamp dengan zona waktu. Ini setara dengan Timestamp Oracle dengan zona waktu lokal, tetapi perbedaan kecil ini dapat menyebabkan masalah kinerja atau bug aplikasi. |
CLOB | TEKS | Jenis TEKS PostgreSQL dapat menyimpan teks hingga 1 GB. |
BLOB RAW(n) | BYTEA(batas 1 GB) Objek besar | Di Oracle, tipe data BLOB menyimpan data biner tidak terstruktur dalam database. Jenis BLOB dapat menyimpan hingga 128 terabyte data biner. PostgreSQL BYTEA menyimpan data biner tetapi hanya hingga 1 GB. Jika data diatas 1 GB maka gunakan objek Large. |
Transaksi
Database Oracle selalu menggunakan transaksi tetapi di PostgreSQL Anda harus mengaktifkannya. Di Oracle, transaksi dimulai saat mengeksekusi pernyataan apa pun dan berakhir saat pernyataan COMMIT dieksekusi. Di PostgreSQL, transaksi dimulai saat menjalankan BEGIN dan berakhir saat pernyataan COMMIT dieksekusi. Bahkan tingkat isolasi juga tidak ada masalah. Database PostgreSQL mengetahui semua level isolasi yang diketahui database Oracle. Tingkat isolasi default PostgreSQL adalah Read commited.
Contoh:
Oracle:
DELETE FROM table_name WHERE id = 120;
COMMIT;
PostgreSQL:
BEGIN;
DELETE FROM table_name WHERE id = 120;
COMMIT;
Tabel Ganda
Dalam klausa Oracle FROM adalah wajib untuk setiap pernyataan SELECT sehingga database Oracle menggunakan tabel DUAL untuk pernyataan SELECT di mana nama tabel tidak diperlukan. Di PostgreSQL, klausa FROM tidak wajib sehingga tabel DUAL tidak diperlukan. Tabel Ganda dapat dibuat di PostgreSQL sebagai tampilan untuk menghilangkan masalah porting. Alat Orafce telah menerapkan ini sehingga Anda dapat menggunakan Orafce juga.
Contoh:
postgres=# SELECT CURRENT_TIMESTAMP FROM DUAL;
ERROR: relation "dual" does not exist
LINE 1: SELECT CURRENT_TIMESTAMP FROM DUAL;
^
postgres=# SELECT CURRENT_TIMESTAMP;
current_timestamp
-------------------------------
2018-03-16 09:36:01.205925+00
(1 row)
Setelah menginstal modul Orafce:
postgres=# SELECT CURRENT_TIMESTAMP FROM DUAL;
current_timestamp
-------------------------------
2018-03-16 09:36:01.205925+00
(1 row)
SYSDATE
Fungsi SYSDATE Oracle mengembalikan tanggal dan waktu. Perilaku fungsi SYSDATE berbeda di tempat yang berbeda. PostgreSQL tidak memiliki fungsi yang sesuai dengan fungsi SYSDATE. Di PostgreSQL ada beberapa metode untuk mendapatkan tanggal dan waktu dan itu didasarkan pada tujuan aplikasi.
Metode pengambilan waktu | Fungsi yang akan digunakan |
---|---|
Waktu mulai SQL | Statement_timestamp() |
Waktu mulai transaksi | sekarang() atau
Transaction_timestamp() |
Waktu saat fungsi diimplementasikan | Clock_timestamp() |
Dalam contoh di bawah ini clock_timestamp() mengembalikan waktu saat fungsi aktual dijalankan dan statement_timestamp() lainnya mengembalikan waktu saat pernyataan SQL memulai eksekusinya.
postgres=# SELECT now(), statement_timestamp(), current_timestamp, transaction_timestamp(), clock_timestamp();
now | statement_timestamp | current_timestamp | transaction_timestamp | clock_timestamp
-------------------------------+-------------------------------+-------------------------------+-------------------------------+-------------------------------
2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163154+00 | 2018-03-16 09:27:56.163281+00
(1 row)
TO_DATE(dua argumen)
Fungsi TO_DATE Oracle mengembalikan nilai tipe DATE(tahun, bulan, hari, jam, menit, detik) sedangkan TO_DATE(dua_argumen) PostgreSQL mengembalikan nilai tipe DATE(tahun, bulan, hari).
Solusi untuk ketidakcocokan ini adalah mengonversi TO_DATE() menjadi TO_TIMESTAMP(). Jika Anda menggunakan alat Orafce maka tidak perlu mengubah apa pun karena Orafce mengimplementasikan fungsi ini sehingga kami mendapatkan hasil yang sama dengan Oracle.
Oracle:
SELECT TO_DATE ('20180314121212','yyyymmddhh24miss') FROM dual;
PostgreSQL:
SELECT TO_TIMESTAMP ('20180314121212','yyyymmddhh24miss')::TIMESTAMP(0);
SINONIM
CREATE SYNONYM tidak didukung di PostgreSQL. Di Oracle CREATE SYNONYM digunakan untuk mengakses objek jarak jauh sedangkan di PostgreSQL kita dapat menggunakan SET search_path untuk memasukkan definisi jarak jauh.
Oracle:
CREATE SYNONYM abc.table_name FOR pqr.table_name;
PostgreSQL:
SET search_path TO 'abc.table_name';
Perilaku String Kosong dan NULL
Di Oracle, string kosong dan nilai NULL dalam konteks string adalah sama. Penggabungan NULL dan string mendapatkan string sebagai hasilnya. Di PostgreSQL, hasil penggabungan adalah nol dalam kasus ini. Di Oracle IS NULL operator digunakan untuk memeriksa apakah string kosong atau tidak tetapi di PostgreSQL hasilnya FALSE untuk string kosong dan TRUE untuk NULL.
Urutan
Ada sedikit perbedaan sintaks sequence pada Oracle dan PostgreSQL.
Oracle:
Sequence_name.nextval
PostgreSQL:
Nextval(‘sequence_name’)
Untuk mengubah sintaks ini, Anda dapat membuat skrip atau mengubahnya secara manual.
SUBSTR
Perilaku fungsi SUBSTR di Oracle dan PostgreSQL berbeda. Fungsi SUBSTR bekerja di PostgreSQL tanpa kesalahan tetapi mengembalikan hasil yang berbeda. Perbedaan ini dapat menyebabkan bug aplikasi.
Oracle:
SELECT SUBSTR(‘ABC’,-1) FROM DUAL;
Returns ‘C’
PostgreSQL:
postgres=# SELECT SUBSTR('ABC',-1);
substr
--------
ABC
(1 row)
Solusinya adalah dengan menggunakan fungsi SUBSTR Orafce yang mengembalikan hasil yang sama seperti Oracle di PostgreSQL.
HAPUS Pernyataan
Di Oracle, pernyataan DELETE dapat berfungsi tanpa klausa FROM tetapi di PostgreSQL tidak didukung. Kita perlu menambahkan klausa FROM dalam pernyataan PostgreSQL DELETE secara manual.
Oracle:
DELETE table_name WHERE column_name = 'Col_value';
PostgreSQL:
DELETE FROM table_name WHERE column_name = 'Col_value';
Kopling Eksternal +
Oracle menggunakan operator + untuk join kiri dan kanan tetapi PostgreSQL tidak menggunakannya.
Oracle:
SELECT a1.name1, a2.name2
FROM a1, a2
WHERE a1.code = a2.code (+);
PostgreSQL:
SELECT a1.name1, a2.name2
FROM a1
LEFT OUTER JOIN a2 ON a1.code = a2.code;
MULAI DENGAN..HUBUNGI DENGAN
Oracle menggunakan START WITH..CONNECT BY untuk kueri hierarkis. PostgreSQL tidak mendukung pernyataan START WITH..CONNECT BY. PostgreSQL memiliki WITH RECURSIVE untuk kueri hierarkis, jadi terjemahkan pernyataan CONNECT BY ke dalam pernyataan WITH RECURSIVE.
Oracle:
SELECT
restaurant_name,
city_name
FROM
restaurants rs
START WITH rs.city_name = 'TOKYO'
CONNECT BY PRIOR rs.restaurant_name = rs.city_name;
PostgreSQL:
WITH RECURSIVE tmp AS (SELECT restaurant_name, city_name
FROM restaurants
WHERE city_name = 'TOKYO'
UNION
SELECT m.restaurant_name, m.city_name
FROM restaurants m
JOIN tmp ON tmp.restaurant_name = m.city_name)
SELECT restaurant_name, city_name FROM tmp;
Konversi PLSQL ke PLPGSQL
Bahasa PL/pgSQL PostgreSQL mirip dengan bahasa PL/SQL Oracle dalam banyak aspek. Ini adalah bahasa imperatif yang terstruktur blok, dan semua variabel harus dideklarasikan. Dalam kedua tugas database, loop, kondisi serupa.
Perbedaan utama yang harus Anda ingat saat melakukan porting dari PL/SQL Oracle ke PL/pgSQL PostgreSQL
Unduh Whitepaper Hari Ini Pengelolaan &Otomatisasi PostgreSQL dengan ClusterControlPelajari tentang apa yang perlu Anda ketahui untuk menerapkan, memantau, mengelola, dan menskalakan PostgreSQLUnduh WhitepaperAlat Migrasi
Ada beberapa alat yang sangat membantu untuk migrasi Oracle ke PostgreSQL. Anda juga dapat membuat alat Anda sendiri sebagai ekstensi dan menggunakannya di dalam PostgreSQL.
Orafce
Fungsi, tipe data, dan paket yang kompatibel dengan Oracle dapat digunakan seperti di PostgreSQL. Ini adalah alat sumber terbuka dengan lisensi BSD sehingga siapa pun dapat menggunakan alat ini.
Sebagian besar fungsi utama tercakup dalam Orafce.
Aplikasi biasanya menggunakan fungsi tersebut dengan beberapa kejadian. Anda dapat mengurangi biaya modifikasi SQL dengan menggunakan alat ini.
Semua fungsi dan paket diimplementasikan dengan benar dan telah diuji dengan baik.
Beberapa fungsinya:
- Dbms_output
- dbms_random
- utl_file – fungsi terkait sistem file
- Dbms_pipe dan dbms_alert
- Tanggal PLV, PLVstr, PLVchr
- Tipe data dan fungsi DATE yang kompatibel dengan Oracle seperti ADD_MONTHS, LAST_DAY,NEXT_DAY, dan seterusnya.
- Fungsi NVL
- Fungsi SUBSTR dan SUBSTRB
- dukungan VARCHAR2 dan NVARCHAR2
- TO_DATE()
Ora2pg
Ora2Pg adalah alat gratis yang digunakan untuk memigrasikan database Oracle ke skema yang kompatibel dengan PostgreSQL.
Itu terhubung ke database Oracle, memindainya secara otomatis, mengekstrak struktur atau datanya, dan kemudian menghasilkan skrip SQL yang dapat Anda muat ke dalam database PostgreSQL Anda.
Estimasi biaya dalam migrasi Oracle ke PostgreSQL tidak mudah.
Ora2Pg memeriksa semua objek database, semua fungsi dan prosedur tersimpan untuk mendeteksi jika masih ada beberapa objek dan kode PL/SQL yang tidak dapat dikonversi secara otomatis oleh Ora2Pg.
Alat ini sangat membantu untuk konversi berikut:
- Konversi skema
- Konversi PLSQL ke PLPGSQL
Pengujian
Menguji seluruh aplikasi dan database yang dimigrasikan sangat penting karena beberapa fungsi di kedua database sama, namun perilakunya berbeda.
- Beberapa skenario umum perlu diperiksa:
- Periksa apakah semua objek telah dikonversi dengan benar atau tidak.
- Periksa apakah semua DMLS berfungsi dengan benar atau tidak.
- Muat beberapa data sampel di kedua database dan periksa hasilnya. Hasil SQL dari kedua database harus sama.
- Periksa kinerja DML dan tingkatkan jika perlu.