In früheren Blogs haben wir das Thema Migrieren von Oracle zu MySQL/Percona Server und zuletzt Migrieren von Oracle Database zu MariaDB – Was Sie wissen sollten behandelt.
Im Laufe der Jahre und als neue Versionen von MySQL und MariaDB veröffentlicht wurden, sind beide Projekte vollständig in zwei sehr unterschiedliche RDBMS-Plattformen abgewichen.
MariaDB und MySQL weichen jetzt erheblich voneinander ab, insbesondere mit der Einführung ihrer neuesten Versionen:MySQL 8.0 und MariaDB 10.3 GA und dessen 10.4 (derzeit RC-Kandidat).
Mit der Veröffentlichung von MariaDB TX 3.0 überraschte MariaDB viele, da es kein Drop-in-Ersatz für MySQL mehr ist. Es führt ein neues Maß an Kompatibilität mit der Oracle-Datenbank ein und entwickelt sich nun zu einer echten Alternative zu Oracle sowie zu anderen Unternehmens- und proprietären Datenbanken wie IBM DB2 oder EnterpriseDB.
Beginnend mit MariaDB Version 10.3 wurden wichtige Funktionen eingeführt, wie systemversionierte Tabellen und, was für Oracle-DBAs am attraktivsten ist, Unterstützung für PL/SQL!
Laut der MariaDB-Website können etwa 80 % des Legacy-Oracle PL/SQL migriert werden, ohne den Code neu zu schreiben. MariaDB hat auch ColumnStore, ihre neue Analyse-Engine und eine spaltenweise Speicher-Engine, die für die verteilte, massiv parallele Verarbeitung (MPP) entwickelt wurde, beispielsweise für Big-Data-Analysen.
Das MariaDB-Team hat hart an der zusätzlichen Unterstützung für PL/SQL gearbeitet. Es erleichtert die Migration von Oracle zu MariaDB zusätzlich. Als Referenzpunkt für Ihre geplante Migration können Sie die folgende Referenz von MariaDB überprüfen. Wie in unserem vorherigen Blog beschrieben, deckt dies nicht den gesamten Migrationsprozess ab, da es sich um einen langen Prozess handelt. Aber es wird hoffentlich genügend Hintergrundinformationen liefern, um als Leitfaden für Ihren Migrationsprozess zu dienen.
Planungs- und Entwicklungsstrategie
Für den DBA bedeutet die Migration von der Oracle-Datenbank zu MariaDB eine solche Migration viele ähnliche Faktoren, die nicht allzu schwierig zu verschieben und anzupassen sein sollten. MariaDB kann auf einem Windows-Server betrieben werden und verfügt über Binärdateien für die Windows-Plattform zum Herunterladen. Wenn Sie Oracle für OLAP (Online Analytical Processing) oder Business Intelligence verwenden, verfügt MariaDB auch über den ColumnStore, der dem Datenbank-In-Memory-Spaltenspeicher von Oracle entspricht.
Wenn Sie es gewohnt sind, eine Oracle-Architektur mit MAA (Maximum Available Architecture) mit Data Guard ++ Oracle RAC (Real Application Cluster), genau wie MySQL/Percona Server, in MariaDB zu haben, können Sie aus einer synchronen Replikation, halb- sync oder eine asynchrone Replikation.
Für eine hochverfügbare Lösung hat MariaDB Maxscale als Hauptoption, die Sie verwenden können. Sie können MaxScale mit Keepalived und HAProxy mischen. ClusterControl zum Beispiel kann dies effizient und sogar mit dem neuen Produkt von MariaDB, MariaDB TX, bewältigen. Sehen Sie sich unseren vorherigen Blog an, um mehr darüber zu erfahren, wie ClusterControl dies effizient verwalten kann.
Da MariaDB eine Open-Source-Technologie ist, sollte diese Frage berücksichtigt werden:„Wie erhalten wir Support?“
Sie müssen bei der Auswahl einer Support-Option sicherstellen, dass diese nicht auf die Datenbank beschränkt ist, sondern Fachwissen in den Bereichen Skalierbarkeit, Redundanz, Ausfallsicherheit, Backups, Hochverfügbarkeit, Sicherheit, Überwachung/Beobachtbarkeit, Wiederherstellung und Eingriff in unternehmenskritische Systeme abdecken sollte . Insgesamt muss das von Ihnen gewählte Supportangebot mit einem Verständnis Ihrer Architektur einhergehen, ohne die Vertraulichkeit Ihrer Daten preiszugeben.
Darüber hinaus hat MariaDB eine sehr große und kollaborative Community weltweit. Wenn Sie Probleme haben und Leute fragen möchten, die in dieser Community involviert sind, können Sie Freenode über den IRC-Client (Internet Relay Chat) ausprobieren, zu ihrer Community-Seite gehen oder ihrer Mailingliste beitreten.
Bewertung oder Vorabprüfung
Das Sichern Ihrer Daten, einschließlich Konfigurationen oder Setup-Dateien, Kernel-Tunings und Automatisierungsskripts, muss berücksichtigt werden:Es ist eine offensichtliche Aufgabe, aber sichern Sie immer zuerst alles, bevor Sie migrieren, insbesondere wenn Sie auf eine andere Plattform wechseln.
Sie müssen auch beurteilen, ob Ihre Anwendungen den aktuellen Softwareentwicklungskonventionen folgen, und sicherstellen, dass sie plattformunabhängig sind. Diese Praktiken können für Sie von Vorteil sein, insbesondere wenn Sie zu einer anderen Datenbankplattform wechseln.
Da MariaDB eine Open-Source-Technologie ist, stellen Sie sicher, dass Sie wissen, welche Konnektoren in MariaDB verfügbar sind. Dies ist im Moment ziemlich einfach, da es verschiedene verfügbare Client-Bibliotheken gibt. Hier finden Sie eine Liste dieser Client-Bibliotheken. Abgesehen davon können Sie auch diese Liste der verfügbaren Clients und Dienstprogramme überprüfen.
Vergewissern Sie sich zuletzt über Ihre Hardwareanforderungen.
MariaDB hat keine spezifischen Anforderungen:Ein typischer Commodity-Server kann funktionieren, aber das hängt davon ab, wie viel Leistung Sie benötigen. Wenn Sie jedoch mit ColumnStore für Ihre analytischen Anwendungen oder Data-Warehouse-Anwendungen zusammenarbeiten, sehen Sie sich deren Dokumentation an. Aus ihrer Seite entnommen, haben sie dies für AWS im Allgemeinen mit m4.4xlarge-Instance-Typen als kostengünstigen Mittelweg getestet. Der R4.8xlarge wurde ebenfalls getestet und ist etwa doppelt so schnell für etwa den doppelten Preis.
Was Sie wissen sollten
Genau wie MySQL können Sie in MariaDB mehrere Datenbanken erstellen, während Oracle nicht über dieselbe Funktionalität verfügt.
In MariaDB ist ein Schema gleichbedeutend mit einer Datenbank. Sie können das Schlüsselwort SCHEMA anstelle von DATABASE in der MariaDB-SQL-Syntax ersetzen. Verwenden Sie zum Beispiel CREATE SCHEMA statt DATENBANK ERSTELLEN; während Oracle dafür eine Unterscheidung hat. Ein Schema stellt nur einen Teil einer Datenbank dar:die Tabellen und anderen Objekte, die einem einzelnen Benutzer gehören. Normalerweise besteht eine Eins-zu-Eins-Beziehung zwischen der Instanz und der Datenbank.
In einem Replikationssetup, das in Oracle äquivalent ist (z. B. Real Application Clusters oder RAC), haben Sie beispielsweise mehrere Instanzen, die auf eine einzige Datenbank zugreifen. Dadurch können Sie Oracle auf mehreren Servern starten, die alle auf dieselben Daten zugreifen. In MariaDB können Sie jedoch den Zugriff auf mehrere Datenbanken von Ihren mehreren Instanzen aus zulassen und sogar herausfiltern, welche Datenbanken/Schemas Sie auf einen MariaDB-Knoten replizieren können.
In Bezug auf einen unserer früheren Blogs (dies und dieser) gilt das gleiche Prinzip, wenn es darum geht, Ihre Datenbank mit verfügbaren Tools aus dem Internet zu konvertieren.
Es gibt kein solches Tool, das die Oracle-Datenbank zu 100 % in MariaDB konvertieren kann, obwohl MariaDB über die Red Rover-Migrationspraxis verfügt; dies ist ein Service, den MariaDB anbietet und der nicht kostenlos ist.
MariaDB spricht über die Migration bei der Development Bank of Singapore (DBS) als Ergebnis der Zusammenarbeit mit MariaDB zur Oracle-Kompatibilität. Es war in der Lage, mehr als 50 % seiner geschäftskritischen Anwendungen in nur 12 Monaten von Oracle Database auf MariaDB zu migrieren.
Aber wenn Sie nach einigen Tools suchen, bieten sqlines-Tools, nämlich SQLines SQL Converter und SQLines Data Tool, eine einfache, aber operative Sammlung von Tools.
Die folgenden Abschnitte umreißen die Dinge, die Sie beachten müssen, wenn es um die Migration und die Überprüfung des logischen SQL-Ergebnisses geht.
Datentypzuordnung
MySQL und MariaDB teilen die gleichen verfügbaren Datentypen. Obwohl es Variationen bei der Implementierung gibt, können Sie hier nach der Liste der Datentypen in MariaDB suchen.
Während MySQL den JSON-Datentyp verwendet, unterscheidet sich MariaDB dadurch, dass es nur ein Alias des LONGTEXT-Datentyps ist. MariaDB hat auch eine Funktion, JSON_VALID, die innerhalb des CHECK-Einschränkungsausdrucks verwendet werden kann.
Daher verwende ich diese tabellarische Darstellung unten basierend auf den Informationen hier, da Datentypen von MySQL gegenüber MariaDB nicht so stark abweichen, aber ich habe Änderungen hinzugefügt, da der ROW-Datentyp in MariaDB 10.3 eingeführt wurde. 0 als Teil der PL/SQL-Kompatibilitätsfunktion.
Sehen Sie sich die folgende Tabelle an:
Oracle | MySQL | |||
---|---|---|---|---|
1 | BFILE | Zeiger auf Binärdatei, ⇐ 4G | VARCHAR(255) | |
2 | BINARY_FLOAT | 32-Bit-Gleitkommazahl | SCHWEBEN | |
3 | BINARY_DOUBLE | 64-Bit-Gleitkommazahl | DOPPELT | |
4 | BLOB | Binäres großes Objekt, ⇐ 4G | LONGBLOB | |
5 | ZEICHEN(n), ZEICHEN(n) | String mit fester Länge, 1 ⇐ n ⇐ 255 | ZEICHEN(n), ZEICHEN(n) | |
6 | ZEICHEN(n), ZEICHEN(n) | String mit fester Länge, 256 ⇐ n ⇐ 2000 | VARCHAR(n) | |
7 | CLOB | Charakter großes Objekt, ⇐ 4G | LANGTEXT | |
8 | DATUM | Datum und Uhrzeit | DATETIME | |
9 | DEZIMAL(p,s), DEZ(p,s) | Festkommazahl | DEZIMAL(p,s), DEZ(p,s) | |
10 | DOPPELTE PRÄZISION | Gleitkommazahl | DOPPELTE PRÄZISION | |
11 | FLOAT(p) | Gleitkommazahl | DOPPELT | |
12 | INTEGER, INT | 38-stellige Ganzzahl | INT | DEZIMAL(38) |
13 | INTERVALL JAHR(p) BIS MONAT | Datumsintervall | VARCHAR(30) | |
14 | INTERVALL TAG(p) BIS SEKUNDE(n) | Tag und Zeitintervall | VARCHAR(30) | |
15 | LANG | Zeichendaten, ⇐ 2G | LANGTEXT | |
16 | LONG RAW | Binäre Daten, ⇐ 2G | LONGBLOB | |
17 | NCHAR(n) | UTF-8-String mit fester Länge, 1 ⇐ n ⇐ 255 | NCHAR(n) | |
18 | NCHAR(n) | UTF-8-String mit fester Länge, 256 ⇐ n ⇐ 2000 | NVARCHAR(n) | |
19 | NCHAR VARYING(n) | UTF-8-String unterschiedlicher Länge, 1 ⇐ n ⇐ 4000 | NCHAR VARYING(n) | |
20 | NCLOB | Unicode-String variabler Länge, ⇐ 4G | NVARCHAR(max) | |
21 | NUMMER(p,0), NUMMER(p) | 8-Bit-Ganzzahl, 1 <=p <3 | TINYINT | (0 bis 255) |
16-Bit-Ganzzahl, 3 <=p <5 | SMALLINT | |||
32-Bit-Ganzzahl, 5 <=p <9 | INT | |||
64-Bit-Ganzzahl, 9 <=p <19 | BIGINT | |||
Festkommazahl, 19 <=p <=38 | DEZIMAL(p) | |||
22 | ZAHL(p,s) | Festkommazahl, s> 0 | DEZIMAL(p,s) | |
23 | NUMMER, NUMMER(*) | Gleitkommazahl | DOPPELT | |
24 | NUMERIC(p,s) | Festkommazahl | NUMERIC(p,s) | |
25 | NVARCHAR2(n) | UTF-8-String variabler Länge, 1 ⇐ n ⇐ 4000 | NVARCHAR(n) | |
26 | RAW(n) | Binärzeichenfolge variabler Länge, 1 ⇐ n ⇐ 255 | BINARY(n) | |
27 | RAW(n) | Binärzeichenfolge variabler Länge, 256 ⇐ n ⇐ 2000 | VARBINARY(n) | |
28 | ECHT | Gleitkommazahl | DOPPELT | |
29 | ROWID | Physische Zeilenadresse | CHAR(10) Daher können Sie für die PL/SQL-Kompatibilität ROW ( | |
30 | SMALLINT | 38-stellige Ganzzahl | DEZIMAL(38) | |
31 | ZEITSTEMPEL(p) | Datum und Uhrzeit mit Bruch | DATETIME(p) | |
32 | ZEITSTEMPEL(p) MIT ZEITZONE | Datum und Uhrzeit mit Bruchteil und Zeitzone | DATETIME(p) | |
33 | UROWID(n) | Logische Zeilenadressen, 1 ⇐ n ⇐ 4000 | VARCHAR(n) | |
34 | VARCHAR(n) | String variabler Länge, 1 ⇐ n ⇐ 4000 | VARCHAR(n) | |
35 | VARCHAR2(n) | String variabler Länge, 1 ⇐ n ⇐ 4000 | VARCHAR(n) | |
36 | XMLTYPE | XML-Daten | LANGTEXT |
Datentypattribute und Optionen:
Oracle | MySQL |
---|---|
BYTE- und CHAR-Spaltengrößensemantik | Größe ist immer in Zeichen |
Transaktionen
MariaDB verwendet XtraDB von früheren Versionen bis 10.1 und wurde ab Version 10.2 auf InnoDB umgestellt; obwohl verschiedene Speicher-Engines eine alternative Wahl für die Abwicklung von Transaktionen sein können, wie z. B. die MyRocks-Speicher-Engine.
Standardmäßig hat MariaDB die Autocommit-Variable auf ON gesetzt, was bedeutet, dass Sie Transaktionsanweisungen explizit behandeln müssen, um ROLLBACK zum Ignorieren von Änderungen oder zum Nutzen der Verwendung von SAVEPOINT zu nutzen.
Es ist im Grunde das gleiche Konzept, das Oracle in Bezug auf Commit, Rollbacks und Savepoints verwendet.
Für explizite Transaktionen bedeutet dies, dass Sie die START TRANSACTION/BEGIN;
Andernfalls, wenn Sie Autocommit deaktivieren müssen, müssen Sie für Ihre Anweisungen, die Änderungen an Ihren Daten erfordern, die ganze Zeit explizit COMMIT ausführen.
Dualer Tisch
MariaDB hat die doppelte Kompatibilität mit Oracle, die für die Kompatibilität von Datenbanken gedacht ist, die eine Dummy-Tabelle verwenden, nämlich DUAL. Es funktioniert genauso wie MySQL, wo die FROM-Klausel nicht obligatorisch ist, sodass die DUAL-Tabelle nicht erforderlich ist. Die DUAL-Tabelle funktioniert jedoch nicht genau so wie bei Oracle, aber für einfache SELECTs in MariaDB ist dies in Ordnung.
Dies passt zur Verwendung von DUAL durch Oracle, sodass alle vorhandenen Anweisungen in Ihrer Anwendung, die DUAL verwenden, bei der Migration zu MariaDB möglicherweise keine Änderungen erfordern.
Die Oracle FROM-Klausel ist für jede SELECT-Anweisung obligatorisch, daher verwendet die Oracle-Datenbank die DUAL-Tabelle für die SELECT-Anweisung, wenn kein Tabellenname erforderlich ist.
Siehe folgendes Beispiel unten:
Bei 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
Aber in 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)
Hinweis:das DESC DUAL Syntax funktioniert nicht in MariaDB und die Ergebnisse unterscheiden sich auch, da CURRENT_TIMESTAMP (verwendet den TIMESTAMP-Datentyp) in MySQL die Zeitzone nicht enthält.
SYSDATUM
Die SYSDATE-Funktion von Oracle ist in MariaDB fast identisch.
MariaDB gibt Datum und Uhrzeit zurück und es ist eine Funktion, die () erfordert (Klammer schließen und öffnen, ohne dass Argumente erforderlich sind. Um dies unten zu demonstrieren, hier Oracle und MariaDB zur Verwendung von SYSDATE.
In Oracle gibt die Verwendung von einfachem SYSDATE nur das Datum des Tages ohne die Uhrzeit zurück. Aber um die Zeit und das Datum zu erhalten, verwenden Sie TO_CHAR, um die Datumszeit in das gewünschte Format zu konvertieren; während Sie es in MariaDB möglicherweise nicht benötigen, um das Datum und die Uhrzeit zu erhalten, da es beides zurückgibt.
Siehe Beispiel unten.
Bei 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
Aber in MariaDB:
MariaDB [test]> SELECT SYSDATE() FROM DUAL;
+---------------------+
| SYSDATE() |
+---------------------+
| 2019-02-27 04:11:57 |
+---------------------+
1 row in set (0.000 sec)
Wenn Sie das Datum formatieren möchten, hat MariaDB eine DATE_FORMAT()-Funktion.
Weitere Informationen finden Sie in der Datums- und Zeitdokumentation von MariaDB.
TO_DATE
Das TO_DATE-Äquivalent von Oracle in MariaDB ist die STR_TO_DATE()-Funktion.
Es ist fast identisch mit dem in Oracle:Es gibt den Datentyp DATE zurück, während es in MariaDB den Datentyp DATETIME zurückgibt.
Orakel:
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)
SYNONYM
MariaDB hat noch keine äquivalente Funktionalität dazu. Basierend auf ihrem Jira-Ticket MDEV-16482 ist diese Funktionsanfrage zum Hinzufügen von SYNONYM derzeit noch offen und es gibt noch keine Anzeichen für einen Fortschritt zu diesem Zeitpunkt. Wir hoffen, dass dies in die zukünftige Version aufgenommen wird. Eine mögliche Alternative könnte jedoch die Verwendung von VIEW.
seinObwohl SYNONYM in Oracle verwendet werden kann, um einen Alias einer entfernten Tabelle zu erstellen,
z. B.
CREATE PUBLIC SYNONYM emp_table FOR [email protected]
In MariaDB können Sie die CONNECT-Speicher-Engine nutzen, die leistungsfähiger ist als die FederatedX-Speicher-Engine, da Sie damit verschiedene Datenbankquellen verbinden können. Sie können sich diese kurze Videopräsentation ansehen.
Es gibt ein gutes Beispiel in der Handbuchseite von MariaDB, das ich hier nicht wiederholen werde, da es bestimmte Überlegungen gibt, die Sie treffen müssen, insbesondere wenn Sie ODBC verwenden. Bitte schlagen Sie im Handbuch nach.
Verhalten von leerem String und NULL
Beachten Sie, dass in MariaDB leere Zeichenfolgen nicht NULL sind, während Oracle leere Zeichenfolgen als Nullwerte behandelt.
Bei Oracle:
SQL> SELECT CASE WHEN '' IS NULL THEN 'Yes' ELSE 'No' END AS "Null Eval" FROM dual;
Nul
---
Yes
In 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)
Sequenzen
Seit MariaDB 10.3 wurden Oracle-kompatible Sequenzen und eine mit Oracle PL/SQL kompatible Sprache für gespeicherte Prozeduren eingeführt. In MariaDB ist das Erstellen einer Sequenz der SEQUENCE von Oracle ziemlich ähnlich.
MariaDBs Beispiel:
CREATE SEQUENCE s START WITH 100 INCREMENT BY 10;
CREATE SEQUENCE s2 START WITH -100 INCREMENT BY -10;
und das Festlegen praktikabler Mindest- und Höchstwerte zeigt sich wie folgt
CREATE SEQUENCE s3 START WITH -100 INCREMENT BY 10 MINVALUE=-100 MAXVALUE=1000;
Zeichenkettenfunktionen
MariaDB hat ebenso wie MySQL eine Handvoll String-Funktionen, die zu lang sind, um sie hier einzeln zu diskutieren. Daher können Sie die Dokumentation von hier aus überprüfen und mit den String-Funktionen von Oracle vergleichen.
DML-Anweisungen
Einfügen/Aktualisieren/Löschen-Anweisungen von Oracle sind in MariaDB deckungsgleich.
ALLE EINFÜGEN/ZUERST EINFÜGEN von Oracle wird in MariaDB nicht unterstützt und noch niemand hat diese Funktionsanfrage in seinem Jira geöffnet (soweit ich weiß).
Andernfalls müssten Sie Ihre MySQL-Abfragen einzeln angeben.
z. B.
Bei 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.
Aber in MariaDB müssen Sie die Einfügung einzeln ausführen:
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 ist nicht vergleichbar mit der Verwendung in Oracle, wo Sie Bedingungen nutzen können, indem Sie Ihrer Syntax ein WHEN-Schlüsselwort hinzufügen; Derzeit gibt es in MariaDB keine entsprechende Option.
Daher besteht Ihre alternative Lösung darin, Prozeduren zu verwenden.
Outer Joins "+"-Symbol
Derzeit ist es aus Kompatibilitätsgründen noch nicht in MariaDB vorhanden. Daher gibt es viele Jira-Tickets, die ich in MariaDB gefunden habe, aber dieses ist viel präziser in Bezug auf Funktionsanforderungen. Daher ist Ihre alternative Wahl für dieses Mal die Verwendung der JOIN-Syntax. Weitere Informationen hierzu finden Sie in der Dokumentation.
BEGINN MIT..VERBINDEN DURCH
Oracle verwendet START WITH..CONNECT BY für hierarchische Abfragen.
Mit MariaDB 10.2 haben sie CTE (Common Table Expression) eingeführt, das darauf ausgelegt ist, Generationen von hierarchischen Datenergebnissen zu unterstützen, die Modelle wie Adjazenzlisten oder verschachtelte Mengenmodelle verwenden.
Ähnlich wie PostgreSQL und MySQL verwendet MariaDB nicht-rekursive und rekursive CTEs.
Zum Beispiel ein einfacher nicht-rekursiver Ausdruck, der verwendet wird, um Individuen mit ihrer Gruppe zu vergleichen:
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)
während ein rekursiver CTE (Beispiel:Busziele mit New York als Ausgangspunkt zurückgeben)
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 in MariaDB?
Zuvor haben wir in unserem Blog über „Migration von Oracle Database zu MariaDB – Was Sie wissen sollten“ gezeigt, wie leistungsfähig es jetzt in MariaDB ist, indem wir seine Konformität zur Übernahme von PL/SQL als Teil seines Datenbankkerns hinzugefügt haben. Wenn Sie die PL/SQL-Kompatibilität in MariaDB verwenden, stellen Sie sicher, dass Sie SQL_MODE ='Oracle' eingestellt haben wie folgt:
SET SQL_MODE='ORACLE';
Der neue Kompatibilitätsmodus hilft bei folgender Syntax:
- Schleifensyntax
- Variablendeklaration
- Nicht-ANSI-Konstrukt für gespeicherte Prozeduren
- Cursor-Syntax
- Parameter gespeicherter Prozeduren
- Datentypvererbung (%TYPE, %ROWTYPE)
- Ausnahmen im PL/SQL-Stil
- Synonyme für grundlegende SQL-Typen (VARCHAR2, NUMBER, …)
In Oracle können Sie beispielsweise ein Paket erstellen, bei dem es sich um ein Schemaobjekt handelt, das logisch verwandte PL/SQL-Typen, -Variablen und -Unterprogramme gruppiert. Daher können Sie es in MariaDB wie folgt tun:
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 ;
PL/SQL von Oracle wird jedoch vor der Ausführung kompiliert, wenn es in den Server geladen wird. Obwohl MariaDB dies in ihrem Handbuch nicht sagt, würde ich davon ausgehen, dass der Ansatz der gleiche ist wie bei MySQL, wo es kompiliert und im Cache gespeichert wird, wenn es aufgerufen wird.
Migrationstools
Wie mein Kollege Bart in unserem vorherigen Blog hier angedeutet hat, können sqlines-Tools, nämlich SQLines SQL Converter und SQLines Data Tool, ebenfalls als Teil Ihrer Migration hilfreich sein.
MariaDB hat ihren Red Rover Migration Practice Service, den Sie nutzen können.
Insgesamt ist die Migration von Oracle zu MariaDB keine so einfache Sache wie die Migration zu MySQL/Percona, was mehr Herausforderungen mit sich bringen könnte als MariaDB; insbesondere existiert keine PL/SQL-Kompatibilität in MySQL.
Wie auch immer, wenn Sie Tools finden oder kennen, die Sie für die Migration von Oracle zu MariaDB hilfreich und nützlich finden, hinterlassen Sie bitte einen Kommentar in diesem Blog!
Testen
Erlauben Sie mir, das Gleiche, was ich in diesem Blog gesagt habe, hier zu wiederholen.
Als Teil Ihres Migrationsplans ist das Testen eine wichtige Aufgabe, die eine sehr wichtige Rolle spielt und Ihre Entscheidung bezüglich der Migration beeinflusst.
Das Tool dbdeployer (ein Ersatz für MySQL Sandbox) ist ein sehr hilfreiches Tool, das Sie nutzen können. Dies ist ziemlich einfach für Sie, um verschiedene Ansätze auszuprobieren und zu testen, und spart Ihnen Zeit, anstatt den gesamten Stack einzurichten, wenn Sie zuerst die RDBMS-Plattform ausprobieren und testen möchten.
Zum Testen Ihrer gespeicherten SQL-Routinen (Funktionen oder Prozeduren), Trigger und Ereignisse schlage ich vor, dass Sie diese Tools mytap oder das Unit Testing Framework von Google verwenden.
Percona-Tools können immer noch nützlich sein und können sogar mit MariaDB in Ihre DBA- oder Engineering-Aufgaben integriert werden. Sehen Sie sich hier das Percona Toolkit an. Sie können die Tools entsprechend Ihren Anforderungen speziell für Test- und Produktionsnutzungsaufgaben auswählen.
Insgesamt sind die Dinge, die Sie als Ihre Richtlinien im Hinterkopf behalten müssen, wenn Sie einen Test für Ihren MariaDB-Server durchführen, die folgenden:
- Nach der Installation müssen Sie einige Einstellungen vornehmen. Sehen Sie sich unser Webinar zum Optimieren Ihres MariaDB-Servers an.
- Führen Sie einige Benchmarks und Belastungstests für Ihr Konfigurations-Setup auf Ihrem aktuellen Knoten durch. Testen Sie mysqlslap und sysbench, die Ihnen dabei helfen können. Lesen Sie auch unseren Blog "How to Benchmark Performance of MySQL &MariaDB using SysBench".
- Überprüfen Sie Ihre DDLs, ob sie korrekt definiert sind, wie z. B. Datentypen, Einschränkungen, gruppierte und sekundäre Indizes oder Partitionen, falls vorhanden.
- Überprüfen Sie Ihre DML, insbesondere, ob die Syntax korrekt ist und die Daten wie erwartet korrekt gespeichert werden.
- Überprüfen Sie Ihre gespeicherten Routinen, Ereignisse und Trigger, um sicherzustellen, dass sie die erwarteten Ergebnisse ausführen/zurückgeben.
- Stellen Sie sicher, dass Ihre ausgeführten Abfragen leistungsfähig sind. Ich schlage vor, dass Sie Open-Source-Tools nutzen oder unser Produkt ClusterControl ausprobieren. Es bietet Überwachung/Beobachtbarkeit insbesondere Ihres MariaDB-Clusters. Sehen Sie sich diesen vorherigen Blog an, in dem wir zeigen, wie ClusterControl Ihnen bei der Verwaltung von MariaDB TX 3.0 helfen kann. Sie können ClusterControl hier verwenden, um Ihre Abfragen und ihren Abfrageplan zu überwachen, um sicherzustellen, dass sie leistungsfähig sind.