Datenbanken

Linux und der Weg zur Ordnung

von Nils Faerber


Linux ist derzeit in aller Munde, vor allem im Serverbereich. Was können wir mitlerweile nicht alles bedienen: Die klassischen WWW- und FTP-Server, DNS Nameserver, Fileserver für die verschiedensten Plattformen, etc. Doch wie sieht es mit Datenbanken aus? Die Verwaltung und sinnvolle Ordnung großer Datenbestände ist eine zentrale Funktionalität für viele Anwendungen. Und wer einmal über den Rand der "Linux-Suppenschüssel" geschaut hat und gesehen hat, was große Softwarehäuser für Ihre Datenbankserver verlangen fragt sich unwillkürlich: Gibt es so etwas auch für Linux? Und was das dann wohl kosten mag?

Ja, es gibt sie... und so viele!

Softwarepakete, welche weit über dem Monatseinkommen eines einfachen Arbeiters kosten, flößen einem schon Respekt ein. So geht es einem meist bei Datenbanken. Die großen Hersteller greifen einem hier tief in die Tasche. Sie bieten auch etwas für das Geld, doch fragt man sich, wenn das soviel Geld kostet, dann steckt auch sehr viel Arbeit darin und wer soll das bloß kostenlos für Linux tun wollen? Doch andersherum überlegt, haben auch die früheren Unix'e einmal fürchterlich viel Geld gekostet und doch haben wir heute Linux, welches sich durchaus mit all diesen messen läßt. Und genau dies scheint auch der Ansporn für einige der Datenbankentwicklungen gewesen zu sein. Die kommerziellen waren viel zu teuer für die geplante Anwendung und auf dem freien Markt gab es nichts passendes. Nun was tut man? Man macht die Not zur Tugend und stampft selbst etwas aus dem Boden. So geschehen in Australien und Schweden und wahrscheinlich noch an vielen anderen Orten.

Einige Beispiele, MiniSQL

Der erste Datenbankserver mit dem ich Kontakt hatte, war MiniSQL[1] (mSQL) von David Hughes aus Australien. Eine Entwicklung, wie eben beschrieben, aus der Not. Man wollte eine recht überschaubare Datenmenge sinnvoll verwalten. Einzige Alternative wäre zum damaligen Zeitpunkt PostGres oder University Ingres gewesen, doch diese Dinosaurier für ein paar Hundert Datensätze einzusetzen, wäre wohl zum besten Beispiel für den Begriff "Overkill" geworden. Also entwickelte man einen kleinen Datenbankserver mit begrenzten Befehlsumfang, sowie eine Schnittstelle für darauf aufsetzende Applikationen. Dies erfüllte zunächst seinen Zweck, doch wie es immer bei solchen Projekten ist, könnte man ja hier noch etwas erweitern, dort etwas optimieren, und so fort. So entstand ein ansehnlicher Datenbankserver, welcher die wichtigsten SQL Befehle unterstützt und klein und überschaubar ist. Mittlerweile gibt es eine ganze Reihe von Erweiterungen, wie ein Perl Interface sowie eine spezielle Sammlung von Routinen für den Zugriff über das WWW. Leider hat sich mittlerweile das Copyright von mSQL geändert und die weitere Entwicklung hat David Hughes in eine eigene Firma weitergetragen. Dies war der Grund für mich, nach anderen Lösungen zu suchen.

ODBC

Die Durchsetzung unserer Umwelt mit Betriebsystemen aus Redmond nimmt leider immer weiter zu und so kann sich auch der härteste Linux Verfechter nicht davor drücken, nach Lösungen für deren Koexistenz zu suchen. Oftmals ist dann der erste Linux Einsatz der eines Servers für den Rest der Welt. Und genau hierfür hat die Firma aus Redmond einmal etwas sinnvolles getan. Für Datenbankanbindungen von Ihrem Betriebsystem zu anderen Servern wurde die ODBC-Schnittstelle geschaffen. Diese ermöglicht es den Applikationen über den ODBC-Treiber mit einem Datenbankserver zu kommunizieren. Das Schöne ist nun, daß der Anwender an seinem PC von all dem gar nichts merkt. Er arbeitet weiter mit seiner gewohnten Oberfläche, wie bspw. MS-Access, doch im Hintergrund arbeitet fröhlich ein Linux Server vor sich hin.

