Download - MySQL lernen - Anfangen, anwenden, verstehen mysql < mycommands.sql Database musikschule mysql test raum_id raum_name etage personen 1 A5.33 5

Transcript

lernen

��� ��� �� ���� ���� �� ������ ���

5 Zugriffsmöglichkeiten

Man kann auf vielerlei Wegen auf die Daten eines MySQL-Servers zu-greifen. Bisher haben wir immer das Client-Programm mysql genutzt.Natürlich ist das aber kein sinnvoller Weg für Endbenutzer. Für dieseGruppe schreibt man im Allgemeinen ein eigenes Programm, welchesüber eine der angebotenen Schnittstellen mit dem MySQL-Server kom-muniziert.

Zudem gibt es einige Programme, die einen Administrator bei seiner Ar-beit mit dem MySQL-Server unterstützen, sei es grafisch oder textuellausgerichtet. Um die Daten „am Stück“ aus dem Server heraus- und ineinen anderen wieder hineinzubekommen, kann man auch verschie-dene Wege beschreiten.

5.1 Was Sie in diesem Kapitel lernenZunächst wollen wir uns mit den verschiedenen Tools auseinanderset-zen, die Zugriff auf den MySQL-Server bzw. die von ihm verwalteten Da-ten gewähren. Das wichtigste ist dabei natürlich mysql, es gibt aber nocheinige weitere, die eher der Administration dienen.

Danach werden wir phpMyAdmin vorstellen, ein von Dritten program-miertes Tool, das dem Benutzer eine grafische Oberfläche präsentierenkann, welche den Dialog mit dem Server hübscher verpackt als diesTextprogramme ermöglichen (welche dafür natürlich andere Vorteilehaben). Zudem läuft es unter einer Web-Oberfläche und kann somit mitjedem Browser bedient werden.

Zum Dritten wollen wir uns mit dem Im- und Export von Daten küm-mern. Damit kann man Datenbanken von einem zum anderen Rechnerverschieben, aber auch Daten aus anderen Quellen in MySQL importie-ren.

��� �������� ���������

Schließlich befassen wir uns mit den Programmierschnittstellen vonMySQL. Man kann aus den verschiedensten Programmiersprachen her-aus auf den Server zugreifen, aber auch sprachunabhängige Schnittstel-len wie ODBC nutzen.

5.2 Admin-Tools zu MySQLMit MySQL werden schon viele Tools direkt mitgeliefert. Diese sollendem Administrator die Arbeit mit dem MySQL-Server erleichtern. Dasam häufigsten verwendete dürfte natürlich mysql sein. Wir haben dieganze Zeit damit gearbeitet und werden hier noch ein paar ergänzendeMöglichkeiten erwähnen.

Weiterhin stehen für den Zugriff auf den MySQL-Server weitere Toolsbereit. Im Folgenden werden wir mysqladmin und mysqlshow bespre-chen.

Die Tools mysqldump und mysqlimport werden wir detaillierter in Kapitel5.4 behandeln, da sie zum Im- und Exportieren von Daten genutzt wer-den. mysqlhotcopy dient zum Sichern von Daten und wird im nächstenKapitel besprochen, ebenso wie myisamchk und mysqlcheck, welche zumPrüfen und Reparieren von Tabellen und Datenbanken dienen.

5.2.1 mysql

mysql ist das Tool, mit dem man vermutlich außerhalb des eigentlichenProgramms für die Endbenutzer am häufigsten arbeiten wird. Wir ha-ben schon sehr viel damit gemacht und werden hier nur noch auf einigeweitere Punkte eingehen, die das Leben einfacher machen können.

TEE / NOTEE

TEE Mit dem Befehl TEE kann man dafür sorgen, dass die Ausgabe neben demBildschirm gleichzeitig auch in eine Datei geschrieben wird. Als Parame-ter gibt man den Pfad und Namen einer Datei an. Diese Datei wird alsZiel genommen, um die Ein- und Ausgaben, die man auch auf dem Bild-schirm sieht, abzuspeichern. Dabei wird immer an das Ende der Dateiangehängt, so dass auch nach einem Neustart die alten Daten nicht ver-loren sind. Mit NOTEE beendet man das Protokollieren. Ein Beispiel füreine solche Log-Datei wäre:

Logging to file 'd:/temp/test.txt'mysql> SELECT * FROM raum;

��������� � ����� ���

+---------+-----------+-------+----------+| raum_id | raum_name | etage | personen |+---------+-----------+-------+----------+| 1 | A5.33 | 5 | 4 || 2 | B2.02 | 2 | 20 || 3 | C4.16 | 4 | 11 || 4 | A5.21 | 5 | 6 || 5 | A5.23 | 5 | 6 |+---------+-----------+-------+----------+5 rows in set (0.00 sec)

mysql> UPDATE schueler SET nachname = 'Meier' WHERE schueler_id = 11;Query OK, 0 rows affected (0.02 sec)Rows matched: 0 Changed: 0 Warnings: 0

mysql> NOTEE

Direkt vor dem „Logging to file…“ wurde der Befehl TEE d:/temp/test.txtaufgerufen (übrigens wieder ohne Semikolon). Ruft man nach einemNOTEE den Befehl TEE erneut auf, ohne aber einen Dateinamen angegebenzu haben, wird in die letzte Datei protokolliert, die verwendet wurde.

STATUS

STATUSMit diesem Befehl kann man sich Statusinformationen über den Server,den Client und die Verbindung anzeigen lassen. Auch er wird ohne Se-mikolon aufgerufen:

mysql> STATUS--------------D:\mysql\bin\mysql.exe Ver 11.18 Distrib 3.23.51, for Win95/Win98 (i32)

Connection id: 1Current database: musikschuleCurrent user: ODBC@localhostServer version: 3.23.51-ntProtocol version: 10Connection: localhost via TCP/IPClient characterset: german1Server characterset: german1TCP port: 3306Uptime: 12 hours 37 min 35 sec

Threads: 1 Questions: 66 Slow queries: 0 Opens: 24 Flush tables: 1 Open tables: 2 Queries per second avg: 0.001--------------

��� �������� ���������

Zunächst folgt eine Angabe des aktuellen Programms mit seinem Standund der Distribution.

Die Connection id gibt dann die Kennung an, über die das Client-Pro-gramm aktuell mit dem Server verbunden ist. Sie kann genutzt werden,um unter anderem mit mysqladmin Clients „abzuschießen“, die sichaufgehängt haben oder anderen Ärger bereiten.

Die Current database gibt natürlich an, welche Datenbank gerade ausge-wählt ist, und der Current user zeigt, wer man gerade ist.

Server version und Protocol version geben Informationen über den Standdes Servers und die Protokollversion. Connection sagt, wie man mit demServer verbunden ist, Client characterset und Server characterset informie-ren über den genutzten Zeichensatz, der TCP port steht für den Port,über den der MySQL-Server kommuniziert und die Uptime steht für dieLaufzeit, die der Server schon ohne Unterbrechung läuft. Am Ende fin-den sich noch ein paar Informationen zur Statistik.

Umleiten der Ein- und Ausgabe

Redirection Hat man mehrere Befehle in einer festen Reihenfolge zu verarbeiten,kann man diese in einer Textdatei speichern (gerne mit der Endung .sql)und entweder in mysql mit dem Befehl SOURCE ausführen lassen (wieschon weiter oben behandelt), oder direkt beim Aufruf per Umleitungder Eingabe mitgeben. Speichern wir zum Beispiel die folgenden Befehlein einer Datei namens mycommand.sql:

SHOW DATABASES;USE musikschule;SELECT * FROM raum;SELECT * FROM instrument;

Wenn man nun mysql diese Datei als Eingabe mitgibt, erhält man fol-gende Ausgabe:

prompt>mysql < mycommands.sqlDatabasemusikschulemysqltestraum_id raum_name etage personen1 A5.33 5 42 B2.02 2 203 C4.16 4 114 A5.21 5 65 A5.23 5 6

��������� � ����� ���

instrument_id instr_name instr_gruppe1 Querflöte Holzbläser2 Klarinette Holzbläser3 Violine Streicher4 Viola Streicher5 Posaune Blechbläser6 Trompete Blechbläser7 Klavier Tasten8 Keyboard Tasten

Wie man sieht, werden keine weiteren Informationen neben den Datenselber und den Spaltenüberschriften mitgegeben. Getrennt werden dieDaten mit dem Tabulatorzeichen. Dieses Ausgabeformat wird dann ver-wendet, wenn MySQL im sogenannten Batch-Modus läuft. Das Verhal-ten lässt sich auch erzwingen oder verhindern, dazu benötigt man dieim nächsten Abschnitt beschriebenen Kommandozeilen-Parameter.

Die Ausgabe lässt sich natürlich auch direkt in eine Datei umleiten. Daserreicht man mit folgendem Aufruf:

prompt>mysql < mycommands.sql > myresult.txt

Kommandozeilen-Parameter

Es gibt (neben -h, -u und -p) einige Parameter, die man beim Starten vonmysql angeben kann und die in manchen Situationen helfen können.Fünf möchte ich hier aufführen, es gibt aber noch diverse mehr.

• -? oder --help

Dieser Parameter dürfte der wichtigste sein… Er gibt die möglichenKommandozeilen-Parameter aus und beendet das Programm dannwieder. Das Ergebnis sehen Sie hier:

prompt>mysql -?mysql Ver 11.18 Distrib 3.23.51, for Win95/Win98 (i32)Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult ABThis software comes with ABSOLUTELY NO WARRANTY. This is free software,and you are welcome to modify and redistribute it under the GPL license

Usage: mysql [OPTIONS] [database]

-?, --help Display this help and exit. -A, --no-auto-rehash No automatic rehashing. One has to use 'rehash' to get table and field completion. This gives a quicker start of mysql and disables rehashing on reconnect. -B, --batch Print results with a tab as separator, each row on a new line. Doesn't use history file.

��� �������� ���������

--character-sets-dir=... Directory where character sets are located. -C, --compress Use compression in server/client protocol. -D, --database=.. Database to use. --default-character-set=... Set the default character set. -e, --execute=... Execute command and quit. (Output like with --batch) -E, --vertical Print the output of a query (rows) vertically. -f, --force Continue even if we get an sql error. -g, --no-named-commands Named commands are disabled. Use \* form only, or use named commands only in the beginning of a line ending with a semicolon (;) Since version 10.9 the client now starts with this option ENABLED by default! Disable with '-G'. Long format commands still work from the first line. -G, --enable-named-commands Named commands are enabled. Opposite to -g. -i, --ignore-spaces Ignore spaces after function names. -h, --host=... Connect to host. -H, --html Produce HTML output. --local-infile=[1|0] Enable/disable LOAD DATA LOCAL INFILE -L, --skip-line-numbers Don't write line number for errors. --no-tee Disable outfile. See interactive help (\h) also. -n, --unbuffered Flush buffer after each query. -N, --skip-column-names Don't write column names in results. -O, --set-variable var=option Give a variable an value. --help lists variables. -o, --one-database Only update the default database. This is useful for skipping updates to other database in the update log. -p[password], --password[=...] Password to use when connecting to server If password is not given it's asked from the tty. -W, --pipe Use named pipes to connect to server

-P, --port=... Port number to use for connection. -q, --quick Don't cache result, print it row by row. This may slow down the server if the output is suspended. Doesn't use history file. -r, --raw Write fields without conversion. Used with --batch

��������� � ����� ���

-s, --silent Be more silent. -S --socket=... Socket file to use for connection. -t, --table Output in table format. -T, --debug-info Print some debug info at exit. --tee=... Append everything into outfile. See interactive help (\h) also. Does not work in batch mode. -u, --user=# User for login if not current user. -U, --safe-updates[=#], --i-am-a-dummy[=#] Only allow UPDATE and DELETE that uses keys. -v, --verbose Write more. (-v -v -v gives the table output format) -V, --version Output version information and exit. -w, --wait Wait and retry if connection is down.

Default options are read from the following files in the given order:D:\WINNT\my.ini C:\my.cnfThe following groups are read: mysql clientThe following options may be given as the first argument:--print-defaults Print the program argument list and exit--no-defaults Don't read default options from any options file--defaults-file=# Only read default options from the given file #--defaults-extra-file=# Read this file after the global files are read

Possible variables for option --set-variable (-O) are:connect_timeout current value: 0max_allowed_packet current value: 16777216net_buffer_length current value: 16384select_limit current value: 1000max_join_size current value: 1000000

• -e oder --execute

Mit diesem Parameter kann man einzelne Befehle ausführen lassen.Das Programm wird dann direkt danach beendet. Der Befehl muss inAnführungszeichen stehen. Damit kann man sich einzelne Tabellen-inhalte oder andere Informationen ausgeben lassen, ohne erst auf-wändiger eine Befehlsdatei zu erstellen. Ein Beispiel dafür ist:

prompt>mysql -e "SELECT * FROM raum;" musikschule+---------+-----------+-------+----------+| raum_id | raum_name | etage | personen |+---------+-----------+-------+----------+| 1 | A5.33 | 5 | 4 || 2 | B2.02 | 2 | 20 || 3 | C4.16 | 4 | 11 || 4 | A5.21 | 5 | 6 || 5 | A5.23 | 5 | 6 |+---------+-----------+-------+----------+

��� �������� ���������

Nutzt man die lange Version des Parameters, sieht das Ganze so aus:

prompt>mysql --execute="SHOW TABLES;" musikschule+-----------------------+| Tables_in_musikschule |+-----------------------+| ausleihe || fulltexttest || instrument || lehrer || leihinstrument || orchester || orchester_tn || raum || schueler || unterricht || unterricht_tn || warteliste |+-----------------------+

• -B oder --batch

Mit dieser Option kann man dafür sorgen, dass die Ausgabe wie beiumgeleiteter Eingabe geschieht: nur mit Tabulatoren getrennte Wer-te und keine Rahmen um die Tabellen herum. Das kann nützlichsein, wenn man mysql mit dem Parameter -e aufruft (was ansonstenzu einer „normalen“ Anzeige führt):

prompt>mysql -B -e "SELECT * FROM instrument;" musikschuleinstrument_id instr_name instr_gruppe1 Querflöte Holzbläser2 Klarinette Holzbläser3 Violine Streicher4 Viola Streicher5 Posaune Blechbläser6 Trompete Blechbläser7 Klavier Tasten8 Keyboard Tasten

Natürlich kann man mysql mit diesem Parameter auch im interakti-ven Modus starten, nur hat man dann keinerlei Anzeige und Struk-turierung neben den eigentlichen Daten. Im folgenden Beispiel sindzur Verdeutlichung die eingegebenen Zeichen kursiv gedruckt:

��������� � ����� ���

prompt>mysql -B musikschuleSELECT * FROM raum;raum_id raum_name etage personen1 A5.33 5 42 B2.02 2 203 C4.16 4 114 A5.21 5 65 A5.23 5 6SHOW FIELDS FROM raum;Field Type Null Key Default Extraraum_id smallint(5) unsigned PRI NULL auto_incrementraum_name varchar(10)etage char(3) YES MUL NULLpersonen mediumint(8) unsigned YES 1EXIT

prompt>

Wie man sieht, ist dies in den meisten Fällen nicht wirklich sinnvoll.Das Gegenstück dazu ist der Parameter -t.

• -H oder --html

