Di blog-blog sebelumnya, kita sudah membahas topik Cara Migrasi dari Oracle ke Server MySQL / Percona dan yang terbaru Migrasi dari Database Oracle ke MariaDB - Yang Harus Anda Ketahui.
Selama bertahun-tahun dan ketika versi baru MySQL dan MariaDB dirilis, kedua proyek telah menyimpang sepenuhnya menjadi dua platform RDBMS yang sangat berbeda.
MariaDB dan MySQL sekarang berbeda satu sama lain secara signifikan, terutama dengan hadirnya versi terbaru mereka:MySQL 8.0 dan MariaDB 10.3 GA dan 10.4 (saat ini kandidat RC).
Dengan rilis MariaDB TX 3.0, MariaDB mengejutkan banyak orang karena ini bukan lagi pengganti drop-in untuk MySQL. Ini memperkenalkan tingkat kompatibilitas baru dengan database Oracle dan sekarang menjadi alternatif nyata untuk Oracle serta database perusahaan dan kepemilikan lainnya seperti IBM DB2 atau EnterpriseDB.
Dimulai dengan MariaDB versi 10.3, fitur penting telah diperkenalkan seperti tabel versi sistem dan, yang paling menarik untuk Oracle DBA, dukungan untuk PL/SQL!
Menurut situs web MariaDB, sekitar 80% dari Oracle PL/SQL lama dapat dimigrasikan tanpa menulis ulang kode. MariaDB juga memiliki ColumnStore, yang merupakan mesin analitik baru dan mesin penyimpanan kolumnar yang dirancang untuk pemrosesan paralel masif (MPP) terdistribusi, seperti untuk analitik data besar.
Tim MariaDB telah bekerja keras untuk dukungan tambahan untuk PL/SQL. Ini menambah kemudahan ekstra saat bermigrasi ke MariaDB dari Oracle. Sebagai titik referensi untuk migrasi yang direncanakan, Anda dapat memeriksa referensi berikut dari MariaDB. Sesuai blog kami sebelumnya, ini tidak akan mencakup keseluruhan proses migrasi, karena ini adalah proses yang panjang. Namun, ini diharapkan akan memberikan informasi latar belakang yang cukup untuk menjadi panduan bagi proses migrasi Anda.
Strategi Perencanaan dan Pengembangan
Untuk DBA, bermigrasi dari database Oracle ke MariaDB, migrasi semacam itu berarti banyak faktor serupa yang seharusnya tidak terlalu sulit untuk diubah dan diadaptasi. MariaDB dapat dioperasikan di server Windows dan memiliki binari yang tersedia untuk platform Windows untuk diunduh. Jika Anda menggunakan Oracle untuk OLAP (Online Analytical Processing) atau intelijen bisnis, MariaDB juga memiliki ColumnStore, yang setara dengan penyimpanan kolom Database In-Memory Oracle.
Jika Anda terbiasa memiliki arsitektur Oracle yang memiliki MAA (Maximum Available Architecture) dengan Data Guard ++ Oracle RAC (Real Application Cluster), sama seperti MySQL/Percona Server, di MariaDB, Anda dapat memilih dari replikasi sinkron, semi- sinkronisasi, atau replikasi asinkron.
Untuk solusi yang sangat tersedia, MariaDB memiliki Maxscale sebagai opsi utama yang dapat Anda gunakan. Anda dapat mencampur MaxScale dengan Keepalive dan HAProxy. ClusterControl misalnya dapat mengelola ini secara efisien dan bahkan dengan kedatangan baru produk MariaDB, MariaDB TX. Lihat blog kami sebelumnya untuk mempelajari lebih lanjut tentang bagaimana ClusterControl dapat mengelola ini secara efisien.
Dengan MariaDB menjadi teknologi open source, pertanyaan ini dapat dipertimbangkan:"Bagaimana kami mendapatkan dukungan?"
Anda perlu memastikan ketika memilih opsi dukungan bahwa itu tidak terbatas pada database tetapi harus mencakup keahlian dalam skalabilitas, redundansi, ketahanan, cadangan, ketersediaan tinggi, keamanan, pemantauan/observabilitas, pemulihan, dan keterlibatan pada sistem kritis misi . Secara keseluruhan, penawaran dukungan yang Anda pilih harus disertai dengan pemahaman tentang penyiapan arsitektural Anda tanpa mengungkapkan kerahasiaan data Anda.
Selain itu, MariaDB memiliki komunitas yang sangat besar dan kolaboratif di seluruh dunia. Jika Anda mengalami masalah dan ingin bertanya kepada orang-orang yang terlibat dalam komunitas ini, Anda dapat mencoba Freenode melalui klien IRC (Internet Relay Chat), membuka halaman komunitas mereka, atau bergabung dengan milis mereka.
Penilaian atau Pemeriksaan Awal
Mencadangkan data Anda termasuk file konfigurasi atau penyiapan, penyetelan kernel, skrip otomatisasi perlu dipertimbangkan:ini adalah tugas yang jelas, tetapi sebelum Anda bermigrasi, selalu amankan semuanya terlebih dahulu , terutama saat pindah ke platform yang berbeda.
Anda juga harus menilai bahwa aplikasi Anda mengikuti konvensi rekayasa perangkat lunak terkini dan memastikan bahwa itu adalah platform agnostik. Praktik ini dapat bermanfaat bagi Anda terutama saat berpindah ke platform database yang berbeda.
Karena MariaDB adalah teknologi sumber terbuka, pastikan Anda mengetahui konektor apa saja yang tersedia di MariaDB. Ini cukup mudah sekarang karena ada berbagai perpustakaan klien yang tersedia. Periksa di sini untuk daftar pustaka klien ini. Selain itu, Anda juga dapat memeriksa daftar halaman Klien dan Utilitas yang tersedia ini.
Terakhir, pastikan persyaratan perangkat keras Anda.
MariaDB tidak memiliki persyaratan khusus:server komoditas biasa dapat bekerja tetapi itu tergantung pada seberapa banyak kinerja yang Anda butuhkan. Namun, jika Anda menggunakan ColumnStore untuk aplikasi analitik atau aplikasi gudang data Anda, lihat dokumentasinya. Diambil dari halaman mereka, untuk AWS, mereka telah menguji ini secara umum menggunakan jenis instans m4.4xlarge sebagai jalan tengah yang hemat biaya. R4.8xlarge juga telah diuji dan berkinerja sekitar dua kali lebih cepat dengan harga sekitar dua kali lipat.
Yang Harus Anda Ketahui
Sama seperti MySQL, di MariaDB, Anda dapat membuat beberapa database sedangkan Oracle tidak datang dengan fungsi yang sama.
Di MariaDB, skema identik dengan database. Anda dapat mengganti kata kunci SCHEMA sebagai ganti DATABASE dalam sintaks SQL MariaDB. Misalnya, menggunakan BUAT SKEMA bukannya BUAT DATABASE; sementara Oracle memiliki perbedaan untuk ini. Skema hanya mewakili sebagian dari database:tabel dan objek lain yang dimiliki oleh satu pengguna. Biasanya, ada hubungan satu-ke-satu antara instance dan database.
Misalnya, dalam pengaturan replikasi yang setara di Oracle (mis. Real Application Clusters atau RAC), Anda memiliki beberapa instans yang mengakses satu database. Ini memungkinkan Anda memulai Oracle di beberapa server, semuanya mengakses data yang sama. Namun, di MariaDB, Anda dapat mengizinkan akses ke beberapa database dari beberapa instans Anda dan bahkan dapat memfilter database/skema mana yang dapat Anda tiru ke node MariaDB.
Merujuk dari salah satu blog kami sebelumnya (ini dan ini), prinsip yang sama berlaku ketika berbicara tentang mengonversi basis data Anda dengan alat yang tersedia di internet.
Tidak ada alat seperti itu yang dapat 100% mengubah database Oracle menjadi MariaDB, meskipun MariaDB memiliki Praktik Migrasi Red Rover; ini adalah layanan yang ditawarkan MariaDB dan tidak gratis.
MariaDB berbicara tentang migrasi di Development Bank of Singapore (DBS), sebagai hasil kolaborasinya dengan MariaDB dalam kompatibilitas Oracle. Ia mampu memigrasikan lebih dari 50 persen aplikasi mission-criticalnya hanya dalam 12 bulan dari Oracle Database ke MariaDB.
Tetapi jika Anda mencari beberapa alat, alat sqlines, yaitu SQLines SQL Converter dan SQLines Data Tool menawarkan seperangkat alat yang sederhana namun operasional.
Bagian berikut di bawah ini menguraikan lebih lanjut hal-hal yang harus Anda perhatikan saat melakukan migrasi dan memverifikasi hasil SQL logis.
Pemetaan Tipe Data
MySQL dan MariaDB berbagi tipe data yang sama yang tersedia. Meskipun ada variasi dalam penerapannya, Anda dapat memeriksa daftar tipe data di MariaDB di sini.
Sementara MySQL menggunakan tipe data JSON, MariaDB berbeda karena hanya merupakan alias tipe data LONGTEXT. MariaDB juga memiliki fungsi, JSON_VALID, yang dapat digunakan dalam ekspresi kendala CHECK.
Oleh karena itu, saya akan menggunakan presentasi tabel di bawah ini berdasarkan informasi di sini, karena tipe data dari MySQL terhadap MariaDB tidak terlalu menyimpang, tetapi saya telah menambahkan perubahan karena tipe data ROW telah diperkenalkan di MariaDB 10.3. 0 sebagai bagian dari fitur kompatibilitas PL/SQL.
Lihat tabel di bawah ini:
Oracle | MySQL | |||
---|---|---|---|---|
1 | BFILE | Penunjuk ke file biner, 4G | VARCHAR(255) | |
2 | BINARY_FLOAT | Angka floating-point 32-bit | FLOAT | |
3 | BINARY_DOUBLE | Angka floating-point 64-bit | GANDA | |
4 | BLOB | Objek besar biner, 4G | LONGBLOB | |
5 | CHAR(n), CHARACTER(n) | String dengan panjang tetap, 1 n 255 | CHAR(n), CHARACTER(n) | |
6 | CHAR(n), CHARACTER(n) | String dengan panjang tetap, 256 n 2000 | VARCHAR(n) | |
7 | CLOB | Karakter objek besar, 4G | TEKS PANJANG | |
8 | TANGGAL | Tanggal dan waktu | DATETIME | |
9 | DECIMAL(p,s), DEC(p,s) | Nomor poin tetap | DECIMAL(p,s), DEC(p,s) | |
10 | PRESISI GANDA | Angka titik-mengambang | PRESISI GANDA | |
11 | FLOAT(p) | Angka titik-mengambang | GANDA | |
12 | INTEGER, INT | 38 digit bilangan bulat | INT | DESIMAL(38) |
13 | INTERVAL TAHUN(p) SAMPAI BULAN | Interval tanggal | VARCHAR(30) | |
14 | INTERVAL HARI(p) HINGGA DETIK | Interval hari dan waktu | VARCHAR(30) | |
15 | PANJANG | Data karakter, 2G | TEKS PANJANG | |
16 | BAKU PANJANG | Data biner, 2G | LONGBLOB | |
17 | NCHAR(n) | String UTF-8 dengan panjang tetap, 1 n 255 | NCHAR(n) | |
18 | NCHAR(n) | String UTF-8 dengan panjang tetap, 256 n 2000 | NVARCHAR(n) | |
19 | VARIASI NCHAR(n) | String UTF-8 dengan panjang bervariasi, 1 n 4000 | NCHAR VARIASI(n) | |
20 | NCLOB | String Unicode dengan panjang variabel, 4G | NVARCHAR(maks) | |
21 | NUMBER(p,0), NUMBER(p) | Integer 8-bit, 1 <=p <3 | TINYINT | (0 hingga 255) |
Integer 16-bit, 3 <=p <5 | KECIL | |||
Integer 32-bit, 5 <=p <9 | INT | |||
Integer 64-bit, 9 <=p <19 | BESAR | |||
Angka titik tetap, 19 <=p <=38 | DECIMAL(p) | |||
22 | NUMBER(p,s) | Angka titik tetap, s> 0 | DECIMAL(p,s) | |
23 | NUMBER, NUMBER(*) | Angka titik-mengambang | GANDA | |
24 | NUMERIK(p,s) | Nomor poin tetap | NUMERIK(p,s) | |
25 | NVARCHAR2(n) | String UTF-8 dengan panjang variabel, 1 n 4000 | NVARCHAR(n) | |
26 | RAW(n) | String biner dengan panjang variabel, 1 n 255 | BINARY(n) | |
27 | RAW(n) | String biner dengan panjang variabel, 256 n 2000 | VARBINARY(n) | |
28 | NYATA | Angka titik-mengambang | GANDA | |
29 | ROWID | Alamat baris fisik | CHAR(10) Oleh karena itu, untuk kompatibilitas PL/SQL, Anda dapat menggunakan ROW ( | |
30 | KECIL | 38 digit bilangan bulat | DECIMAL(38) | |
31 | TIMESTAMP(p) | Tanggal dan waktu dengan pecahan | DATETIME(p) | |
32 | TIMESTAMP(p) DENGAN ZONA WAKTU | Tanggal dan waktu dengan pecahan dan zona waktu | DATETIME(p) | |
33 | UROWID(n) | Alamat baris logis, 1 n ⇐ 4000 | VARCHAR(n) | |
34 | VARCHAR(n) | String dengan panjang variabel, 1 n 4000 | VARCHAR(n) | |
35 | VARCHAR2(n) | String dengan panjang variabel, 1 n 4000 | VARCHAR(n) | |
36 | XMLTYPE | data XML | TEKS PANJANG |
Atribut dan opsi tipe data:
Oracle | MySQL |
---|---|
semantik ukuran kolom BYTE dan CHAR | Ukuran selalu dalam karakter |
Transaksi
MariaDB menggunakan XtraDB dari versi sebelumnya hingga 10.1 dan beralih ke InnoDB dari versi 10.2 dan seterusnya; meskipun berbagai mesin penyimpanan dapat menjadi pilihan alternatif untuk menangani transaksi seperti mesin penyimpanan MyRocks.
Secara default, MariaDB memiliki variabel autocommit yang disetel ke ON yang berarti Anda harus secara eksplisit menangani pernyataan transaksional untuk memanfaatkan ROLLBACK untuk mengabaikan perubahan atau memanfaatkan SAVEPOINT.
Ini pada dasarnya adalah konsep yang sama yang digunakan Oracle dalam hal commit, rollback, dan savepoints.
Untuk transaksi eksplisit, ini berarti Anda harus menggunakan MULAI TRANSAKSI/MULAI;
Jika tidak, jika Anda harus menonaktifkan autocommit, Anda harus secara eksplisit COMMIT sepanjang waktu untuk pernyataan Anda yang memerlukan perubahan pada data Anda.
Tabel Ganda
MariaDB memiliki kompatibilitas ganda dengan Oracle yang dimaksudkan untuk kompatibilitas database menggunakan tabel dummy, yaitu DUAL. Ini beroperasi sama seperti MySQL di mana klausa FROM tidak wajib, sehingga tabel DUAL tidak diperlukan. Namun, tabel DUAL tidak bekerja dengan cara yang persis sama seperti pada Oracle, tetapi untuk SELECT sederhana di MariaDB, ini tidak masalah.
Ini sesuai dengan penggunaan DUAL oleh Oracle sehingga setiap pernyataan yang ada di aplikasi Anda yang menggunakan DUAL mungkin tidak memerlukan perubahan saat migrasi ke MariaDB.
Klausa Oracle FROM wajib untuk setiap pernyataan SELECT, jadi database Oracle menggunakan tabel DUAL untuk pernyataan SELECT di mana nama tabel tidak diperlukan.
Lihat contoh berikut di bawah ini:
Di Oracle:
SQL> DESC DUAL;
Name Null? Type
----------------------------------------- -------- ----------------------------
DUMMY VARCHAR2(1)
SQL> SELECT CURRENT_TIMESTAMP FROM DUAL;
CURRENT_TIMESTAMP
---------------------------------------------------------------------------
16-FEB-19 04.16.18.910331 AM +08:00
Tapi di MariaDB:
MariaDB [test]> DESC DUAL;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DUAL' at line 1
MariaDB [test]> SELECT CURRENT_TIMESTAMP FROM DUAL;
+---------------------+
| CURRENT_TIMESTAMP |
+---------------------+
| 2019-02-27 04:11:01 |
+---------------------+
1 row in set (0.000 sec)
Catatan:DESC DUAL sintaks tidak berfungsi di MariaDB dan hasilnya juga berbeda karena CURRENT_TIMESTAMP (menggunakan tipe data TIMESTAMP) di MySQL tidak menyertakan zona waktu.
SYSDATE
Fungsi SYSDATE Oracle hampir sama di MariaDB.
MariaDB mengembalikan tanggal dan waktu dan itu adalah fungsi yang membutuhkan () (tutup dan buka kurung tanpa argumen. Untuk mendemonstrasikannya di bawah, inilah Oracle dan MariaDB tentang penggunaan SYSDATE.
Di Oracle, menggunakan SYSDATE biasa hanya mengembalikan tanggal hari tanpa waktu. Tetapi untuk mendapatkan waktu dan tanggal, gunakan TO_CHAR untuk mengubah waktu tanggal menjadi format yang diinginkan; sedangkan di MariaDB, Anda mungkin tidak memerlukannya untuk mendapatkan tanggal dan waktu karena keduanya mengembalikan.
Lihat contoh di bawah.
Di Oracle:
SQL> SELECT TO_CHAR (SYSDATE, 'MM-DD-YYYY HH24:MI:SS') "NOW" FROM DUAL;
NOW
-------------------
02-16-2019 04:39:00
SQL> SELECT SYSDATE FROM DUAL;
SYSDATE
---------
16-FEB-19
Tapi di MariaDB:
MariaDB [test]> SELECT SYSDATE() FROM DUAL;
+---------------------+
| SYSDATE() |
+---------------------+
| 2019-02-27 04:11:57 |
+---------------------+
1 row in set (0.000 sec)
Jika Anda ingin memformat tanggal, MariaDB memiliki fungsi DATE_FORMAT().
Anda dapat memeriksa dokumentasi Tanggal dan Waktu MariaDB untuk informasi lebih lanjut.
TO_DATE
Setara TO_DATE Oracle di MariaDB adalah fungsi STR_TO_DATE().
Ini hampir identik dengan yang ada di Oracle:mengembalikan tipe data DATE, sedangkan di MariaDB mengembalikan tipe data DATETIME.
Oracle:
SQL> SELECT TO_DATE ('20190218121212','yyyymmddhh24miss') as "NOW" FROM DUAL;
NOW
-------------------------
18-FEB-19
MariaDB:
MariaDB [test]> SELECT STR_TO_DATE('2019-02-18 12:12:12','%Y-%m-%d %H:%i:%s') as "NOW" FROM DUAL;
+---------------------+
| NOW |
+---------------------+
| 2019-02-18 12:12:12 |
+---------------------+
1 row in set (0.000 sec)
SINONIM
MariaDB belum memiliki fungsi yang setara dengan ini. Saat ini, berdasarkan tiket Jira mereka MDEV-16482 , permintaan fitur untuk menambahkan SYNONYM ini masih terbuka dan belum ada tanda-tanda kemajuan pada saat ini. Kami berharap ini akan dimasukkan dalam rilis mendatang. Namun, alternatif yang memungkinkan adalah menggunakan VIEW.
Meskipun SYNONYM di Oracle dapat digunakan untuk membuat alias dari tabel jarak jauh,
misalnya
CREATE PUBLIC SYNONYM emp_table FOR [email protected]
Di MariaDB, Anda dapat memanfaatkan mesin penyimpanan CONNECT yang lebih kuat daripada mesin penyimpanan FederatedX, karena memungkinkan Anda untuk menghubungkan berbagai sumber database. Anda dapat melihat presentasi video singkat ini.
Ada contoh bagus di halaman manual MariaDB, yang tidak akan saya ulangi di sini karena ada pertimbangan tertentu yang harus Anda penuhi terutama saat menggunakan ODBC. Silakan merujuk ke manual.
Perilaku String Kosong dan NULL
Perhatikan bahwa di MariaDB, string kosong bukanlah NULL sedangkan Oracle memperlakukan string kosong sebagai nilai null.
Di Oracle:
SQL> SELECT CASE WHEN '' IS NULL THEN 'Yes' ELSE 'No' END AS "Null Eval" FROM dual;
Nul
---
Yes
Di MariaDB:
MariaDB [test]> SELECT CASE WHEN '' IS NULL THEN 'Yes' ELSE 'No' END AS "Null Eval" FROM dual;
+-----------+
| Null Eval |
+-----------+
| No |
+-----------+
1 row in set (0.001 sec)
Urutan
Sejak MariaDB 10.3, urutan yang kompatibel dengan Oracle dan bahasa prosedur tersimpan yang sesuai dengan Oracle PL/SQL telah diperkenalkan. Di MariaDB, membuat urutan sangat mirip dengan Oracle's SEQUENCE.
Contoh MariaDB:
CREATE SEQUENCE s START WITH 100 INCREMENT BY 10;
CREATE SEQUENCE s2 START WITH -100 INCREMENT BY -10;
dan menentukan nilai minimum dan maksimum yang dapat diterapkan menunjukkan sebagai berikut
CREATE SEQUENCE s3 START WITH -100 INCREMENT BY 10 MINVALUE=-100 MAXVALUE=1000;
Fungsi String Karakter
MariaDB, sama seperti MySQL, juga memiliki beberapa fungsi string yang terlalu panjang untuk dibahas satu per satu di sini. Oleh karena itu, dapat memeriksa dokumentasi dari sini dan membandingkannya dengan fungsi string Oracle.
Pernyataan DML
Menyisipkan/Memperbarui/Menghapus pernyataan dari Oracle sama di MariaDB.
Oracle INSERT ALL/INSERT FIRST tidak didukung di MariaDB dan belum ada yang membuka permintaan fitur ini di Jira mereka (yang saya tahu).
Jika tidak, Anda harus menyatakan kueri MySQL Anda satu per satu.
misalnya
Di Oracle:
SQL> INSERT ALL
INTO CUSTOMERS (customer_id, customer_name, city) VALUES (1000, 'Jase Alagaban', 'Davao City')
INTO CUSTOMERS (customer_id, customer_name, city) VALUES (2000, 'Maximus Aleksandre Namuag', 'Davao City')
SELECT * FROM dual;
2 rows created.
Tapi di MariaDB, Anda harus menjalankan insert satu per satu:
MariaDB [test]> INSERT INTO CUSTOMERS (customer_id, customer_name, city) VALUES (1000, 'Jase Alagaban', 'Davao City');
Query OK, 1 row affected (0.02 sec)
MariaDB [test]> INSERT INTO CUSTOMERS (customer_id, customer_name, city) VALUES (2000, 'Maximus Aleksandre Namuag', 'Davao City');
Query OK, 1 row affected (0.00 sec)
INSERT ALL/INSERT FIRST tidak dapat dibandingkan dengan cara penggunaannya di Oracle, di mana Anda dapat memanfaatkan kondisi dengan menambahkan kata kunci WHEN dalam sintaks Anda; tidak ada opsi yang setara untuk saat ini di MariaDB.
Oleh karena itu, solusi alternatif Anda dalam hal ini adalah menggunakan prosedur.
Luar Bergabung dengan Simbol "+"
Saat ini, untuk kompatibilitas, belum ada di MariaDB. Oleh karena itu, ada banyak tiket Jira yang saya temukan di MariaDB tetapi yang ini jauh lebih tepat dalam hal permintaan fitur. Oleh karena itu, pilihan alternatif Anda kali ini adalah menggunakan sintaks JOIN. Silakan periksa dokumentasi untuk info lebih lanjut tentang ini.
MULAI DENGAN..HUBUNGI DENGAN
Oracle menggunakan MULAI DENGAN..CONNECT BY untuk kueri hierarkis.
Mulai MariaDB 10.2, mereka memperkenalkan CTE (Common Table Expression) yang dirancang untuk mendukung generasi hasil data hierarkis, yang menggunakan model seperti daftar adjacency atau model kumpulan bersarang.
Mirip dengan PostgreSQL dan MySQL, MariaDB menggunakan CTE non-rekursif dan rekursif.
Misalnya, non-rekursif sederhana yang digunakan untuk membandingkan individu dengan grupnya:
WITH sales_product_year AS (
SELECT product,
YEAR(ship_date) AS year,
SUM(price) AS total_amt
FROM item_sales
GROUP BY product, year
)
SELECT *
FROM sales_product_year S1
WHERE
total_amt >
(SELECT 0.1 * SUM(total_amt)
FROM sales_product_year S2
WHERE S2.year = S1.year)
sementara CTE rekursif (contoh:mengembalikan tujuan bus dengan New York sebagai asalnya)
WITH RECURSIVE bus_dst as (
SELECT origin as dst FROM bus_routes WHERE origin='New York'
UNION
SELECT bus_routes.dst FROM bus_routes, bus_dst WHERE bus_dst.dst= bus_routes.origin
)
SELECT * FROM bus_dst;
PL/SQL di MariaDB?
Sebelumnya, di blog kami tentang "Migrating from Oracle Database to MariaDB - Yang Harus Anda Ketahui", kami menunjukkan betapa kuatnya sekarang di MariaDB menambahkan kepatuhannya untuk mengadopsi PL/SQL sebagai bagian dari kernel database-nya. Setiap kali Anda menggunakan kompatibilitas PL/SQL di MariaDB, pastikan Anda telah menyetel SQL_MODE ='Oracle' seperti berikut:
SET SQL_MODE='ORACLE';
Mode kompatibilitas baru membantu dengan sintaks berikut:
- Sintaks Loop
- Deklarasi Variabel
- Konstruk Prosedur Tersimpan Non-ANSI
- Sintaks Kursor
- Parameter Prosedur Tersimpan
- Pewarisan Tipe Data (%TYPE, %ROWTYPE)
- Pengecualian Gaya PL/SQL
- Sinonim untuk Tipe SQL Dasar (VARCHAR2, NUMBER, …)
Misalnya, di Oracle, Anda dapat membuat paket, yang merupakan objek skema yang mengelompokkan tipe, variabel, dan subprogram PL/SQL yang terkait secara logis. Oleh karena itu, di MariaDB, Anda dapat melakukannya seperti di bawah ini:
MariaDB [test]> CREATE OR REPLACE PACKAGE BODY hello AS
->
-> vString VARCHAR2(255) := NULL;
->
-> -- was declared public in PACKAGE
-> PROCEDURE helloFromS9s(pString VARCHAR2) AS
-> BEGIN
-> SELECT 'Severalnines showing MariaDB Package Procedure in ' || pString || '!' INTO vString FROM dual;
-> SELECT vString;
-> END;
->
-> BEGIN
-> SELECT 'called only once per connection!';
-> END hello;
-> /
Query OK, 0 rows affected (0.021 sec)
MariaDB [test]>
MariaDB [test]> DECLARE
-> vString VARCHAR2(255) := NULL;
-> -- CONSTANT seems to be not supported yet by MariaDB
-> -- cString CONSTANT VARCHAR2(255) := 'anonymous block';
-> cString VARCHAR2(255) := 'anonymous block';
-> BEGIN
-> CALL hello.helloFromS9s(cString);
-> END;
-> /
+----------------------------------+
| called only once per connection! |
+----------------------------------+
| called only once per connection! |
+----------------------------------+
1 row in set (0.000 sec)
+--------------------------------------------------------------------+
| vString |
+--------------------------------------------------------------------+
| Severalnines showing MariaDB Package Procedure in anonymous block! |
+--------------------------------------------------------------------+
1 row in set (0.000 sec)
Query OK, 1 row affected (0.000 sec)
MariaDB [test]>
MariaDB [test]> DELIMITER ;
Namun, PL/SQL Oracle dikompilasi sebelum dieksekusi saat dimuat ke server. Meskipun MariaDB tidak mengatakan ini dalam manual mereka, saya akan berasumsi bahwa pendekatannya sama dengan MySQL di mana ia dikompilasi dan disimpan dalam cache ketika dipanggil.
Alat Migrasi
Seperti yang ditunjukkan oleh rekan saya Bart di blog kami sebelumnya di sini, alat sqlines yaitu SQLines SQL Converter dan SQLines Data Tool juga dapat memberikan bantuan sebagai bagian dari migrasi Anda.
MariaDB memiliki layanan Praktik Migrasi Red Rover yang dapat Anda manfaatkan.
Secara keseluruhan, migrasi Oracle ke MariaDB tidak semudah migrasi ke MySQL/Percona, yang dapat menambah lebih banyak tantangan daripada MariaDB; terutama tidak ada kompatibilitas PL/SQL di MySQL.
Bagaimanapun, jika Anda menemukan atau mengetahui alat apa pun yang menurut Anda berguna dan bermanfaat untuk bermigrasi dari Oracle ke MariaDB, silakan tinggalkan komentar di blog ini!
Pengujian
Sama seperti apa yang saya nyatakan di blog ini, izinkan saya mengulanginya di sini.
Sebagai bagian dari rencana migrasi Anda, pengujian adalah tugas vital yang memainkan peran yang sangat penting dan memengaruhi keputusan Anda terkait migrasi.
Alat dbdeployer (pengganti MySQL Sandbox) adalah alat yang sangat membantu yang dapat Anda manfaatkan. Ini cukup mudah bagi Anda untuk mencoba dan menguji berbagai pendekatan dan menghemat waktu Anda, daripada menyiapkan seluruh tumpukan jika tujuan Anda adalah mencoba dan menguji platform RDBMS terlebih dahulu.
Untuk menguji rutinitas tersimpan SQL Anda (fungsi atau prosedur), pemicu, peristiwa, saya sarankan Anda menggunakan alat ini mytap atau Kerangka Pengujian Unit Google.
Alat Percona masih dapat berguna dan dapat digabungkan ke DBA atau tugas rekayasa Anda bahkan dengan MariaDB. Lihat Percona Toolkit di sini. Anda dapat memilih alat sesuai dengan kebutuhan Anda terutama untuk tugas pengujian dan penggunaan produksi.
Secara keseluruhan, hal-hal yang perlu Anda ingat sebagai pedoman Anda saat melakukan pengujian untuk Server MariaDB Anda adalah:
- Setelah penginstalan, Anda perlu mempertimbangkan untuk melakukan penyetelan. Lihat webinar kami tentang menyetel server MariaDB Anda.
- Lakukan beberapa tolok ukur dan pengujian beban stres untuk penyiapan konfigurasi Anda pada node Anda saat ini. Periksa mysqlslap dan sysbench yang dapat membantu Anda dalam hal ini. Lihat juga blog kami "Cara Membandingkan Kinerja MySQL &MariaDB menggunakan SysBench".
- Periksa DDL Anda apakah DDL didefinisikan dengan benar seperti tipe data, batasan, indeks berkerumun dan sekunder, atau partisi, jika Anda memilikinya.
- Periksa DML Anda terutama jika sintaks sudah benar dan menyimpan data dengan benar seperti yang diharapkan.
- Periksa rutinitas, peristiwa, pemicu yang tersimpan untuk memastikannya berjalan/mengembalikan hasil yang diharapkan.
- Pastikan bahwa kueri Anda berjalan berkinerja baik. Saya sarankan Anda memanfaatkan alat sumber terbuka atau mencoba produk ClusterControl kami. Ini menawarkan pemantauan/pengamatan terutama dari klaster MariaDB Anda. Periksa blog sebelumnya di mana kami menunjukkan bagaimana ClusterControl dapat membantu Anda mengelola MariaDB TX 3.0. Anda dapat menggunakan ClusterControl di sini untuk memantau kueri Anda dan rencana kuerinya untuk memastikan kinerjanya.