Die Vorteile liegen auf der Hand. Der Server ist zentral administrierbar. Alle Daten, bspw. einer Firma, liegen zentral vor und können gemeinsam archiviert oder ausgewertet werden. Man hat von allen an das Netzwerk angeschlossenen Rechnern die Möglichkeit des Zugriffs auf die Daten.

MySQL

Doch zurück zu meinem Wechsel. Als also mSQL nicht mehr so interessant war und ich von der ODBC-Schnittstelle von MySQL[2] hörte, mußte ich das unbedingt sehen. Also holte ich MySQL aus Schweden und als alter Linux Veteran natürlich erstmal brav nur den Sourcecode. Allein an der Größe der Quellen wurde mir schnell klar, daß MySQL etwas "mehr" als mSQL ist.

Die Entwickler von MySQL legten den Schwerpunkt auf Robustheit, d.h. Datenunversehrtheit, und Geschwindigkeit. Die hohe Geschwindigkeit von MySQL resultiert aus der Verwendung von Threads für die Serverprozesse. Jede Anfrage an den Server startet einen eigenen Thread zu dessen Verarbeitung. Hier kommen die MIT-PThreads für Linux zum Einsatz. Die Threads sind damit leider auch ein kleiner Knackpunkt, wodurch MySQL noch nicht auf allen Linux Plattformen einwandfrei zum Einsatz kommen kann, bspw. gibt es auf Linux-Alpha noch ein paar kleinere Probleme, wenn Abfragen während der Ausfürung abgebrochen werden sollen. Doch im großen und ganzen kann man sagen, es läuft stabil, gerade die Linux-Intel Version.

MySQL - Copyright

Das Copyright von MySQL ist bemerkenswert. Man kann praktisch alles mit MySQL kostenlos machen, nur nicht verkaufen. Möchte man MySQL selbst oder als Teil eines eigenen Produktes verkaufen, so muß man zahlen. Die Lizenpreise sind jedoch auch dann recht moderat; derzeit ab US$200 bis hinunter zu US$20 ab 2500 Lizenzen. Dieser Preis beinhaltet auch kostenlosen eMail Support. Weitere Supportangebote sind auch verfügbar, je nach Bedarf bis zum Dial-In Support. Für alle anderen Anwendungen, sei dies auch der Aufbau einer kommerziellen Datenbank, ist der Einsatz kostenlos!

Installation - Erster Start

Die Installation von MySQL ist einfach und gut dokumentiert, daher verzichte ich an dieser Stelle darauf, diese zu beschreiben. Der erste Start ist recht unspektakulär. Über das mitgelieferte Script

mysql.server {start|stop}
läßt sich dies einfach erledigen. Anschließend sollte man nur noch eine kurze Meldung sehen, daß der MySQL Server erfolgreich gestartet wurde. Der Server ist nun einsatzbereit. Doch nun? Dies ist eine etwas unangenehme Eigenschaft der meisten Datenbankserver für Linux. Keine bunte Oberfläche, keine besonders komfortablen Programme, um seine Arbeit mit dem Server zu erledigen. Diese Clients sind kein Bestandteil des Servers. Ein Datenbankserver ist qua Definition eben nur der Server. Doch ganz so schlimm ist es dann doch nicht!

Nützliche Programme

Zum einen sind in der MySQL Distribution ein paar Programme mit Commandlineinterface (CLI) enthalten, mit welchen sich eigentlich schon alles erledigen läßt und zum anderen gibt es einige Zusatzpakete mit grafischen Oberflächen.

Die mitgelieferten Programme sind

Neben diesen Grundwerkzeugen sollten zwei grafische Oberflächen zur Administration und Datenein-/ausgabe nicht unerwähnt bleiben.

xMySQLadmin