Diese Option sorgt dafür, dass die Daten anstatt mit |, + und - alsHTML-Tabellen formatiert ausgegeben werden. Es wird eine Tabellemit einer Rahmenstärke von 1 erzeugt, die Spaltennamen sind als<TH>...</TH> formatiert, die Werte selber mit <TD>...</TD> umschlos-sen. Diese Option kann man dann verwenden, wenn man die Tabel-leninhalte schnell und einfach in einer HTML-Datei ausgebenmöchte. Allerdings ist zu beachten, dass Umlaute und andere Son-derzeichen nicht gesondert behandelt werden. Möchte man also aufNummer sicher gehen, sollte man in der HTML-Datei, die drumher-um noch entstehen muss, den entsprechenden Zeichensatz angeben.Ein Beispiel für die Ausgabe zusammen mit -e wäre das folgende:

D:\TEMP>mysql -H -e "SELECT * FROM instrument;" musikschule<TABLE BORDER=1><TR><TH>instrument_id</TH><TH>instr_name</TH><TH>instr_gruppe</TH></TR><TR><TD>1</TD><TD>Querflöte</TD><TD>Holzbläser</TD></TR><TR><TD>2</TD><TD>Klarinette</TD><TD>Holzbläser</TD></TR><TR><TD>3</TD><TD>Violine</TD><TD>Streicher</TD></TR><TR><TD>4</TD><TD>Viola</TD><TD>Streicher</TD></TR><TR><TD>5</TD><TD>Posaune</TD><TD>Blechbläser</TD></TR><TR><TD>6</TD><TD>Trompete</TD><TD>Blechbläser</TD></TR><TR><TD>7</TD><TD>Klavier</TD><TD>Tasten</TD></TR><TR><TD>8</TD><TD>Keyboard</TD><TD>Tasten</TD></TR></TABLE>

Sehr gut lesbar, oder? Aber für eine Web-Seite genau das Richtige(vielleicht abgesehen von den fehlenden Zeilenumbrüchen, die aberauch nur den Quelltext lesbarer machen). Ein etwas komplexeres Bei-

��� �������� ���������

spiel wäre das folgende, wobei wir die folgende SQL-Anfrage in einerDatei namens unterricht.sql speichern:

SELECT CONCAT(LEFT(vorname, 1), '. ', nachname) AS Lehrer, instr_name AS "Instr.", raum_name AS Raum, CASE wochentag WHEN 0 THEN 'Mo' WHEN 1 THEN 'Di' WHEN 2 THEN 'Mi' WHEN 3 THEN 'Do' WHEN 4 THEN 'Fr' WHEN 5 THEN 'Sa' WHEN 6 THEN 'So' END AS Tag, CONCAT(TIME_FORMAT(uhrzeit_von, '%H:%i'), '-', TIME_FORMAT(uhrzeit_bis, '%H:%i')) AS Zeit, kosten AS Preis, IF(einzel, 'X', ' ') AS EinzelFROM unterricht AS u, lehrer AS l, instrument AS i, raum AS rWHERE u.lehrer_id = l.lehrer_id AND u.instrument_id = i.instrument_id AND u.raum_id = r.raum_id;

Mit diesem Aufruf erzeugt man nun eine HTML-Tabelle in unterricht_tab.html:

prompt>mysql -H musikschule < unterricht.sql > unterricht_tab.html

Diese Datei kann man nun als Grundlage für eine vollständigeHTML-Datei nutzen. Klemmt man noch die notwendigsten Codesdrumherum (<HTML><BODY> am Anfang und </BODY></HTML> am Ende), er-hält man eine Ausgabe wie in Abbildung 5.1.

Abbildung 5.1: Ausgabe einer Tabelle im HTML-Format

Sie finden die Datei unterricht.sql auch auf der beiliegenden CD-ROMim Verzeichnis Beispiel.

Die ergänzte Ergebnisdatei unterricht_tab.html ist ebenfalls auf der CD-ROM im Verzeichnis Beispiel zu finden.

��������� � ����� ���

Diese Ausgabe kann man also als Grundlage für die Anzeige von Datenauf Web-Seiten nutzen, allerdings sind andere Wege (zum Beispielüber PHP, siehe weiter unten) deutlich flexibler. Man kann übrigensauch diesen Parameter im interaktiven Modus nutzen, allerdings sinddie Ausgaben dann nicht sehr leserlich (wie man oben gesehen hat)…

• -N oder --skip-column-names

Mit -N kann man die Ausgabe der Spaltennamen unterdrücken. Dieskann dann nützlich sein, wenn man die Daten in Dateien speichernmöchte und die Spaltennamen dabei eher hinderlich sind (man soll-te dann ja sowieso wissen, wie die Spaltenanordnung ist). Ein Bei-spiel dafür ist:

prompt>mysql -N -B -e "SELECT * FROM raum;" musikschule1 A5.33 5 42 B2.02 2 203 C4.16 4 114 A5.21 5 65 A5.23 5 6

• -t oder --table

Mit dieser Option kann man sich auch dann die Daten in der übli-chen Tabellenform (mit Rahmen) ausgeben lassen, wenn man sicheigentlich im Batch-Modus befindet (zum Beispiel bei Verwendungder Ein- und Ausgabeumleitung):

prompt>mysql musikschule < unterricht.sqlLehrer Instr. Raum Tag Zeit Preis EinzelG. Mosler Posaune A5.23 Mi 19:15-20:00 25.00H. Knarer Querflöte C4.16 Fr 17:00-17:45 30.00 XK. Hansen Violine B2.02 Do 15:35-16:20 20.00K. Hansen Viola B2.02 Do 16:30-17:15 20.00P. Ottbein Klavier A5.33 Sa 10:00-11:00 35.00 X

prompt>mysql -t musikschule < unterricht.sql+------------+-----------+-------+------+-------------+-------+--------+| Lehrer | Instr. | Raum | Tag | Zeit | Preis | Einzel |+------------+-----------+-------+------+-------------+-------+--------+| G. Mosler | Posaune | A5.23 | Mi | 19:15-20:00 | 25.00 | || H. Knarer | Querflöte | C4.16 | Fr | 17:00-17:45 | 30.00 | X || K. Hansen | Violine | B2.02 | Do | 15:35-16:20 | 20.00 | || K. Hansen | Viola | B2.02 | Do | 16:30-17:15 | 20.00 | || P. Ottbein | Klavier | A5.33 | Sa | 10:00-11:00 | 35.00 | X |+------------+-----------+-------+------+-------------+-------+--------+

��� ����������� �������

5.2.2 mysqladmin

mysqladmin Mit mysqladmin kann man viele Verwaltungsaufgaben einfacher erledi-gen als mit mysql. Dabei nutzt man die folgende Syntax:

mysqladmin [options] command command ...

Die möglichen Optionen ähneln denen von mysql, in Tabelle 5.1 gibt eszu jeder eine kurze Beschreibung.

Tabelle 5.1: Optionen für mysqladmin

Kurze Version Lange Version Beschreibung

-# --debug=... Ausgabe von Debug-Informationen

-f --force Beim Löschen von Datenbanken nicht nach-fragen. Werden mehrere Befehle angegeben, werden die folgenden auch bei einem Fehler des aktuellen Befehls abgearbeitet.

-? --help Ausgabe der Hilfe

--character-sets-dir=...

Angabe des Verzeichnisses mit den Zeichen-satzinformationen

-C --compress Komprimierung bei der Kommunikation zwi-schen Client und Server nutzen

-h --host=... Angabe des Hosts

-p --password[=...] Angabe des Kennworts oder Nachfragen, falls nicht angegeben

-W --pipe Verwendung von Named Pipes bei der Ver-bindung zum Server

-P --port=... Angabe des Ports für die Verbindung

-i --sleep=... wiederholtes Ausführen der Befehle mit einer Pause der angegebenen Zeit (in Sekunden)

-r --relative zeigt bei Nutzung von -i nur den Unter-schied zur vorigen Ausführung (funktioniert nur mit extended-status, siehe unten).

-E --vertical Ausgabe wie bei -r, allerdings in vertikaler Richtung

-s --silent Keine Fehlermeldung, wenn es Verbindungs-probleme zum Server gibt.

-S --socket=... Angabe der Socket-Datei für die Verbindung

-u --user=... Angabe des Benutzers, mit dem sich das Programm anmelden soll

-v --verbose Ausgabe von mehr Informationen

-V --version Nur Ausgabe der Versionsnummer und Beenden des Programms.

-w --wait=... Falls die Verbindung nicht möglich ist, die angegebene Anzahl an Versuchen wieder-holen, anstatt direkt abzubrechen.

��������� � ����� ���

Bei den Befehlen gibt es insgesamt 21 Möglichkeiten. Allen ist gemein,dass man sie soweit abkürzen kann, wie sie noch eindeutig sind. createdb_name zum Beispiel kann man mit c db_name abkürzen, status hingegenmuss mindestens stat heißen.

• create db_name

Dieser Befehl legt eine Datenbank mit dem Namen db_name an. Er ent-spricht dem Befehl CREATE DATABASE db_name in mysql.

• drop db_name

Mit diesem Befehl wird eine Datenbank wieder gelöscht. Dabei gibtes eine Kontrollabfrage (sofern man nicht die Option -f nutzt), da da-nach unwiderruflich auch alle Tabellen und Daten dieser Datenbankgelöscht sind:

prompt>mysqladmin create mytest

prompt>mysqladmin drop mytestDropping the database is potentially a very bad thing to do.Any data stored in the database will be destroyed.

Do you really want to drop the 'mytest' database [y/N] yDatabase "mytest" dropped

• extended-status

Dieser Befehl gibt eine Statusübersicht aus, die man unter mysql mitSHOW STATUS erhalten würde. Nutzt man den Parameter -r zusammenmit -i werden beim ersten Mal die „normalen“ Werte ausgegeben,danach aber nur noch die Differenzen zur Vorversion. Dies kannman nutzen, wenn man nur die Veränderungen der Werte beobach-ten möchte. Der folgende Befehl gibt die Statusliste alle 60 Sekundenaus, zeigt dabei aber (nach dem ersten Mal) nur die Differenzen an:

prompt>mysqladmin -i 60 -r extended-status

• flush-hosts

leert den Host-Cache. Dies kann nützlich sein, wenn sich die IP-Adresse eines Hosts geändert hat oder wenn ein Host geblockt ist.Unter mysql kann man dafür den Befehl FLUSH HOSTS nutzen.

• flush-logs

schließt alle Log-Dateien und öffnet sie neu. Damit ist sichergestellt,dass alle Änderungen auch auf Festplatte abgelegt sind. Dies ent-spricht dem Befehl FLUSH LOGS unter mysql.

��� �������� ���������

• flush-tables

schließt alle offenen Tabellen und sorgt dafür, dass alle Tabellen, diegerade in Benutzung sind, möglichst bald geschlossen werden. Diesentspricht dem Befehl FLUSH TABLES unter mysql.

• flush-privileges

lädt die Berechtigungen erneut aus den entsprechenden Tabellen.Dies entspricht dem Befehl FLUSH PRIVILEGES unter mysql.

• kill id, id, ...

Mit diesem Befehl kann man Threads im MySQL-Server beenden, dieeinen Client bedienen. Die entsprechende ID wird beim Anmeldenmit mysql ausgegeben, kann aber auch mit SHOW PROCESSLIST ermitteltwerden. Ein Thread wird normalerweise nicht sofort beendet, son-dern erhält nur eine Markierung. Diese wird erst in bestimmtenSituationen berücksichtigt.

• password new_pwd

ändert das bestehende Kennwort ab und setzt es auf new_pwd.

• ping

prüft, ob der MySQL-Server erreichbar ist und reagiert:

prompt>mysqladmin pingmysqld is alive

• processlist

gibt die aktuelle Prozessliste aus. Dies kann auch mit SHOW PROCESSLISTin mysql erreicht werden. Wie in Abbildung 5.2 zu sehen, erhält manneben den angemeldeten Benutzern auch die gerade verwendete Da-tenbank und eine Information über die aktuelle Tätigkeit. Auch derAufruf von mysqladmin ist hier (indirekt) vermerkt, er wird auf einSHOW PROCESSLIST abgebildet.

Abbildung 5.2: Ausgabe von mysqladmin processlist

• reload

lädt die Berechtigungstabellen erneut. Dies ist identisch zu flush-privileges.

Prompt>mysqladmin processlist+----+------+-----------+-------------+---------+------+-------+------------------+| Id | User | Host | db | Command | Time | State | Info |+----+------+-----------+-------------+---------+------+-------+------------------+| 8 | ODBC | localhost | musikschule | Sleep | 1 | | || 10 | ODBC | localhost | | Query | 0 | | show processlist |+----+------+-----------+-------------+---------+------+-------+------------------+

��������� � ����� ���

• refresh

schließt alle Tabellen und Log-Dateien und öffnet diese erneut.

• shutdown

Dieser Befehl fährt den Server herunter. Somit lässt sich der Serverauch „aus der Ferne“ beenden, ohne, dass man sich direkt auf demRechner anmelden muss.

• status

Mit diesem Befehl kann man sich eine kurze Status-Information aus-geben lassen:

prompt>mysqladmin statusUptime: 35750 Threads: 2 Questions: 19 Slow queries: 0 Opens: 7 Flush tables: 1 Open tables: 0 Queries per second avg: 0.001

• start-slave

startet einen Slave in einer verteilten Umgebung

• stop-slave

beendet einen Slave in einer verteilten Umgebung

• variables

Dieser Befehl gibt die aktuellen Variablen des MySQL-Servers aus undentspricht einem SHOW VARIABLES unter mysql.

• version

Mit diesem Befehl kann man sich – anders als bei der Option -V –nicht nur die Version von mysqladmin ausgeben lassen, sondern auchdie Versionsinfo des MySQL-Servers auslesen. Zudem werden auchdie Informationen angezeigt, die man mit status erhält:

prompt>mysqladmin versionmysqladmin Ver 8.23 Distrib 3.23.51, for Win95/Win98 on i32Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult ABThis software comes with ABSOLUTELY NO WARRANTY. This is free software,and you are welcome to modify and redistribute it under the GPL license

Server version 3.23.51-ntProtocol version 10Connection localhost via TCP/IPTCP port 3306Uptime: 9 hours 59 min 36 sec

Threads: 2 Questions: 26 Slow queries: 0 Opens: 7 Flush tables: 1 Open tables: 0 Queries per second avg: 0.001

��� �������� ���������

5.2.3 mysqlshow

mysqlshow Das Programm mysqlshow dient als einfaches Interface zum Anzeigenvon Strukturdaten. Es lassen sich Datenbanken, Tabellen und Spaltenausgeben. Alle Informationen erhält man auch über den SHOW-Befehl inmysql. Der Aufruf sieht wie folgt aus:

mysqlshow [OPTIONS] [database [table [column]]]

Als Optionen stehen die (zum Teil bekannten) Varianten aus Tabelle 5.2zur Verfügung.

Tabelle 5.2: Optionen für mysqlshow

Wird keine Datenbank angegeben, werden alle verfügbaren Datenban-ken angezeigt:

prompt>mysqlshow+-------------+| Databases |+-------------+| musikschule || mysql || test |+-------------+

Kurze Version Lange Version Beschreibung

-# --debug=... Ausgabe von Debug-Informationen

-? --help Ausgabe der Hilfe

-c --character-sets-dir=...

Angabe des Verzeichnisses mit den Zeichensatz-informationen

-C --compress Komprimierung bei der Kommunikation zwischen Client und Server nutzen

-h --host=... Angabe des Hosts

-i –status Ausgabe von zusätzlichen Tabelleninformationen

-k --keys Angabe der Schlüssel für die Tabelle

-p --password[=...] Angabe des Kennworts oder Nachfragen, falls nicht angegeben

-W --pipe Verwendung von Named Pipes bei der Verbin-dung zum Server

-P --port=... Angabe des Ports für die Verbindung

-S --socket=... Angabe der Socket-Datei für die Verbindung

