Die MariaDB Connect Engine: Bitte bleiben Sie dran, die Verbindung wird hergestellt.

mysql-titel

Viele unserer Kunden nutzen heterogene Datenmanagement-Plattformen. So werden bei einigen neben Oracle Datenbanken auch SQL Server und Open-Source-Datenbanken oder auch NoSQL Systeme betrieben. Oftmals bestehen direkte Verbindungen innerhalb einer Systemklasse (z.B. über Datenbanklinks zwischen Oracle Systemen). Bei einer heterogenen Kommunikation (Oracle -> SQL Server oder MySQL -> Oracle) werden häufig „Zusatzprodukte" (z.B. ETL- / CDC-Tools) oder selbst entwickelte „Schnittstellen" (CSV, XML, JSON, …) verwendet.

Die Open-Source-Datenbank MariaDB bietet mit der Connect Engine eine Möglichkeit, unterschiedliche Datenquellen direkt (ohne Dritt-Produkt) anzubinden. 

Die Schaltzentrale…

Mittels der MariaDB Connect Engine können unterschiedlichste Datenquellen in die Datenbank integriert werden. Darunter sind die klassischen Kandidaten wie ODBC und JDBC, aber auch dateibasierte Informationen (inkl. CSV, XML, JSON; auch in gepackter (ZIP) Form) und viele andere Formate. Eine Übersicht über alle verfügbaren Formate (Table Types) finden Sie hier: https://mariadb.com/kb/en/connect-bin-table-type/ 

Im folgenden Beispiel versuchen wir über die Connect Engine Daten aus einer Oracle XE Datenbank der Version 18c einzubinden. Wir nutzen dafür das klassische Oracle Test-Schema „HR" als Datenquelle. 

Einen Augenblick, wir verbinden Sie…

Die Anbindung der entfernten Oracle DB soll per ODBC erfolgen. Die MariaDB läuft in der Version 10.5.4 auf einem Linux-Server. Im ersten Schritt binden wir das Plugin „CONNECT" ein. Sollte dieses nicht verfügbar sein, so kann es über das entsprechende MariaDB Repository runtergeladen und installiert werden: 

# https://mariadb.com/kb/en/installing-the-connect-storage-engine/     
bash> sudo apt-get install mariadb-plugin-connect-engine     
bash> mysql -uroot -p 
    
MariaDB> install soname ‚ha_connect.so‘;     
MariaDB> show engines;
+--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+

| Engine             | Support | Comment                                                                                         | Transactions | XA   | Savepoints |

+--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+ 
... 
| MyISAM             | YES     | Non-transactional engine with good performance and small data footprint                         | NO           | NO   | NO         | 
| CONNECT            | YES     | Management of External Data (SQL/NOSQL/MED), including Rest query results                       | NO           | NO   | NO         | 
| SEQUENCE           | YES     | Generated tables filled with sequential values                                                  | YES          | NO   | YES        | 
… 
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                                                              | NO           | NO   | NO         | 
+--------------------+---------+-------------------------------------------------------------------------------------------------+--------------+------+------------+ 
9 rows in set (0.001 sec)    

Zusätzlich sind auf dem MariaDB Server die Pakete unixODBC, ein aktueller Oracle Instant Client und das Oracle ODBC Paket zu installieren (entpacken):

bash> sudo apt-get install unixodbc
bash> wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip
bash> wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-odbc-linuxx64.zip 

Im Anschluss daran sind die ODBC Quellen zu konfigurieren. Dazu wird im ersten Schritt der Oracle Treiber definiert:

bash> cat /etc/odbcinst.ini
[Oracle]
Description=Oracle Driver
Driver=/mariadb/instantclient_19_6/libsqora.so.19.1 

Im zweiten Teil wird die Datenquelle (hier als DSN „HR" definiert) bestimmt:

cat /etc/odbc.ini
[ODBC Data Sources]
HR="Oracle HR schema"
[HR]
Application Attributes = T
Attributes = W
BatchAutocommitMode = IfAllSuccessful
CloseCursor = F
DisableDPM = F
DisableMTS = T
Driver = Oracle
EXECSchemaOpt =
EXECSyntax = T
Failover = T
FailoverDelay = 10
FailoverRetryCount = 10
FetchBufferSize = 64000
ForceWCHAR = F
Lobs = T
Longs = T
MetadataIdDefault = F
QueryTimeout = T
ResultSets = T
ServerName = //12f07cfd2fb8:1521/xepdb1
SQLGetData extensions = F
Translation DLL =
Translation Option = 0
UserID = hr
Password = geheim 

Nun kann über das ODBC Tool „isql" (wird mit unixODBC installiert) die Quelle „getestet" werden:

bash> isql hr
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+

SQL> select table_name from user_tables;
+---------------------------------------------------------------------------------------------------------------------------------+
| TABLE_NAME                                                                                                                      |
+---------------------------------------------------------------------------------------------------------------------------------+
…                                                                                                            |
| JOBS                                                                                                                            |
| EMPLOYEES                                                                                                                       |
| JOB_HISTORY                                                                                                                     |
+---------------------------------------------------------------------------------------------------------------------------------+
SQLRowCount returns -1
7 rows fetched

SQL> quit 

Die Verbindung wird gehalten…

Nun ist es an der Zeit, die Verbindung zwischen der MariaDB und dem „DSN HR" zu etablieren. Hierzu legen wir einfach eine Tabelle in die Engine „Connect" und spezifizieren die Verbindungsdaten.

MariaDB> create table hr_remote engine=connect table_type=ODBC tabname='JOBS' dbschema='HR' connection='dsn=HR';
Query OK, 0 rows affected (3.509 sec)
MariaDB> select * from hr_remote limit 1;
+--------+-----------+------------+------------+
| JOB_ID | JOB_TITLE | MIN_SALARY | MAX_SALARY |
+--------+-----------+------------+------------+
| XX_XXX | XXX       |       1000 |       2000 |
+--------+-----------+------------+------------+
1 row in set (0.264 sec) 

Bei der Spezifikation der Quell-Objekte (DBSCHEMA; TABNAME) ist auf die korrekte Schreibweise zu achten. Im Allgemeinen speichert Oracle solche Namen in Großbuchstaben. Eine abweichende Schreibweise hat bei unseren Versuchen zu nicht ganz aussagekräftigen Fehlermeldungen geführt.

Verbindung gut, alles gut?

In unserem Test ließen sich alle Tabellen des HR-Schemas der Oracle Datenbank problemlos einbinden. Die Zugriffe per SELECT und DML liefen fehlerfrei. DDL Änderungen auf dem Ziel-System sollten unterbunden werden. So konnte beispielsweise eine Spalte der Tabelle „hr_remote" lokal (MariaDB) erzeugt werden. Diese Änderung wurde vom entfernten System (Oracle) jedoch nicht nachvollzogen. Ab diesem Moment konnten keine SELECTs mehr gegen dieses Objekt abgesetzt werden, da eine „Mismatch" der Spalten festgestellt wurde. Der Fehler konnte durch das Entfernen der zusätzlichen lokalen Spalte gelöst werden.
Generell stellt die Connect-Engine aber eine brauchbare Funktion dar, um schnell heterogene Datenquellen einzubinden.

By accepting you will be accessing a service provided by a third-party external to https://blog.ordix.de/