Dies ist die, meiner Meinung nach, sinnvollste Ergänzung zu MySQL. Es erlaubt die komplette Administration des Servers innerhalb einer recht komfortablen Oberfläche, erstellt mit den XForms[3]. Von der Erstellung der Datenbanken und Tabellen bis hin zum Absetzen von SQL-Abfragen ist hiermit fast alles möglich. Einzig selbst konfigurierbare Abfrageformulare oder Eingabemasken lassen sich leider nicht erstellen. Nach dem Start von xMySQLadmin präsentiert sich die Oberfläche folgendermaßen


Abbildung 1: xMySQLadmin Hauptmenü

XmySQL

Als zweiter Vertreter sollte auch XmySQL erwähnt werden. Ebenfalls XForms-basiert bietet es fast die gleiche Funktionalität wie xMySQLadmin, jedoch etwas anders:


Abbildung 2: XmySQL Hauptmenü

XmySQL konzentriert sich dabei mehr auf die Verwaltung der Daten selbst, also die Erstellung der Tabellen und das Bearbeiten der Daten. Die Adminstrationsfunktionen, wie sie in xMySQLadmin vorhanden sind, fehlen hier weitgehend. Schön ist der SQL "Query"-Editor


Abbildung 3: XmySQL Query Editor

Programmierung von Clients

Es ist schon komisch, daß die genannten Oberflächen beide XForms benutzen. Noch komischer empfand ich es, denn als ich die Notwendigkeit für eine Oberfläche für ein eigenes Projekt erkannte, griff ich selbst zu XForms. Das ganze liegt wohl darin begründet, daß die Programmierung eigener Clients keiner besonderen Kunstgriffe bedarf. Ganz im Gegenteil! Es ist eigentlich fürchterlich einfach. Und da die Datenbank schon so einfach zu programmieren ist, sollte es auch die Oberfläche sein. Vielleicht ist dies der Grund.

Das ganze ist so erschreckend einfach, daß selbst ein nicht sonderlich versierter Programmierer schnell eine eigene Applikation erstellen kann. Um an die Datenbank heran zu kommen, existieren eine Reihe von Schnittstellen

Ich persönlich bin froh, wenn ich eine Sprache einigermaßen beherrsche und benutze daher lediglich die C-Schnittstelle.

Die C-Schnittstelle

Für die meisten Funktionen reicht ein sehr schmales Gerüst an Funktionen aus. Alle notwendigen Deklarationen finden sich in dem Headerfile mysql.h. Die wichtigsten zur Anwendung kommenden Datentypen sind

Als erstes muß eine Client Applikation eine Verbindung zu dem Datenbankserver herstellen. Der Server muß dabei nicht auf demselben Rechner laufen. Es ist also möglich, ohne Veränderungen an dem Client-Programm vornehmen zu müssen, auf Datenbankserver zuzugreifen, welche irgendwie über ein Netzwerk erreichbar sind. Das Öffnen der Verbindung erfolgt dann einfach durch Aufruf der Funktion

mysql_connect(&mysql,"host","user","passwort")
mit den Parametern

Der Anfang eines Client-Programms könnte dann etwa wie folgt aussehen

/* Die zentralen Datenstrukturen */
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;

if (!(mysql_connect(&mysql,HOST,NULL,NULL))) {
  fprintf(stderr,"Fehler beim Verbindungsaufbau!\n");
  exit(-1);
}

Die Verbindung ist nun vorhanden und es kann eine SQL-Abfrage an den Server abgesetzt werden. Abfrage bedeutet in diesem Fall, nicht nur die lesende Abfrage von Daten, sondern auch das Schreiben von Daten. Beides wird über die gleiche Funktion realisiert, da beides auf SQL-Befehle abbildbar ist. Die C Funktion hierzu ist

int mysql_query(MYSQL *mysql, const char *query);

Hier kommt wieder MYSQL zur Verbindungidentifikation zum Einsatz, sowie die eigentliche Abfrage, welche als String übergeben wird, also const char *query.

Angenommen es existiere eine Tabelle namens "Artikel" auf dem Server, so könnte man alle Datensätze dieser Tablle mit folgender Abfrage erhalten

char query[]="SELECT * FROM Artikel ORDER BY ArtNr";