-u --user=... Angabe des Benutzers, mit dem sich das Programm anmelden soll

-v --verbose Ausgabe von mehr Informationen

-V --version nur Ausgabe der Versionsnummer und Beenden des Programms

��������� � ����� ���

Mit Angabe einer Datenbank werden die dort enthaltenen Tabellen an-gegeben:

prompt>mysqlshow musikschuleDatabase: musikschule+----------------+| Tables |+----------------+| ausleihe || fulltexttest || instrument || lehrer || leihinstrument || orchester || orchester_tn || raum || schueler || unterricht || unterricht_tn || warteliste |+----------------+

Mit dem zusätzlichen Parameter -i erhält man eine sehr umfangreicheAusgabe wie bei SHOW TABLE STATUS, siehe auch Abbildung 5.3.

Abbildung 5.3: Ausgabe von mysqlshow -i musikschule

Gibt man Datenbank und Tabelle an, werden Informationen über dieSpalten der Tabelle ausgegeben (siehe Abbildung 5.4). Diese Ausgabe er-reicht man auch mit SHOW FULL COLUMNS FROM ...

prompt>mysqlshow -i musikschuleDatabase: musikschule+----------------+--------+------------+------+----------------+-------------+-----------------+--------------+-----------+-| Name | Type | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free |+----------------+--------+------------+------+----------------+-------------+-----------------+--------------+-----------+-| ausleihe | MyISAM | Fixed | 0 | 0 | 0 | 81604378623 | 1024 | 0 || fulltexttest | MyISAM | Dynamic | 16 | 227 | 3632 | 4294967295 | 11264 | 0 || instrument | MyISAM | Dynamic | 8 | 29 | 236 | 4294967295 | 2048 | 0 || lehrer | MyISAM | Dynamic | 4 | 124 | 496 | 4294967295 | 2048 | 0 || leihinstrument | MyISAM | Dynamic | 4 | 34 | 136 | 4294967295 | 2048 | 0 || orchester | MyISAM | Dynamic | 0 | 0 | 0 | 4294967295 | 1024 | 0 || orchester_tn | MyISAM | Fixed | 0 | 0 | 0 | 73014444031 | 1024 | 0 || raum | MyISAM | Dynamic | 5 | 20 | 100 | 4294967295 | 3072 | 0 || schueler | MyISAM | Dynamic | 4 | 117 | 468 | 4294967295 | 4096 | 0 || unterricht | MyISAM | Fixed | 5 | 31 | 155 | 133143986175 | 2048 | 0 || unterricht_tn | MyISAM | Fixed | 4 | 13 | 52 | 55834574847 | 2048 | 0 || warteliste | MyISAM | Fixed | 0 | 0 | 0 | 68719476735 | 1024 | 0 |+----------------+--------+------------+------+----------------+-------------+-----------------+--------------+-----------+-

+----------------+---------------------+---------------------+---------------------+----------------+---------+| Auto_increment | Create_time | Update_time | Check_time | Create_options | Comment |+----------------+---------------------+---------------------+---------------------+----------------+---------+| 1 | 2002-09-19 21:49:54 | 2002-09-19 21:49:54 | | | || | 2002-10-03 14:53:01 | 2002-10-03 15:04:05 | | | || 9 | 2002-09-19 21:49:54 | 2002-09-19 22:13:37 | | | || 5 | 2002-09-19 21:49:54 | 2002-09-21 17:00:18 | | | || 5 | 2002-09-19 21:49:54 | 2002-09-19 22:13:37 | | | || 1 | 2002-09-19 21:49:54 | 2002-09-19 21:49:54 | | | || 1 | 2002-09-19 21:49:54 | 2002-09-19 21:49:54 | | | || 6 | 2002-09-24 21:38:22 | 2002-09-24 21:38:22 | 2002-09-24 21:38:22 | | || 5 | 2002-09-28 21:50:55 | 2002-09-28 21:50:55 | 2002-10-03 13:57:10 | | || 6 | 2002-09-19 21:49:54 | 2002-09-19 22:13:37 | | | || 5 | 2002-09-19 21:49:54 | 2002-09-19 22:13:37 | | | || 1 | 2002-09-19 21:49:54 | 2002-09-19 21:49:54 | | | |

+----------------+---------------------+---------------------+---------------------+----------------+---------+

Fortsetzung

��� �������� ���������

Abbildung 5.4: Ausgabe von mysqlshow musikschule raum

Nutzt man zusätzlich den Parameter -k, werden auch noch Informatio-nen über die Schlüssel der Tabelle ausgegeben, wie in Abbildung 5.5 zusehen. Dies ist eine Kombination von SHOW FULL COLUMNS FROM ... mit SHOWINDEX FROM ...

Abbildung 5.5: Ausgabe von mysqlshow -k musikschule raum

Gibt man auf einer der beschriebenen Ebenen einen Platzhalter an (wo-bei hier auch die Betriebssystem-Platzhalter * und ? zugelassen sind),werden diese wie ein LIKE ... umgesetzt:

prompt>mysqlshow musikschule u*Database: musikschule Wildcard: u%+---------------+| Tables |+---------------+| unterricht || unterricht_tn |+---------------+

Dies kann allerdings zu Problemen führen, wenn man zum Beispiel dieSpalten der Tabelle unterricht_tn angezeigt bekommen möchte:

prompt>mysqlshow musikschule unterricht_tnDatabase: musikschule Wildcard: unterricht_tn+---------------+| Tables |+---------------+| unterricht_tn |+---------------+

prompt>mysqlshow musikschule raumDatabase: musikschule Table: raum Rows: 5+-----------+-----------------------+------+-----+---------+----------------+---------------------------------+| Field | Type | Null | Key | Default | Extra | Privileges |+-----------+-----------------------+------+-----+---------+----------------+---------------------------------+| raum_id | smallint(5) unsigned | | PRI | | auto_increment | select,insert,update,references || raum_name | varchar(10) | | | | | select,insert,update,references || etage | char(3) | YES | MUL | | | select,insert,update,references || personen | mediumint(8) unsigned | YES | | 1 | | select,insert,update,references |+-----------+-----------------------+------+-----+---------+----------------+---------------------------------+

prompt>mysqlshow -k musikschule raumDatabase: musikschule Table: raum Rows: 5+-----------+-----------------------+------+-----+---------+----------------+---------------------------------+| Field | Type | Null | Key | Default | Extra | Privileges |+-----------+-----------------------+------+-----+---------+----------------+---------------------------------+| raum_id | smallint(5) unsigned | | PRI | | auto_increment | select,insert,update,references || raum_name | varchar(10) | | | | | select,insert,update,references || etage | char(3) | YES | MUL | | | select,insert,update,references || personen | mediumint(8) unsigned | YES | | 1 | | select,insert,update,references |+-----------+-----------------------+------+-----+---------+----------------+---------------------------------++-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+---------+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Comment |+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+---------+| raum | 0 | PRIMARY | 1 | raum_id | A | 5 | | | || raum | 1 | idx_etage | 1 | etage | A | 2 | | | |+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+---------+

��������� ��

Leider interpretiert mysqlshow die letzte Angabe als Angabe eines Filtersmit Platzhaltern (wegen des Unterstrichs) und gibt nur alle Tabellen aus,die diesem Filter entsprechen. Umgehen kann man das Problem, indemman in solch einem Fall als zusätzlichen Wert noch ein einzelnes Pro-zentzeichen anfügt:

prompt>mysqlshow musikschule unterricht_tn %Database: musikschule Table: unterricht_tn Rows: 4 Wildcard: %+------------------+------------------+------+-----+---------+-------...| Field | Type | Null | Key | Default | Extra ... +------------------+------------------+------+-----+---------+-------...| unterricht_tn_id | int(10) unsigned | | PRI | || unterricht_id | int(10) unsigned | | | 0 || schueler_id | int(10) unsigned | | | 0 |+------------------+------------------+------+-----+---------+-------...

Damit wird die Angabe der Tabelle nicht mehr als Filter interpretiert,sondern nur die Angabe für die Spalten. Bei denen bewirkt das % aber na-türlich, dass alle Spalten ausgegeben werden – also unser gewünschtesErgebnis.

5.3 phpMyAdminphpMyAdminphpMyAdmin ist kein direktes Programm. Es handelt sich vielmehr um

eine Sammlung von PHP-Seiten für einen Web-Server, mit denen sichMySQL-Server (auch aus der Ferne) administrieren und die Daten anzei-gen lassen. Er bietet unter einer übersichtlichen Oberfläche viele Funk-tionen, die bei der Verwaltung von MySQL nützlich sind.

Um phpMyAdmin nutzen zu können, benötigt man einen laufendenWeb-Server mit PHP-Unterstützung. Dabei kann es sich um den Apacheoder auch andere Server handeln. Der Server muss nicht mit demMySQL-Server identisch sein, solange er Zugriff auf ihn bietet. Zum Ein-richten eines Apache-Servers mit PHP-Unterstützung sei auf das spätereKapitel über LAMP/WAMP verwiesen.

Zur Installation lädt man sich am besten von http://www.phpmyadmin.netdie entsprechenden Dateien herunter.

Die Installationsdateien sind auch auf der beiliegenden CD-ROM ent-halten. Im Unterverzeichnis phpMyAdmin finden Sie die DateienphpMyAdmin-2.3.3pl1-php.zip für Windows und phpMyAdmin-2.3.3pl1-php.tar.gz.

��� �������� ���������

Es reicht, die Daten auszupacken (wobei auf die VerzeichnisstrukturRücksicht genommen werden sollte) und an eine Stelle zu kopieren, aufdie der Web-Server zugreifen kann. Unter Apache kann man die Datenzum Beispiel in das entsprechende Verzeichnis htdocs in ein Unterver-zeichnis phpMyAdmin kopieren. In der dort vorhandenen Datei con-fig.inc.php müssen nun noch einige wenige Eintragungen zum MySQL-Server und den Anmeldeparametern vorgenommen werden.

• $cfg['Servers'][$i]['host'] = 'hostname';

Hier wird der Name oder die IP-Adresse des MySQL-Servers eingetra-gen.

• $cfg['Servers'][$i]['port'] = 'portnumber';

Falls sich der Port, unter dem der MySQL-Server läuft, von der Stan-dardvorgabe 3306 unterscheidet, kann man hier die korrekte Port-nummer angeben. Ansonsten kann man den Eintrag leer lassen.

• $cfg['Servers'][$i]['user'] = 'username';

Angabe des Benutzernamens, mit dem sich phpMyAdmin am My-SQL-Server anmelden soll.

• $cfg['Servers'][$i]['password'] = 'password';

Angabe des Kennworts für den angegebenen Benutzer.

• $cfg['PmaAbsoluteUri'] = 'url_string';

Dies ist die absolute Angabe der URL für das phpMyAdmin-Verzeich-nis, zum Beispiel http://localhost/phpMyAdmin/. Dies ist nicht unbe-dingt erforderlich, da phpMyAdmin diesen Wert in den meistenFällen auch automatisch ermitteln kann. Lässt man diesen Eintragleer, gibt es auf der Startseite eine Warnung, die ausgeschaltet werdenkann, wenn es auch automatisch funktioniert.

Hat man die notwendigen Einstellungen vorgenommen, kann man dieStartseite aufrufen. Befindet man sich direkt auf dem Web-Server undhat phpMyAdmin unter htdocs im Verzeichnis phpMyAdmin installiert,kann man es mit der URL http://localhost/phpMyAdmin/index.php aufru-fen und erhält eine Webseite wie in Abbildung 5.6 zu sehen.

��������� ��

Abbildung 5.6: Startseite von phpMyAdmin

Auf der Startseite kann man verschiedene Dinge erreichen: Im linkenRahmen lässt sich eine Datenbank auswählen. In der linken Spalte desrechten Rahmens gibt es einige Links auf Verwaltungstasks, die unab-hängig von einer ausgewählten Datenbank sind (Erstellen einer neuenDatenbank, Informationen über den MySQL-Server oder die Benutzeranzeigen, MySQL-Server neu starten). Rechts lässt sich die Sprache vonphpMyAdmin auswählen und man erreicht die Dokumentation. Der ineckigen Klammern angegebene Link auf Dokumentation führt direkt aufdie entsprechenden Webseiten von http://www.mysql.com.

Klickt man zum Beispiel auf Statistiken über alle Datenbanken, erreichtman die in Abbildung 5.7 dargestellte Seite. Hier lassen sich (wie an fastallen anderen Stellen auch, wo eine tabellarische Übersicht gezeigtwird) die Spaltentitel anklicken. Dadurch wird die Anzeige nach der ent-sprechenden Spalte sortiert. Klickt man die Überschrift ein zweites Malan, wird die Tabelle nach dieser Spalte absteigend sortiert.

��� �������� ���������

Abbildung 5.7: Statistiken über alle Datenbanken in phpMyAdmin

Über die Auswahlbox im linken Rahmen gelangt man zu den einzelnenDatenbanken des Servers. Wählt man dort musikschule aus, gelangt manin eine Übersicht über diese Datenbank (siehe Abbildung 5.8). Mit ei-nem Klick auf eine der angezeigten Tabellennamen erhält man eineÜbersicht über die Struktur der Tabelle und einige statistische Daten(Abbildung 5.9). Von hier aus kann man eigentlich alles machen, wasmit einer Tabelle sinnvoll ist: Ändern der Struktur, Eintragen von Daten,Analysieren der Inhalte, Exportieren, Importieren, Umbenennen undvieles mehr. Klickt man auf den Reiter Anzeigen, erhält man den Inhaltder Tabelle (siehe Abbildung 5.10). Dabei sind ein paar Dinge, die auchan vielen anderen Stellen vorkommen, erwähnenswert:

• Es wird der zugrunde liegende SQL-Befehl mit Syntaxhighlightingangezeigt. Dieser Befehl lässt sich über Ändern anpassen. So kannman nebenbei etwas SQL lernen …

• Man kann angeben, wie viele Datensätze angezeigt werden sollen.Zudem lässt sich festlegen, ob die Datensätze untereinander oder ne-beneinander zu sehen sein sollen.

• Für die einzelnen Spalten lassen sich Aktionen durchführen (hier:Ändern, Löschen).

• Es gibt eine Druckansicht, die alle „Befehlslinks“ entfernt und einesinnvoll druckbare Übersicht darstellt (siehe Abbildung 5.11).

��������� ��

Abbildung 5.8: Übersicht über die Datenbank musikschule in phpMyAdmin

Abbildung 5.9: Übersicht über die Tabelle raum in phpMyAdmin

��� �������� ���������

Abbildung 5.10: Inhalt der Tabelle raum in phpMyAdmin

Abbildung 5.11: Druckansicht der Tabelle raum in phpMyAdmin

All diese Optionen sind auch an vielen anderen Stellen vorhanden, sodass man sich schnell zurechtfindet.

������ � ������ ��

phpMyAdmin ist ein sehr bequemes Hilfsmittel, um MySQL-Server und-Datenbanken zu administrieren. Fast alles, was man mit einem MySQL-Server machen kann, lässt sich auch über diese grafische Oberfläche er-reichen, zudem läuft es in (fast) jedem Browser und unter jedem Be-triebssystem und ist zudem wunderbar für die Fernwartung nutzbar.

5.4 Import und ExportManchmal ist es notwendig, Daten aus der Datenbank auszulesen, umsie für andere Programme zu verwenden. Oder man möchte Daten auseiner anderen Quelle einlesen, um sie in seinen eigenen Applikationenzu nutzen. Natürlich kann man dafür eigene Programme schreiben, dieSatz für Satz aus- bzw. einlesen und wegschreiben bzw. in die Datenbankeintragen. Es gibt allerdings einfachere und schnellere Methoden dafür.

Um Daten im Text-Format zu speichern, kann man SELECT ... INTO ...nutzen. Umgekehrt lassen sich mit LOAD DATA INFILE Daten mit hoher Ge-schwindigkeit aus einer Text-Datei in die Datenbank einlesen.

Das Programm mysqldump erzeugt SQL-Befehle, mit denen eine Daten-bank oder Tabelle in einem anderen Datenbank-Server wieder angelegtwerden kann. In die andere Richtung ist mysqlimport ein Tool, welchesdas Importieren von Text-Dateien wie mit LOAD DATA INFILE unterstützt.

5.4.1 SELECT ... INTO

SELECT INTOUm Daten in Textdateien zu exportieren, bietet sich der SELECT-Befehlan, dem als Erweiterung ein Ziel und verschiedene Format-Optionenmitgegeben werden. Die daraus erstellten Daten lassen sich auf ziemlichweitreichende Art anpassen, allerdings haben sie nie eine feste Breite(was man im Notfall allerdings mit einigen Tricks erreichen kann), son-dern sind immer durch Trennzeichen unterteilt.

Die Syntax wurde schon weiter oben im Kapitel über SELECT beschrieben,hier nochmals ein Überblick über die Optionen. Prinzipiell geht es umeinen normalen SELECT-Befehl, der beliebig kompliziert sein kann. Zu-sätzlich folgt nach Angabe der Spalten der Abschnitt INTO ... mit seinenOptionen:

SELECT ... INTO {OUTFILE | DUMPFILE} 'file_name' [FIELDS [TERMINATED BY 'fielddiv'] [[OPTIONALLY] ENCLOSED BY 'enc_char'] [ESCAPED BY 'esc_char']] [LINES TERMINATED BY 'linedev'] FROM ...

��� �������� ���������

Normalerweise wird man SELECT ... INTO OUTFILE ... nutzen. Dies ist die„normale“ Version und sorgt für das Speichern aller selektierten Datenmit den entsprechenden Formatierungsoptionen in der gewünschtenDatei. Verwendet man stattdessen SELECT ... INTO DUMPFILE ..., wird nurein Datensatz in die Datei geschrieben, und zwar ohne Feldbegrenzer,Spaltenüberschriften oder Ähnliches. Man kann dies zum Beispiel dazunutzen, den Inhalt eines Blob-Feldes direkt in einer Datei zu verewigen.Zu beachten ist, dass die Ergebnismenge auf jeden Fall nur einen Daten-satz enthalten darf, ansonsten funktioniert das Ganze nicht. Sichergehenkann man, indem man die Option LIMIT 1 am Ende des SELECT-Befehlsnutzt.

Als Dateiname wird file_name verwendet. Diese Datei darf aus Sicher-heitsgründen noch nicht existieren, sie wird auf jeden Fall neu angelegt.Ist sie schon vorhanden, schlägt der Aufruf fehl. Die Datei wird auf demServer erstellt. Möchte man die Daten auf dem Client speichern, mussman einen anderen Weg gehen: entweder über mysql -e "SELECT ..." >file_name mit den entsprechend formatierten Spalten (siehe auch Kapi-tel 5.2.1) oder über das Programm mysqldump (siehe Kapitel 5.4.3).

Gibt man nur den Dateinamen an, ohne weitere Formatierungsoptio-nen festzulegen, werden die Daten durch Tabulatorzeichen getrennt,ohne Anführungszeichen und mit dem Backslash (\) als Fluchtzeichenabgespeichert. Dabei wird pro Zeile ein Datensatz angelegt. Mit folgen-dem Befehl wird die Datei raum.txt auf dem Server erzeugt (sofern nichtschon vorhanden) und die Raum-Daten dort eingetragen:

SELECT * INTO OUTFILE 'raum.txt' FROM raum;

Die Datei raum.txt hat dann folgenden Inhalt (wobei zwischen den ein-zelnen Werten ein Tabulatorzeichen steht):

1 A5.33 5 42 B2.02 2 203 C4.16 4 114 A5.21 5 65 A5.23 5 6

Mit den folgenden Formatierungsoptionen lässt sich der Inhalt der Da-tei in einigen Dingen anpassen. FIELDS ändert das Ausgabeformat bezüg-lich der Feldwerte, während LINES das Verhalten beim Wechsel von ei-nem Datensatz auf den nächsten festlegt.

FIELDSTERMINATED

• FIELDS TERMINATED BY 'fielddiv'

Hiermit kann man festlegen, wie die Feldwerte untereinander ge-trennt werden sollen. Üblich sind das Tabulatorzeichen (Standard-einstellung, auch erreichbar durch '\t'), das Komma oder das

������ � ������ �

Semikolon. Man kann durchaus auch mehr als ein Zeichen angeben,es wird dann der gesamte String als Trenner genutzt. Dies ist zum Bei-spiel dann nützlich, wenn die Ausgabe „leserlicher“ sein soll: Mangibt nicht nur ein Komma an, sondern auch noch ein Leerzeichendanach:

SELECT * INTO OUTFILE 'raum2.txt' FIELDS TERMINATED BY ', ' FROM raum;

Das Ergebnis sieht dann so aus:

1, A5.33, 5, 42, B2.02, 2, 203, C4.16, 4, 114, A5.21, 5, 65, A5.23, 5, 6

FIELDS ENCLOSED• FIELDS [OPTIONALLY] ENCLOSED BY 'enc_char'

Alle Feldwerte werden durch den enc_char umschlossen. Üblicherwei-se wird man hier das einfache oder doppelte Anführungszeichen nut-zen, es sind aber auch andere denkbar, durchaus auch mehrereZeichen (zum Beispiel '#*#').

Was für einen Vorteil hat es, Feldwerte zum Beispiel mit Anführungs-zeichen zu umschließen? Nun, ein Stringfeld kann alle möglichenZeichen enthalten, unter anderem auch das Feldtrennzeichen. EinTabulatorzeichen ist vielleicht selten, aber wenn man das Komma alsFeldtrenner nutzt, kann man schon bei Adressen Probleme bekom-men. Das glauben Sie nicht? Dann kommen Sie mal nach Mann-heim, dort gibt es in der Innenstadt keine Straßennamen (bis aufAusnahmen), sondern nur Blöcke: A1, A2, ... A7, B1 usw. bis U7.Noch kein Problem, allerdings wird die Hausnummer meist durchein Komma getrennt: P3, 6.

Was macht das jetzt für Kummer? Geben wir doch einfach mal einBeispiel aus. Zunächst fügen wir einen Satz mit entsprechenderAdresse ein:

INSERT INTO schueler (nachname, vorname, geburtsdatum, strasse, plz, ort, geschlecht) VALUES ('Herms', 'Georg', '1960-09-16', 'P3, 6', '68161', 'Mannheim', 0);

Nun lassen wir uns eine Liste mit Namen und Adressen der Schülerausgeben:

SELECT nachname, vorname, strasse, plz, ort INTO OUTFILE 'komma.txt' FIELDS TERMINATED BY ',' FROM schueler;

��� �������� ���������

Das Ergebnis sieht so aus:

Schmidt,Thomas,Hauptstr. 16,28219,BremenMayer,Anke,Leher Heerstr. 342,68219,MannheimMeier,Frank,Waldweg 30,69190,WalldorfSchulze,Friederike,Relaisstr. 432,41564,KaarstHerms,Georg,P3\, 6,68161,Mannheim

Wie man sieht, ist das Komma nun mit einem Fluchtzeichen verse-hen. Dies ist beim anschließenden Weiterverarbeiten meist rechtumständlich, manche Programme können gar nichts damit anfan-gen. Es kann auch sein, dass man das Fluchtzeichen aus anderenGründen bewusst weglässt (siehe dazu weiter unten). Und dann wirdes schwierig. In diesem Fall wird das verarbeitende Programm näm-lich 6 als Postleitzahl und 68161 als Ort ansehen. Dumm, oder?

Die Lösung liegt eben in ENCLOSED BY. Das Beispiel von eben, jetzt abermit Anführungszeichen:

SELECT nachname, vorname, strasse, plz, ort INTO OUTFILE 'komma2.txt' FIELDS TERMINATED BY ',' ENCLOSED BY '"' FROM schueler;

Als Ergebnis erhält man jetzt:

"Schmidt","Thomas","Hauptstr. 16","28219","Bremen""Mayer","Anke","Leher Heerstr. 342","68219","Mannheim""Meier","Frank","Waldweg 30","69190","Walldorf""Schulze","Friederike","Relaisstr. 432","41564","Kaarst""Herms","Georg","P3, 6","68161","Mannheim"

Jeder Wert ist jetzt mit Anführungszeichen umschlossen, das Kommain P3, 6 nicht mehr mit einem Fluchtzeichen versehen. Damit kön-nen die meisten Programme etwas anfangen…

Nun kann man einwenden, dass bei Zahlen nun wirklich kein An-führungszeichen notwendig ist. Es gibt keine besonders gefährlichenZeichen, da kostet das nur Platz und macht auch etwas unübersicht-licher. Dazu kann man die Option OPTIONALLY nutzen: Sie sorgt dafür,dass nur String-Felder umschlossen werden:

SELECT * INTO OUTFILE 'raum3.txt' FIELDS TERMINATED BY ', ' OPTIONALLY ENCLOSED BY '"' FROM raum;

führt zu:

1, "A5.33", "5", 42, "B2.02", "2", 203, "C4.16", "4", 114, "A5.21", "5", 65, "A5.23", "5", 6

������ � ������ ��

Die Etage (als jeweils vorletzter Wert) ist hier mit Anführungszeichenumschlossen, da sie als String in der Datenbank abgespeichert ist.

Wie man an den letzten Beispielen sieht, kann man bei FIELDS auchmehrere Optionen kombinieren. Es muss nur mindestens eine ange-geben sein, sonst muss man auch FIELDS weglassen.

FIELDS ESCAPED• FIELDS ESCAPED BY 'esc_char'

Mit dieser Option kann man das Fluchtzeichen angeben. Standard-mäßig handelt es sich um den Backslash (\), der dann vor allen be-sonders zu behandelnden Zeichen angegeben wird. Bei diesenZeichen handelt es sich um den Backslash selber (daher muss er beieigener Angabe auch als '\\' definiert werden), das Tabulatorzei-chen, den Zeilenumbruch und der Feldtrenner innerhalb von Wer-ten (sofern sie nicht durch Anführungszeichen umschlossen sind).

Es lassen sich auch mehrere Zeichen angeben, von denen wird abernur das erste verwendet. Will man das Fluchtzeichen unterdrücken,muss ein leerer String ('') angegeben werden. Dies funktioniert übri-gens auch bei den anderen Optionen.

LINES

TERMINATED

• LINES TERMINATED BY 'linedev'

Durch diese Option ist es möglich, die einzelnen Datensätze durchbesondere Zeichen zu trennen. Üblich ist der Zeilenumbruch ('\n'),man kann aber auch beliebige andere Werte angeben. So würde dieAnweisung für einen Datensatztrenner #*# aussehen:

SELECT raum_name INTO OUTFILE 'raum4.txt' LINES TERMINATED BY '#*#' FROM raum;

Das Ergebnis wäre dann:

A5.33#*#B2.02#*#C4.16#*#A5.21#*#A5.23#*#

Es handelt sich hier nur um eine Zeile, da die Datensätze nur nochdurch #*# getrennt sind, aber nicht mehr durch den Zeilenumbruch.

Die Standardeinstellung lautet zusammengefasst wie folgt:

FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n'

Zum Abschluss möchte ich noch ein Beispiel aus dem „richtigen“ Lebenpräsentieren, bei dem es um die geschickte Kombination von Funktio-nen, Formatoptionen und der Ausgabe geht: Es hat nichts mit der Mu-sikschule zu tun, sondern basiert auf einer Frage in der Newsgroupde.comp.datenbanken.mysql von André Schleife. Er hatte in einer TabelleLiteraturverweise auf Artikel gespeichert, die er so in einer Datei spei-

��� �������� ���������

chern wollte, dass sich aus dieser mittels BibTeX (einem Tool für dasSatzsystem LaTeX) ein Literaturverzeichnis erstellen ließ.

Gegeben war eine Tabelle article mit dem Schlüssel ikey sowie den Fel-dern author, title, journal, year, pages, volume, number, URL und keywords.Diese sollten dann als Datei pro Datensatz wie folgt aussehen:

@Article{ikey, author = {author}, title = {title}, journal = {journal}, year = {year}, pages = {pages}, volume = {volume}, number = {number}, URL = {URL}, keywords = {keywords}}