if (mysql_query (&mysql,query)) {
  fprintf(stderr,"Fehler bei Abfrage!\n");
  exit(-1);
};

Wie man jedoch leicht sieht, werden hier noch keine Daten vom Server geholt, sondern lediglich die Abfrage zum Server geschickt. Um die Daten nun auch an den Client zu transferieren, sind noch zwei weitere Funktionen notwendig. Die erste stellt Platz auf dem Server für das Ergebnis zur Verfügung und legt das Ergebnis dort ab. Die Funktion dazu ist

MYSQL_RES *mysql_store_result(MYSQL *mysql);
Als Rückgabewert bekommt man einen Zeiger auf das Ergebnis, welchen man anschließend benutzen muß, um das Ergebnis in sein Programm zu übernehmen. Diese Übernahme der Daten erfolgt anschließend mit der zweiten Funktion
MYSQL_ROW mysql_fetch_row(MYSQL_RES *mysql);
Hat man alle Daten abgeholt oder möchte einfach keine weiteren Daten mehr haben, so muß das Ergebnis im Server noch auf jeden Fall wieder freigegeben werden, also einfach
void mysql_free_result(MYSQL_RES *result);
aufrufen.

Ein Beispiel-Codefragment könnte dann etwa so aussehen

    res=mysql_store_result(&mysql);

    while ((row=mysql_fetch_row(res))) {
      printf("%s\n",row[0]);
    }

    mysql_free_result(res);

Zu guter Letzt sollte man noch nach getaner Arbeit die Verbindung zum Server beenden. Auch wenn Verbindungen automatisch nach acht Stunden beendet werden, so liegt doch die ganze Zeit der für den Client gestartete Server-Thread unnütz im Speicher des Servers. Die Verbindung kann einfach durch

void mysql_close(MYSQL *mysql);
geschlossen werden.

Gut aufgepaßt? Hier zeigt sich ein kleines Problem der Abfragen. Alle Daten werden dem Client als Strings geliefert, d.h. auch wunderschön als Float oder Integer abgelegte Zahlenwerte werden in ihrer Textrepräsentation an den Client geliefert, müssen also wieder konvertiert werden. Über den Sinn oder Unsinn dieses Verfahrens läßt sich sicherlich vortrefflich streiten, doch hat dies einen ganz klaren Vorteil: Das Ergebnis ist portabel! Keine Bytereihenfolge, keine unterschiedlichen Standards für die Repräsentation einer Fließkommazahl spielen hier eine Rolle.

Weitere Datenbanken

Nach den ausschweifenden Ausführungen zu MySQL, zurück zum Anfang: Es gibt noch mehr Datenbanken außer mSQL und MySQL. Doch da die Seiten nun schon davonlaufen und ich, daß muß ich zugeben, von den anderen keine Ahnung habe, für die interessierten Leser hier noch kurz eine Auflistung weiterer Datenbanken:

Infos

[1] Homepage zu mSQL, http://www.Hughes.com.au/
[2] Homepage zu MySQL, http://www.tcx.se/
[3] Homepage der XForms, http://bragg.phys.uwm.edu/xforms/
[4] Ingres FTP, ftp://s2k-ftp.cs.berkeley.edu/pub/ingres/
[5] Postgres Homepage, http://www.postgresql.org/
[6] QDDB Homepage, http://www.hsdi.com/qddb/
[7] AdabasD, Homepage des SAG, http://www.sag.de/
[8] Interbase Homepage, http://www.interbase.com/
[9] Homepage von Yard, http://www.yard.de/
[10] Homepage von Concept-Asa, http://www.concept-asa.de
[11] Homepage von Solid, http://www.solidtech.com
[12] Homepage von Raima, http://www.raima.com

Der Autor

Nils Faerber studiert Technische Informatik an der Universität-Gesamthochschule Siegen. Er ist Mitglied der dortigen Unix-AG und beschäftigt sich seit Kernel 0.96 mit Linux sowie den späteren Portierungen davon auf Sun-Sparc und Digital Alpha. Zu erreichen ist er unter Nils.Faerber@unix-ag.org.