@Article{ikey, ...

Dabei entsprechen die kursiv geschriebenen Worte den Spaltennamenin der Tabelle. Erschwerend kam noch hinzu, dass Felder, die keinen In-halt haben, nicht auftauchen sollen.

Gelöst wurde das Ganze durch den folgenden Befehl:

SELECT CONCAT('@Article{',ikey,IFNULL(CONCAT(',\n author = {',author),''),IFNULL(CONCAT('},\n title = {',title),''),IFNULL(CONCAT('},\n journal = {',journal),''),IFNULL(CONCAT('},\n year = {',year),''),IFNULL(CONCAT('},\n pages = {',page),''),IFNULL(CONCAT('},\n volume = {',volume),''),IFNULL(CONCAT('},\n number = {',number),''),IFNULL(CONCAT('},\n URL = {',URL),''),IFNULL(CONCAT('},\n keywords = {',keywords),''),'}\n}\n\n')INTO OUTFILE '/sqltest/literatur.td.bib' FIELDS ESCAPED BY '' FROM article ORDER BY ikey;

Mittels CONCAT werden die einzelnen Strings und Felder zusammenge-setzt. IFNULL sorgt dafür, dass nur dann eine Zeile entsteht, wenn das Feldauch Inhalt besitzt. Dabei wurde die Eigenschaft ausgenutzt, dass CONCATimmer dann NULL zurückliefert, wenn auch nur ein einzelner Wert derParameterliste NULL ist. So ist CONCAT(',\n author = {', author) dannkomplett NULL, wenn author alleine schon NULL ist. In diesem Fallwird der zweite Parameter von IFNULL zurückgeliefert, der hier ein Leer-

������ � ������ ��

string ist. Auf diesem Weg werden überflüssige Leerzeilen vermieden,zugleich wird aber für die einzelnen Elemente nicht NULL, sondern einleerer String zurückgeliefert. Dies ist deshalb nötig, weil sonst dasoberste CONCAT auch NULL zurückgeben würde.

FIELDS ESCAPED BY '' sorgt wiederum dafür, dass die per Hand eingefügtenZeilenumbrüche (\n) nicht wieder mit einem Backslash maskiert werden.

Als Ergebnis erhält man jetzt folgenden Text, der wunderbar mit BibTeXweiterverarbeitet werden kann:

@Article{eppler:92, author = {D. T. Eppler et al.}, title = {Passive Microwave Signatures of Sea Ice}, journal = {Geophysical Monograph}, year = {1992}, pages = {300--302}, volume = {68}, keywords = {microwave signatures}}

@Article{fuhrhop:96, author = {R. Fuhrhop and C. Simmer}, title = {SSM/I Brightness Temperature Corrections for Incidence Angle Variantions}, journal = {Journal of Atmospheric and Oceanic Technology}, year = {1996}, pages = {230--235}, volume = {13}, number = {1}, keywords = {temperature corrections}}

@Article{hartmann:96, author = {J. Hartmann et al.}, title = {Radiation and Eddy Flux Experiment 1995 (REFLEX III)}, journal = {Berichte zur Polarforschung}, year = {1996}, pages = {147--155}, volume = {218}, URL = {www.awi-bremerhaven.de}, keywords = {REFLEX III}}

Setzt man das Ergebnis schließlich in LaTeX um, erhält man die ge-wünschte Ausgabe in Abbildung 5.12:

��� �������� ���������

Abbildung 5.12: Ausgabe der LaTeX-Datei mit dem Literaturverzeichnis

5.4.2 LOAD DATA INFILE

LOAD DATA Für den umgekehrten Weg, das Einlesen von Textdaten in eine MySQL-Tabelle, gibt es den Befehl LOAD DATA INFILE. Mit ihm kann man Dateiendes Typs einlesen, die sich auch mit SELECT ... INTO erzeugen lassen, auchdie Parameter sind zum Teil identisch. Seine Syntax lautet:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name' [REPLACE | IGNORE] INTO TABLE tbl_name [FIELDS [TERMINATED BY 'fielddiv'] [[OPTIONALLY] ENCLOSED BY 'enc_char'] [ESCAPED BY 'esc_char' ] ] [LINES TERMINATED BY 'linediv'] [IGNORE number LINES] [(col_name,...)]

Die kürzeste gültige Variante ist hier

LOAD DATA INFILE 'file_name' INTO TABLE tbl_name;

Dabei werden die Daten aus der Textdatei file_name in die Tabelletbl_name eingelesen. Die Feldwerte müssen durch Tabulatoren getrennt

So konnten Daten aus den verschiedenen jahreszeitlichen Situationen ge-wonnen werden [2].

Dabei ist zu bedenken, daß alleine dem SSM/I-Sensor schon ein Fehlervon etwa 2 K zuzuordnen ist [3].

Aus [1] wurden dann fur diesen Eistyp die entsprechenden Emissivitatenermittelt und in (fur MWMOD notwendige) Reflektivitaten umgerechnet.

Literatur

[1] D. T. Eppler et al. Passive Microwave Signatures of Sea Ice. GeophysicalMonograph, 68:300–302, 1992.

[2] J. Hartmann et al. Radiation and Eddy Flux Experiment 1995 (REFLEXIII). Berichte zur Polarforschung, 218:147–155, 1996.

[3] R. Fuhrhop and C. Simmer. SSM/I Brightness Temperature Correcti-ons for Incidence Angle Variantions. Journal of Atmospheric and OceanicTechnology, 13(1):230–235, 1996.

������ � ������ ��

werden, dürfen nicht mit Anführungszeichen umschlossen sein unddas Fluchtzeichen ist der Backslash (\). Die einzelnen Datensätze sinddurch Zeilenumbrüche getrennt.

Die solchermaßen eingelesenen Daten wandern dann in die Tabelletbl_name, wobei alle Felder in der richtigen Reihenfolge schon in der Dateivorhanden sein müssen und auch keine überflüssigen Zeilen am Anfangder Datei existieren dürfen. Die schon existierenden Schlüsselwerte in derTabelle dürfen in der Datei nicht nochmals vorkommen, da es ansonsteneine Fehlermeldung gibt.

Natürlich kann man sehr viele Änderungen am Standardverhalten vor-nehmen:

• LOW_PRIORITY | CONCURRENT

Gibt man als Option LOW_PRIORITY an, werden nur dann Daten in dieZieltabelle geschrieben, wenn sonst niemand mehr auf sie zugreift.Umgekehrt kann man mit CONCURRENT dafür sorgen, dass auch wäh-rend des Einfügens von Daten mittels LOAD DATA INFILE andere Clientsauf die Tabelle zugreifen können, was allerdings nur mit MyISAM-Tabellen möglich ist.

• LOCAL

Normalerweise sucht MySQL die Datei auf dem Server. Mit der Anga-be von LOCAL wird der Client-Rechner als Grundlage genommen. Al-lerdings muss man sich darüber im Klaren sein, dass das Laden derDaten dann länger dauert, weil schließlich die Textdatei erst an denServer übertragen werden muss.

• REPLACE | IGNORE

Standardverhalten von LOAD DATA INFILE ist, dass es keine Konfliktezwischen den Schlüsselwerten der neu einzulesenden Daten und de-nen der schon vorhandenen Daten in der Tabelle geben darf. Passiertdies doch (d.h., ein neu einzutragender Datensatz aus der Datei be-sitzt einen Schlüssel, der schon in der Tabelle existiert), bricht dieVerarbeitung mit einer Fehlermeldung ab. Dies entspricht dem Ver-halten von INSERT INTO ...

Mittels REPLACE kann man nun dafür sorgen, dass die Daten trotzdemeingetragen werden; bestehende Datensätze mit dem entsprechen-den Schlüssel werden dadurch überschrieben. Durch diese Optionwird also das Verhalten des Befehls REPLACE INTO ... nachgebildet.

Nutzt man stattdessen IGNORE, werden vorhandene Daten nicht über-schrieben, es wird aber auch keine Fehlermeldung ausgegeben. Da-mit bleiben alte Daten bestehen, noch nicht vorhandene werdenaber trotzdem eingetragen – wie bei INSERT IGNORE INTO...

��� ����������� �������

• FIELDS TERMINATED BY 'fielddiv' [OPTIONALLY] ENCLOSED BY 'enc_char' ESCAPED BY 'esc_char'LINES TERMINATED BY 'linediv'

Diese Optionen entsprechen exakt denen bei SELECT ... INTO, bis aufdie Ausnahme, dass enc_char und esc_char nur aus jeweils einem ein-zelnen Zeichen bestehen dürfen (wenn man sie nicht leer lässt). Zu-dem ist es nicht zulässig, fielddiv und enc_char gleichzeitig leer zulassen. Dies entspräche einer Textdatei mit festen Spaltenbreiten, wasnicht unterstützt wird.

• IGNORE number LINES

Mit dieser Angabe werden die ersten number Zeilen am Anfang der Da-tei ignoriert. Damit kann man Zeilen überspringen, die Spaltenüber-schriften oder andere Angaben zu den Daten enthalten.

• (col_name, ...)

Auf diesem Weg kann man die zu befüllenden Spalten der Tabelle inder entsprechenden Reihenfolge angeben, in der sie in der Datei auf-tauchen. Dies kann dann nützlich sein, wenn man nicht alle Spaltender Tabelle befüllen will oder die Daten in der Datei in der falschenReihenfolge stehen.

Felder, die nicht gefüllt werden – entweder, weil sie in der Spaltenlis-te nicht mit aufgeführt wurden, oder weil einfach nicht genug Wertepro Datensatz vorhanden sind – erhalten ihren Standardwert. Gibt eshingegen zu viele Werte pro Datensatz in der Datei, werden dieseignoriert und die Anzahl der Warnungen dementsprechend erhöht.

Als Beispiel wollen wir unsere Musikschul-Datenbank mit den gültigenBankleitzahlen ergänzen. Die Daten mögen zwar nicht unbedingt zwin-gend wichtig sein, sie sind aber ein schönes Beispiel für das Einlesen ex-terner Daten nach MySQL. Zudem kann man die Daten kostenlos im In-ternet erhalten. Leider handelt es sich dabei um eine Datei mit festerFeldlänge und ohne Feldtrenner. Aber auch dies lässt sich mit Hilfe einerZwischentabelle lösen.

Auf den Web-Seiten der Bundesbank gibt es unter http://www.bundes-bank.de/zv/zv_bankleitzahlen.htm einen Link „Download der Bankleit-zahlen-Dateien“ zum Herunterladen der Bankleitzahlen. Es gibt verschie-dene Varianten, uns interessiert hier aber die PC/Text-Version. Die hiergenutzte Datei hat den Namen blz0209pc.exe. Dabei steht 0209 für dieGültigkeit ab September 2002, eventuell gibt es bereits neuere Versionen.

Die Datei ist eine selbstentpackende Zip-Datei. Sie kann auch unter Li-nux mittels unzip ausgepackt werden. Als Ergebnis erhält man eine Text-

������ � ������ ��

datei (hier blz0209pc.txt) und ein Word-Dokument mit der Beschrei-bung über den Aufbau der Daten (satzaufbaupc188.doc). Auch dieseDatei lässt sich notfalls unter Linux öffnen, entweder, indem manOpenOffice oder StarOffice nutzt oder sie sich ganz rudimentär mitstrings satzaufbaupc188.doc ausgeben lässt.

Aus dieser Beschreibung kann man nun den Aufbau der Daten entneh-men. Da es sich allerdings um Felder fester Länge handelt, bleibt uns zu-nächst nichts anderes übrig, als die Daten „am Stück“ in eine Zwischen-tabelle zu importieren. Aus dieser Tabelle kann man dann mit den SQL-Funktionen die „richtige“ BLZ-Tabelle mit den „richtigen“ Feldern be-füllen. Der Dokumentation entnehmen wir, dass die Daten pro Satz ins-gesamt 188 Zeichen lang sind. Also erzeugen wir eine Tabelle mit einemFeld dieser Länge:

CREATE TABLE blz_import (satz CHAR(188));

Nun können wir für den ersten Schritt die Daten importieren.

mysql> LOAD DATA INFILE 'blz0209pc.txt' -> INTO TABLE blz_import;Query OK, 21104 rows affected (0.39 sec)Records: 21104 Deleted: 0 Skipped: 0 Warnings: 0

Wie man sieht, geht das Einlesen der Datei wirklich schnell – gerade mal0,39 Sekunden haben die 21.104 Sätze benötigt. Allerdings sind wirnoch nicht fertig, schließlich müssen die Daten noch in die richtige Ta-belle kopiert werden. Diese legen wir erst einmal an, wobei als Vorlagefür die Felder die Beschreibung der Datenstruktur dient. Dabei nutzenwir nur die Felder, die wir später auch nutzen wollen: die Bankleitzahlselber und der längere Name der Bank.

CREATE TABLE bankleitzahl (blz CHAR(8), bank_name VARCHAR(58), INDEX (blz), INDEX (bank_name));

Es wurde kein Primärschlüssel angelegt, da es durchaus mehrfacheKombinationen von BLZ und Name gibt. Nun können wir die Daten ausder Import-Tabelle übertragen:

mysql> INSERT INTO bankleitzahl -> (blz, bank_name) -> SELECT DISTINCT LEFT(satz, 8), MID(satz, 28, 58) -> FROM blz_import -> WHERE LEFT(satz, 8) > '00000000';Query OK, 6401 rows affected (0.56 sec)Records: 6401 Duplicates: 0 Warnings: 0

��� �������� ���������

Durch den Einsatz der Zwischentabelle und den Funktionen LEFT() undMID() haben wir trotz fester Feldlänge die Daten sinnvoll und ziemlichschnell importieren können. Wie man sieht, wurden nun nur noch6.401 Sätze in die eigentliche BLZ-Tabelle übertragen. Das liegt zum ei-nen daran, dass wir mit der WHERE-Bedingung alle zu löschenden Bank-leitzahlen ausgeschlossen haben, zum anderen und vor allem aberdaran, dass die diversen einzelnen Geschäftsstellen nicht mit aufge-nommen wurden. Durch das DISTINCT wurde verhindert, dass eine Satz-kombination mehrfach vorkommt. Man kann nun diese Tabelle dazunutzen, Bankleitzahlen oder Banknamen automatisch heraussuchenund vorschlagen zu lassen, wenn man Kontodaten in einer Applikationfür die Musikschule einträgt. Durch die Indizes auf blz und bank_nameist diese Suche auch ziemlich schnell.

5.4.3 mysqldump

mysqldump Um Daten aus einem MySQL-Server zu exportieren, kann man auch dasProgramm mysqldump nutzen. Es liest die Struktur und die Daten eineroder mehrerer Datenbanken oder Tabellen aus und schreibt sie in eineDatei. Mit dieser kann man die entsprechenden Strukturen danach wie-der erneut aufbauen (sei es auf einem anderen Server oder auf dem glei-chen Server zum Beispiel nach einer Neuinstallation) und die Daten ein-tragen lassen. Selbst das Erstellen der Datenbank selber wird aufWunsch übernommen.

Beim Aufruf des Programms kann man eine der drei folgenden Syntax-Varianten nutzen:

mysqldump [OPTIONS] database [tables]mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]mysqldump [OPTIONS] --all-databases [OPTIONS]

In der ersten Variante gibt man eine Datenbank an, dazu die Tabellen,die exportiert werden sollen. Lässt man die Angabe der Tabellen weg,werden alle Tabellen der Datenbank exportiert.

Die zweite Variante erlaubt die Auswahl mehrerer Datenbanken, für diealle Tabellen exportiert werden. Zusätzlich werden mit den erzeugtenSQL-Befehlen die Datenbanken erstellt und vor dem Anlegen und Befül-len der Tabellen in diese gewechselt.

In der dritten Variante schließlich werden alle Datenbanken exportiert.

Die Optionen sind in Tabelle 5.3 aufgeführt.

������ � ������ �

Kurze Version Lange Version Beschreibung

-A --all-databases Exportiere alle Datenbanken des Servers.

-a --all Nutze alle CREATE-Optionen von MySQL.

-# --debug=... Ablauf des Programms protokollieren und verfolgen

--character-sets-dir=...

Angabe des Verzeichnisses, in dem die Zeichensatzbeschreibungen abgelegt sind

-? --help Ausgabe der Hilfe-Informationen

-B --databases Ausgabe mehrerer Datenbanken, die nach den Optionen aufgeführt werden müssen (siehe zweite Syntaxvariante)

-c --complete-insert INSERT-Befehle werden komplett mit den Spaltennamen erzeugt.

-C --compress Nutzung der Datenkompression bei der Kommunikation zwischen Client und Server

--default-character-set=...

Angabe des Standard-Zeichensatzes

-e --extended-insert Nutzung der Angabe mehrerer Datensätze mit einem INSERT-Befehl

--add-drop-table Aufnahme des Befehls DROP TABLE vor dem Erstellen der Tabelle

--add-locks Hinzufügen von LOCK TABLE vor den INSERT-Befehlen und UNLOCK TABLE danach. Dadurch wird das Einfügen von Datensätzen be-schleunigt.

--allow-keywords Es können Schlüsselwörter als Spaltennamen genutzt werden, indem jedem Spaltenname der Tabellenname vorangestellt wird.

--delayed-insert Einfügen von Daten mittels INSERT DELAYED.

--master-data Hinzufügen von Ort und Dateiname des Masters bei verteilten Datenbanken

-F --flush-logs Wegschreiben der Log-Dateien, bevor mit dem Export begonnen wird

-f --force auch bei einem Fehler mit dem Exportieren fortfahren

-h --host=... Angabe des MySQL-Servers

-l --lock-tables Sperren aller Tabellen vor dem Exportieren

--no-autocommit Hinzufügen von Befehlen zum Deaktivieren des Autocommits und dem Bestätigen am Ende der INSERT-Befehle.

-K --disable-keys Deaktivieren der Schlüssel vor dem Eintragen der Daten und nachträgliches Aktivieren. Dies kann das Erstellen der Daten an ihrem neuen Ort beschleunigen.

Tabelle 5.3: Optionen von mysqldump

��� �������� ���������

-n --no-create-db Die Befehle zum Anlegen der Datenbanken werden nicht mit ausgegeben.

-t --no-create-info Die Befehle zum Anlegen der Tabellen wer-den nicht mit ausgegeben.

-d --no-data Es werden nur die Strukturen exportiert.

-O --set-variable var=option

Setzen von Variablen

--opt Schnellstmögliche Variante zum Exportieren und Importieren von Daten. Diese Option entspricht der gemeinsamen Nutzung von --add-drop-table --add-locks --all --quick --extended-insert --lock-tables --disable-keys

-p --password[=...] Angabe des Kennworts oder Abfrage

-W --pipe Verwendung von Named Pipes für die Kommunikation mit dem Server

-P --port=... Angabe des Ports, über den sich der Client mit dem MySQL-Server verbinden soll

-q --quick direkte Ausgabe der Befehle ohne Pufferung

-Q --quote-names Umschließen von Tabellen- und Spalten-namen mit dem umgekehrten einfachen Anführungszeichen (`)

-r --result-file=... Ausgabe in die angegebene Datei statt auf die Standardausgabe

-S --socket=... Angabe der zu verwendenden Socket-Datei

--tables Überschreiben der Option --databases

-T --tab=... Ausgabe der Daten als Textdatei. Für jede Tabelle werden zwei Dateien erstellt: eine SQL-Datei mit den Befehlen zum Anlegen der Struktur und eine Textdatei mit den Daten. Diese können später mit LOAD DATA INFILE eingelesen werden. Erstellt werden die Dateien im angegebenen Verzeichnis. Die Textdateien lassen sich wie bei SELECT INTO formatieren, dazu dienen die entspre-chenden Optionen, die am Ende der Tabelle beschrieben sind.

-u --user=... Angabe des Benutzers, der sich anmelden soll

-v --verbose ausführlichere Ausgabe von Informationen während des Exportierens

-V --version Ausgabe der Version und Beenden des Pro-gramms

-w --where=... Angabe von WHERE-Bedingungen, die für die auszugebenden Datensätze erfüllt sein müs-sen. Anführungszeichen sind notwendig.

Kurze Version Lange Version Beschreibung

Tabelle 5.3: Optionen von mysqldump (Forts.)

������ � ������ ��

Standardmäßig werden die SQL-Befehle direkt in die Standardausgabegeschrieben.

prompt>mysqldump musikschule-- MySQL dump 8.22---- Host: localhost Database: musikschule----------------------------------------------------------- Server version3.23.51-nt

---- Table structure for table 'ausleihe'--

CREATE TABLE ausleihe ( ausleihe_id int(10) unsigned NOT NULL auto_increment, leihinstrument_id int(10) unsigned NOT NULL default '0', schueler_id int(10) unsigned NOT NULL default '0', datum_von date NOT NULL default '0000-00-00', datum_bis date default NULL, PRIMARY KEY (ausleihe_id)) TYPE=MyISAM;

---- Dumping data for table 'ausleihe'--

---- Table structure for table 'instrument'--

-X --xml Ausgabe der Daten als wohlgeformte XML-Datei

-x --first-slave Sperren aller Datensätze in allen Daten-banken (bei verteilten Systemen)

--fields-terminated-by=...

Angabe der Feldtrenner bei --tab. Standard ist \t.

--fields-enclosed-by=...

Angabe der Quoting-Zeichen bei --tab

--fields-optional-ly-enclosed-by=...

Angabe der optionalen Quoting-Zeichen bei --tab

--fields-escaped-by=...

Angabe des Fluchtzeichens bei --tab

--lines-terminated-by=...

Angabe der Datensatztrenner bei --tab. Standard ist \n.

Kurze Version Lange Version Beschreibung

Tabelle 5.3: Optionen von mysqldump (Forts.)

��� �������� ���������

CREATE TABLE instrument ( instrument_id int(10) unsigned NOT NULL auto_increment, instr_name varchar(50) NOT NULL default '', instr_gruppe varchar(50) default NULL, PRIMARY KEY (instrument_id)) TYPE=MyISAM;

---- Dumping data for table 'instrument'--

INSERT INTO instrument VALUES (1,'Querflöte','Holzbläser');INSERT INTO instrument VALUES (2,'Klarinette','Holzbläser');INSERT INTO instrument VALUES (3,'Violine','Streicher');INSERT INTO instrument VALUES (4,'Viola','Streicher');INSERT INTO instrument VALUES (5,'Posaune','Blechbläser');INSERT INTO instrument VALUES (6,'Trompete','Blechbläser');INSERT INTO instrument VALUES (7,'Klavier','Tasten');INSERT INTO instrument VALUES (8,'Keyboard','Tasten');...

Diese lässt sich natürlich in eine Datei umbiegen:

prompt>mysqldump musikschule > musikschule.sql

Oder man nutzt die Option -r bzw. --result-file:

prompt>mysqldump --result-file=musikschule.sql musikschule

Solch eine erzeugte Datei kann man mit mysql auf einem anderen Serverwieder einlesen:

prompt>mysql musikschule < musikschule.sql

Möchte man die Daten später mit mysqlimport wieder einlesen (siehe Ka-pitel 5.4.4), muss man mit der Option --tab arbeiten. Die Daten werdendann in Dateien geschrieben, die gleich den richtigen Namen besitzen:

prompt>mysqldump --tab=musikschule musikschule

Damit werden in das Verzeichnis musikschule Dateien für alle Tabellender Datenbank musikschule geschrieben.

Um Daten von einem MySQL-Server auf einen anderen zu verschieben,kann man auch eine andere, elegantere Möglichkeit nutzen. Dazu sollteman sich auf dem Server mit dem Ausgangspunkt der Daten befinden.Dann kann man die Ausgabe des Programms gleich als Eingabe fürmysql auf dem Zielserver nutzen:

������ � ������ ��

prompt>mysqldump --opt musikschule | mysql --h remotehost -C musikschule

Durch --opt wird der schnellstmögliche Weg zum Exportieren gewählt,während -C dafür sorgt, dass die Kommunikation mit dem entferntenRechner komprimiert vonstatten geht.

5.4.4 mysqlimport

mysqlimportMit dem Programm mysqlimport kann man – genau wie bei LOAD DATA IN-FILE – Daten aus Textdateien in die Datenbank laden. Im Grunde genom-men stellt mysqlimport nur eine Kommandozeilenschnittstelle für denSQL-Befehl bereit. Viele Optionen sind identisch zu denen von LOAD DATAINFILE. Der Aufruf des Programms geschieht mit der folgenden Syntax:

mysqlimport [OPTIONS] database textfile1 [textfile2 ...]

Von den angegebenen Textdateien werden alle vorhandenen Erweite-rungen abgeschnitten und der eigentliche Dateiname als Name der Ta-belle genommen, in die die Daten aus der entsprechenden Datei impor-tiert werden sollen. So würden zum Beispiel die Daten der Dateiunterricht.txt in die Tabelle unterricht importiert werden. Die verwendeteDatenbank muss auch mit angegeben werden.

Als mögliche Optionen stehen die in Tabelle 5.4 aufgeführten bereit.Viele sollten bereits bekannt sein.

Kurze Version Lange Version Beschreibung

-# --debug[=...] Ablauf des Programms protokollieren und verfolgen

-? --help Ausgabe der Hilfe-Informationen

–-default-charac-ter-set=...

Angabe des Standard-Zeichensatzes

--character-sets-dir=...

Angabe des Verzeichnisses mit den Zeichen-sätzen

-c –-columns=... Angabe der Spalten, die für den Import genutzt werden sollen. Diese Option ent-spricht dem Passus (col_name, ...) in LOAD DATA INFILE.

-C –-compress Nutzung der Datenkompression bei der Kommunikation zwischen Client und Server

-d –-delete Die zu befüllenden Tabellen werden vor dem Import geleert.

-f –-force Der Import soll weitergehen, auch wenn ein Fehler aufgetreten ist. Existiert zum Beispiel eine Tabelle nicht, wird das Programm ohne diese Option abgebrochen.

Tabelle 5.4: Optionen von mysqlimport

��� �������� ���������

-h –-host=... Angabe des MySQL-Servers

-i –-ignore Zu importierende Daten mit Schlüsseln, die in der Tabelle schon vorhanden sind, werden ignoriert. Dies entspricht der Option IGNORE bei LOAD DATA INFILE.

-l –-lock-tables Sperren aller Tabellen des Servers bevor der Import beginnt. Damit ist sichergestellt, dass alle Tabellen synchron sind.

-L –-local Die Dateien werden auf dem Client eingele-sen und zum Server übertragen. Ohne diese Angabe werden die Daten auf dem Server gesucht.

–-low-priority Die Daten werden mit geringerer Priorität in die Tabellen geschrieben (entspricht LOW_PRIORITY bei LOAD DATA INFILE).

-p –-password[=...] Angabe des Kennwortes für den Benutzer oder Abfragen bei Nichtangabe

-W –-pipe Nutzung von Named Pipes für die Kommu-nikation zwischen Client und Server

-r –-replace Existieren schon Daten in der Tabelle mit Schlüsseln, die auch in der Datei vorkom-men, werden die bestehenden Daten über-schrieben. Dies entspricht der Option REPLACE in LOAD DATA INFILE.

-s –-silent „Stille“ Arbeitsweise. Es werden nur Fehler-meldungen ausgegeben.

-S –-socket=... Angabe der zu verwendenden Socket-Datei

-u –-user=... Angabe des Benutzers, der angemeldet wer-den soll

-v –-verbose ausführliche Statusausgaben während des Programmlaufs

-V –-version Ausgabe der Versionsangaben und Beenden des Programms

--fields-terminated-by=...

Angabe der Feldtrenner. Standard ist \t.

--fields-enclosed-by=...

Angabe der Quoting-Zeichen

--fields-optional-ly-enclosed-by=...

Angabe der optionalen Quoting-Zeichen

--fields-escaped-by=...

Angabe des Fluchtzeichens

--lines-termina-ted-by=...

Angabe der Datensatztrenner. Standard ist \n.

Kurze Version Lange Version Beschreibung

Tabelle 5.4: Optionen von mysqlimport (Forts.)

������������ ��

Möchte man also nun Daten importieren, kann man wie folgt vorgehen:

prompt>cd musikschuleprompt>mysqlimport --delete musikschule ausleihe.txt instrument.txtmusikschule.ausleihe: Records: 0 Deleted: 0 Skipped: 0 Warnings: 0musikschule.instrument: Records: 8 Deleted: 0 Skipped: 0 Warnings: 0

Durch --delete oder -d wird dafür gesorgt, dass keine alten Daten in denTabellen verbleiben. Das möchte man natürlich ab und an gerne haben,in diesem Fall aber geht es eben um den direkten Import der alten Daten.Im Folgenden wird dann für jede Tabelle angegeben, wie viele Datensätzeimportiert wurden, ob es doppelte gab und ob Warnungen auftraten.

Möchte man mehr über den aktuellen Status der Verarbeitung erfahren,kann man die Option --verbose oder -v nutzen:

prompt>mysqlimport -d -v musikschule ausleihe.txt instrument.txtConnecting to localhostSelecting database musikschuleDeleting the old data from table ausleiheLoading data from file: ausleihe.txt into ausleihemusikschule.ausleihe: Records: 0 Deleted: 0 Skipped: 0 Warnings: 0Deleting the old data from table instrumentLoading data from file: instrument.txt into instrumentmusikschule.instrument: Records: 8 Deleted: 0 Skipped: 0 Warnings: 0Disconnecting from localhost

5.5 SchnittstellenEs ist nun sicherlich sehr praktisch, die verschiedensten Programme zurVerfügung zu haben, um auf den MySQL-Server und dessen Daten zu-greifen zu können. Allerdings sind dies alles Programme, die nicht un-bedingt sinnvoll für einen Endbenutzer sind. Dieser erwartet eine Ober-fläche, die die Daten sinnvoll angeordnet anzeigt, Eingabeprüfungenvornimmt und einfache Suchmöglichkeiten anbietet. Zudem sollte dieAblauf- oder Geschäftslogik unter der Oberfläche verborgen sein undnicht vom Benutzer selber beachtet werden müssen („Immer, wenn einKunde mehr als _ 10.000 Umsatz pro Jahr macht, erhält er automatisch3% Rabatt.“).

Das Programm kann MySQL einem natürlich nicht zur Verfügung stel-len. Dafür ist der Applikationsentwickler selber verantwortlich. Aberum auf die Datenbank zugreifen zu können, benötigt er Schnittstellen.Es gibt sie für die verschiedensten Programmiersprachen. Ich möchtehier die am häufigsten genutzten vorstellen: Perl und C++ sowie allge-meiner und sprachunabhängiger MyODBC. PHP wird auch sehr häufig

��� �������� ���������

für die Anbindung eines Web-Servers an eine MySQL-Datenbank ge-nutzt. Da es dafür aber ein eigenes Kapitel gibt, werde ich hier nicht nä-her darauf eingehen.

5.5.1 Perl

Perl ist eine ideale interpretierende Programmiersprache, um kleine(und auch größere) Skripten zu schreiben. Sie sind schnell erstellt, trotz-dem aber auch flexibel und vor allem die Fähigkeiten zur Zeichenket-tenverarbeitung sind sehr umfangreich. Die zentrale Stelle für Perl imInternet ist http://www.perl.com. Während unter Linux und anderenUnix-Derivaten Perl meist schon vorhanden ist, muss man es sich unterWindows erst installieren. Dafür findet man unter http://www.active-state.com/ActivePerl quasi die Perl-Version für Windows.

Der Zugriff auf MySQL mit Perl geschieht über die Schnittstelle DBI.Dies ist eine universelle Datenbankschnittstelle für Perl und unterstütztunter anderem auch MySQL. Es gibt noch andere, ältere Zugriffsvarian-ten, aber mittlerweile sollte man auf jeden Fall DBI nutzen.

Auf der beiliegenden CD-ROM finden Sie im Verzeichnis Perl die MSI-Installationsdatei für ActivePerl unter Windows. Der Dateiname lautetActivePerl-5.6.1.633-MSWin32-x86.msi.

Falls DBI und der MySQL-Zugriff unter Linux noch nicht vorhandensind, muss man sich die entsprechenden Module von http://www.mysql.com/Downloads/Contrib/ herunterladen. Mindestens not-wendig sind Data-Dumper, DBI und msql-mysql-modules. Die entspre-chenden Dateien Data-Dumper-2.101.tar.gz, DBI-1.18.tar.gz und Msql-Mysql_modules-1.2216.tar.gz finden Sie auch auf der beiligenden CD-ROM im Verzeichnis Perl.

Dabei handelt es sich um komprimierte Tar-Archive, die mittels

prompt> gunzip < MODULE-VERSION.tar.gz | tar xvf -

ausgepackt werden können. MODULE-VERSION steht dabei für eines deraufgeführten Module einschließlich der Versionsbezeichnung.

Danach wechselt man in das entsprechende Verzeichnis des Moduls:

prompt> cd MODULE-VERSION

������������ ��

Ein einfaches Perl-Programm, welches auf unsere Datenbank zugreift,sieht so aus:

#! /usr/bin/perl

# mysql01.pl - Einfaches Beispiel zum Verbinden mit MySQL

use DBI; use strict;:my ($dsn) = "DBI:mysql:musikschule"; # Verbindungstyp und Datenbanknamemy ($user_name); # Benutzername (hier leer)my ($password); # Kennwort (hier leer)my ($dbh, $sth); # Verbindungshandle, Query-Handlemy ($query); # SELECT-Befehlmy (@ary); # Datensatz

Dort baut man die Distribution und kompiliert alles:

prompt> perl Makefile.PLprompt> makeprompt> make testprompt> make install

Zu beachten ist noch, dass make test für msql-mysql-modules nur dannerfolgreich funktionieren wird, wenn der MySQL-Server läuft.

Um DBI und die Unterstützung für MySQL unter Windows zu instal-lieren, müssen Sie den PPM (Programmer's Package Manager) vonActivePerl aufrufen. Er benötigt eine Internetverbindung oder – fallsvorhanden – Zugriff auf ein lokales Repository (wie zum Beispiel dieCD von ActiveState).

prompt>ppm

Nun kann DBI installiert werden:

ppm> install DBI

Ist dies erfolgreich geschehen, kann man die MySQL-Unterstützunginstallieren (bitte den folgenden Befehl auf einer Zeile eingeben):

ppm> install ftp//ftp.de.uu.net/pub/CPAN/authors/id/JWIED/DBD-mysql-1.2212.x86.ppd

Mit

ppm> exit

wird der PPM beendet und es steht die DBI und der MySQL-Supportzur Verfügung.

��� ����������� �������

# Verbindung aufbauen$dbh = DBI->connect($dsn, $user_name, $password, {RaiseError => 1});

#SELECT-Befehl definieren$query = "SELECT raum_id, raum_name, etage, personen " ."FROM raum ORDER BY raum_name";

# Anfrage vorbereiten und ausführen$sth = $dbh->prepare($query);$sth->execute();

# Spaltenüberschriften ausgebenprint "raum_id\traum_name\tetage\tpersonen\n\n";

# Schleife über alle Datensätzewhile(@ary = $sth->fetchrow_array()){ # Ausgabe des Datensatzes print join("\t", @ary), "\n";}

# Freigeben des Query-Handles$sth->finish();

# Verbindung beenden$dbh->disconnect();

exit(0);

Ich möchte hier nicht die Programmierung mit Perl an sich erklären.Aber anhand dieses Beispielprogramms will ich auf die Elemente einge-hen, die für DBI notwendig sind.

#! /usr/bin/perl

# mysql01.pl - Einfaches Beispiel zum Verbinden mit MySQL

Alle Zeichen hinter einem # werden als Kommentar betrachtet und ig-noriert. Die erste Zeile dient unter Unix dazu, bei Aufruf von

prompt> mysql01.pl

direkt den Perl-Interpreter zu starten und das Programm auszuführen.

Sie finden das Skript mit dem Dateinamen mysql01.pl auf der beilie-genden CD-ROM.

������������ ��

use DBI; use strict;

Mit diesen beiden Befehlen wird der Perl-Interpreter dazu gebracht, dasModul DBI zu laden, um es später nutzen zu können. Mit use strict wirddafür gesorgt, dass Variablennamen zunächst deklariert werden müs-sen, bevor man sie verwenden kann. Das ist zwar nicht unbedingt nötig,aber sehr sinnvoll, um später nicht ewig nach Fehlern zu suchen, diedarauf beruhen, dass man eine Variable mit $myWonderfulLongVariable-Name anspricht, die in Wirklichkeit $myWonderfulLongVarName heißt(und dann natürlich keinen sinnvollen Inhalt hat).

my ($dsn) = "DBI:mysql:musikschule"; # Verbindungstyp und Datenbanknamemy ($user_name); # Benutzername (hier leer)my ($password); # Kennwort (hier leer)my ($dbh, $sth); # Verbindungshandle, Query-Handlemy ($query); # SELECT-Befehlmy (@ary); # Datensatz

Mit my(...) werden Variablen deklariert. Normale Variablen haben ein $am Anfang ihres Namens, Arrays ein @. Hier kommen jetzt als Variablen-namen verschiedene Bezeichnungen ins Spiel, die häufig im Zusam-menhang mit DBI verwendet werden:

• $dsn: enthält meist die Verbindungsdaten (DSN, Data Source Name),hier zum Beispiel den Datenbanktyp und den Datenbanknamen.

• $user_name, $password: Diese Variablennamen sprechen wohl für sich.

• $dbh: Ein sogenannter Handle, der als Variable die Verbindung an sichrepräsentiert. Ihn brauchen wir im Folgenden immer wieder, da eralle Daten enthält, die für die Verbindung notwendig sind.

• $sth: Ein weiterer Handle, der für die Verarbeitung einer Anfrage not-wendig ist. Ihm wird der SELECT-Befehl übergeben und von ihm erhältman die Ergebnisse.

• $query: Der String, der die eigentliche SQL-Anfrage enthält. Es machtSinn, den SQL-Befehl in einer eigenen Variable zusammenzubauen,um sie leichter ausgeben zu können, wenn man Probleme mit derAnfrage hat.

• @ary: Ein Array, in dem der Inhalt eines Datensatzes gespeichert wird.

Die Variable $dsn wird hier gleich mit den notwendigen Verbindungsda-ten gefüllt, die durch den Doppelpunkt getrennt sind. Zunächst kommtdie Angabe DSI, dann der Datenbanktyp mysql, schließlich der Name derDatenbank musikschule. Handelt es sich nicht um die Datenbank auflocalhost, kann man zum Schluss (wieder durch einen Doppelpunkt ab-geteilt) auch noch den Rechnernamen angeben.

��� ����������� �������

$dbh = DBI->connect($dsn, $user_name, $password, {RaiseError => 1});

Mit diesem Befehl wird die Verbindung zur Datenbank aufgebaut undder Handle $dbh mit Leben gefüllt. {RaiseError => 1} sorgt dafür, dass beieinem Fehler im Verbindungsaufbau das Skript beendet wird und nichtmit einer Warnung weiterläuft. Normalerweise wird man sicherlich eineausgefeiltere Fehlerbehandlung durchführen, aber wir haben es hierschließlich nur mit einem einfachen Skript zu tun.

$query = "SELECT raum_id, raum_name, etage, personen " ."FROM raum ORDER BY raum_name";

$sth = $dbh->prepare($query);$sth->execute();

Nun wird die Abfrage definiert und der Query-Handle mit prepare(...)vorbereitet. Danach lässt er sich mit execute() ausführen.

print "raum_id\traum_name\tetage\tpersonen\n\n";

Zunächst werden jetzt die Feldnamen ausgegeben.

while(@ary = $sth->fetchrow_array()){ # Ausgabe des Datensatzes print join("\t", @ary), "\n";}

Nun wird in einer Schleife so lange die Methode fetchrow_array() aufge-rufen, bis sie keine Ergebnisse mehr zurückliefert. Diese Methode liestden aktuellen Datensatz aus, gibt die Werte der Spalten in einem Arrayzurück und springt dann zu nächsten Datensatz. Handelt es sich dabeium den letzten Satz, wird beim nächsten Aufruf ein leeres Array zurück-gegeben. Es gibt noch weitere Befehle zum Auslesen von Datensätzen,zum Beispiel fetchrow_arrayref(), fetch() und fetchrow_hashref(), die inanderen Situationen einsetzbar sind.

print join("\t", @ary) gibt die einzelnen Elemente des Arrays durch Ta-bulatorzeichen getrennt aus.

$sth->finish();

$dbh->disconnect();

exit(0);

finish() gibt die Ressourcen wieder frei, die der Query-Handle benötigthat. disconnect() trennt die Verbindung zur Datenbank und exit(0)schließlich beendet das Programm mit einem normalen Code.

������������ ��

Ruft man dieses Programm jetzt auf (zum Beispiel mit perl mysql01.pl),erhält man folgende Ausgabe:

prompt>perl mysql01.plraum_id raum_name etage personen

4 A5.21 5 65 A5.23 5 61 A5.33 5 42 B2.02 2 203 C4.16 4 11

Möchte man Befehle ausführen, die im Allgemeinen keine Ergebnis-menge zurückliefern, kann man statt execute() die Methode do(...)desVerbindungshandles $dbh nutzen. Mit ihr lassen sich zum Beispiel UP-DATE, DELETE und INSERT ausführen. Hier wieder ein kleines Beispielskript:

#! /usr/bin/perl

# mysql02.pl - Einfaches Beispiel zum Ausführen von DML-Befehlen

use DBI; use strict;:my ($dsn) = "DBI:mysql:musikschule"; # Verbindungstyp und Datenbanknamemy ($user_name); # Benutzername (hier leer)my ($password); # Kennwort (hier leer)my ($dbh); # Verbindungshandle my ($query); # SELECT-Befehlmy ($rows); # Anzahl der betroffenen Zeilen # Verbindung aufbauen$dbh = DBI->connect($dsn, $user_name, $password, {RaiseError => 1});

# UPDATE ausführen$rows = $dbh->do("UPDATE raum SET personen = 9 WHERE raum_id = 2");

# Verbindung beenden$dbh->disconnect();

exit(0);

do(...) liefert die Menge der betroffenen Zeilen zurück, wobei allerdingsINSERT, UPDATE und DELETE immer 0E0 vermelden. Bei einem Fehler würdedagegen der Wert undef ausgegeben werden.

Sie finden das Skript mit dem Dateinamen mysql02.pl auf der beilie-genden CD-ROM.

��� �������� ���������

Richtig nett wird es natürlich, wenn man die SQL-Befehle selber zusam-menbaut. Dann kann man zum Beispiel folgendes Skript schreiben, wel-ches einen Tabellennamen als Parameter enthält und den Inhalt dieserTabelle ausgibt:

#! /usr/bin/perl

# mysql03.pl table_name - Einfaches Beispiel zum Anzeigen von Tabellen

use DBI; use strict;

my ($dsn) = "DBI:mysql:musikschule"; # Verbindungstyp und Datenbanknamemy ($user_name); # Benutzername (hier leer)my ($password); # Kennwort (hier leer)my ($dbh, $sth); # Verbindungshandle, Query-Handlemy ($query); # SELECT-Befehlmy (@ary); # Datensatz

# Verbindung aufbauen$dbh = DBI->connect($dsn, $user_name, $password, {RaiseError => 1});

#SELECT-Befehl definieren$query = "SELECT * FROM ".$ARGV[0];

# Anfrage vorbereiten und ausführen$sth = $dbh->prepare($query);$sth->execute();

# Spaltenüberschriften ausgebenprint join("\t", @{$sth->{NAME}}), "\n";

# Schleife über alle Datensätzewhile(@ary = $sth->fetchrow_array()){ # Ausgabe des Datensatzes print join("\t", @ary), "\n";}

# Freigeben des Query-Handles$sth->finish();

# Verbindung beenden$dbh->disconnect();

exit(0);

������������ ��

Hier haben wir die $query zusammengesetzt, um mit $ARGV[0] den Namender Tabelle einbauen zu können. Natürlich muss man eigentlich nochFehlerbehandlungsroutinen einbauen…

Interessant ist noch die folgende Zeile:

print join("\t", @{$sth->{NAME}}), "\n";

$sth->{NAME} liefert eine Referenz auf ein Array zurück (die dann mit@{...} aufgelöst wird), in der die Namen der zurückgegebenen Spaltenstehen. Somit kann man hier unabhängig von der Tabelle die Spalten-namen ausgeben lassen:

prompt>perl mysql03.pl instrumentinstrument_id instr_name instr_gruppe1 Querflöte Holzbläser2 Klarinette Holzbläser3 Violine Streicher4 Viola Streicher5 Posaune Blechbläser6 Trompete Blechbläser7 Klavier Tasten8 Keyboard Tasten

Um eine SQL-Abfrage universell verwendbar zu machen, gibt es (haupt-sächlich) zwei verschiedene Varianten: der jeweilige Aufbau eines SQL-Befehls oder die Verwendung von Platzhaltern:

• Die erste Variante haben wir im Prinzip schon kennengelernt: inner-halb des Abfrage-Strings wird eine Variable genutzt:

$query = "SELECT * FROM schueler WHERE nachname LIKE '$name'";$sth = $dbh->prepare($query);$sth->execute();

$name wird von Perl innerhalb von doppelten Anführungszeichendurch den Inhalt der Variablen ersetzt. Möchte man doppelte Anfüh-rungszeichen innerhalb des SQL-Befehls nutzen, muss man sie durchein Fluchtzeichen (\) maskieren:

$query = "SELECT * FROM lehrer WHERE plz = \"$plz\"";

Eleganter und weniger fehleranfällig ist die Verwendung von qq{}. Al-les zwischen den geschweiften Klammern (für die man im Übrigenauch andere Zeichen wie // oder () nutzen kann, die allerdings häufi-ger selbst in Strings vorkommen) wird dann als Zeichenkette interpre-

Sie finden das Skript mit dem Dateinamen mysql03.pl auf der beilie-genden CD-ROM.

��� �������� ���������

tiert und so ausgewertet, als ob es von doppelten Anführungszeichenumschlossen wäre. Man muss sich dabei aber keine Gedanken um dasMaskieren der Anführungszeichen machen:

$query = qq{SELECT * FROM lehrer WHERE plz = "$plz"};

Die zweite Variante ist etwas aufwändiger. Dafür ermöglicht sie diemehrfache Verwendung von SQL-Befehlen mit verschiedenen Wer-ten, ohne dass der Befehl vom Server neu analysiert werden müsste.Das spart Zeit, wenn man häufig gleiche Anfragen, nur mit unter-schiedlichen Werten ausgestattet, schickt. Allerdings ist dieser Vorteilbei MySQL gerade nicht gegeben, da MySQL die SQL-Befehle nicht füreine spätere Verwendung zwischenspeichert. Es kann sich aber trotz-dem anbieten, den Zugriff auf diese Weise zu realisieren, falls man spä-ter einmal auch auf andere Datenbanksysteme zugreifen möchte.

Will man Platzhalter nutzen, verwendet man an Stelle der Werte dasFragezeichen im SQL-Befehl:

$query = "SELECT * FROM schueler WHERE nachname = ? AND vorname = ?";$sth = $dbh->prepare($query);

Bei der Ausführung des Befehls werden execute() nun die entspre-chenden Parameter in der angegebenen Reihenfolge mitgegeben:

$sth->execute("Schmidt", "Thomas");

Platzhalter lassen sich auch für die Ausgabe verwenden. So kann mandie Ergebnisspalten direkt mit Variablen verknüpfen, die dann bei je-dem fetch automatisch mit den aktuellen Werten gefüllt werden. Dasfolgende Skript gibt die Adressen aller Schüler aus, deren Nachnamemit den als Parameter übergebenen Buchstaben beginnt:

#! /usr/bin/perl

# mysql04.pl lastname - Einfaches Beispiel zum Verknüpfen von # Platzhaltern

use DBI; use strict;

my ($dsn) = "DBI:mysql:musikschule"; # Verbindungstyp und Datenbanknamemy ($user_name); # Benutzername (hier leer)my ($password); # Kennwort (hier leer)my ($dbh, $sth); # Verbindungshandle, Query-Handlemy ($query); # SELECT-Befehlmy ($queryname) = $ARGV[0]; # Filterkriteriummy ($lastname, $firstname, $street, $plz, $city); # Ausgabevariablen

������������ ��

# Anfügen eines Prozentzeichens, um immer auch nach Namensstücken suchen # zu können$queryname = $queryname."%";

# Verbindung aufbauen$dbh = DBI->connect($dsn, $user_name, $password, {RaiseError => 1});

#SELECT-Befehl definieren$query = "SELECT nachname, vorname, strasse, plz, ort " ."FROM schueler WHERE nachname LIKE ?";

# Anfrage vorbereiten und ausführen$sth = $dbh->prepare($query);$sth->execute($queryname);

# Ausgabespalten mit Variablen verbinden$sth->bind_col(1, \$lastname);$sth->bind_col(2, \$firstname);$sth->bind_col(3, \$street);$sth->bind_col(4, \$plz);$sth->bind_col(5, \$city);

# Schleife über alle Datensätzeprint "$firstname $lastname\n$street\n$plz $city\n\n" while $sth->fetch();

# Freigeben des Query-Handles$sth->finish();

# Verbindung beenden$dbh->disconnect();

exit(0);

Entscheidend für die Ausgabebindung ist hier der Befehlbind_col(...). Er sorgt dafür, dass die angegebenen Variablen mit derentsprechenden Ausgabespalte der Abfrage verbunden werden. Al-ternativ kann man auch alle Variablen auf einmal verbinden, indemman den Befehl bind_columns(...) nutzt:

$sth->bind_columns(\$lastname, \$firstname, \$street, \$plz, \$city);

Wichtig ist noch, dass bind_col(...) bzw. bind_columns(...) erst nachexecute(...) ausgeführt wird.

Sie finden das Skript mit dem Dateinamen mysql04.pl auf der beilie-genden CD-ROM.

��� �������� ���������

5.5.2 C++

Um mittels der Programmiersprache C++ auf MySQL zugreifen zu kön-nen, benötigt man MySQL++, die entsprechende API von MySQL. Siebietet eine umfassende Klassenstruktur, die man ähnlich nutzen kannwie andere Klassen der STL (Standard Template Library) von C++. Mankann mit MySQL++ sehr einfache und gut lesbare Programme schrei-ben, aber sie bietet eigentlich auch alles an, was man in irgendeinerForm für den Zugriff und die Kommunikation mit MySQL benötigt.

MySQL++ findet man auf den Web-Seiten von MySQL im Contrib-Bereich (http://www.mysql.com/Downloads/Contrib/).

Ein einfaches Beispiel für den Zugriff auf MySQL ist das folgende Pro-gramm, welches den Beispielen von MySQL++ entnommen und für dieMusikschule leicht modifiziert wurde:

// mysql01.cpp// Ausgabe von Daten

#include <windows.h>#include <iostream>#include <iomanip>#include <sqlplus.hh>

int main() { try { Connection con("musikschule");

// Erstellen eines Query-Objektes, welches mit con verbunden ist Query query = con.query();

// Definieren der Abfrage query << "select * from raum";

// Ausführen der Query und Rückgabe des Ergebnisses Result res = query.store();

// Anzahl der Datensätze cout << "Records Found: " << res.size() << endl << endl; Row row;

Die benötigten Dateien für Red Hat Linux und Windows (Borland undVisual C++) finden Sie auch auf der beiliegenden CD-ROM im Ver-zeichnis MySQL++.

������������ ��

// Überschrift cout.setf(ios::left); cout << setw(10) << "raum_id" << setw(20) << "raum_name" << setw(7) << "etage" << "personen" << endl << endl; // Iterator über die Ergebnismenge Result::iterator i; for (i = res.begin(); i != res.end(); i++) { row = *i; // Ausgabe der Daten cout << setw(10) << row[0] << setw(20) << row[1] << setw(7) << row["etage"] << row[3] << endl; } } catch (BadQuery er) { // Abfangen aller Fehler (außer s.u.) cerr << "Error: " << er.error << endl; return -1; } catch (BadConversion er) { // Konvertierungs-Fehler cerr << "Error: Tried to convert \"" << er.data << "\" to a \"" << er.type_name << "\"." << endl; return -1; } return 0;}

Kurz die einzelnen Schritte erläutert:

Connection con("musikschule");

Hiermit wird ein Objekt con erzeugt, welches eine Verbindung zu einerDatenbank aufbaut. Es lassen sich neben dem Namen der Datenbankdie üblichen Verbindungsparameter mit angeben.

Query query = con.query();query << "select * from raum";Result res = query.store();

Sie finden den Quelltext mit dem Dateinamen mysql01.cpp auf der bei-liegenden CD-ROM.

��� �������� ���������

Mittels con.query() wird ein Query-Objekt erzeugt, welches seine Anfra-gen über die Verbindung con stellt. Dieses Objekt wird dann über << miteinem SQL-Befehl gefüllt und über store() ausgeführt. Letztere Funktionliefert eine Ergebnismenge vom Typ Result zurück.

cout << "Records Found: " << res.size() << endl << endl;

res.size() liefert die Anzahl der Datensätze zurück, die die Abfrage erge-ben hat.

Row row;Result::iterator i;for (i = res.begin(); i != res.end(); i++) { row = *i;

Eine Row kann die Daten eines Datensatzes enthalten. Um alle Daten-sätze der Ergebnismenge ausgeben zu können, nutzt man einen Iteratorvom Typ Result::iterator.

cout << setw(10) << row[0] << setw(20) << row[1] << setw(7) << row["etage"] << row[3] << endl;

Auf die einzelnen Elemente einer Zeile kann man entweder über die Posi-tion der Spalte im Datensatz oder über den Namen der Spalte zugreifen.

catch (BadQuery er) { cerr << "Error: " << er.error << endl; return -1;} catch (BadConversion er) { cerr << "Error: Tried to convert \"" << er.data << "\" to a \"" << er.type_name << "\"." << endl;}

BadQuery und BadConversion sind Exceptions, die bei entsprechenden Feh-lern geworfen werden.

Als Ergebnis erhält man eine übersichtliche Tabelle mit allen Räumen:

prompt>mysql01Records Found: 5

raum_id raum_name etage personen

1 A5.33 5 42 B2.02 2 93 C4.16 4 114 A5.21 5 65 A5.23 5 6

������������ ��

Ein anderes Beispiel zeigt den Zugriff auf die Metadaten einer Abfrage:

// mysql02.cpp// Ausgabe von Meta-Daten

#include <windows.h>#include <iostream>#include <iomanip>#include <sqlplus.hh>

int main() { try { Connection con(use_exceptions); con.connect("musikschule"); Query query = con.query(); query << "SELECT * FROM schueler"; Result res = query.store(); cout << "Records Found: " << res.size() << endl << endl;

cout.setf(ios::left);

for (unsigned int i = 0; i < res.names().size(); i++) { cout << setw(3) << i << setw(15) << res.names(i).c_str() << setw(25) << res.types(i).sql_name() << endl; }

cout << endl; return 0; } catch (BadQuery er) { cerr << "Error: " << er.error << endl; return -1; } catch (BadConversion er) { cerr << "Error: Tried to convert \"" << er.data << "\" to a \"" << er.type_name << "\"." << endl; return -1; }}

Sie finden den Quelltext mit dem Dateinamen mysql02.cpp auf der bei-liegenden CD-ROM.

��� ����������� �������

Hier sei besonders auf die Nutzung der Elemente von Result hingewie-sen:

for (unsigned int i = 0; i < res.names().size(); i++) { cout << setw(3) << i << setw(15) << res.names(i).c_str() << setw(25) << res.types(i).sql_name() << endl;

res.names(...).c_str() gibt Zugriff auf die Spaltennamen der Ergebnis-menge, während res.types(...).sql_name() die Spaltentypen von MySQLausgibt.

Das Ergebnis lautet dann:

prompt>mysql02Records Found: 5

0 schueler_id INT UNSIGNED NOT NULL1 nachname VARCHAR NOT NULL2 vorname VARCHAR NULL3 geburtsdatum DATE NULL4 strasse VARCHAR NULL5 plz VARCHAR NULL6 ort VARCHAR NULL7 telefon VARCHAR NULL8 mobil VARCHAR NULL9 email VARCHAR NULL10 einzug TINYINT NULL11 bankname VARCHAR NULL12 blz VARCHAR NULL13 kontonr VARCHAR NULL14 kontoname VARCHAR NULL15 geschlecht TINYINT NULL

Auch bei MySQL++ gibt es die Möglichkeit, mit Platzhaltern zu arbeiten.Darauf will ich hier aber nicht weiter eingehen, sondern verweise aufdie Dokumentation, die zu MySQL++ auf den Web-Seiten von MySQLzu finden ist. Sie enthält noch einige weitere Beispiele, die zeigen, wieman die C++-API sinnvoll nutzen kann.

5.5.3 MyODBC

Entwickelt man ein Programm, welches mit einer Datenbank zusammen-arbeitet, wird man im Allgemeinen die Schnittstelle verwenden, die zumDatenbanksystem gehört. Das ermöglicht eine umfassende Kontrolle derKommunikation und ist meistens auch recht performant. Möchte manaber ein Programm entwickeln, welches mit möglichst vielen verschiede-

������������ ��

nen Datenbanksystemen zusammenarbeitet, benötigt man eine Zwi-schenschicht, die die Verbindungen zur Datenbank verwaltet und dieeinzelnen SQL-Anweisungen an die Datenbank übermittelt.

Solch eine Zwischenschicht ist ODBC (Open Database Connectivity).Diese Schnittstelle wurde von Microsoft entworfen und dient haupt-sächlich dazu, Windows-Programmen die Kommunikation mit Daten-banken (egal ob unter Windows oder Unix) zu ermöglichen. Mittler-weile gibt es auch unter verschiedenen Unix-Systemen Applikationen,die mit ODBC laufen, allerdings ist dies ein recht seltener Fall.

Um mit ODBC auf eine Datenbank zugreifen zu können, benötigt maneinen entsprechenden ODBC-Treiber für das Datenbank-System, der dieODBC-Aufrufe in die entsprechenden Anweisungen für die Datenbankumwandelt. Für MySQL gibt es MyODBC, ein Treiber für Windows undUnix, der einen großen Teil der möglichen ODBC-Befehle umsetzt. DaODBC für einen Unix-Client sehr selten genutzt wird, werde ich im Fol-genden nur auf die Windows-Variante eingehen.

Unterstützt ein Programm ODBC, kann es theoretisch jede Datenbankansprechen, die entsprechende Treiber anbietet. Theoretisch deshalb,weil viele Applikationen dann doch recht spezielle SQL-Befehle einzel-ner Datenbank-Systeme nutzen oder auf Systemtabellen zugreifen, dienur in einem einzelnen RDBMS vorkommen. Macht man sich aber dieMühe, wirklich plattformübergreifend zu entwickeln, kann man zumBeispiel zunächst mit einer kleinen Datenbank arbeiten, um dann spä-ter auf ein deutlich größeres und besser skalierbares System umzustei-gen.

MyODBC erhält man auf den Web-Seiten von MySQL unter http://www.mysql.com/downloads/api-myodbc.html. Dort kann man sich einekomprimierte Datei mit dem Namen myodbc-VERSION-OS.zip herunter-laden, wobei VERSION die aktuelle Version ist und OS für das Betriebs-system steht: „win95“ Windows 95, Windows 98 und Windows ME;„nt“ für Windows NT, Windows 2000 und Windows XP. Diese Dateipackt man aus (zum Beispiel mit WinZIP) und startet das Installations-programm SETUP.EXE (siehe Abbildung 5.13).

Die entsprechenden Dateien myodbc-2.50.39-win95.zip und myodbc-2.50.39-nt.zip finden Sie auch auf der beiliegenden CD-ROM im Ver-zeichnis MyODBC.

��� �������� ���������

Abbildung 5.13: Startbildschirm des Setups von MyODBC

Wenn man die Schaltfläche Continue anklickt, gelangt man in dasnächste Fenster (Abbildung 5.14), in dem man das entsprechende Pro-dukt auswählt – hier ist allerdings nur eines verfügbar…

Abbildung 5.14: Auswahl des Treibers bei der Installation von MyODBC

������������ ��

Nach einem kurzen Kopiervorgang erscheint ein Dialog zum Verwaltender ODBC-Datenquellen (Abbildung 5.15). Mit ihm kann man die auto-matisch mit eingerichtete MyODBC-Verbindung sample-MySQL zu ei-nem MySQL-Server konfigurieren. Den entsprechenden Dialog (Abbil-dung 5.16) erreicht man, wenn man auf die Schaltfläche Setup... klickt.Die einzelnen Optionen will ich im Folgenden beschreiben:

• Windows DSN-name: Dies ist der Name der ODBC-Verbindung. Erwird auch in der Liste der Verbindungen angezeigt und über ihnkann man die Verbindung in anderen Programmen ansprechen.

• MySQL host (name or IP): Der Server, auf dem sich die MySQL-Daten-bank befindet. Handelt es sich um den lokalen Rechner, sollte manhier localhost eintragen, ansonsten den entsprechenden Rechner-namen oder dessen IP-Adresse.

• MySQL database name: Der Name der Datenbank, die angesprochenwerden soll.

• User: Name des Benutzers, der angemeldet werden soll.

• Password: Kennwort des anzumeldenden Benutzers.

• Port (if not 3306): Port, über den der MySQL-Server angesprochenwird.

• SQL command on connect: SQL-Befehl, der gleich nach dem Verbindenausgeführt werden soll.

• Options that affects the behaviour of MyODBC: Optionen, mit denenman das Verhalten des MyODBC-Treibers steuern kann. In Abhängig-keit von der verwendeten Applikation kann es notwendig sein, eineoder mehrere der angegebenen Optionen zu aktivieren. Um zum Bei-spiel Daten mit Microsoft Excel weiterzuverarbeiten, empfiehlt essich, die Option Return matching rows zu aktivieren. Weitere Optionensind unter anderem im Manual von MySQL beschrieben.

Um auch später die ODBC-Verbindungen konfigurieren zu können,kann man den Windows-eigenen Dialog aufrufen. Unter Windows2000 zum Beispiel erreicht man ihn über Start/Einstellungen/System-steuerung, dort dann unter Verwaltung/Datenquellen (ODBC) (sieheauch Abbildung 5.17). Über die Schaltfläche Hinzufügen... (bzw. Add...bei der Konfigurationsoberfläche des MyODBC-Installers) gelangt manin das in Abbildung 5.18 dargestellte Fenster, in dem man einen Treiberauswählen kann, um eine neue Datenquelle (zum Beispiel für eine an-dere Datenbank oder einen anderen Server) zu erstellen.

Um zu testen, ob die Verbindung auch richtig eingerichtet ist, gibt esunter den Installationsdateien von MyODBC das Programm admn-demo.exe. Mit diesem Tool lassen sich Verbindungen zu einer ODBC-Datenquelle herstellen und SQL-Befehle absetzen.

��� �������� ���������

Startet man das Tool, öffnet sich gleich ein Dialog, in dem man Datei-datenquellen und Computerdatenquellen auswählen kann. Die Datei-datenquellen interessieren hier weniger, daher sollte man gleich auf dieRegisterkarte Computerdatenquelle wechseln (siehe Abbildung 5.19).Dort kann man dann zum Beispiel sample-MySQL auswählen. Nach demVerbindungsaufbau steht einem ein Eingabefenster zur Verfügung, indem man SQL-Befehle ausführen kann (siehe Abbildung 5.20). Dazugibt man zum Beispiel einen SELECT-Befehl ein und kann mit (Strg)(E)oder über den Menüpunkt Command/Execute den Befehl ausführen(siehe Abbildung 5.21). Wenn man hier Ergebnisse sieht, hat man dasZiel erreicht und kann die ODBC-Verbindung meist auch mit anderenProgrammen erfolgreich nutzen.

Es gibt noch einige andere Funktionen des Programms admndemo.exe,die hier aber nicht weiter aufgeführt werden sollen, so zum Beispiel dieMöglichkeit, sich Datenbank-, Tabellen- und Indexstrukturen ausgebenzu lassen.

Abbildung 5.15: ODBC-Datenquellen im Installationsprogramm von MyODBC

������������ ��

Abbildung 5.16: Einstellungsdialog von MyODBC

Abbildung 5.17: ODBC-Datenquellen unter Windows 2000

��� �������� ���������

Abbildung 5.18: Hinzufügen einer neuen Datenquelle

Abbildung 5.19: Auswahl einer Datenquelle in admndemo.exe

������������ ��

Abbildung 5.20: Eingabefenster bei admndemo.exe

Abbildung 5.21: Erfolgreiche ODBC-Verbindung mit admndemo.exe

��� ����������� �������

5.6 Fragen1. Wie kann man sich in regelmäßigen Abständen Statusänderungen

anzeigen lassen?

2. Auf welchem Weg lässt sich eine Datenbank komplett auf einen an-deren Server transportieren?

3. Über welches Modul sollte man in Perl eine MySQL-Datenbank an-sprechen?

4. Wie kann man in mysql die Befehle und Ausgaben aufzeichnen?