MySQL  

The World's Most Popular Open Source Database
 
Unternehmen | Produkte | Dienstleistungen | Dokumentation | News | Portale | Downloads
Quick links: Sitemap | Suche | Schulung | Support | Beratung | Partner | Jobs | Bestellen | Mailinglisten

MySQL-Referenzhandbuch für Version 4.0.5-beta


1 Allgemeine Informationen über MySQL

MySQL ist ein sehr schneller und robuster, Multi-Thread und Multi-User SQL-Datenbank-Server (SQL = Structured Query Language, strukturierte Abfrage-Sprache). Die Einsatzgebiete des MySQL Server liegen in Hochleistungsapplikationen und in der Einbindung in weit verbreitete Massen-Software. MySQL ist eine Schutzmarke von MySQL AB.

Die MySQL Software steht unter einer Doppellizenz. Sie können sie entweder frei im Sinne der GNU GENERAL PUBLIC LICENSE (http://www.gnu.org/licenses/) verwenden, oder Sie erwerben eine komerzielle Lizenz, wenn Sie nicht durch die Restriktionen der GPL gebunden sein wollen. See section 2.4.4 MySQL-Lizenzpolitik.

die MySQL Homepage enthält die letzten Informationen über MySQL.

Die folgende Liste beschreibt nützliche Teile des Handbuchs.

WICHTIG:

Berichte zu Fehlern (oft Bugs genannt) sowie Fragen und Bemerkungen sollten an die Mailingliste geschickt werden: mysql@lists.mysql.com. See section 2.6.2.3 Wie man Bugs oder Probleme berichtet. Das mysqlbug Skript sollte benutzt werden, um Fehlerberichte zu erzeugen. Bei Quelltext-Distributionen liegt das mysqlbug Skript im `scripts' Verzeichnis. Bei Binärdistributionen liegt mysqlbug im `bin' Verzeichnis. Wenn Sie einen empfindlichen Sicherheits-Bug in MySQL gefunden haben, sollten Sie eine E-Mail an security@mysql.com schicken.

2 Vorbemerkungen zum deutschen Handbuch

Die Übersetzung einer so umfangreichen technischen Dokumentation wie des MySQL-Referenzhandbuchs ist schon eine besondere Herausforderung. Zumindest für jemanden, der seine Zielsprache ernst nimmt:

Womit wir auch schon bei der besonderen Herausforderung wären: Jeder, der sich mit Transaktionen auskennt, weiß, dass beim Fehlschlagen einer solchen ein Rollback-Befehl ausgeführt wird. Dieses Hauptwort ins Deutsche zu übersetzen, würde zum Verständnis wenig beitragen - im Gegenteil.

Damit bleiben alle technischen Fachbegriffe, die sich so und nicht anders etabliert haben, englisch:

Die Fallstricke einer Übersetzung stecken allerdings in den Details:

Richtig spannend wird die Übersetzung bei Wörtern, die in der deutschen Fachsprache zumeist englisch verwendet werden, obwohl es passende deutsche Entsprechungen gibt:

Alle diese Entsprechungen, bei denen die deutsche Sprache eher in Vergessenheit geraten ist, wurden zweisprachig aufgenommen. Beispiele:

Gelegentlich wird auch in diesem Handbuch die "Performance getuned", neue "Features" eines MySQL-"Release" werden beschrieben usw. Anregungen für eine weiter gehende Eindeutschung nimmt der Übersetzer gern entgegen. Insbesondere gilt das auch für Hinweise zur Verkürzung deutscher Ausdrücke. Beispielsweise heißt "case sensitive" (14 Buchstaben) im Handbuch "abhängig von der verwendeten Groß-/Kleinschreibung" (44 Buchstaben).

Letzter Punkt: Die Übersetzung erfolgte in äußerst enger Anlehnung an das englischsprachige Original. Nichts wurde hinzugefügt (ausser diesem Vorwort), geändert oder weggelassen (Ausnahme: die Geschichte der Änderungen (ChangeLog) vor Version 3.23). Es liegt in der Natur der Dinge, dass weder Original noch Übersetzung frei von Fehlern sind (obwohl wir das anstreben). Berichten Sie bitte Übersetzungsfehler, stilistische "Bugs", die das Verständnis beeinträchtigen und sonstige Anmerkungen zur Übersetzung direkt an:

Stefan Hinz, handbuch@mysql.com

Berlin, im Februar 2002

Stefan Hinz, iConnect GmbH Berlin

2.1 Über dieses Handbuch

Das ist ein Referenzhandbuch. Es enthält keine allgemeinen Anleitungen zu SQL oder relationalen Datenbankkonzepten.

Da die MySQL Datenbank Software eine laufende Weiterentwicklung erfährt, wird das Handbuch regelmäßig aktualisiert. Die jeweils aktuellste Version dieses Handbuchs befindet sich unter http://www.mysql.com/documentation/. Dieses Handbuch ist gegenwärtig verfügbar in Texinfo, als Klartext (plain text), Info, HTML, PostScript und PDF. Das Primärdokument ist die Texinfo-Datei. Die HTML-Version wird automatisch produziert, indem eine modifizierte Version von texi2html benutzt wird. Die Klartext- und Info- Versionen werden mit makeinfo hergestellt. Die PostScript-Version wird mit texi2dvi und dvips produziert. Die PDF-Version wird mit pdftex hergestellt.

Wenn Sie Schwierigkeiten haben, Informationen zu finden, beachten Sie bitte auch die durchsuchbare PHP Version des Handbuchs unter http://www.mysql.com/doc/.

Wenn Sie Vorschläge für Hinzufügungen oder Korrekturen dieses Handbuchs haben, schicken Sie sie bitte an das Handbuch-Team: docs@mysql.com.

Dieses Handbuch wurde geschrieben und wird gewartet von David Axmark, Michael (Monty) Widenius, Jeremy Cole, und Paul DuBois. Andere Kontributoren sind unter section F Danksagungen aufgelistet. Die deutsche Übersetzung stammt von Stefan Hinz. Für die Aktualität ist Jan Lehnardt zuständig.

Das Copyright (2002) für dieses liegt bei der schwedischen Firma MySQL AB. See section 2.4.2 Copyrights und Lizenzen, die von MySQL verwendet werden..

2.1.1 Konventionen in diesem Handbuch

Dieses Handbuch benutzt bestimmte typographische Konventionen:

constant
Schriftart gleicher Breite (nicht-proportionale Schrift) wird für Befehle und Optionen benutzt, für SQL-Statements, Datenbank-, Tabellen- und Spaltennamen, für C- und PERL-Code und für Umgebungsvariablen. Beispiel: ``Um festzustellen, wie mysqladmin funktioniert, rufen Sie den Befehl mit der --help Option auf.''
`filename'
Schriftart gleicher Breite, die von Anführungszeichen umgeben ist, wird für Datei- und Pfadnamen benutzt. Beispiel: ``Die Distribution wird im Verzeichnis `/usr/local/' installiert.''
`c'
Schriftart gleicher Breite, die von Anführungszeichen umgeben ist, wird auch benutzt um Zeichenfolgen anzuzeigen. Beispiel: ``Um ein Platzhalterzeichen einzugeben, benutzen Sie das `%' Zeichen.''
italic
Kursivschrift wird für Hervorhebungen verwendet, wie in diesem Beispiel.
boldface
Fettschrift wird für Namen von Zugriffsrechten verwendet (zum Beispiel: ``Gewähren Sie das process Zugriffsrecht nicht leichtfertig'') und gelegentlich, um besonders starke Hervorhebungen zu kennzeichnen.

Wenn Befehle gezeigt werden, die durch ein bestimmtes Programm ausgeführt werden sollen, wird dieses Programm durch einen Prompt (Eingabeaufforderung) vor dem Befehl angezeigt. Der shell> Prompt zum Beispiel zeigt an, dass Sie den Befehl von Ihrer Login-Shell aus ausführen sollen. mysql> zeigt an, dass Sie den Befehl vom mysql Client-Programm aus ausführen sollen:

shell> geben sie hier ein shell-kommando ein
mysql> geben sie hier ein mysql-kommando ein

Shell-Befehle werden mit der Bourne-Shell-Syntax dargestellt. Wenn Sie eine csh-Shell benutzen, müssen die Befehle evtl. etwas anders eingegeben werden. Das folgende Beispiel zeigt, wie mit der Bourne-Shell eine Umgebungsvariable gesetzt wird und anschließend ein Befehl abgesetzt wird:

shell> VARNAME=wert irgendein_befehl

Um csh auszuführen, würden Sie folgende Sequenz ausführen:

shell> setenv VARNAME wert
shell> irgendein_befehl

Oft müssen Datenbank-, Tabellen- und Spaltennamen in konkreten Befehlen ersetzt werden. Um anzuzeigen, dass eine solche Ersetzung notwendig ist, benutzt dieses Handbuch db_name, tbl_name und col_name. Sie könnten zum Beispiel folgendes Statement sehen:

mysql> SELECT spalten_name FROM datenbank_name.tabellen_name;

Wenn Sie ein ähnliches Statement eingeben wollen, müssen Sie Ihre eigenen Datenbank-, Tabellen- und Spaltennamen eingeben, zum Beispiel wie folgt:

mysql> SELECT autor_name FROM bibliothek.autorenliste;

SQL-Statements können in Groß- und Kleinschreibung geschrieben werden. Wenn dieses Handbuch SQL-Statements darstellt, wird Großschreibung verwendet, um spezielle Schlüsselworte in diesem Kontext hervorzuheben. Kleinschreibung wird für den Rest des Statements verwendet. Folgendes könnten Sie im Kontext des SELECT Statements sehen:

mysql> SELECT count(*) FROM tabellen_name;

Im Kontext der COUNT() Funktion hingegen könnte dasselbe Statement wie folgt geschrieben werden:

mysql> select COUNT(*) from tabellen_name;

Wenn keine besondere Hervorhebung beabsichtigt wird, werden alle Schlüsselworte in Großschreibung dargestellt.

In Syntax-Beschreibungen werden eckige Klammern (`[' und `]') benutzt, um wahlfrei (optionale) Wörter oder Klauseln anzuzeigen:

DROP TABLE [IF EXISTS] tabellen_name

Wenn ein Syntaxelement aus einer Anzahl von Alternativen besteht, werden die Alternativen durch gerade Striche (`|') voneinander getrennt. Wenn genau ein Element aus einer Anzahl von Möglichkeiten ausgewählt werden (kann), werden die Alternativen mit eckigen Klammern aufgelistet (`[' und `]'):

TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)

Wenn genau ein Element aus einer Anzahl von Möglichkeiten ausgewählt werden muss, werden die Alternativen innerhalb geschweifter Klammern aufgelistet (`{' und `}'):

{DESCRIBE | DESC} tbl_name {col_name | wild}

2.2 Was ist MySQL?

MySQL, die populärste Open Source SQL-Datenbank, wird von MySQL AB zur Verfügung gestellt. MySQL AB ist ein kommerzielles Unternehmen, dessen Geschäft darin besteht, Serviceleistungen rund um die MySQL-Datenbank zur Verfügung zu stellen. See section 2.3 Was ist MySQL AB?.

MySQL ist ein Datenbank-Managementsystem.
Eine Datenbank ist eine strukturierte Sammlung von Daten. Das kann alles sein - von einer einfachen Einkaufsliste über eine Bildergalerie bis zu riesigen Informationsmengen in einem Unternehmensnetzwerk. Um Daten zu einer Computer-Datenbank hinzuzufügen, auf sie zuzugreifen und sie zu verarbeiten, benötigen Sie ein Datenbank-Managementsystem wie MySQL. Weil Computer sehr gut darin sind, große Datenmengen zu handhaben, spielt Datenbank-Management eine zentrale Rolle im Computer-Bereich, sowohl bei Anwendungen, die allein laufen (Stand-Alone-Utilities) als auch als Teil anderer Anwendungen.
MySQL ist ein relationales Datenbank-Managementsystem.
Eine relationale Datenbank speichert Daten in separaten Tabellen, anstatt sie alle in einem einzigen großen Speicherraum unterzubringen. Hierdurch werden hohe Geschwindigkeit und Flexibilität erreicht. Die Tabellen werden durch definierte Beziehungen verbunden (Relationen), was es möglich macht, Daten aus verschiedenen Tabellen auf Nachfrage zu kombinieren. Der SQL-Teil von MySQL steht für "Structured Query Language" (strukturierte Abfragesprache) - die verbreitetste standardisierte Sprache für Datenbankzugriffe.
MySQL ist Open-Source-Software.
Open Source bedeutet, dass es für jeden möglich ist, solche Software zu benutzen und zu verändern. Jeder kann MySQL aus dem Internet herunter laden und benutzen, ohne irgend etwas zu bezahlen. Jeder, der daran interessiert ist, kann den Quelltext studieren und den eigenen Bedürfnissen entsprechend verändern. MySQL benutzt die GPL (GNU General Public License) http://www.gnu.org, um festzulegen, was Sie mit der Software tun dürfen und was Sie nicht tun dürfen, abhängig von unterschiedlichen Situationen. Wenn Ihnen die GPL Probleme bereitet oder wenn Sie MySQL in eine kommerzielle Anwendung einbetten müssen, können Sie eine kommerziell lizensierte Version von uns erwerben.
Warum sollten Sie MySQL benutzen?
MySQL ist sehr schnell, zuverlässig und leicht zu benutzen. Wenn Sie nach diesen Eigenschaften suchen, sollten Sie MySQL ausprobieren. MySQL besitzt eine ganze Reihe praktischer Features, die in enger Kooperation mit unseren Benutzern entwickelt wurden. Einen Performance-Vergleich zwischen MySQL und einigen anderen Datenbank-Managementsystemen finden Sie auf unserer Benchmark-Seite. See section 6.1.4 Die MySQL-Benchmark-Suite. MySQL wurde ursprünglich entwickelt, um sehr große Datenbanken handhaben zu können, und zwar sehr viel schneller als existierende Lösungen. Es wurde mehrere Jahre in höchst anspruchsvollen Produktionsumgebungen eingesetzt. Heutzutage bietet MySQL eine umfangreiche Reihe sehr nützlicher Funktionen. Connectivity, Geschwindigkeit und Sicherheit machen MySQL äußerst geeignet, um auf Datenbanken über das Internet zuzugreifen.
Die technischen Features von MySQL
Weiter führende technische Informationen finden Sie unter section 7 MySQL-Sprachreferenz. MySQL ist ein Client-Server-System, das aus einem multi-thread SQL-Server besteht, der unterschiedliche Backends, verschiedene Client-Programme und -Bibliotheken, Verwaltungswerkzeuge und etliche Programmschnittstellen unterstützt. Wir stellen MySQL auch als multi-thread Bibliothek zur Verfügung, die Sie mit Ihren Anwendungen verknüpfen können, um ein kleineres, schnelleres und leichter zu bedienendes Produkt zu erhalten.
MySQL stellt beigesteuerte (contributed) Software in großer Menge
zur Verfügung. Es ist sehr wahrscheinlich, dass Ihre Lieblingsanwendung oder -sprache bereits MySQL unterstützt.

Offiziell wird MySQL 'Mai Ess Ku Ell' ausgesprochen (nicht 'Mai Siekwel'). Wir vermeiden allerdings, Leute zu korrigieren, die Mai-Siekwel sagen.

Wir fingen ursprünglich mit der Intention an, den mSQL-Code zu benutzen, um unsere eigenen Tabellen anzusprechen, wobei wir unsere eigenen schnellen Low-Level-Routinen (ISAM) benutzten. Nach einigem Testen gelangten wir allerdings zur Überzeugung, dass mSQL weder schnell noch flexibel genug wäre, um unsere Anforderungen abzudecken. Dies resultierte in einer neuen SQL-Schnittstelle zu unserer Datenbank, allerdings mit fast derselben API-Schnittstelle, wie sie mSQL benutzt. Diese API wurde gewählt, weil sie es erlaubte, Code von Drittanbietern einfach zu portieren. Die Entstehung des Namens MySQL ist nicht völlig geklärt. Unser Basis-Verzeichnis und eine große Anzahl unserer Bibliotheken und Werkzeuge hatten immer schon das Präfix ``my'' während mehr als 10 Jahren. Wie auch immer, auch Montys Tochter (einige Jahre jünger) heißt My. Welcher der beiden Umstände MySQL den Namen gab, ist immer noch ein Rätsel, sogar für uns.

2.2.1 Die wichtigsten Features von MySQL

Die folgende Liste beschreibt einige wichtige Charakteristika von MySQL:

2.2.2 Wie stabil ist MySQL?

Dieser Abschnitt beschäftigt sich mit den Fragen ``Wie stabil ist MySQL?'' und ``Kann ich mich auf MySQL bei diesem Projekt verlassen?'' Wir werden versuchen, einige Dinge klar zu stellen und einige der wichtigeren Fragen zu beantworten, die offensichtlich viele Leute beschäftigen. Dieser Abschnitt wurde aus Informationen zusammen gestellt, die aus der Mailing-Liste gesammelt wurden (die sehr aktiv beim Berichten von Bugs ist).

Bei TcX funktioniert MySQL ohne jegliche Probleme in unseren Projekten seit Mitte 1996. Als MySQL einer breiteren Öffentlichkeit zugänglich gemacht wurde, fiel uns auf, dass es einige Teile von ``ungetestetem Code'' gab, die schnell von neuen Benutzern gefunden wurden, die Anfragen machten, die von unseren eigenen abwichen. Seitdem hat jedes neue Release weniger Portabilitätsprobleme als das vorhergehende (obwohl jedes viele neue Features hat).

Jedes Release von MySQL war benutzbar. Probleme gab es nur, wenn Benutzer anfingen, Code aus den ``Grauzonen'' zu benutzen. Natürlich wissen Benutzer von ausserhalb nicht, was diese Grauzonen sind, daher versucht dieser Abschnitt, die momentan bekannten aufzuzeigen. Die Beschreibungen hier beziehen sich auf Version 3.23 von MySQL. Alle bekannten und berichteten Bugs werden in der letzten Version behoben, mit Ausnahme der Bugs, die im Bugs-Abschnitt aufgelistet sind, was Dinge sind, die auf das Design zurückzuführen sind. See section 2.7.5 Bekannte Fehler und Design-Unzulänglichkeiten in MySQL.

MySQL ist in mehrfachen Ebenen (Layers) und verschiedenen unabhängigen Modulen geschrieben. Diese Module sind im Folgenden aufgeführt, wobei angezeigt wird, wie gut getestet jedes von ihnen ist:

Der ISAM Tabellen-Handler -- stabil
Dieser verwaltet Speicherung und Abfrage aller Daten in MySQL Version 3.22 und früher. In allen Releases von MySQL gab es nicht einen einzigen (berichteten) Bug in diesem Code. Die einzige Möglichkeit, eine zerstörte (korrumpierte) Tabelle zu erhalten, besteht darin, den Server mitten während eines Updates zu killen. Selbst dadurch ist es unwahrscheinlich, dass Daten unwiederbringlich zerstört werden, denn alle Daten werden zwischen Anfragen auf die Festplatte zurück geschrieben (flush). Es hat nicht einen einzigen Bug-Bericht gegeben, in dem von verlorenen Daten aufgrund von MySQL-Bugs berichtet wurde.
Der MyISAM Tabellen-Handler -- stabil
Dieser wurde in MySQL Version 3.23 hinzu gefügt. Er basiert zum großen Teil auf dem ISAM Tabellen-Code, hat aber eine Menge neuer und sehr nützlicher Features.
Der Parser und lexikalische Analysator -- stabil
Es hat seit sehr langer Zeit keinen einzigen berichteten Bug in diesem System gegeben.
Der C Client-Code -- stabil
Keine bekannten Probleme. Im frühen 3.20 Release gab es einige Einschränkungen hinsichtlich der Größe des Sende- / Empfangs-Puffers (buffer size). Ab Version 3.21 ist die Puffergröße jetzt dynamisch, bis zu einem Vorgabewert von 16 M.
Standard-Client-Programme -- stabil
Dies beinhaltet mysql, mysqladmin, mysqlshow, mysqldump und mysqlimport.
Basis-SQL -- stabil
Die grundlegenden SQL-Funktionen, Zeichenketten-Klassen und dynamisches Speicher-Handling. Nicht ein einziger berichteter Bug in diesem System.
Anfragen-Optimierer (Query optimizer) -- stabil
Bereichs-Optimierer (Range optimizer) -- stabil
Join-Optimierer (Join optimizer) -- stabil
Sperren (Locking) -- Gamma
Dies ist sehr system-abhängig. Auf einigen Systemen gibt es große Probleme, wenn Standard-Betriebssystem-Sperren verwendet wird (fcntl()). In solchen Fällen sollten Sie den MySQL-Daemon mit dem Flag --skip-locking laufen lassen. Bekannt ist, dass solche Probleme auf manchen Linux-Systemen vorkommen sowie auf SunOS, wenn NFS- gemountete Dateisysteme verwendet werden.
Linux-Threads -- stabil
Das hauptsächliche Problem fand sich im fcntl()-Aufruf, der durch Benutzung der --skip-locking-Option bei mysqld behoben werden kann. Einige Leute haben Lockup-Probleme mit Version 0.5 berichtet. Linux-Threads müssen rekompiliert werden, wenn Sie mehr als 1000 gleichzeitige Verbindungen benutzen wollen. Obwohl es möglich ist, so viele Verbindungen mit den vorgabemäßigen Linux-Threads laufen zu lassen (obwohl man nie über 1021 kommen wird), macht das vorgabemäßige Stack-Spacing von 2 MB die Applikation unstabil, und wir konnten einen Coredump reproduzieren, nachdem 1021 Verbindungen im Leerlauf (idle connections) hergestellt wurden. See section 3.6.1 Linux (alle Linux-Versionen).
Solaris 2.5+ pthreads -- stabil
Wir benutzen dies für unsere gesamte Produktionsarbeit.
MIT-pthreads (andere Systeme) -- stabil
Seit Version 3.20.15 gab es keine berichteten Bugs mehr, und keine bekannten Bugs seit Version 3.20.16. Auf einigen Systemen gibt es ein ``Misfeature'', das heißt einige Operationen sind recht langsam (1/20 Sekunde Schlafzyklus zwischen jeder Anfrage). Natürlich können MIT- Threads alles ein bisschen verlangsamen, aber Index-basierende SELECT-Statements werden üblicherweise in einem Zeit-Frame ausgeführt, also sollte es kein mutex locking/thread juggling geben.
Andere Thread-Implementierungen -- Beta - Gamma
Die Ports zu anderen Systemen sind noch sehr neu und können Bugs haben, möglicherweise auch in MySQL, aber in den meisten Fällen in der Thread- Implementierung selbst.
LOAD DATA ..., INSERT ... SELECT -- stabil
Einige Leute dachten, hier Bugs gefunden zu haben, aber üblicherweise haben sich diese als Missverständnisse heraus gestellt. Bitte sehen Sie zuerst im Handbuch nach, bevor Sie Bugs berichten!
ALTER TABLE -- stabil
Einige Änderungen in Version 3.22.12.
DBD -- stabil
Wird jetzt von Jochen Wiedmann gewartet (wiedmann@neckar-alb.de). Danke!
mysqlaccess -- stabil
Geschrieben und gewartet von Yves Carlier (Yves.Carlier@rug.ac.be). Danke!
GRANT -- stabil
große Änderungen in MySQL Version 3.22.12.
MyODBC (benutzt ODBC SDK 2.5) -- Gamma
Scheint mit einigen Programmen gut zu laufen.
Replikation -- Beta / Gamma
Wir arbeiten noch an der Replikation, also erwarten Sie nicht, dass diese schon felsenfest steht. Auf der anderen Seite benutzen MySQL- Benutzer diese bereits mit guten Resultaten.
BDB-Tabellen -- Beta
Der Berkeley-Datenbank-Code ist sehr stabil, aber wir verbessern immer noch die Schnittstelle zwischen MySQL und BDB-Tabellen, also wird es einige Zeit dauern, bevor dies so gut wie andere Tabellentypen getestet ist.
InnoDB-Tabellen -- Beta
Diese wurden MySQL kürzlich hinzu gefügt. Sie scheinen gut zu funktionieren und können nach einigen anfänglichen Tests benutzt werden.
Automatische Wiederherstellung von MyISAM-Tabellen - Beta
Dies betrifft nur den neuen Code, der beim Öffnen einer Tabelle nachsieht, ob diese korrekt geschlossen wurde und ein automatisches Überprüfen / Reparieren der Tabelle ausführt, falls das nicht der Fall war.
MERGE-Tabellen -- Beta / Gamma
Die Benutzung von Schlüsseln bei MERGE-Tabellen ist noch nicht sehr ausgetestet. Der restliche Teile des MERGE-Codes ist recht gut getestet.
FULLTEXT -- Beta
Textsuche scheint zu funktionieren, wird aber noch nicht viel eingesetzt.

MySQL AB stellt E-Mail-Support für zahlende Kunden bereit, aber die MySQL-Mailingliste bietet üblicher Weise Antworten für die meisten Fragen. Bugs werden meist direkt mit einem Patch behoben; für schwerwiegende Bugs gibt es fast immer ein neues Release.

2.2.3 Wie groß können MySQL-Tabellen sein?

MySQL Version 3.22 hat eine Begrenzung auf 4G bei der Tabellengröße. Mit dem neuen MyISAM in MySQL Version 3.23 wurde die maximale Tabellengröße auf 8 Millionen Terabytes (2 ^ 63 bytes) hochgeschraubt.

Beachten Sie allerdings, dass Betriebssysteme ihre eigenen Dateigrößen- Beschränkungen haben. Hier sind einige Beispiele:

Betriebssystem Dateigrößen-Beschränkung
Linux-Intel 32 bit 2G, 4G oder mehr, abhängig von der Linux-Version
Linux-Alpha 8T (?)
Solaris 2.5.1 2G (möglich sind 4G mit Patch)
Solaris 2.6 4G
Solaris 2.7 Intel 4G
Solaris 2.7 ULTRA-SPARC 8T (?)

Auf Linux 2.2 kann man größere Tabellen als 2G benutzen, wenn man den LFS-Patch für das ext2 Dateisystem benutzt. Auf Linux 2.4 existiert zusätzlich ein Patch für das ReiserFS, um Unterstützung für große Dateien zu erhalten.

Letztlich wird die Tabellengröße für MySQL normalerweise durch das Betriebssystem begrenzt.

Vorgabemäßig haben MySQL-Tabellen eine maximale Größe von etwa 4G. Sie können die maximale Tabellengröße für eine Tabelle mit dem SHOW TABLE STATUS-Befehl überprüfen oder mit myisamchk -dv tabellen_name. See section 5.5.5 SHOW-Syntax.

Wenn Sie größere Tabellen als 4G benötigen (und Ihr Betriebssystem dies unterstützt), sollten Sie die AVG_ROW_LENGTH- und MAX_ROWS-Parameter benutzen, wenn Sie Ihre Tabelle anlegen. See section 7.5.3 CREATE TABLE-Syntax. Sie können diese auch später setzen, mit ALTER TABLE. See section 7.5.4 ALTER TABLE-Syntax.

Falls auf Ihre große Tabelle nur mit Lesezugriff zugegriffen wird (read-only), können Sie auch myisampack benutzen, um mehrere Tabellen zu vereinen (merge) und sie zu einer zu komprimieren. myisampack komprimiert eine Tabelle üblicherweise mindestens um 50%, also können Sie effektiv viel größere Tabellen benutzen. See section 5.7.4 myisampack, MySQL-Programm zum Erzeugen komprimierter Nur-Lese-Tabellen.

Sie können die Dateibegrenzung des Betriebssystems für MyISAM Daten-Dateien umgehen, indem Sie die RAID-Option benutzen. See section 7.5.3 CREATE TABLE-Syntax.

Eine weitere Lösung kann die MERGE-Bibliothek darstellen, die Ihnen erlaubt, eine Sammlung identischer Tabellen zugleich zu benutzen. See section 8.2 MERGE-Tabellen.

2.2.4 Jahr-2000-Konformität

MySQL selbst hat keine Probleme mit der Jahr-2000-Konformität:

Probleme können Sie bekommen, wenn Sie MySQL mit Applikationen benutzen, die MySQL auf eine Art benutzen, die nicht Jahr-2000-sicher ist. Zum Beispiel speichern oder ändern viele alte Applikationen Jahresangaben, indem sie zweistellige Werte benutzen (was mehrdeutig ist), anstatt vierstellige Werte zu nehmen. Dieses Problem kann durch Applikationen verschlimmert werden, die Werte wie 00 oder 99 als Anzeiger ``fehlender'' Werte benutzen.

Leider sind diese Probleme möglicherweise schwer zu beheben, weil verschiedene Applikationen von unterschiedlichen Programmierern geschrieben sein können, von denen jeder einen anderen Satz von Konventionen und Funktionen benutzt haben kann, was die Handhabung von Datumsangaben betrifft.

Hier ist eine einfache Demonstration, die zeigt, dass MySQL keine Probleme mit Datumsangaben bis zum Jahr 2030 hat:

mysql> DROP TABLE IF EXISTS y2k;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE y2k (date date, date_time datetime, time_stamp timestamp);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO y2k VALUES 
    -> ("1998-12-31","1998-12-31 23:59:59",19981231235959),
    -> ("1999-01-01","1999-01-01 00:00:00",19990101000000),
    -> ("1999-09-09","1999-09-09 23:59:59",19990909235959),
    -> ("2000-01-01","2000-01-01 00:00:00",20000101000000),
    -> ("2000-02-28","2000-02-28 00:00:00",20000228000000),
    -> ("2000-02-29","2000-02-29 00:00:00",20000229000000),
    -> ("2000-03-01","2000-03-01 00:00:00",20000301000000),
    -> ("2000-12-31","2000-12-31 23:59:59",20001231235959),
    -> ("2001-01-01","2001-01-01 00:00:00",20010101000000),
    -> ("2004-12-31","2004-12-31 23:59:59",20041231235959),
    -> ("2005-01-01","2005-01-01 00:00:00",20050101000000),
    -> ("2030-01-01","2030-01-01 00:00:00",20300101000000),
    -> ("2050-01-01","2050-01-01 00:00:00",20500101000000);
Query OK, 13 rows affected (0.01 sec)
Records: 13  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM y2k;
+------------+---------------------+----------------+
| date       | date_time           | time_stamp     |
+------------+---------------------+----------------+
| 1998-12-31 | 1998-12-31 23:59:59 | 19981231235959 |
| 1999-01-01 | 1999-01-01 00:00:00 | 19990101000000 |
| 1999-09-09 | 1999-09-09 23:59:59 | 19990909235959 |
| 2000-01-01 | 2000-01-01 00:00:00 | 20000101000000 |
| 2000-02-28 | 2000-02-28 00:00:00 | 20000228000000 |
| 2000-02-29 | 2000-02-29 00:00:00 | 20000229000000 |
| 2000-03-01 | 2000-03-01 00:00:00 | 20000301000000 |
| 2000-12-31 | 2000-12-31 23:59:59 | 20001231235959 |
| 2001-01-01 | 2001-01-01 00:00:00 | 20010101000000 |
| 2004-12-31 | 2004-12-31 23:59:59 | 20041231235959 |
| 2005-01-01 | 2005-01-01 00:00:00 | 20050101000000 |
| 2030-01-01 | 2030-01-01 00:00:00 | 20300101000000 |
| 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 |
+------------+---------------------+----------------+
13 rows in set (0.00 sec)

Das zeigt, dass die DATE- und DATETIME-Typen für zukünftige Datumsangaben keine Probleme bereiten werden (sie handhaben Datumsangaben bis zum Jahr 9999).

Der TIMESTAMP-Typ, der zur Speicherung der aktuellen Zeit benutzt wird, hat nur einen Bereich bis zu 2030-01-01. TIMESTAMP hat einen Bereich von 1970 bis 2030 auf 32-Bit-Maschinen (vorzeichenbehafteter Wert). Auf 64-Bit-Maschinen handhabt dieser Spaltentyp bis zu 2106 (vorzeichenloser Wert).

Obwohl MySQL Jahr-2000-kompatibel ist, sind Sie dafür verantwortlich, mehrdeutige Eingaben zu vermeiden. Siehe section 2.2.4 Jahr-2000-Konformität wegen der Regeln, die MySQL anwendet, wenn mehrdeutige Datumsangaben gemacht werden (Datumsangaben, die zweistellige Jahreswerte verwenden).

2.3 Was ist MySQL AB?

MySQL AB ist das Unternehmen der MySQL Gründer und Hauptentwickler. MySQL AB wurde ursprünglich in Schweden von David Axmark, Allan Larsson und Michael Monty Widenius gegründet.

Alle Entwickler des MySQL Servers sind Angestellte dieses Unternehmens. Wir sind eine virtuelle Firma mit Mitarbeitern, die über die ganze Welt verstreut in aller Herren Länder sitzen. Der Hauptteil unserer Kommunikation untereinander, mit unseren Anwendern, Unterstützern und Partnern wird über das Internet abgewickelt

Wir haben uns der Entwicklung und Verbreitung des MySQL Datenbankservers verschrieben. MySQL hält das Copyright der MySQL Quelltexte, des MySQL Logos und dieses Handbuchs.. See section 2.2 Was ist MySQL?.

Die MySQL-Kernwerte zeigen unsere Verpflichtung gegenüber MySQL und Open Source.

Wir wollen, dass MySQL folgendes ist:

MySQL AB und die Leute von MySQL AB:

2.3.1 Geschäftsmodell und Dienstleistungen von MySQL AB

Eine der uns häufig gestellten Fragen ist: Wie kann man von etwas leben, das man kostenlos abgibt? Hier ist die Antwort: MySQL AB verdient Geld mit Support, Dienstleistungen, kommerziellen Lizenzen und Lizenzgebühren, das wir dazu verwenden, die Produktentwicklung zu finanzieren und die MySQL-Geschäftsfelder auszubauen.

Unser Unternehmen läuft seit der Gründung profitabel. Im Oktober 2001 akzeptierten wir eine Risikokapitalfinanzierung durch führende skandinavische Investoren und eine Handvoll Business-Angels. Die Investitionen werden genutzt, um unser Geschäftsmodell auf solide Füße zu stellen und eine Grundlage für nachhaltiges Wachstum zu schaffen.

2.3.1.1 Support

MySQL AB gehört den Gründern und Haupt-Entwicklern der MySQL-Datenbank und wird von ihnen betrieben. Die Entwickler fühlen sich verpflichtet, Kunden und anderen Benutzern Support zu bieten, um mit deren Bedürfnissen und Problemen in Kontakt zu bleiben. Unser gesamter Support wird durch qualifizierte Entwickler geleistet. Wirklich schwierige Fragen werden von Michael Monty Widenius beantwortet, der der erste Entwickler des MySQL-Servers ist. See section 2.4.1 Support den MySQL AB anbietet.

Um Support unterschiedlicher Grade zu bestellen, besuchen Sie bitte die Bestellseite unter https://order.mysql.com/. Wenn Sie nur beschränkten Zugriff auf das Internet haben, setzen Sie sich bitte mit unserem Vertrieb unter sales@mysql.com in Verbindung.

2.3.1.2 Training und Zertifizierung

MySQL AB führt Schulungen zu MySQL und verwandten Themen weltweit durch. Wir bieten sowohl offene Kurse als auch In-house-Trainings an, die auf die speziellen Bedürfnisse Ihres Unternehmens zugeschnitten sind. MySQL-Schulungen werden auch durch unsere Partner durchgeführt, die Authorised MySQL Training Center.

Unsere Schulungsmaterialien benutzen dieselben Beispiel-Datenbanken wie unsere Dokumentation und unsere Beispiel-Applikationen und werden ständig aktualisiert, um den Entwicklungsstand der neusten MySQL-Version widerzuspiegeln. Unsere Trainer erhalten Rückhalt vom Entwicklungsteam, um die Trainingsqualität und die kontinuierliche Entwicklung des Schulungsmaterials sicherzustellen. Das stellt auch sicher, dass keine während der Kurse aufgetretenen Fragen unbeantwortet bleiben.

Wenn Sie an unseren Schulungen teilnehmen, können Sie sicher sein, die Ziele zu erreichen, die Sie mit Ihren MySQL-bezogenen Applikationen anstreben. Ausserdem haben Sie folgende Vorteile:

Wenn Sie an unseren Schulungen Interesse als möglicher Teilnehmer oder Trainingspartner haben, besuchen Sie bitte die Seite unter http://www.mysql.com/training/. Wenn Sie nur beschränkten Zugriff auf das Internet haben, setzen Sie sich bitte mit unserem Trainingspersonal unter training@mysql.com in Verbindung.

Die Veröffentlichung des MySQL-Zertifizierungsprogramms ist für 2002 geplant. Details finden Sie unter http://www.mysql.com/training/certification.html. Wenn Sie stets die neusten Informationen über das MySQL-Zertifizierungsprogramm haben wollen, schicken Sie bitte eine E-Mail an certification@mysql.com.

2.3.1.3 Beratung

MySQL AB und seine authorisierten Partner bieten Benutzern des MySQL-Servers und denen, die ihn in ihre Software einbetten wollen, Beratungsleistungen, weltweit.

Unsere Berater können Ihnen helfen, Ihre Datenbanken zu entwerfen und zu optimieren, effiziente Anfragen zu konstruieren, Ihre Plattform auf optimale Performance zu tunen, Migrationsprobleme zu lösen, Replikation aufzusetzen, robuste transaktionale Applikationen zu bauen und vieles mehr. Wir helfen auch Kunden dabei, den MySQL-Server für den Großflächigen Einsatz in ihre Produkte und Applikationen einzubauen.

Unsere Berater arbeiten in enger Kooperation mit unserem Entwicklungsteam, was die technische Qualität unserer Dienstleistungen sicherstellt. Beratungsaufgaben erstrecken sich von zweitägigen Power-Start-Sessions bis zu Projekten, die Wochen und Monate dauern. Unsere Kompetenz deckt nicht nur den MySQL-Server ab, sondern auch Programmier- und Skripting-Sprachen wie PHP, Perl und andere.

Wenn Sie an unseren Beratungsleistungen interessiert sind oder ein Consulting-Partner werden wollen, besuchen Sie bitte unsere Seite unter http://www.mysql.com/consulting/. Wenn Sie nur beschränkten Zugriff auf das Internet haben, setzen Sie sich bitte mit unserem Beratungspersonal unter consulting@mysql.com in Verbindung.

2.3.1.4 Kommerzielle Lizenzen

Die MySQL-Datenbank wird unter der GNU General Public License veröffentlicht (GPL). Das bedeutet, dass die MySQL-Software kostenlos unter der GPL benutzt werden darf. Wenn Sie nicht an die GPL-Bedingungen gebunden sein wollen (was in der Folge bedeutet, dass auch Ihre eigenen Applikationen GPL werden), können Sie eine kommerzielle Lizenz für dasselbe Produkt unter https://order.mysql.com/ erwerben.

Weil MySQL AB das Copyright am MySQL-Server besitzt, können wir eine duale Lizensierung einsetzen, was heißt, dass dasselbe Produkt sowohl unter der GPL als auch unter einer kommerziellen Lizenz erhältlich ist. Das berührt in keiner Weise die Verpflichtung von MySQL AB gegenüber Open Source. Wegen Details, wann eine kommerzielle Lizenz erforderlich ist, sehen Sie bitte unter section 2.4.4 MySQL-Lizenzpolitik nach.

Wir verkaufen auch kommerzielle Lizenzen von Open-Source-GPL-Software Dritter. Ein gutes Beispiel hierfür ist der InnoDB-Tabellen-Handler, der ACID-Unterstützung, Sperren auf Zeilenebene, Wiederherstellung nach Abstürzen, Multiversionierung, Fremdschlüsselunterstützung und vieles mehr bietet.

2.3.1.5 Partnerprogramme

MySQL AB hat ein weltweites Partnerprogramm, dass Schulungskurse, Support, Beratung, Lösungen, Publikationen plus Weiterverkauf und Vertrieb von MySQL und verwandten Produkten beinhaltet. Partner erscheinen unter http://www.mysql.com/ auf der Website und erhalten das Recht, spezielle Versionen der MySQL-Schutzmarken zu benutzen, um ihre Produkte zu identifizieren und ihr Geschäft voranzutreiben. Wenn Sie interessiert sind, ein MySQL-AB-Partner zu werden, schicken Sie bitte eine E-Mail an partner@mysql.com.

Das Wort MySQL und das MySQL-Delphin-Logo sind Schutzmarken von MySQL AB. See section 2.4.3 MySQL-AB-Logos und -Schutzmarken.

2.3.1.6 Werbung

Die MySQL-Website (http://www.mysql.com/) ist bei Entwicklern und Benutzern beliebt. Im Oktober 2001 bedienten wir 10 Millionen Seitenanfragen (PageViews). Unsere Besucher repräsentieren eine Gruppe, die Kaufentscheidungen und Empfehlungen sowohl für Software als auch für Hardware trifft. 12% unserer Besucher genehmigen Kaufentscheidungen, lediglich 9% sind überhaupt nicht an Kaufentscheidungen beteiligt. Mehr als 65% haben innerhalb des letzten halben Jahres online eingekauft, 70% planen, in den nächsten Monaten einzukaufen. Wenn Sie Interesse haben, Werbebanner auf unserer Website http://www.mysql.com/ zu schalten, setzen Sie sich bitte mit advertising@mysql.com in Kontakt.

2.3.1.7 Kontaktinformationen

Die MySQL Website (http://www.mysql.com/) enthält die neusten Informationen über MySQL und MySQL AB.

Für Presseservice und Anfragen aller Art, die in unseren Veröffentlichungen (http://www.mysql.com/news/) nicht behandelt werden, wenden Sie sich bitte an press@mysql.com.

Zeitnahe, präzise Antworten auf technische Fragen erhalten Sie, wenn Sie unter order einen unserer Support-Verträge abschließen. MySQL-Support wird von den MySQL-Entwicklern geleistet, weshalb der Standard extrem hoch ist.

Informationen über MySQL Trainig erhalten Sie unter http://www.mysql.com/training/. Wenn Sie einen eingeschränkten Internetzugang haben, kontaktieren Sie bitte unser Trainingspersonal unter training@mysql.com. See section 2.3.1.2 Training und Zertifizierung.

Für Informationen über das MySQL Zertifizierungsprogramm erhalten Sie unter http://www.mysql.com/training/certification.html. Wenn Sie weiterhin über das MySQL Zertifizierungsprogramm informiert werden wollen, schreiben Sie eine E-Mail an certification@mysql.com. See section 2.3.1.3 Beratung.

Kommerzielle Lizenzen können online unter https://order.mysql.com/ abgewickelt werden. Dort finden Sie ausserdem Informationen darüber, wie Sie ihre Bestellung per Fax erledigen können. Wenn Sie Fragen bezüglich der Lizensierung haben, oder Sie ein Angebot über eine größere Lizenzerteilung erhalten wollen, füllen Sie bitte Das Kontaktformular auf unserer Website (http://www.mysql.com/) aus, oder schicken Sie eine E-Mail an licensing@mysql.com (für Lizenzfragen) oder an sales@mysql.com (für Verkaufsinformationen). See section 2.4.4 MySQL-Lizenzpolitik.

Wenn Sie daran interessiert sind, ein Werbebanner auf unserer Website (http://www.mysql.com/) zu schalten, schicken Sie bitte eine E-Mail an advertising@mysql.com. See section 2.3.1.6 Werbung.

Wenn Sie ein Unternehmen vertreten, dass an einer Partnerschaft mit MySQL interessiert ist, schicken Sie bitte eine E-Mail an partner@mysql.com.

Für weitere Informationen über die MySQL Schutzmarkenbestimmungen, beachten Sie bitte http://www.mysql.com/company/trademark.html oder kontaktieren Sie trademark@mysql.com. See section 2.4.3 MySQL-AB-Logos und -Schutzmarken.

Wenn Sie an einem der Jobs interessiert sind, die im jobs-Abschnitt aufgeführt sind, schicken Sie bitte eine E-Mail an jobs@mysql.com. Bitte senden Sie ihre CV nicht als Anhang an dieser mail mit, sondern fügen Sie sie lieber am Ende ihrer mail als Klartext (plain text) ein.

Allgemeine Diskussionen mit vielen unserer Benutzer können Sie auf den entsprechenden Mailing-Listen führen.

Fehlerberichte (Auch Bugreporte genannt), sowie Fragen und Kommentare, sollten an die Mailingliste mysql@lists.mysql.com gehen. Wenn Sie ein empfindliches Sicherheitsloch im MySQL Server gefunden haben, sollten Sie eine E-Mail an security@mysql.com schreiben. See section 2.6.2.3 Wie man Bugs oder Probleme berichtet.

Wenn Sie Benchmarkergebnis haben, die wir veröffentlichen können, kontaktieren Sie uns unter benchmarks@mysql.com.

Wenn Sie Vorschläge für Hinzufügungen oder Korrekturen dieses Handbuchs haben, schicken Sie sie bitte an das Handbuch-Team: docs@mysql.com.

Fragen zur Arbeitsweise oder zu Inhalten unserer Website(http://www.mysql.com/) stellen Sie bitte an webmaster@mysql.com.

Fragen über das MySQL Portal (http://www.mysql.com/portal/) können an portals@mysql.com geschickt werden.

Die Datenschutzbestimmungen von MySQL AB können Sie unter http://www.mysql.com/company/privacy.html einsehen. Für irgendwelche Fragen darüber, wenden Sie sich bitte an privacy@mysql.com.

Allgemeine Informationsanfragen schicken Sie bitte an info@mysql.com.

2.4 MySQL Support and Lizensierung

Dieser Abschnitt beschreibt die MySQL Support und Lizensierungsvereinbarungen

2.4.1 Support den MySQL AB anbietet

Wir versuchen, technischen Support in einem breiten und umfassenden Blickwinkel zu sehen. Fast jedes Problem im Zusammenhang mit MySQL-Software ist für uns wichtig, wenn es für Sie wichtig ist. Typischerweise suchen Kunden Hilfe dabei, wie man unterschiedliche Befehle und Dienstprogramme zum Funktionieren bringt, wie Performance-Flaschenhälse beseitigt werden können, wie man beschädigte Systeme repariert, wie sich Betriebssysteme oder Netzwerkkonfigurationen auf MySQL auswirken, wie man Datensicherung und Wiederherstellung optimal konfiguriert, wie man APIs benutzt usw. Unser Support deckt nur den MySQL-Server und unsere eigenen Dienstprogramme ab, nicht Produkte Dritter, die auf den MySQL-Server zugreifen, obwohl wir auch hierbei versuchen, zu helfen wo wir können.

Detaillierte Informationen über unsere unterschiedlichen Support-Optionen finden Sie auf https://order.mysql.com/, wo auch Support-Verträge online bestellt werden können. Wenn Sie nur beschränkten Zugriff auf das Internet haben, setzen Sie sich mit unserem Vertrieb unter sales@mysql.com in Verbindung.

Technischer Support ist wie eine Lebensversicherung. Sie können jahrelang ohne solches glücklich sein, doch wenn die Stunde schlägt, kann es zu spät sein, diese(n) zu kaufen! Wenn Sie den MySQL-Server für wichtige Applikationen nutzen und plötzlich Problemen begegnen, kann es möglicherweise zu lange dauern, alle Antworten selbst herauszufinden. Es kann daher sein, dass Sie unmittelbaren Zugriff auf die erfahrensten MySQL-Problemlöser benötigen, und da

2.4.2 Copyrights und Lizenzen, die von MySQL verwendet werden.

MySQL AB besitzt das Copyright des MySQL Quellcodes, der MySQL Logos and Schutzmarken und dieses Handbuch See section 2.3 Was ist MySQL AB?. Es gibt einige verschiedene Lizenzen, die für die MySQL Distribution relevant sind:

  1. Der MySQL-spezifische Quelltext, der benötigt wird, um die mysqlclient-Bibliothek zu kompilieren, ist unter der LGPL lizensiert. Programme im `client'-Verzeichnis sind GPL. Jede Datei hat einen Header, aus dem ersichtlich ist, welches Copyright für diese Datei gilt.
  2. Die Client-Bibliothek und die (GNU getopt)-Bibliothek werden von der ``GNU LIBRARY GENERAL PUBLIC LICENSE'' abgedeckt. See section L GNU LESSER GENERAL PUBLIC LICENSE.
  3. Der gesamte Quelltext des Servers und der (GNU readline)-Bibliothek werden von der ``GNU GENERAL PUBLIC LICENSE'' abgedeckt. See section K GNU GENERAL PUBLIC LICENSE. Diese findet sich unter anderem als Datei `COPYING' in den Distributionen.
  4. Einige Teile des Quelltextes (die regexp-Bibliothek) werden von einem Copyright in Berkeley-Art abgedeckt.
  5. Ältere Versionen von (3.22 und früher) stehen unter einer strikteren Lizenz (http://www.mysql.com/support/arrangements/mypl.html). Bitte beachten sie die Dokumentation der speziellen Version für weitere Informationen.
  6. Das Handbuch steht nicht unter einer GPL-artigen Lizenz. Die Benutzung des Handbuchs unterliegt den folgenden Bestimmungen. Bitte senden Sie eine E-Mail an docs@mysql.com für weitere Informationen oder wenn Sie daran interessiert sind, eine Übersetzung zu erstellen.

Für Informationen darüber, wie die MySQL Lizenzen in der Praxis arbeiten beachten Sie bitte section 2.4.4 MySQL-Lizenzpolitik. Siehe auch section 2.4.3 MySQL-AB-Logos und -Schutzmarken.

2.4.2.1 Verwendung des MySQL Servers unter einer kommerziellen Lizenz

Internet Service Provider (ISP) hosten oft MySQL-Server für ihre Kunden. Aufgrund der GPL-Lizenz ist hierfür keine Lizensierung erforderlich.

Auf der anderen Seite ermutigen wir Leute, ISPs zu benutzen, die MySQL-Support haben, und das wird ihnen Vertrauen geben, dass ihr ISP im Falle von Problemen mit ihrer MySQL-Installation helfen wird, das Problem zu lösen (in manchen Fällen mit der Hilfe des MySQL-Entwicklungsteams).

Alle ISPs, die auf dem neuesten Stand der Dinge bleiben wollen, sollten sich in die announce-Mailing-Liste eintragen, um auf der Hut zu sein vor schwerwiegenden Problemen, die für ihre MySQL-Installationen relevant sein könnten.

Beachten Sie bitte, dass ein ISP ohne MySQL-Lizenz seinen Kunden zumindest Lesezugriff auf den Quelltext der MySQL-Installation geben sollte, damit die Kunden feststellen können, dass diese korrekt gepatcht ist.

2.4.2.2 Einen Webserver betreiben, der MySQL benutzt

Wenn Sie MySQL in Verbindung mit einem Webserver unter Unix betreiben, brauchen Sie nicht für eine Lizenz zu bezahlen.

Das gilt selbst dann, wenn Sie einen kommerziellen Webserver betreiben, der MySQL benutzt, weil Sie nicht selbst eine eingebettete MySQL-Version verkaufen. Dennoch bitten wir Sie, in einem solchen Fall MySQL-Support zu kaufen, weil MySQL Ihrem Unternehmen hilft.

2.4.3 MySQL-AB-Logos und -Schutzmarken

Viele MySQL-Datenbankbenutzer wollen auf Ihren Websites, ihren Büchern und Packungsprodukten das MySQL-AB-Delphin-Logo zeigen. Wir begrüßen das und ermuntern dazu, weisen aber darauf hin, dass das Wort MySQL und das MySQL-Delphin-Logo Schutzmarken von MySQL AB sind und nur so benutzt werden dürfen, wie in unserer Schutzmarken-Richtlinie unter http://www.mysql.com/company/trademark.html festgelegt.

2.4.3.1 Das Original-MySQL-Logo

Das MySQL-Delphin-Logo wurde von der finnischen Werbeagentur Priority im Jahr 2001 entworfen. Der Delphin wurde als passendes Symbol für die MySQL-Datenbank gewählt, weil er schlau, schnell und schlank ist und mühelos durch die Daten-Ozeane navigiert. Ausserdem mögen wir Delphine.

Das Original-MySQL-Logo darf nur von Repräsentanten von MySQL AB und von Personen benutzt werden, die eine schriftliche Erlaubnis hierfür haben.

2.4.3.2 MySQL-Logos die ohne schriftliche Erlaubnis benutzt werden dürfen

Wir haben einen Satz spezieller Logos für vorbehaltliche Benutzung angelegt, die von unserer Website unter http://www.mysql.com/downloads/logos.html herunter geladen werden können und von Dritten auf ihren Websites ohne schriftliche Erlaubnis von MySQL AB benutzt werden dürfen. Der Gebrauch dieser Logos ist - wie der Name anzeigt - nicht völlig uneingeschränkt, sondern unterliegt unseren Schutzmarken-Richtlinien, die Sie auf unserer Website finden. Sie sollten diese Richtlinien lesen, wenn Sie planen, die Logos zu benutzen. Die Anforderungen sind im Wesentlichen:

Setzen Sie sich unter trademark@mysql.com mit uns in Verbindung, um wegen spezieller Arrangements anzufragen, die Ihren Bedürfnissen entsprechen.

2.4.3.3 Wann Sie eine Erlaubnis für die Benutzung des MySQL-Logos benötigen

In folgenden Fällen benötigen Sie eine schriftliche Erlaubnis von MySQL AB, bevor Sie die MySQL-Logos benutzen:

Aus rechtlichen und kommerziellen Gründen müssen wir die Benutzung der MySQL-Schutzmarken auf Produkten, Büchern usw. beobachten. Üblicherweise verlangen wir eine Gebühr für das Anzeigen von MySQL-AB-Logos auf kommerziellen Produkten, weil wir der Meinung sind, das es vertretbar ist, dass einige der Erlöse für die Weiterentwicklung der MySQL- Datenbank zurückfließen.

2.4.3.4 MySQL-AB-Partnerschafts-Logos

MySQL-Partnerschafts-Logos dürfen nur von Unternehmen und Personen benutzt werden, die eine schriftliche Partnerschaftsvereinbarung mit MySQL AB haben. Partnerschaften beinhalten eine Zertifizierung als MySQL-Trainer oder -Berater. Sehen Sie bitte unter section 2.3.1.5 Partnerprogramme nach.

2.4.4 MySQL-Lizenzpolitik

Die formalen Bedingungen der GPL-Lizenz stehen unter section K GNU GENERAL PUBLIC LICENSE. Im Wesentlichen ist unsere Lizenzpolitik und die Interpretation der GPL wie folgt:

Beachten Sie bitte, dass ältere Versionen von MySQL immer noch einer strengeren Lizenz unterliegen. Sehen Sie in der Dokumentation der betreffenden Version wegen entsprechender Informationen nach. Wenn Sie eine kommerzielle Lizenz benötigen, weil die GPL-Lizenz nicht zu den Anforderungen Ihrer Applikation passt, können Sie eine Lizenz unter https://order.mysql.com/ kaufen.

Für normalen internen Gebrauch kostet MySQL nichts. Sie brauchen uns nichts zu bezahlen, wenn Sie nicht wollen.

Eine Lizenz wird benötigt:

Eine Lizenz wird NICHT benötigt:

In Situationen, wo eine MySQL-Lizenz benötigt wird, brauchen Sie eine Lizenz pro Maschine, auf der der MySQL-Server läuft. Eine Mehrprozessor-Maschine zählt jedoch als eine einzelne Maschine, und es gibt keine Beschränkung hinsichtlich der Anzahl von MySQL-Servern, die auf einer Maschine laufen, oder hinsichtlich der Anzahl von Clients, die zur gleichen Zeit mit einem Server verbunden sind, der auf dieser Maschine läuft!

Falls Sie nicht sicher sind, ob für Ihre spezielle Benutzung von MySQL eine Lizenz erforderlich ist, lesen Sie diesen Abschnitt bitte nochmals, bevor Sie uns kontaktieren. See section 2.3.1.7 Kontaktinformationen.

Wenn Sie eine MySQL-Lizenz benötigen, ist die Bezahlung am einfachsten, wenn Sie das Lizenzformular auf dem Secure-Server von MySQL unter https://order.mysql.com/ benutzen.

2.4.4.1 Benutzung des Worts MySQL in Druckmaterialien oder

Präsentationen

MySQL AB begrüßt Verweise auf die MySQL-Datenbank, aber das Wort MySQL ist eine Schutzmarke von MySQL AB. Deshalb müssen Sie der ersten oder deutlichsten Erwähnung des Worts MySQL das Schutzmarken-Symbol TM hinzufügen, und wo angebracht deutlich machen, dass MySQL eine Schutzmarke von MySQL AB ist. Details entnehmen Sie bitte unserer Schutzmarken-Richtlinie unter http://www.mysql.com/company/trademark.html.

2.4.4.2 Benutzung des Worts MySQL in Unternehmens- und

Produktnamen

Die Benutzung des Worts MySQL in Produkt- und Unternehmensnamen oder in Internet-Domänen-Namen ist nur mit vorheriger schriftlicher Erlaubnis durch MySQL AB gestattet.

2.5 MySQL 4.0 kurz und bündig

Dateline: 16. Oktober 2001, Uppsala, Schweden

Lange durch MySQL AB angekündigt und lange von unseren Benutzern erwartet: Der MySQL-Server 4.0 ist jetzt in der Alpha-Version zum Herunterladen von http://www.mysql.com/ und unseren Mirrors verfügbar.

Die neuen Haupt-Features des MySQL-Servers 4.0 sind eng mit unserem bestehenden Geschäft und den Community-Nutzern verzahnt. Durch ihn wird die MySQL-Datenbank-Software als Lösung für geschäftskritische Schwerlast-Datenbanksysteme verbessert. Weitere neue Features zielen auf die Benutzer eingebetteter Datenbanken.

2.5.1 Schritt für Schritt

Das Erscheinen des MySQL-Servers 4.0 wird in mehreren Schritten erfolgen, wobei die erste Version 4.0.0 genannt wird und bereits die meisten neuen Features enthält. Zusätzliche Features werden in die Versionen 4.0.1, 4.0.2 usw. eingebaut, höchstwahrscheinlich innerhalb weniger Monate. MySQL 4.0 wird als Beta gekennzeichnet. In MySQL 4.1 werden dann weitere neue Features hinzugefügt. Es wird angestrebt, das Alpha-Release Anfang 2002 herauszubringen.

2.5.2 Für den sofortigen Entwicklungseinsatz

Es wird nicht empfohlen, Produktionssysteme auf den MySQL-Server 4.0 umzustellen, bis dieser in der Beta-Version veröffentlicht wird. Selbst das anfängliche Release hat unsere ausgiebigen Tests ohne jegliche Fehler durchlaufen, auf allen Plattformen, auf denen wir testen. Wegen der großen Zahl neuer Features empfehlen wir daher den MySQL-Server selbst in der Alpha-Version für Entwicklungsarbeiten, wobei in Betracht gezogen werden kann, dass der MySQL-Server 4.0 das Stadium "stabil" erreichen wird, bevor Applikationen hiermit veröffentlicht werden, die jetzt im Entwicklungsstadium sind.

2.5.3 Eingebettetes MySQL

libmysqld macht den MySQL-Server für einen erheblich ausgedehnten Bereich von Applikationen geeignet. Wenn man die eingebettete MySQL- Server-Bibliothek benutzt, kann man den MySQL-Server in unterschiedlichste Applikationen und elektronische Geräte einbetten, bei denen der Endbenutzer keinerlei Ahnung davon hat, dass ihnen eine Datenbank unterlegt ist. Der eingebettete MySQL-Server ist ideal für Benutzung hinter den Kulissen in Internet-Geräten, öffentlichen Kiosken, schlüsselfertigen Hardware-/Software-Einheiten, Hochlast-Internet- Servern oder Datenbanken, die auf CD-ROM vertrieben werden.

Viele Benutzer von eingebettetem MySQL können von der dualen Lizensierung der MySQL-Software profitieren. Neben der GPL-Lizenz sind auch kommerzielle Lizenzen für diejenigen verfügbar, die nicht an die GPL gebunden sein wollen. Die eingebettete MySQL-Bibliothek benutzt dieselbe Schnittstelle wie die normale Client-Bibliothek und ist daher angenehm und leicht zu benutzen. See section 9.4.9 libmysqld, die eingebettete MySQL-Server-Bibliothek.

2.5.4 Weitere ab MySQL 4.0.0 verfügbare Features

2.5.5 Zukünftige Features in MySQL 4.0

Für die kommenden Releases des MySQL-Servers 4.0 (4.0.1, 4.0.2 usw.) können Sie folgende Features erwarten, die noch in der Entwicklung sind:

2.5.6 MySQL 4.1, das folgende Entwicklungs-Release

Intern wird durch das neue .frm-Dateiformat für Tabellendefinitionen in MySQL-Server 4.0 die Grundlage für neue Features in MySQL-Server 4.1 gelegt, beispielsweise verschachtelte Unterabfragen, gespeicherte Prozeduren und Fremdschlüssel- Integritätsregeln, die ganz oben auf der Wunschliste vieler unserer Kunden stehen. Daneben werden auch einfachere Erweiterungen wie Multi- Tabellen-UPDATE-Statements hinzugefügt.

Nach diesen Ergänzungen werden Kritiker des MySQL-Datenbankservers es noch schwerer haben, auf Schwächen des MySQL-Datenbank-Managementsystems hinzuweisen. MySQL, das seit langem für seine Stabilität, Geschwindigkeit und Einfachheit der Benutzung bekannt ist, wird dann den Anforderungen sehr anspruchsvoller Käufer genügen.

2.6 MySQL-Informationsquellen

2.6.1 MySQL-Portale

Die MySQL-Portale (http://www.mysql.com/portal/) auf unserer Website bieten ein breites Spektrum MySQL-bezogener Informationen und Links. Sie sind so aufgebaut, dass Sie leicht die Dinge finden, die Sie interessieren.

Sie können sich als Benutzer registrieren. In diesem Fall können Sie alle Dinge in den Portalen kommentieren und bewerten und auch selbst Dinge beisteuern. Bei der Registrierung können Sie auch angeben, ob und - wenn ja - welche Newsletter aus welchen Kategorien Sie beziehen wollen.

Einige der momentanen MySQL-Portal-Kategorien:

2.6.2 MySQL-Mailing-Listen

Dieser Abschnitt führt Sie in die MySQL-Mailing-Listen ein und zeigt einige Richtlinien und ihre Benutzung auf.

2.6.2.1 Die MySQL-Mailing-Listen

Um die MySQL-Haupt-Mailing-Liste zu abonnieren, schicken Sie eine Nachricht an die E-Mail-Adresse mysql-subscribe@lists.mysql.com.

Um sich aus der MySQL-Haupt-Mailing-Liste auszutragen, schicken Sie eine Nachricht an die E-Mail-Adresse mysql-unsubscribe@lists.mysql.com.

Von Bedeutung ist nur die Adresse, unter der Sie Ihre Nachrichten abschicken. Betreffzeile und Text der Nachricht werden ignoriert.

Wenn Ihre Antwortadresse nicht gültig ist, können Sie Ihre Adresse explizit angeben. Fügen Sie einen Bindestrich zum Abonnement- oder Abmelde-Kommando hinzu, gefolgt von Ihrer Adresse, wobei das `@'-Zeichen in Ihrer Adresse durch `=' ersetzt wird. Um sich zum Beispiel mit your_name@host.domain einzutragen, schicken Sie eine Nachricht an mysql-subscribe-your_name=host.domain@lists.mysql.com.

Mails an mysql-subscribe@lists.mysql.com oder mysql-unsubscribe@lists.mysql.com werden automatisch vom ezmlm Mailing-Listen-Prozessor bearbeitet. Informationen über ezmlm sind auf The ezmlm Website verfügbar.

Um eine Nachricht an die Liste selbst zu schicken, schicken Sie eine Mail an mysql@lists.mysql.com. Schicken aber bitte keine Mail an mysql@lists.mysql.com, die das Abonnieren oder Austragen betrifft, denn Mails an diese Adresse werden automatisch an tausende anderer Benutzer verteilt.

Wenn Ihre lokale Site viele Abonnenten für mysql@lists.mysql.com hat, sollten Sie evtl. eine lokale Mailing-Liste einrichten, so dass Nachrichten, die von lists.mysql.com an Ihre Site gesandt werden, an die lokale Liste verteilt werden. In solchen Fällen wenden Sie sich bitte an Ihre Systemadministrator, um zur lokalen Mailing-Liste hinzugefügt oder aus ihr gelöscht zu werden.

Wenn Sie wollen, dass der Traffic einer Mailing-Liste in eine separate Mailbox Ihres E-Mail-Programms geleitet wird, setzen Sie einen Filter, der auf die E-Mail-Header (Kopfdaten) reagiert. Sie können dazu entweder den List-ID:- oder den Delivered-To:-Header benutzen, um die Listennachrichten zu erkennen.

Die folgenden MySQL-Mailing-Listen existieren:

announce-subscribe@lists.mysql.com announce
Diese Liste kündigt neue Versionen von MySQL und verwandter Programme an. Sie hat geringen Traffic; alle MySQL-Benutzer sollten sie abonnieren.
mysql-subscribe@lists.mysql.com mysql
Die Hauptliste für allgemeine MySQL-Diskussionen. Bitte beachten Sie, dass bestimmte Themen besser in spezialisierteren Listen diskutiert werden. Wenn Sie an die falsche Liste posten, erhalten Sie vielleicht keine Antwort!
mysql-digest-subscribe@lists.mysql.com mysql-digest
Die mysql-Liste in Digest-Form (zusammengefasst). Anstelle individueller Nachrichten wird einmal pro Tag eine große Mail mit allen Nachrichten dieses Tages geschickt.
bugs-subscribe@lists.mysql.com bugs
An diese Liste sollte Sie ausschließlich komplette, wiederholbare Bug-Berichte schicken, indem Sie das mysqlbug-Skript benutzen. (Wenn Sie unter Windows arbeiten, sollten Sie eine Beschreibung des Betriebssystems und der MySQL-Version hinzufügen.) Vorzugsweise sollten Sie den Problemfall mit der letzten stabilen oder Entwicklungs-Version von MySQL testen, bevor Sie den Bericht posten! Jeder sollte in der Lage sein, den Bug zu wiederholen, indem einfach mysql test < Skript auf den beigefügten Testfall angewandt wird. Alle Bugs, die auf dieser Liste gepostet werden, werden im nächsten MySQL-Release behoben oder dokumentiert! Wenn nur kleinere Code-Änderungen betroffen sind, werden wir zusätzlich ein Patch bereitstellen, das das Problem behebt.
bugs-digest-subscribe@lists.mysql.com bugs-digest
Die Digest-Version (zusammengefasst) der bugs-Liste.
internals-subscribe@lists.mysql.com internals
Eine Liste für Leute, die am MySQL-Code arbeiten. Auf dieser Liste kann man auch die MySQL-Entwicklung diskutieren und Patches posten.
internals-digest-subscribe@lists.mysql.com internals-digest
Die Digest-Version (zusammengefasst) der internals-Liste.
java-subscribe@lists.mysql.com java
Diskussionen über MySQL und Java, hauptsächlich über JDBC-Treiber.
java-digest-subscribe@lists.mysql.com java-digest
Eine java-Liste.
win32-subscribe@lists.mysql.com win32
Alles betreffend MySQL auf Microsoft-Betriebssystemen wie Win95, Win98, NT, XP, und Win2000.
win32-digest-subscribe@lists.mysql.com win32-digest
Die Digest-Version (zusammengefasst) der win32-Liste.
myodbc-subscribe@lists.mysql.com myodbc
Alles betreffend ODBC-Verbindungen zu MySQL.
myodbc-digest-subscribe@lists.mysql.com myodbc-digest
Die Digest-Version (zusammengefasst) der myodbc-Liste.
plusplus-subscribe@lists.mysql.com plusplus
Alles, was das Programmieren mit der C++-API von MySQL betrifft.
plusplus-digest-subscribe@lists.mysql.com plusplus-digest
Die Digest-Version (zusammengefasst) der plusplus-Liste.
msql-mysql-modules-subscribe@lists.mysql.com msql-mysql-modules
Eine Liste zur Perl-Unterstützung in MySQL. msql-mysql-modules
msql-mysql-modules-digest-subscribe@lists.mysql.com msql-mysql-modules-digest
Die Digest-Version (zusammengefasst) der msql-mysql-modules-Liste.

Alle Listen abonnieren Sie - und tragen sich wieder aus - auf dieselbe Art wie oben beschrieben. Tragen Sie in Ihre Mail zum Abonnieren oder Austragen die entsprechende Mailing-Liste ein anstelle von mysql. Um sich zum Beispiel für die myodbc-Liste einzutragen, schicken Sie eine Nachricht an myodbc-subscribe@lists.mysql.com oder myodbc-unsubscribe@lists.mysql.com.

Wenn Sie keine Antwort auf Ihre Fragen von der Mailing-Liste erhalten, ist eine Option, für den Support von MySQL AB zu bezahlen, was Sie in direkten Kontakt mit den MySQL-Entwicklern bringt. See section 2.4.1 Support den MySQL AB anbietet.

Die folgende Tabelle listet einige Mailing-Listen in anderen Sprachen als englisch auf. Beachten Sie, dass diese nicht von MySQL AB unterhalten werden. Daher können wir nicht für die Qualität dieser Listen garantieren.

mysql-france-subscribe@yahoogroups.com Eine französische Mailing-Liste
list@tinc.net Eine koreanische Mailing-Liste
Schicken Sie eine E-Mail mit dem Betreff subscribe mysql your@email.address an diese Liste.
mysql-de-request@lists.4t2.com Eine deutsche Mailing-Liste
Schicken Sie eine E-Mail mit dem Betreff subscribe mysql-de your@email.address an diese Liste. Informationen über diese Liste finden Sie unter http://www.4t2.com/mysql.
mysql-br-request@listas.linkway.com.br Eine portugiesische Mailing-Liste.
Schicken Sie eine E-Mail mit dem Betreff subscribe mysql-br your@email.address an diese Liste.
mysql-alta@elistas.net Eine spanische Mailing-Liste.
Schicken Sie eine E-Mail mit dem Betreff subscribe mysql your@email.address an diese Liste.

2.6.2.2 Wie man Fragen stellt oder Bugs berichtet

Bevor Sie einen Bug berichten oder eine Frage stellen, tun Sie bitte folgendes:

Wenn Sie weder im Handbuch noch in den Archiven eine Antwort finden können, versuchen Sie es mit Ihrem lokalen MySQL-Experten. Wenn Sie immer noch keine Antwort auf Ihre Frage finden, lesen Sie den nächsten Abschnitt über die Mailing-Listen unter mysql@lists.mysql.com.

2.6.2.3 Wie man Bugs oder Probleme berichtet

Einen guten Bug-Bericht zu schreiben braucht Geduld, aber es gleich beim ersten Mal richtig zu machen spart Ihnen und uns Zeit. Ein guter Bug-Bericht enthält einen kompletten Testfall für den Bug, der es sehr wahrscheinlich macht, dass wir ihn im nächsten Release beheben. Dieser Abschnitt hilft Ihnen, Ihren Bericht korrekt zu schreiben, damit Sie Ihre Zeit nicht damit verschwenden, etwas zu schreiben, was uns wenig oder gar nicht weiterhilft.

Wir ermutigen jeden, das mysqlbug-Skript zu benutzen, um einen Bug-Bericht anzufertigen (oder einen Bericht über irgendein anderes Problem), falls das möglich ist. Der mysqlbug findet sich im `Skripts'-Verzeichnis der Quelldistribution, bzw. im `bin'-Verzeichnis der Binärdistribution, im Verzeichnis unterhalb Ihres MySQL-Installationsverzeichnisses. Falls es Ihnen nicht möglich ist, mysqlbug zu benutzen, sollten Sie trotzdem alle notwendigen Informationen mitliefern, die in diesem Abschnitt aufgeführt sind.

Das mysqlbug-Skript hilft Ihnen, einen Bericht zu erstellen, der viele der folgenden Informationen automatisch einschließt, aber falls etwas Wichtiges fehlt, fügen Sie es bitte Ihrer Nachricht hinzu! Bitte lesen Sie diesen Abschnitt sorgfältig und stellen Sie sicher, dass alle hier beschriebenen Informationen in Ihrem Bericht enthalten sind.

Für gewöhnlich sollten Sie Ihren Bug-Bericht und Probleme an mysql@lists.mysql.com schicken. Wenn Sie einen Testfall erzeugen können, der den Bug klar demonstriert, sollten Sie ihn an die bugs@lists.mysql.com-Liste schicken. Beachten Sie, dass Sie nur einen kompletten, nachvollziehbaren Bug-Bericht an diese Liste schicken sollten, indem Sie das mysqlbug-Skript benutzen. Falls Sie unter Windows arbeiten, sollten Sie eine Beschreibung des Betriebssystems und der MySQL-Version hinzufügen. Vorzugsweise sollten Sie den Problemfall mit der letzten stabilen oder Entwicklungs-Version von MySQL testen, bevor Sie den Bericht posten! Jeder sollte in der Lage sein, den Bug zu wiederholen, indem einfach mysqltest < Skript auf den beigefügten Testfall angewandt wird. Alle Bugs, die auf dieser Liste gepostet werden, werden im nächsten MySQL-Release behoben oder dokumentiert! Wenn nur kleinere Code-Änderungen betroffen sind, werden wir zusätzlich ein Patch bereitstellen, das das Problem behebt.

Denken Sie daran, dass es immer möglich ist, auf eine Nachricht zu antworten, die zu viele Informationen enthält, aber nicht immer auf eine, die zu wenige Informationen enthält. Oft lassen Leute Fakten aus, weil sie denken, die Ursache eines Probleme zu kennen und annehmen, dass einige Details nicht von Wichtigkeit sind. Ein gutes Prinzip ist folgendes: Falls Sie im Zweifel sind, ob Sie etwas Bestimmtes mitteilen sollten, teilen Sie es mit! Es ist tausendmal schneller und weniger ärgerlich, ein paar Zeilen mehr in Ihrem Bericht zu schreiben, als gezwungen zu sein, noch einmal zu fragen und auf die Antwort zu warten, weil Sie beim ersten Mal nicht genug Informationen geliefert haben.

Die häufigste Fehler besteht darin, dass Leute die Versionsnummer der MySQL-Distribution, die sie benutzen nicht angeben, oder vergessen anzugeben, auf welcher Plattform sie MySQL installiert haben (inklusive der Betriebssystem-Version). Diese Informationen sind äußerst relevant, und in 99 von 100 Fällen ist der Bug-Bericht ohne sie nutzlos! Sehr oft erhalten wir Fragen wie 'Warum funktioniert das bei mir nicht?', nur um herauszufinden, dass das beschriebene Feature nicht in der benutzten MySQL-Version implementiert war, oder dass der Bug, der im Bericht beschrieben wurde, bereits in einer neueren MySQL-Version behoben wurde. Manchmal ist der Fehler plattformabhängig; in solchen Fällen ist es praktisch unmöglich, irgend etwas zu beheben, ohne das Betriebssystem und die Versionsnummer des Betriebssystems zu kennen.

Denken Sie auch daran, Informationen über Ihren Compiler einzuschließen, falls sie MySQL selbst kompilieren. Oft finden Leute Fehler in Compilern und denken, dass das Problem MySQL-bezogen ist. Die meisten Compiler werden permanent weiter entwickelt und werden von Version zu Version besser. Um festzustellen, ob ein Problem von Ihrem Compiler abhängt oder nicht, müssen wir wissen, welcher Compiler benutzt wird. Beachten Sie, dass jedes Compiler-Problem als Bug-Bericht betrachtet und deshalb entsprechend berichtet werden sollte.

Es ist äußerst hilfreich, wenn eine gute Beschreibung des Probleme in Ihrem Bug-Bericht eingeschlossen ist, das heißt ein gutes Beispiel aller Dinge, die Sie getan haben, die zu dem Problem führten, sowie das Problem selbst. Die besten Bug-Berichte sind diejenigen, die ein komplettes Beispiel zeigen, wie man den Bug oder das Problem reproduzieren kann. See section H.1.6 Einen Testfall herstellen, wenn Sie Tabellenbeschädigung feststellen.

Wenn ein Programm eine Fehlermeldung produziert, ist es sehr wichtig, diese in Ihren Bericht einzuschließen! Wenn wir in den Archiven der Programme suchen, ist es besser, wenn die Fehlernachricht exakt mit derjenigen übereinstimmt, die das Programm produziert. (Sogar Groß-/Kleinschreibung sollte berücksichtigt werden!) Sie sollten nie versuchen, sich daran zu erinnern, was die Fehlernachricht war; stattdessen sollten Sie die gesamte Nachricht per Kopieren und Einfügen in Ihrem Bericht unterbringen!

Wenn Sie ein Problem mit MyODBC haben, sollten Sie versuchen, eine MyODBC-Trace-Datei zu erstellen. See section 9.3.7 Probleme mit MyODBC berichten.

Bitten denken Sie daran, dass viele Leute, die Ihren Bericht lesen, dabei ein 80-Spalten-Anzeigegerät benutzen. Wenn Sie Berichte oder Beispiele erzeugen, indem Sie das mysql-Kommandozeilen-Werkzeug benutzen, sollten Sie deshalb die --vertical-Option (oder den \G-Statement-Begrenzer) für Ausgaben benutzen, die ansonsten die verfügbare Anzeigebreite überschreiten würden (zum Beispiel beim EXPLAIN SELECT-Statement; siehe dazu das Beispiel weiter unten). Bitte schließen Sie folgende Informationen in Ihren Bug-Bericht ein:

Wenn Sie ein Support-Kunde sind, schicken Sie bitte den Bug-Bericht an mysql-Support@mysql.com, damit dieser eine höhere Priorität in der Bearbeitung erfährt. Schicken Sie ihn gleichzeitig an die entsprechende Mailing-Liste, um zu sehen, ob schon jemand anderes das selbe Problem hatte (und vielleicht gelöst hat).

Informationen zu Bug-Berichten siehe MyODBC und section 9.3.4 Wie Sie Probleme mit MyODBC berichten.

Lösungen für häufig auftretende Probleme siehe See section A Probleme und häufige Fehler.

Wenn Ihnen Antworten individuell zugesandt werden und nicht an die Mailing-Liste, wird es als gute Etikette betrachtet, die Antworten zusammenzufassen und die Zusammenfassung an die Mailing-Liste zu schicken, damit andere von den Antworten profitieren können, die Ihnen geholfen haben, Ihr Problem zu lösen!

2.6.2.4 Richtlinien für die Beantwortung von Fragen auf der Mailing-Liste

Wenn Sie davon ausgehen, dass Ihre Antwort auf breites Interesse stößt, sollten Sie an die Mailing-Liste posten, statt direkt der Person zu antworten, die die Frage stellte. Versuchen Sie, Ihre Antwort so allgemein zu halten, dass auch andere als der ursprünglich Fragende von Ihrer Antwort profitieren können. Wenn Sie an die Liste posten, stellen Sie bitte sicher, dass Ihre Antwort kein Duplikat einer vorhergehenden Antwort ist.

Versuchen Sie, den wesentlichen Teil der Frage in Ihrer Antwort zusammenzufassen. Fühlen Sie sich nicht verpflichtet, die gesamte ursprüngliche Nachricht zu zitieren.

Bitte schicken Sie Ihre Mailnachrichten nicht im HTML-Format! Viele Benutzer lesen Nachrichten mit nicht HTML-fähigen Anwendungen!

2.7 Wie Standard-kompatibel ist MySQL?

Dieser Abschnitt beschreibt, wie sich MySQL zum ANSI SQL-Standard verhält. MySQL hat viele Erweiterungen zum ANSI SQL-Standard, und hier steht, welche das sind und wie man sie benutzt. Hier finden Sie auch Informationen über Funktionalität, die MySQL fehlt, und wie man mit diesen Unterschieden umgeht.

2.7.1 An welche Standards hält sich MySQL?

Entry-Level-SQL92. ODBC-Levels 0-2.

Wir beabsichtigen ANSI SQL99 vollständig zu unterstützen. Dies wollen wir jedoch keinesfalls auf Kosten von Geschwindigkeit oder Codequalität erreichen.

2.7.2 MySQL im ANSI-Modus laufen lassen

Wenn Sie mysqld mit der --ansi-Option starten, ändert sich folgendes Verhalten von MySQL:

Das ist dasselbe, als würde man --sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,SERIALIZE,ONLY_FULL_GROUP_BY benutzen.

2.7.3 MySQL-Erweiterungen zu ANSI SQL92

MySQL beinhaltet einige Erweiterungen, die Sie in anderen SQL-Datenbanken wahrscheinlich nicht finden werden. Passen Sie auf, wenn Sie diese benutzen, denn Ihr Code ist dann nicht mehr kompatibel mit anderen SQL-Servern. In einigen Fällen können Sie Code schreiben, der MySQL-Erweiterungen enthält und dennoch portabel ist, indem Sie Kommentare in der Form /*! ... */ benutzen. In diesem Fall wird MySQL den Code innerhalb des Kommentars parsen und ausführen wie jedes andere MySQL-Statement, aber andere SQL-Server werden die Erweiterungen ignorieren. Zum Beispiel:

SELECT /*! STRAIGHT_JOIN */ col_name FROM tabelle1, tabelle2 WHERE ...

Wenn Sie hinter '!' die Versionsnummer angeben, wird die Syntax nur ausgeführt, wenn die MySQL-Version gleich oder neuer als die benutzte Versionsnummer ist:

CREATE /*!32302 TEMPORARY */ TABLE (a int);

Je höher bedeutet, wenn Sie Version 3.23.02 oder neuer haben, wird MySQL das TEMPORARY-Schlüsselwort benutzen.

MySQL-Erweiterungen sind:

2.7.4 MySQL-Unterschiede im Vergleich zu ANSI SQL92

Wir versuchen möglichst, dass MySQL dem ANSI-SQL-Standard und dem ODBC-SQL-Standard folgt, aber in einigen Fällen macht MySQL Dinge auf andere Weise:

2.7.4.1 Sub-Selects

MySQL unterstützt momentan nur Sub-Selects der Form INSERT ... SELECT ... und REPLACE ... SELECT .... In anderen Zusammenhängen können Sie allerdings die Funktion IN() benutzen.

In vielen Fällen können Sie Ihre Anfragen ohne Sub-Selects schreiben:

SELECT * FROM tabelle1 WHERE id IN (SELECT id FROM tabelle2);

Das kann wie folgt umgeschrieben werden:

SELECT tabelle1.* FROM tabelle1,tabelle2 WHERE tabelle1.id=tabelle2.id;

Die Anfragen:

SELECT * FROM tabelle1 WHERE id NOT IN (SELECT id FROM tabelle2);
SELECT * FROM tabelle1 WHERE NOT EXISTS (SELECT id FROM tabelle2 where tabelle1.id=tabelle2.id);

Können wie folgt umgeschrieben werden:

SELECT tabelle1.* FROM tabelle1 LEFT JOIN tabelle2 ON tabelle1.id=tabelle2.id where tabelle2.id IS NULL

Für kompliziertere Unteranfragen (Subqueries) können Sie oft temporäre Tabelle anlegen, die die Unteranfrage enthalten. In einigen Fällen wird diese Option allerdings nicht funktionieren. Am häufigsten treten diese Fälle mit DELETE-Statements auf, wofür Standard-SQL keine Verknüpfungen (Joins) unterstützt. Für solche Situationen sind zwei Optionen verfügbar, solange MySQL noch keine Unteranfragen unterstützt.

Die erste Option besteht darin, eine prozedurale Programmiersprache (wie PHP oder Perl) zu benutzen, um eine SELECT-Anfrage zu erhalten, die die Primärschlüssel enthält, die benötigt werden, um die entsprechenden Datensätze zu löschen, und dann diese Werte zu benutzen, um das DELETE-Statement zu formulieren (DELETE FROM ... WHERE ... IN (key1, key2, ...)).

Die zweite Option besteht darin, interaktives SQL zu benutzen, um automatisch eine Reihe von DELETE-Statements zu formulieren, indem die MySQL-Erweiterung CONCAT() benutzt wird (anstelle des Standard-Operators ||). Beispiel:

SELECT CONCAT('DELETE FROM tabelle1 WHERE pkid = ', tabelle1.pkid, ';')
  FROM tabelle1, tabelle2
 WHERE tabelle1.spalte1 = tabelle2.spalte2;

Sie können diese Anfrage in eine Skriptdatei schreiben und deren Eingabe an den Kommandozeilen-Interpreter mysql leiten und von dort die Ausgabe zurück an eine zweite Instanz des Interpreters:

prompt> mysql --skip-column-names meine_db < mein_skript.sql | mysql meine_db

MySQL 4.0 unterstützt das Löschen aus mehreren Tabellen (multi-table deletes), was benutzt werden kann, um effizient Zeilen zu löschen, basierend auf den Informationen aus einer Tabelle oder sogar aus mehreren Tabellen zur gleichen Zeit.

2.7.4.2 SELECT INTO TABLE

MySQL unterstützt noch nicht die Oracle-SQL-Erweiterung SELECT ... INTO TABLE .... MySQL unterstützt statt dessen die ANSI-SQL-Syntax INSERT INTO ... SELECT ..., die im Prinzip dasselbe ist. See section 7.4.3.1 INSERT ... SELECT-Syntax.

INSERT INTO tabelle_temp2 (fldID) SELECT tabelle_temp1.fldOrder_ID FROM tabelle_temp1 WHERE
tabelle_temp1.fldOrder_ID > 100;

Alternativ können Sie SELECT INTO OUTFILE... oder CREATE TABLE ... SELECT benutzen, um Ihre Probleme zu lösen.

2.7.4.3 Transaktionen

Weil MySQL heutzutage Transaktionen unterstützt, gelten die folgenden Erörterungen nur, wenn Sie nur Tabellentypen benutzen, die nicht transaktionssicher sind. See section 7.7.1 BEGIN/COMMIT/ROLLBACK-Syntax.

Oft wird von neugierigen oder kritischen Leuten gefragt: ``Warum ist MySQL keine transaktionale Datenbank?'' oder ``Warum unterstützt MySQL keine Transaktionen?''

MySQL hat sich bewusst entschieden, andere Paradigmen für die Datenintegrität zu unterstützen: ``atomische Operationen.'' Es entspricht unserer Denkweise und unserer Erfahrung, dass atomische Operationen gleiche oder bessere Integrität bei wesentlich besserer Performance gewährleisten. Nichtsdestotrotz schätzen und verstehen wir das transaktionale Datenbank-Paradigma und planen, im Verlauf der nächsten Releases transaktionssichere Tabellen einzuführen, auf der Basis der Transaktionssicherheit pro einzelner Tabelle. Wir werden unseren Benutzern die Entscheidung überlassen, ob Sie in ihren Applikationen den Geschwindigkeitsvorteil atomischer Operationen benötigen oder die transaktionalen Features.

Wie benutzt man die Features von MySQL, um rigorose Integrität beizubehalten, und wie sind diese Features im Vergleich mit dem transaktionalen Paradigma zu bewerten?

Zunächst ist es nach dem transaktionalen Paradigma bequemer, mit Transaktionen zu arbeiten, wenn Ihre Applikationen auf eine Weise geschrieben sind, dass sie in kritischen Situationen ``rollback'' anstelle von ``commit'' aufrufen. Darüber hinaus stellen Transaktionen sicher, dass unbeendete Updates oder zerstörende Aktivitäten nicht an die Datenbank abgesetzt werden; der Server hat die Gelegenheit, ein automatisches Rollback durchzuführen, wodurch Ihre Datenbank gerettet wird.

In fast allen Fällen erlaubt Ihnen MySQL, potentiellen Problemen vorzubauen, indem einfache Überprüfungen eingebaut und einfache Skripte laufen gelassen werden, die die Datenbanken auf Inkonsistenzen prüfen und automatisch reparieren oder Warnmeldungen ausgeben, wenn so etwas passiert. Beachten Sie auch, dass allein durch die Benutzung der MySQL-Logdatei oder durch das Hinzufügen einer speziellen Logdatei Tabellen perfekt repariert werden können, ohne dass ein Verlust an Datenintegrität eintritt.

Darüber hinaus können fatale transaktionale Updates so umgeschrieben werden, dass sie atomisch sind. In der Tat gehen wir so weit zu sagen, dass alle Integritätsprobleme, die Transaktionen lösen, mit LOCK TABLES oder atomischen Update durchgeführt werden können, was sicherstellt, dass Sie nie einen automatischen Abbruch von der Datenbank bekommen, was ein gewöhnliches Problem transaktionaler Datenbanken darstellt.

Nicht einmal Transaktionen können jeden Verlust verhindern, wenn der Server abstürzt. In solchen Fällen können sogar transaktionale Systeme Daten verlieren. Der Unterschied zwischen unterschiedlichen Systemen besteht einzig darin, wie kurz die Zeitverzögerung ist, in der Daten verloren gehen könnten. Kein System ist 100%-ig sicher, sondern lediglich ``sicher genug''. Selbst von Oracle, ansonsten als das sicherste aller transaktionalen Datenbanken berühmt, wird berichtet, dass es manchmal in solchen Situationen Daten verliert.

Um mit MySQL auf der sicheren Seite zu sein, brauchen Sie lediglich Datensicherungen und angeschaltetes Update-Logging. Damit können Sie in jeder denkbaren Situation genau wie mit jeder beliebigen transaktionalen Datenbank Daten wiederherstellen. Natürlich ist es immer eine gute Idee, Datensicherungen zu haben, unabhängig von der verwendeten Datenbank.

Das transaktionale Paradigma hat seine Vor- und Nachteile. Viele Benutzer und Applikationsentwickler verlassen sich auf die Einfachheit, mit der sie um Probleme herum Code schreiben können, dort wo anscheinend ein Abbruch erfolgt ist, oder wo es notwendig ist, haben sie womöglich ein bisschen mehr Arbeit mit MySQL, weil sie anders denken oder mehr schreiben müssen. Wenn Ihnen atomische Operationen neu sind oder Sie vertrauter mit Transaktionen sind (oder Sie sich damit besser fühlen), kommen Sie nicht gleich zur Schlussfolgerung, dass sich MySQL nicht mit diesen Überlegungen beschäftigt hat. Zuverlässigkeit und Integrität stehen für uns absolut im Vordergrund. Aktuelle Schätzungen gehen davon aus, dass zur Zeit mehr als eine Million mysqld-Server laufen, von denen viele in Produktionsumgebungen eingesetzt werden. Wir hören sehr, sehr selten von Benutzern, die irgendwelche Daten verloren haben, und in fast allen Fällen sind Benutzerfehler im Spiel. Das ist unserer Meinung nach der beste Beweis für die Stabilität und Zuverlässigkeit von MySQL.

Im übrigen lassen die aktuellen Features von MySQL Zuverlässigkeit und Integrität auf Transaktionsebene oder besser zu, wenn in bestimmten Situationen Integrität von höchster Wichtigkeit ist. Wenn Sie Tabellen mit LOCK TABLES sperren, werden alle Updates angehalten, bis jegliche Integritätsprüfungen durchgeführt sind. Wenn Sie nur eine Lesesperre (Read Lock) machen (im Gegensatz zu einer Schreibsperre - Write Lock), werden Lese- und Einfügeoperationen noch zugelassen. Die neu eingefügten Datensätze können von nicht Clients gesehen werden, die eine READ-Sperre haben, bis sie ihre Lesesperre aufheben. Mit INSERT DELAYED können Sie Einfügeoperationen in eine lokale Warteschlange (Local Queue) stellen, solange, bis die Sperren aufgehoben sind, ohne dass der Client warten muss, bis die Einfügeoperationen abgeschlossen sind. See section 7.4.4 INSERT DELAYED-Syntax.

``Atomisch'', so wie wir es meinen, ist nichts Magisches. Es bedeutet nur, dass Sie sicher sein können, dass kein anderer Benutzer mit irgendeinem laufenden Update in Konflikt kommen kann, und dass es nie ein automatisches Rollback geben kann (was bei transaktionsbasierenden Systemen vorkommen kann, wenn Sie nicht sehr vorsichtig sind). MySQL garantiert auch, dass es keine schmutzigen Lesezugriffe (Dirty Reads) gibt. Sie finden einige Beispiele, wie man atomische Updates schreibt, im Abschnitt über Commits und Rollbacks.

Wir haben reichlich über Integrität und Performance nachgedacht und glauben, dass unser atomisches Paradigma sowohl Zuverlässigkeit als auch extrem hohe Performance gewährleistet, und zwar drei- bis fünfmal schneller, als es die schnellste und optimal eingestellte transaktionale Datenbank schafft. Wir haben Transaktionen nicht deshalb heraus gelassen, weil sie schwer zu machen sind. Der Hauptgrund für die Entscheidung für atomische Operationen gegen Transaktionen liegt darin, dass wir dadurch viele Geschwindigkeitsoptimierungen machen konnten, die auf andere Art nicht möglich gewesen wären.

Viele unserer Benutzer, für die Geschwindigkeit das Wichtigste ist, haben keinerlei Bedenken hinsichtlich Transaktionen. Für sie sind Transaktionen kein Thema. Diejenigen Benutzer, die Sorgen mit Transaktionen haben oder sich darüber wundern, dass MySQL diese nicht unterstützt, gibt es eine ``MySQL-Art'', die wir weiter oben beschrieben haben. Denjenigen, denen Sicherheit wichtiger als Geschwindigkeit ist, empfehlen wir die Benutzung von BDB- oder InnoDB-Tabellen für alle kritischen Daten. See section 8 MySQL-Tabellentypen.

Ein letzter Hinweis: Wir arbeiten zur Zeit an einem sicheren Replikationsschema, vom dem wir glauben, dass es besser als jedes kommerzielle Replikationssystem ist, das wir kennen. Dieses System wird mit dem atomischen, nicht-transaktionalen Paradigma mit höchster Zuverlässigkeit laufen. Bleiben Sie dran!

2.7.4.4 Gespeicherte Prozeduren und Trigger

Eine gespeicherte Prozedur ist ein Satz von SQL-Kommandos, die kompiliert und auf dem Server gespeichert werden können. Wenn dies einmal geschehen ist, müssen Clients nicht mehr die gesamte Anfrage absetzen, sondern können sich auf die gespeicherte Prozedur beziehen. Hiermit wird bessere Performance erreicht, den die Anfrage muss nur einmal geparst werden, und es muss weniger Information zwischen Client und Server ausgetauscht werden. Man kann sogar die konzeptionelle Ebene steigern, indem man Bibliotheken von Funktionen auf dem Server bereit hält.

Ein Trigger ist eine gespeicherte Prozedur, die aufgerufen wird, wenn ein bestimmtes Ereignis eintritt. Beispielsweise kann man eine gespeicherte Prozedur installieren, die jedes Mal ausgeführt wird, wenn ein Datensatz aus einer Transaktionstabelle gelöscht wird, und die automatisch den dazu gehörigen Kunden aus einer Kundentabelle löscht, wenn alle seine Transaktionen gelöscht wurden.

Für ein späteres Release ist geplant, dass MySQL gespeicherte Prozeduren handhaben kann, aber ohne Trigger. Trigger verlangsamen üblicherweise alles, sogar Anfragen, für die sie nicht benötigt werden.

Um festzustellen, ab wann MySQL gespeicherte Prozeduren bekommen wird, siehe auch section 2.8 MySQL und die Zukunft (das TODO).

2.7.4.5 Fremdschlüssel

Beachten Sie, dass Fremdschlüssel in SQL nicht dazu benutzt werden, um Tabellen zu verknüpfen, sondern hauptsächlich, um die referentielle Integrität zu überprüfen (Fremdschlüssel-Restriktionen). Wenn Sie durch ein SELECT-Statement Ergebnisse aus mehreren Tabellen erhalten wollen, tun Sie dies, indem Sie Tabellen verknüpfen (Join):

SELECT * von tabelle1,tabelle2 where tabelle1.id = tabelle2.id;

See section 7.4.1.1 JOIN-Syntax. See section 4.5.6 Wie Fremdschlüssel (Foreign Keys) verwendet werden.

Die FOREIGN KEY-Syntax in MySQL existiert nur aus Kompatibilitätsgründen mit den CREATE TABLE-Kommandos anderer Hersteller; sie tut nichts. Die FOREIGN KEY-Syntax ohne ON DELETE ... wird hauptsächlich für Dokumentationszwecke benutzt. Einige ODBC-Applikationen benutzen dies vielleicht, um automatische WHERE-Klauseln zu erzeugen, aber das läßt sich üblicherweise leicht überschreiben. FOREIGN KEY wird manchmal als Restriktionsprüfung benutzt, aber eine solche Überprüfung ist in der Praxis nicht notwendig, wenn Zeilen in Tabellen in der richtigen Reihenfolge eingefügt werden. MySQL unterstützt diese Klauseln nur, weil manche Applikationen verlangen, dass sie existieren (egal ob sie funktionieren oder nicht).

In MySQL können Sie das Problem, dass ON DELETE... nicht implementiert ist, dadurch umgehen, dass Sie das entsprechende DELETE-Statement einer Applikation hinzufügen, wenn Sie Datensätze aus einer Tabelle löschen, die Fremdschlüssel hat. In der Praxis ist das genauso schnell (in einigen Fällen schneller) und wesentlich portabler, als wenn Sie Fremdschlüssel benutzen würden.

In naher Zukunft werden wir die FOREIGN KEY-Implementation erweitern, so dass zumindest die Information in der Datei, die die Tabelle spezifiziert, gespeichert wird und somit durch mysqldump und ODBC abgefragt werden kann. Zu einem späteren Zeitpunkt werden wir Fremdschlüssel-Restriktionen für Applikationen implementieren, die nicht leicht durch entsprechendes Programmieren umgangen werden können.

2.7.4.6 Warum wir Fremdschlüssel nicht implementiert haben

Viele Leute, die Datenbanken unterrichten und programmieren, sind der festen Meinung, dass referentielle Integrität durch den Datenbank-Server erzwungen werden sollte. In der Tat ist dieser Ansatz in vielen Fällen sehr hilfreich. In vielen Gesprächen mit Datenbankbenutzern haben wir jedoch festgestellt, dass Fremdschlüssel oft missbraucht werden, was schwer- wiegende Probleme verursachen kann. Selbst wenn sie in korrekter Weise benutzt werden, sind sie keine magische Lösung für das Problem referentieller Integrität, obwohl sie die Dinge in einigen Fällen einfacher gestalten.

Wegen der obigen Beobachtungen haben wir der Implementation von Fremdschlüsseln keine hohe Priorität zugewiesen. Unsere Benutzerbasis bestand bislang zumeist aus Entwicklern, denen es nichts ausmachte, referentielle Integrität im Code der Applikation zu erzwingen, und die dies sogar bevorzugten, weil es ihnen mehr Kontrolle gab.

In den letzten Jahren hat sich unsere Benutzerbasis jedoch um einiges ausgeweitet. Mittlerweile haben wir viele Benutzer, die es schätzen würden, wenn MySQL erzwungene referentielle Integrität implementiert hätte. Aus diesem Grund werden wir Fremdschlüssel in naher Zukunft implementieren. Allerdings können wir zur Zeit noch kein definitives Auslieferungsdatum nennen.

Einige Vorteile der Erzwingung von Fremdschlüsseln:

Nachteile:

2.7.4.7 Sichten (Views)

MySQL unterstützt noch keine Sichten, aber wir planen, diese in Version 4.1 zu implementieren.

Sichten sind äußerst nützlich, um Benutzern Zugang zu einem Satz von Beziehungen wie zu einer einzigen Tabelle zu gewähren (Lesezugriff). Viele SQL-Datenbanken lassen es nicht zu, dass irgend welche Zeilen in einer Sicht aktualisiert werden (Update). Statt dessen müssen die einzelnen Tabellen aktualisiert werden.

Weil MySQL meist in Applikationen und in Web-Systemen eingesetzt werden, wo der Applikationsprogrammierer volle Kontrolle über die Datenbankbenutzung hat, sehen die meisten unserer Benutzer Sichten als nicht sehr wichtig an. (Zumindest war niemand interessiert genug, um die Implementation von Sichten zu finanzieren.)

In MySQL werden Sichten nicht benötigt, um den Zugriff auf Spalten zu beschränken, weil MySQL ein sehr ausgefeiltes System der Zugriffsberechtigungen hat. See section 5.2 Allgemeine Sicherheitsthemen und das MySQL-Zugriffsberechtigungssystem.

2.7.4.8 `--' als Beginn eines Kommentars

Einige andere SQL-Datenbanken benutzen `--', um Kommentare zu beginnen. MySQL benutzt `#' als Anfangszeichen, wenn auch das mysql-Kommandozeilen-Werkzeug alle Zeilen entfernt, die mit `--' anfangen. Sie können in MySQL auch Kommentare im C-Stil verwenden /* Das ist ein Kommentar */. See section 7.1.5 Kommentar-Syntax.

MySQL ab Version 3.23.3 unterstützt Kommentare, die mit `--' beginnen, allerdings nur, wenn der Kommentarbeginn von einem Leerzeichen gefolgt wird. Der Grund liegt darin, dass dieser degenerierte Kommentar-Stil eine Menge Probleme mit automatisch generierten SQL-Anfragen verursacht, die Ähnliches wie den folgenden Code benutzen, wo automatisch der Wert einer Zahlung für !zahlung! eingefügt wird:

UPDATE tabelle_name SET kredit=kredit-!zahlung!

Was, glauben Sie, passiert, wenn der Wert von zahlung negativ wird?

Weil 1--1 in SQL zulässig ist, sind wir der Meinung, dass es furchtbar ist, dass `--' den Anfang eines Kommentars bedeutet.

In MySQL ab Version 3.23 können Sie allerdings folgendes benutzen: 1-- Das ist ein Kommentar

Die folgenden Erörterungen treffen nur zu, wenn Sie eine MySQL-Version vor 3.23 laufen lassen:

Wenn Sie ein SQL-Programm in einer Textdatei haben, das `--'-Kommentare enthält, sollten Sie folgendes benutzen:

shell> replace " --" " #" < text-datei-mit-merkwuerigen-kommentaren.sql \
         | mysql datenbank

anstelle des üblichen:

shell> mysql datenbank < text-datei-mit-merkwuerdigen-kommentaren.sql

Sie können auch die Kommandodatei ``direkt'' editieren, um die `--'-Kommentare zu `#'-Kommentaren zu machen:

shell> replace " --" " #" -- text-datei-mit-merkwuerdigen-kommentaren.sql

Machen Sie die Änderungen mit folgendem Befehl rückgängig:

shell> replace " #" " --" -- text-datei-mit-merkwuerdigen-kommentaren.sql

2.7.5 Bekannte Fehler und Design-Unzulänglichkeiten in MySQL

Die folgenden Probleme sind bekannt. Ihre Behebung hat eine sehr hohe Priorität:

Folgende Probleme sind bekannt und werden zu gegebener Zeit behoben:

Folgende bekannte Bugs gibt es in früheren Versionen von MySQL:

Was Plattform-spezifische Bugs angeht, sehen Sie bitte im Abschnitt über Kompilieren und Portieren nach.

2.8 MySQL und die Zukunft (das TODO)

Dieser Anhang listet die Features auf, für die wir eine Implementierung in MySQL geplant haben.

Alles auf dieser Liste gibt nur ungefähr die Reihenfolge wieder, in der es gemacht werden wird. Wenn Sie die Prioritäten beeinflussen wollen, registrieren Sie bitte eine Lizenz oder unterstützen Sie uns und teilen uns mit, was Sie schneller gemacht haben wollen. See section 2.4.4 MySQL-Lizenzpolitik.

Geplant ist, dass wir in Zukunft den kompletten ANSI-SQL99-Standard unterstützen, aber mit einer Menge nützlicher Erweiterungen. Die Herausforderung liegt darin, dass durchzuführen, ohne Geschwindigkeitsvorteile zu opfern oder den Code zu kompromittieren.

2.8.1 Dinge, die in Version 4.0 enthalten sein sollten

Wir haben uns der Entwicklung von MySQL Version 4.0 zugewandt. Die meisten grundsätzlichen Dinge, die wir in Version 4.0 haben wollen, sind bereits gemacht. Das Ziel ist, den Rest der folgenden Features schnell einzubauen und dann zur Entwicklung von MySQL 4.1 überzugehen. See section 2.5 MySQL 4.0 kurz und bündig.

Der News-Abschnitt für 4.0 beinhaltet eine Liste der Features, die wir bereits im 4.0-Baum implementiert haben. See section G.1 Änderungen in Release 4.0.x (Entwicklung; Alpha).

2.8.2 Dinge, die in naher Zukunft erledigt werden müssen

2.8.3 Dinge die irgendwann gemacht werden müssen

Zeitangaben stehen für den Umfang der Arbeit, nicht für echte Zeit.

2.8.4 Ein paar Dinge, für deren Umsetzung wir keine Pläne haben

2.9 MySQL im Vergleich mit anderen Datenbanken

Dieser Abschnitt vergleicht MySQL mit anderen populären Datenbanken.

Dieser Abschnitt wurde von den MySQL-Entwicklern geschrieben. Das sollte man beim Lesen im Hinterkopf behalten. In diesem Abschnitt sind - soweit uns bekannt - keine sachlichen Fehler enthalten. Wenn Sie etwas finden, was Sie als sachlichen Fehler erachten, kontaktieren Sie uns bitte unter docs@mysql.com.

Eine Liste aller unterstützten Limits, Funktionen und Typen finden Sie auf der crash-me-Webseite auf http://www.mysql.com/information/crash-me.php.

2.9.1 MySQL im Vergleich mit mSQL

Performance
Um einen echten Geschwindigkeitsvergleich zu sehen, schauen Sie bitte in der wachsenden Liste der MySQL-Benchmarks nach. See section 6.1.4 Die MySQL-Benchmark-Suite. Weil es keinen Overhead für die Erzeugung von Threads besitzt, einen kleineren Parser, weniger Features und einfache Sicherheitsmechanismen, sollte mSQL in folgenden Punkten schneller sein: Weil diese Operationen so einfach sind, ist es schwer, hier besser zu sein, wenn man beim Starten einen größeren Overhead hat. Nachdem die Verbindung erst einmal aufgebaut ist, sollte MySQL wesentlich bessere Leistungsdaten bringen. Andererseits ist MySQL sehr viel schneller als mSQL (und den meisten anderen SQL-Implementationen) bei Folgendem:
SQL-Features
Effiziente Ausnutzung von Speicherplatz
Das heißt, wie klein können Sie Ihre Tabellen machen? MySQL hat sehr präzise Typen, deshalb können Sie Tabellen erzeugen, die sehr wenig Platz brauchen. Ein Beispiel für einen nützlichen MySQL-Datentyp ist MEDIUMINT, der 3 Bytes lang ist. Wenn Sie 100 Millionen Datensätze haben, ist es schon von Wichtigkeit, auch nur ein Byte pro Datensatz zu sparen. mSQL2 hat eine begrenztere Anzahl von Spaltentypen, daher ist es schwieriger, kleine Tabellen zu erhalten.
Stabilität
Dieser Punkt ist schwieriger objektiv zu beurteilen. Eine Erörterung der Stabilität von MySQL finden Sie hier: section 2.2.2 Wie stabil ist MySQL?. Wir haben keine Erfahrungen mit der Stabilität von mSQL, daher können wir nichts darüber sagen.
Preis
Ein weiterer wichtiger Punkt ist die Lizenz. MySQL hat eine flexiblere Lizenz als mSQL und kostet auch weniger als mSQL. Welches Produkt auch immer Sie verwenden, ziehen Sie bitte zumindestens in Betracht, für eine Lizenz oder E-Mail-Support zu zahlen. (Sie müssen natürlich notwendigerweise eine Lizenz erwerben, wenn Sie MySQL in ein Produkt einbeziehen, das Sie verkaufen.)
Perl-Schnittstellen
MySQL hat prinzipiell dieselben Schnittstelle zu Perl wie mSQL, mit einigen zusätzlichen Features.
JDBC (Java)
MySQL hat aktuell eine große Anzahl von JDBC-Treibern: Der empfohlene Treiber ist der mm-Treiber. Der Resin-Treiber mag auch gut sein (zumindest sehen die Benchmarks gut aus), aber wir haben über diesen Treiber noch nicht allzu viele Informationen erhalten. Wir wissen, dass mSQL einen JDBC-Treiber hat, aber wir haben zu wenig Erfahrung damit, um ihn in einen Vergleich einzubeziehen.
Entwicklungsgeschwindigkeit
MySQL hat ein sehr kleines Entwicklerteam, aber wir arbeiten schon lange mit C und C++ und sind daher sehr schnell. Weil Threads, Funktionen, GROUP BY usw. noch nicht in mSQL implementiert sind, hat es eine Menge aufzuholen. Um das in den richtigen Blickwinkel zu rücken, können Sie sich die mSQL `HISTORY'-Datei des letzten Jahres ansehen und sie mit dem News-Abschnitt des MySQL Referenzhandbuchs vergleichen (see section G MySQL-Änderungsverlauf (Change History)). Es ist ziemlich offensichtlich, welches System sich schneller entwickelt hat.
Utilities
Sowohl mSQL als auch MySQL haben viele interessante von Dritten entwickelte Werkzeuge. Weil es sehr einfach ist, aufwärts zu portieren (von mSQL zu MySQL), sind fast alle interessanten Applikationen, die für mSQL verfügbar sind, auch für MySQL erhältlich. MySQL liefert ein einfaches msql2mysql-Programm mit, das Unterschiede in der Schreibweise zwischen mSQL und MySQL für die meistbenutzten C-API-Funktionen bereinigt. Es ändert zum Beispiel Instanzen von msqlConnect() zu mysql_connect(). Ein Client-Programm von mSQL zu MySQL zu konvertieren, erfordert meist nur geringe Anstrengung.

2.9.1.1 Wie man mSQL-Werkzeuge für MySQL konvertiert

Nach unserer Erfahrung nimmt es wenig Zeit in Anspruch, Werkzeuge wie msql-tcl und msqljava zu konvertieren, die die mSQL-C-API benutzen, damit sie mit der MySQL-C-API funktionieren.

Die Konvertierungsprozedur läuft wie folgt:

  1. Lassen Sie das Shell-Skript msql2mysql über den Quelltext laufen. Das erfordert das replace-Programm, das mit MySQL ausgeliefert wird.
  2. Kompilieren.
  3. Alle Kompilierfehler beheben.

Die Unterschiede zwischen der mSQL-C-API und der MySQL-C-API sind:

2.9.1.2 Wie sich mSQL- und MySQL-Client/Server-Kommunikationsprotokolle unterscheiden

Es gibt genug Unterschiede, so dass es unmöglich ist (oder zumindest nicht leicht), beide zu unterstützen.

Die signifikantesten Protokollunterschiede zwischen MySQL und mSQL sind folgende:

2.9.1.3 Wie sich die mSQL 2.0 SQL-Syntax von MySQL unterscheidet

Spaltentypen

MySQL hat folgende zusätzliche Typen (unter anderem; see section 7.5.3 CREATE TABLE-Syntax):
MySQL unterstützt folgende zusätzliche Typ-Attribute:
mSQL2
mSQL-Spaltentypen korrespondieren mit den unten dargestellten MySQL-Typen:
mSQL Typ Korrespondierender MySQL-Typ
CHAR(len) CHAR(len)
TEXT(len) TEXT(len). len ist die maximale Länge. Und LIKE funktioniert.
INT INT. Mit vielen weiteren Optionen!
REAL REAL. Or FLOAT. Beide 4- und 8-Byte-Versionen sind verfügbar.
UINT INT UNSIGNED
DATE DATE. Benutzt ANSI-SQL-Format statt mSQL's eigenem Format.
TIME TIME
MONEY DECIMAL(12,2). Ein Festkomma-Wert mit zwei Dezimalstellen.

Index-Erzeugung

MySQL
Indizes können bei der Erzeugung der Tabelle mit dem CREATE TABLE-Statement festgelegt werden.
mSQL
Indexe müssen erzeugt werden, nachdem die Tabelle erzeugt wurde, mit einem separaten CREATE INDEX-Statements.

Einfügen eines eindeutigen Identifikators (Unique Identifier) in eine Tabelle

MySQL
Benutzen Sie AUTO_INCREMENT als Spaltentyp-Spezifizierer. See section 9.4.3.126 mysql_insert_id().
mSQL
Erzeugen Sie eine SEQUENCE auf eine Tabelle und wählen Sie die _seq-Spalte.

Wie man einen eindeutigen Identifikator (Unique Identifier) für eine Zeile erhält

MySQL
Fügen Sie der Tabelle einen PRIMARY KEY oder UNIQUE-Schlüssel hinzu und benutzen Sie diesen. Neu ab Version 3.23.11: Wenn der PRIMARY- oder UNIQUE-Schlüssel nur aus einer Spalte besteht und diese vom Typ Ganzzahl (Integer) ist, können Sie auf diese auch mit _rowid verweisen.
mSQL
Benutzen Sie die _rowid-Spalte. Beachten Sie, dass sich _rowid im Zeitverlauf möglicherweise ändert, abhängig von vielen Faktoren.

Wie man die Zeit erhält, zu der eine Spalte zuletzt geändert wurde

MySQL
Fügen Sie der Tabelle eine TIMESTAMP-Spalte hinzu. Diese Spalte wird automatisch auf das aktuelle Datum und die aktuelle Zeit gesetzt, und zwar bei INSERT- und UPDATE-Statements, es sein denn, der Spalte wird explizit ein Wert zugewiesen, auch der NULL-Wert.
mSQL
Benutzen Sie die _timestamp-Spalte .

NULL-Wert-Vergleiche

MySQL
MySQL folgt ANSI-SQL, daher wird ein Vergleich mit NULL immer zu NULL ausgewertet.
mSQL
In mSQL ist NULL = NULL TRUE. Sie müssen =NULL zu IS NULL und <>NULL zu IS NOT NULL, wenn Sie alten Code von mSQL zu MySQL portieren.

Zeichenketten-Vergleich

MySQL
Normalerweise werden Zeichenketten-Vergleiche so durchgeführt, dass sie unabhängig von der verwendeten Groß-/Kleinschreibung laufen, wobei die Sortierreihenfolge vom aktuell verwendeten Zeichensatz abhängt (ISO-8859-1 Latin1 als Vorgabewert). Wenn Sie das nicht wollen, deklarieren Sie Ihre Spalten mit dem BINARY-Attribut, was bewirkt, dass Vergleiche nach der ASCII-Reihenfolge durchgeführt werden, wobei der ASCII-Zeichensatz gilt, den der MySQL-Server-Host verwendet.
mSQL
Alle Zeichenketten-Vergleiche werden so durchgeführt, dass sie abhängig von der verwendeten Groß-/Kleinschreibung laufen. Die Sortierung erfolgt in ASCII-Reihenfolge.

Suche, die unabhängig von Groß-/Kleinschreibung läuft

MySQL
LIKE ist ein Operator, der abhängig oder unabhängig von der Groß-/Kleinschreibung läuft, was davon abhängt, welche Spalten verwendet werden. Wenn möglich, benutzt MySQL Indexe, wenn das LIKE-Argument nicht mit einem Platzhalterzeichen (Wildcard) beginnt.
mSQL
Benutzt CLIKE.

Handhabung von Leerzeichen am Ende

MySQL
Entfernt alle Leerzeichen am Ende von CHAR- und VARCHAR-Spalten. Benutzen Sie eine TEXT-Spalte, wenn dieses Verhalten unerwünscht ist.
mSQL
Behält Leerzeichen am Ende bei.

WHERE-Klauseln

MySQL
MySQL priorisiert alles korrekt (AND wird vor OR ausgewertet). Um mSQL-Verhalten in MySQL zu erreichen, benutzen Sie Klammern (wie im unten stehenden Beispiel gezeigt).
mSQL
Wertet alles von links nach rechts aus. Das bedeutet, dass einige logische Berechnungen mit mehr als drei Argumenten überhaupt nicht ausgedrückt werden können. Das heißt auch, dass Sie einige Anfragen ändern müssen, wenn Sie auf MySQL umsteigen. Das einfachste ist, Klammern hinzuzufügen. Nehmen wir an, Sie haben die folgende mSQL-Anfrage:
mysql> SELECT * FROM tabelle WHERE a=1 AND b=2 OR a=3 AND b=4;
Damit MySQL dies auf dieselbe Art auswertet wie mSQL, müssen Sie Klammern hinzufügen:
mysql> SELECT * FROM tabelle WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));

Zugriffskontrolle

MySQL
Hat Tabellen, in denen Berechtigungsoptionen pro Benutzer, Host, und Datenbank gespeichert werden. See section 5.2.5 Wie das Berechtigungssystem funktioniert.
mSQL
Hat eine Datei `mSQL.acl', in der Sie Lese-/Schreibrechte für Benutzer gewähren können.

2.9.2 MySQL im Vergleich mit PostgreSQL

Wenn Sie das Folgende lesen, beachten Sie bitte, dass sich beide Produkte stetig entwickeln. Wir bei MySQL AB und die PostgreSQL-Entwickler geben sich alle Mühe, unsere jeweilige Datenbank so gut wie möglich zu machen. Daher sind es beide Produkte wert bei der Wahl einer kommerziellen Datenbank ernsthaft in Betracht gezogen zu werden.

Der folgende Vergleich wurde von uns bei MySQL AB durchgeführt. Wir haben uns bemüht, so akkurat und fair wie möglich zu sein. Da wir aber keine vollständige Kenntnis aller PostgreSQL-Features haben, während wir MySQL sehr genau kennen, haben wir vielleicht ein paar Dinge falsch verstanden. Wir werden das jedenfalls korrigieren, wenn es uns zu Ohren kommt.

Zunächst wollen wir feststellen, dass sowohl PostgreSQL als auch MySQL weit verbreitete Produkte sind, die aber unterschiedliche Entwurfsziele haben, auch wenn beide sich bemühen, ANSI-SQL-kompatibel zu sein. Das bedeutet, dass MySQL für einige Applikationen besser geeignet ist, PostgreSQL für andere. Wenn Sie überlegen, welche Datenbank Sie wählen sollen, sollten Sie zunächst prüfen, ob die Features der Datenbank für Ihre Applikation zufrieden stellend sind. Wenn Sie satte Geschwindigkeit brauchen, wird Ihre Wahl wahrscheinlich auf MySQL fallen. Wenn Sie einige der speziellen Merkmale brauchen, die nur PostgreSQL anbieten kann, sollten Sie PostgreSQL benutzen.

2.9.2.1 Entwicklungsstragien von MySQL und PostgreSQL

Wenn wir MySQL Dinge hinzufügen, ist es für uns eine Sache der Ehre, eine optimale, definitive Lösungen zu schaffen. Der Code sollte so gut sein, dass wir keine Notwendigkeit erkennen, ihn in der absehbaren Zukunft zu ändern. Wir wollen auch nicht Geschwindigkeit für Features opfern, sondern sind aufs Äußerste bestrebt, eine Lösung zu finden, die maximalen Durchsatz bietet. Das bedeutet, dass die Entwicklung ein bisschen länger dauert, aber die Endergebnisse sind es wert. Diese Art von Entwicklung ist nur möglich, weil der gesamte Server-Code nur von wenigen Leuten geprüft wird (aktuell zwei), bevor er in den MySQL-Server aufgenommen wird.

Wir bei MySQL AB halten viel von häufigen Releases, um in der Lage zu sein, neue Features schnell an unsere Benutzer heraus zu geben. Deshalb bringen wir etwa alle drei Wochen ein kleines Release heraus und einen größeren Zweig (Branch) einmal im Jahr. Alle Releases werden gründlich mit unseren Testwerkzeugen auf vielen verschiedenen Plattformen getestet.

PostgreSQL basiert auf einem Kern (Kernel), zu dem viele Leute etwas beigesteuert haben. Bei diesem Vorgehen ist es sinnvoll, dem Hinzufügen neuer Features Priorität einzuräumen, statt sie optimal zu implementieren, denn man kann immer noch später Dinge optimieren, wenn sich die Notwendigkeit hierfür ergibt.

Ein weiterer großer Unterschied zwischen MySQL und PostgreSQL besteht darin, dass praktisch der gesamte Code des MySQL-Servers von Entwicklern kodiert wurde, die bei MySQL AB angestellt sind und die immer noch am Server-Code arbeiten. Ausnahmen bilden die Transaktions-Engines und die Regexp-Bibliothek.

Das steht in scharfem Kontrast zum PostgreSQL-Code, wo der größte Teil des Codes von einer großen Gruppe von Leuten mit unterschiedlichem Hintergrund kodiert wird. Erst kürzlich gaben die PostgreSQL-Entwickler bekannt, dass ihre aktuelle Entwicklergruppe endlich Zeit gefunden hat, einen Blick auf all den Code der aktuellen PostgreSQL-Version zu werfen.

Beide der genannten Entwicklungsmethoden hat Ihre Vorzüge und Nachteile. Wir hier bei MySQL AB sind natürlich der Meinung, dass unser Modell besser ist, weil unser Modell bessere Konsistenz gewährleistet sowie mehr optimalen und damit wiederverwendbaren Code und deshalb nach unserer Meinung weniger Bugs. Weil wir die Autoren des MySQL-Server-Codes sind, sind wir besser im Stande, neue Features und Releases zu koordinieren.

2.9.2.2 Feature-Vergleich von MySQL und PostgreSQL

Auf der Seite crash-me finden Sie eine Liste der Datenbank-Konstrukte und -Beschränkungen, die man automatisch mit einem Programm entdecken kann. Beachten Sie jedoch, dass sich etliche numerische Beschränkungen mit Start-Optionen der jeweiligen Datenbank ändern lassen. Die genannte Seite ist jedoch äußerst nützlich, wenn Sie sicher stellen wollen, dass Ihre Applikationen mit vielen unterschiedlichen Datenbanken funktionieren, oder wenn Sie Ihre Applikation von einer Datenbank zu einer anderen konvertieren wollen.

MySQL bietet folgende Vorzüge gegenüber PostgreSQL:

Nachteile von MySQL im Vergleich zu PostgreSQL:

PostgreSQL hat momentan folgende Vorteile gegenüber MySQL:

Weil wir die Pläne (Roadmap) von MySQL kennen, haben wir in der folgenden Tabelle die Versionsnummern der jeweiligen MySQL-Version untergebracht, die das entsprechende Feature unterstützen wird. Leider konnten wir das nicht für frühere Vergleiche machen, denn wir kennen nicht kennen nicht die Pläne (Roadmap) von PostgreSQL.

Feature MySQL version
Subselects 4.1
Fremdschlüssel 4.0 und 4.1
Sichten (Views) 4.2
Gespeicherte Prozeduren 4.1
Erweiterbares Typ-System Nicht geplant
Unions 4.0
Full Join 4.0 oder 4.1
Trigger 4.1
Constrainst 4.1
Cursor 4.1 oder 4.2
Erweiterbare Indextypen wie R-Trees R-trees sind geplant für 4.2
Vererbte (Inherited) Tabellen Nicht geplant

Andere Gründe, PostgreSQL zu benutzen:

Nachteile von PostgreSQL im Vergleich zu MySQL:

Eine vollständige Aufstellung der Nachteile finden Sie in der ersten Tabelle dieses Abschnitts.

2.9.2.3 Benchmark-Vergleiche von MySQL und PostgreSQL

Der einzige Open-Source-Benchmark-Test, den wir kennen, der benutzt werden kann, um MySQL und PostgreSQL (und andere Datenbanken) miteinander zu vergleichen, ist unser eigener. Man findet ihn auf http://www.mysql.com/information/benchmarks.html.

Wir haben mehrfach bei den PostgreSQL-Entwicklern und bei einigen PostgreSQL-Benutzer nachgefragt, ob sie bereit wären, uns zu helfen, diesen Benchmark-Test zu erweitern, um ihn zu dem definitiven Benchmark-Test für Datenbanken zu machen, haben aber leider keinerlei Rückmeldung erhalten.

Wir, die MySQL-Entwickler, haben deshalb viele Stunden damit verbracht, für den Benchmark-Test maximale Performance aus PostgreSQL heraus zu bekommen, aber da wir mit PostgreSQL nicht sehr weitgehend vertraut sind, sind wir sicher, dass wir einige Dinge versäumt haben. Auf der Benchmark-Seite haben wir genau dokumentiert, wie wir den Benchmark-Test durchgeführt haben, deshalb sollte es für jeden einfach sein, ihn zu wiederholen und unsere Ergebnisse zu bestätigen.

Die Benchmarks werden üblicherweise mit und ohne die --fast-Option durchgeführt. Wenn wir sie mit --fast durchführen, versuchen wir, jeden Trick zu nutzen, den der Server benutzt, um den Code so schnell wie möglich auszuführen. Die Idee dahinter ist, dass der Server zeigen sollte, wie er mit Vorgabeeinstellungen läuft und --fast sollte zeigen, wie der Server läuft, wenn der Applikationsentwickler Erweiterungen im Server nutzt, um seine Applikation schneller laufen zu lassen.

Wenn wir PostgreSQL mit der --fast-Option laufen lassen, machen wir ein VACUUM() nach jedem größeren Tabellen-UPDATE und DROP TABLE, um die Datenbank in beste Verfassung für die folgenden SELECTs zu bringen. Die Zeit für VACUUM() wird separat gemessen.

PostgreSQL 7.1.1 konnten wir jedoch nicht mit der Option --fast laufen lassen, weil der Postmaster (der PostgreSQL Daemon) während eines INSERT-Tests starb und die Datenbank so beschädigt war, dass es unmöglich war, den Postmaster neu zu starten. Nachdem dies zweimal geschehen war, entschieden wir uns, den Test mit --fast bis zum nächsten PostgreSQL-Release zu verschieben. Die Details zur Maschine, die wir für den Benchmark benutzten, stehen auf der Benchmark-Seite.

Bevor wir uns den anderen Benchmarks, die wir kennen, zuwenden, möchten wir ein paar Hintergrundinformationen zu Benchmarks geben:

Es ist sehr einfach, einen Test zu schreiben, der zeigt, dass JEDE BELIEBIGE Datenbank die beste der Welt ist, indem man den Test einfach auf etwas beschränkt, was diese Datenbank sehr gut kann und nichts anderes testet, was die Datenbank nicht gut kann. Wenn man dann noch das Ergebnis mittels einer einzigen Zahl veröffentlicht, macht das die Dinge sogar noch einfacher.

Das wäre, als ob wir die Geschwindigkeit von MySQL gegenüber PostgreSQL anhand der Messzeit-Zusammenfassung der MySQL-Benchmarks auf unserer Webseite vergleichen würden. Auf dieser Basis wäre MySQL mehr als 40 Mal schneller als PostgreSQL, was natürlich nicht stimmt. Wir könnten die Sache sogar noch verschlimmern, indem wir nur etwas testen, worin PostgreSQL die schlechtesten Leistungsdaten bringt und geltend machen, dass MySQL mehr als 2000 Mal schneller ist als PostgreSQL.

Tatsache ist, dass MySQL eine Menge Optimierungen vornimmt, die PostgreSQL nicht vornimmt. Das ist natürlich auch umgekehrt so. Ein SQL-Optimierer ist eine sehr komplexe Sache, und ein Unternehmen könnte Jahre damit zubringen, nur den Optimierer schneller und schneller zu machen.

Wenn Sie sich die Ergebnisse der Benchmarks ansehen, sollten Sie nach Dingen Ausschau halten, die Sie in Ihrer Applikation durchführen, und dann nur diese Ergebnisse benutzen, um zu entscheiden, welche Datenbank wohl am besten für Ihre Applikation geeignet ist. Die Benchmark-Ergebnisse zeigen ausserdem auf, worin eine bestimmte Datenbank nicht gut ist, was Ihnen eine Ahnung davon geben sollte, welche Dinge Sie am besten vermeiden und was Sie auf andere Weise machen sollten.

Wir kennen zwei Benchmark-Tests, die behaupten, dass PostgreSQL bessere Leistungsdaten bringt als MySQL. Beide waren Mehrbenutzer-Tests, ein Test, den zu schreiben wir bei MySQL AB nie die Zeit hatten, hauptsächlich, weil es eine wirklich große Aufgabe ist, wenn man will, dass der Test fair zu allen Datenbanken ist.

Einer der Tests ist derjenige, für den Great Bridge bezahlt hat, und über den Sie hier lesen können: http://www.greatbridge.com/about/press.php?content_id=4.

Es ist wahrscheinlich der schlechteste Benchmark-Test, den wir jemals gesehen haben. Er war nicht nur so eingestellt, dass er das testete, was PostgreSQL absolut am besten kann, er war auch völlig unfair zu jeder anderen Datenbank, die in diesen Test einbezogen wurde.

ACHTUNG: Wir wissen, dass niemand der hauptsächlichen PostgreSQL-Entwickler die Art mochte, wie Great Bridge den Test durchgeführt hat, daher geben wir ihnen keinerlei Schuld dafür.

Dieser Benchmark wurde in einer Menge Postings und Newsgroups verurteilt, daher beschränken wir uns hier darauf, kurz einige Dinge zu wiederholen, die dabei nicht stimmten.

Tim Perdue, seit langer Zeit PostgreSQL-Fan und ein widerwilliger MySQL-Benutzer, hat einen Vergleich auf phpbuilder veröffentlicht.

Als wir von diesem Vergleich erfuhren, telefonierten wir mit Tim Perdue zu diesem Thema, weil es eine Menge merkwürdiger Dinge in seinen Ergebnissen gab. Er behauptete zum Beispiel, dass MySQL bei seinem Test ein Problem mit fünf Benutzern hatte, während wir wissen, dass es Benutzer mit ähnlichen Maschinen wie seine gibt, die MySQL mit 2000 simultanen Verbindungen betreiben, die 400 Anfragen pro Sekunde abarbeiten. (In diesem Fall war die Beschränkung durch die Web-Bandbreite gegeben, nicht durch die Datenbank.)

Es schien, als hätte er einen Linux-Kernel benutzt, der entweder Probleme mit vielen Threads hatte, wie ein Kernel vor Version 2.4, der ein Problem mit vielen Threads auf Mehrprozessor-Maschinen hat. Wir haben in diesem Handbuch dokumentiert, wie man das behebt, und Tim sollte sich dieses Problems bewusst sein.

Das andere mögliche Problem könnte eine alte glibc-Bibliothek gewesen sein, und dass Tim keine MySQL-Binärdistribution von unserer Site benutzte, die mit einer korrigierten glibc-Bibliothek gelinkt ist, sondern statt dessen eine eigene Version kompiliert hat. Bei jedem der genannten Fälle würden die Symptome genau die sein, die Tim gemessen hat.

Wir haben Tim gebeten, uns Zugang zu seinen Daten zu geben, damit wir den Benchmark-Test wiederholen könnten, sowie die MySQL-Version auf seiner Maschine zu prüfen, um herauszufinden, was falsch lief, und er hat versprochen, uns entsprechende Mitteilung zu geben. Das hat er bis heute nicht gemacht.

Aus diesem Grund können wir auch diesem Benchmark in keiner Weise vertrauen :(

Im Zeitverlauf haben sich die Dinge auch geändert und die genannten Benchmarks sind nicht mehr so relevant. MySQL hat mittlerweile eine Reihe unterschiedlicher Tabellen-Handler mit unterschiedlichen Verhältnissen zwischen Geschwindigkeit und Anzahl gleichzeitiger Zugriffe (Speed/Concurrency Tradeoffs). See section 8 MySQL-Tabellentypen. Es wäre interessant zu sehen, wie die obigen Tests mit den verschiedenen transaktionalen Tabellen von MySQL laufen würden. PostgreSQL hat natürlich auch neue Features erhalten, seit die Tests durchgeführt wurden. Weil die genannten Tests nicht öffentlich erhältlich sind, gibt es keine Möglichkeit für uns herauszufinden, wie die Datenbank heute mit denselben Tests laufen würde.

Fazit:

Der einzige Benchmark, der heutzutage existiert, den jeder herunter laden und laufen lassen kann, um MySQL und PostgreSQL zu vergleichen, ist der MySQL-Benchmark-Test. Wir hier bei MySQL sind der Überzeugung, dass Open-Source-Datenbanken mit Open-Source-Werkzeuge getestet werden sollten! Das ist die einzige Möglichkeit, um sicherzustellen, dass niemand Tests fährt, die nicht reproduzierbar sind, und diese dazu benutzt, um zu behaupten, dass eine Datenbank besser sei als die eine andere. Ohne die Fakten zu kennen ist es unmöglich, auf die Behauptungen des Testers einzugehen.

Eine Sache, die wir merkwürdig finden, ist, dass jeder Test, den wir zu PostgreSQL gesehen haben - und wo es unmöglich ist, diesen zu wiederholen -, behauptet, dass PostgreSQL in den meisten Hinsichten besser sei, während unsere Tests, die jeder reproduzieren kann, eindeutig das Gegenteil beweisen. Damit wollen wir nicht sagen, dass PostgreSQL nicht vieles sehr gut kann (das kann es!) oder dass es nicht unter bestimmten Umständen schneller ist als MySQL. Wir würden nur gern einen fairen Test sehen, der zeigt, worin PostgreSQL sehr gut ist, damit wir einen freundlichen Wettbewerb anzetteln können!

Mehr Informationen über unsere Benchmark-Suite finden Sie unter See section 6.1.4 Die MySQL-Benchmark-Suite.

Wir arbeiten an einer noch besseren Benchmark-Suite, die Mehrbenutzer-Tests beinhaltet sowie eine bessere Dokumentation dessen, was die einzelnen Tests genau tun und wie man weitere Tests zur Suite hinzufügt.

3 Installation von MySQL

Dieses Kapitel beschreibt, woher man MySQL bezieht und wie man MySQL installiert:

3.1 Schnelle Standard-Installation von MySQL

3.1.1 MySQL auf Linux installieren

Die empfohlene Vorgehensweise für die Installation von MySQL auf Linux ist die Benutzung einer RPM-Datei. Die MySQL-RPMs werden aktuell auf einer RedHat-Version 6.2 gebaut, sollten aber auch auf anderen Linux-Versionen funktionieren, die rpm unterstützen und glibc benutzen.

Wenn Sie Probleme mit einer RPM-Datei haben, wenn Sie beispielsweise den Fehler ``Sorry, the host 'xxxx' could not be looked up'' erhalten, sehen Sie bitte unter section 3.1.1 MySQL auf Linux installieren nach.

Die RPM-Dateien, die Sie benutzen sollten, sind:

Um alle Dateien in einem RPM-Paket zu sehen, geben Sie folgendes ein:

shell> rpm -qpl MySQL-VERSION.i386.rpm

Um eine minimale Standard-Installation durchzuführen, geben Sie folgendes ein:

shell> rpm -i MySQL-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm

Um nur das Client-Paket zu installieren, geben Sie folgendes ein:

shell> rpm -i MySQL-client-VERSION.i386.rpm

Das RPM legt Dateien in `/var/lib/mysql' ab. Ausserdem erzeugt das RPM die entsprechenden Einträge in `/etc/rc.d/', um den Server beim Booten automatisch zu starten. (Falls Sie bereits vorher eine Installation durchgeführt haben, bedeutet das, dass Sie eine Kopie Ihrer vorher installierten MySQL-Startdateien machen sollten, falls Sie darin Änderungen vorgenommen haben, damit Sie diese Änderungen nicht verlieren.)

Nach der Installation der RPM-Datei(en) sollte der mysqld-Daemon laufen und Sie sollten jetzt in der Lage sein, mit der Benutzung von MySQL zu beginnen. See section 3.4 Einstellungen und Tests nach der Installation.

Wenn etwas schief geht, finden Sie weitere Informationen im Kapitel über die Binär-Installationen. See section 3.2.6 MySQL-Binärdistributionen, die von MySQL AB kompiliert wurden.

3.1.2 Installation von MySQL unter Windows

Der MySQL-Server für Windows ist in zwei Distributionstypen erhältlich:

  1. Die Binärdistribution enthält ein Setup-Programm, das alles Benötigte installiert, so dass Sie den Server sofort starten können.
  2. Die Quelldistribution enthält den gesamten Code und Unterstützungsdateien, um die ausführbaren Dateien unter Benutzung des VC++-6.0-Kompilers zu bauen. See section 3.3.7 Windows-Quelldistribution.

Im Allgemeinen sollten Sie die Binärdistribution benutzen.

Sie benötigen folgendes:

3.1.2.1 Binärdateien installieren

  1. Wenn Sie auf einem NT- oder Windows-2000-Server arbeiten, melden Sie sich als Benutzer mit Administrationsrechten an.
  2. Wenn Sie ein Upgrade einer früheren MySQL-Installation durchführen, müssen Sie den Server anhalten. Wenn Sie den Server als Systemdienst laufen lassen, geben Sie ein:
    C:\> NET STOP MySQL
    
    Ansonsten geben Sie folgendes ein:
    C:\mysql\bin> mysqladmin -u root shutdown
    
  3. Auf NT-/Windows-2000-Maschinen müssen Sie auch den Systemdienst entfernen, wenn Sie die ausführbare Datei des Servers (z. B. -max or -nt) austauschen wollen:
    C:\mysql\bin> mysqld-max-nt --remove
    
  4. Entpacken Sie die Distributionsdatei in ein temporäres Verzeichnis.
  5. Starten Sie `setup.exe', um den Installationsprozess zu beginnen. Wenn Sie in ein anderes Verzeichnis als das vorgabemäßige (`c:\mysql') installieren wollen, legen Sie mit der Schaltfläche Durchsuchen das gewünschte Verzeichnis fest.
  6. Beenden Sie den Installationsprozess.

Seit MySQL 3.23.38 enthält die Windows-Distribution sowohl die normalen als auch die MySQL-Max-Binärdateien. Der wichtigste Vorteil der Benutzung der normalen mysqld.exe-Binärdatei liegt darin, dass sie etwas schneller ist und weniger Ressourcen belegt.

Hier ist eine Liste der unterschiedlichen MySQL-Server, die Sie benutzen können:
mysqld Kompiliert mit komplettem Debugging und automatischer Überprüfung der Speicherzuordnung (memory allocation), symbolischen Links, InnoDB- und BDB-Tabellen.
mysqld-opt Optimierte Binärdistribution ohne Unterstützung von Transaktionstabellen.
mysqld-nt Optimierte Binärdatei für NT mit Unterstützung von Named Pipes. Man kann diese Version auf Windows 98 laufen lassen, aber in diesem Fall werden keine Named Pipes angelegt und man muss TCP/IP installiert haben.
mysqld-max Optimierte Binärdistribution mit Unterstützung symbolischer Links, InnoDB und BDB-Tabellen.
mysqld-max-nt Wie mysqld-max, aber mit Unterstützung von Named Pipes kompiliert.

Alle genannten Binärdistributionen sind für den Pentium Pro Prozessor optimiert, sollten aber auf jedem Intel-Prozessor >= 386 laufen.

ACHTUNG: Wenn Sie InnoDB-Tabellen benutzen wollen, müssen Sie bestimmte Start-Optionen in Ihrer `my.ini'-Datei festlegen! See section 8.5.2 Mit InnoDB anfangen - Optionen.

3.2 Allgemeine Installationsthemen

3.2.1 Wie man MySQL erhält

Sehen Sie wegen Informationen zur aktuellen Version und für Download-Anweisungen auf MySQL home page nach.

Unser Haupt-Mirror-Server für den Download ist hier:

http://mirrors.sunsite.dk/mysql/

Wenn Sie Interesse haben, eine MySQL-Mirror-Site beizusteuern, können Sie anonymes rsync mit rsync://sunsite.dk/ftp/mirrors/mysql/ machen. Schicken Sie bitte eine E-Mail an webmaster@mysql.com und geben Sie uns Bescheid, wo Ihr Mirror liegt, damit wir ihn der unten stehenden Liste hinzufügen können.

Wenn Sie Probleme beim Download von unserer Hauptseite aus haben, probieren Sie eine der unten stehenden Mirror-Sites.

Geben Sie bitte webmaster@mysql.com Bescheid, wenn Sie auf schlechte oder veraltete Mirror-Sites stoßen.

Europe:

North America:

South America:

Asia:

Australia:

Africa:

3.2.2 Betriebssysteme, die von MySQL unterstützt werden

Wir benutzen GNU Autoconf, daher ist es möglich, MySQL auf alle modernen Betriebssysteme zu portieren, auf denen Posix-Threads und ein C++-Kompiler funktionieren. (Um nur den Client-Code zu kompilieren, wir lediglich ein C++-Kompiler benötigt.) Wir benutzen und entwickeln die Software selbst hauptsächlich auf Sun Solaris (Versionen 2.5 - 2.7) und SuSE Linux Version 7.x.

Beachten Sie, dass die native Thread-Unterstützung für viele Betriebssysteme nur mit den neuesten Versionen funktioniert. Es wurde berichtet, dass MySQL erfolgreich auf folgenden Betriebssystemen / Thread-Paket-Kombinationen kompiliert wurde:

Beachten Sie, dass nicht alle Plattformen gleichermaßen gut geeignet sind, um MySQL laufen zu lassen. Wie gut eine bestimmte Plattform für hohe Last und geschäftskritische Anwendungen geeignet ist, hängt von folgenden Faktoren ab:

Nach den genannten Kriterien sind die besten Plattformen für MySQL bislang x86 mit SuSE Linux 7.1, 2.4 Kernel und ReiserFS (oder jede ähnliche Linux-Distribution) und Sparc mit Solaris 2.7 oder 2.8. FreeBSD kommt als drittes, aber wir hoffen wirklich, dass es zur Spitze aufschließt, sobald erst einmal die Thread-Bibliothek verbessert ist. Wir hoffen auch, dass wir alle anderen Plattformen, auf denen MySQL kompiliert werden kann und korrekt läuft, die aber nicht ganz denselben Grad an Stabilität und Performance aufweisen, in die Spitzenkategorie aufnehmen können. Das erfordert von unserer Seite aus einige Kooperationsbemühungen mit den Entwicklern der Betriebssystem-Bibliothek-Komponenten, von denen MySQL abhängt. Wenn Sie Interesse daran haben, eine dieser Komponenten zu verbessern und in der Lage sind, ihre Entwicklung zu beeinflussen, und detailliertere Informationen darüber brauchen, was MySQL benötigt, um besser zu laufen, schicken Sie eine E-Mail an internals@lists.mysql.com.

Beachten Sie bitte auch, dass der obige Vergleich nichts darüber aussagen will, dass ein Betriebssystem allgemein besser oder schlechter als ein anderes sei. Wir reden hier über die Auswahl eines bestimmten Betriebssystems für einen ganz bestimmten Zweck - nämlich, MySQL laufen zu lassen, und vergleichen die Betriebssysteme nur in dieser Hinsicht. Folglich wäre das Ergebnis dieses Vergleichs ein anderes, wenn wir weitere Belange berücksichtigen würden. In manchen Fällen liegt der Grund, warum ein Betriebssystem besser als ein anderes geeignet ist, schlicht darin, dass wir auf dieser speziellen Plattform mehr Tests und Optimierungen durchgeführt haben. Wir stellen hier nur unsere Beobachtungen dar, um Ihnen bei der Entscheidung zu helfen, auf welcher Plattform Sie MySQL benutzen sollten.

3.2.3 Welche MySQL-Version Sie benutzen sollten

Zunächst müssen Sie entscheiden, ob Sie das letzte Entwicklungs-Release oder das letzte stabile Release benutzen wollen:

Als nächstes müssen Sie entscheiden, ob Sie eine Quelldistribution oder eine Binärdistribution nehmen wollen. In den meisten Fällen ist es ratsam, eine Binärdistribution zu nehmen, wenn eine für Ihre Plattform existiert, weil sich diese im Allgemeinen leichter installieren läßt als eine Quelldistribution.

In folgenden Fällen fahren Sie mit einer Quellinstallation wahrscheinlich besser:

Das MySQL Benennungsschema benutzt Release-Nummern, die aus drei Zahlen und einem Suffix bestehen. Ein Release-Name wie mysql-3.21.17-beta zum Beispiel wird wie folgt interpretiert:

Alle Versionen von MySQL laufen durch unsere Standard-Tests und -Benchmarks, um sicherzustellen, dass man sie relativ sicher benutzen kann. Weil die Standard-Tests im Laufe der Zeit erweitert werden, um auf alle früher gefundenen Bugs zu prüfen, wird die Test-Suite immer besser.

Beachten Sie, dass alle Releases mindestens wie folgt getestet wurden:

Mit der internen Test-Suite
Diese ist Teil unseres Produktionssystems für einen Kunden. Sie besitzt viele Tabellen mit Hunderten Megabytes an Daten.
Mit der MySQL-Benchmark-Suite
Diese läßt eine Reihe gebräuchlicher Anfragen laufen. Das ist zusätzlich ein Test darauf, ob die letzten Optimierungen den Code tatsächlich schneller gemacht haben. See section 6.1.4 Die MySQL-Benchmark-Suite.
Mit dem crash-me-Test
Dieser Test versucht festzustellen, welche Features die Datenbank unterstützt und was ihre Fähigkeiten und Beschränkungen sind. See section 6.1.4 Die MySQL-Benchmark-Suite.

Ein weiterer Test besteht darin, dass wir die neueste MySQL-Version in unserer internen Entwicklungsumgebung einsetzen, mindestens auf einer Maschine. Wir arbeiten hierbei mit mehr als 100 Gigabytes an Daten.

3.2.4 Installationslayouts

Dieser Abschnitt beschreibt das vorgabemäßige Layout der Verzeichnisse, die durch die Installation von Binär- und Quelldistributionen angelegt werden.

Eine Binärdistribution wird installiert, indem sie an die Installationsstelle entpackt wird, die Sie auswählen (typischer Weise `/usr/local/mysql'). Die Installation erstellt folgende Verzeichnisse an dieser Stelle:

Verzeichnis Verzeichnisinhalt
`bin' Client-Programme und der mysqld-Server
`data' Log-Dateien, Datenbanken
`include' Include-(Header)-Dateien
`lib' Bibliotheken
`scripts' mysql_install_db
`share/mysql' Dateien mit Fehlernachrichten
`sql-bench' Benchmarks

Eine Quelldistribution wird installiert, nachdem Sie sie konfiguriert und kompiliert haben. Vorgabemäßig werden Dateien unter `/usr/local' installiert, und zwar in den folgenden Unterverzeichnissen:

Verzeichnis Verzeichnisinhalt
`bin' Client-Programme und -Skripte
`include/mysql' Include-(Header)-Dateien
`info' Dokumentation im Info-Format
`lib/mysql' Bibliotheken
`libexec' Der mysqld-Server
`share/mysql' Dateien mit Fehlernachrichten
`sql-bench' Benchmarks und crash-me-Test
`var' Datenbanken und Log-Dateien

Innerhalb eines Installationsverzeichnisses weicht das Layout einer Quellinstallation von dem einer Binärinstallation wie folgt ab:

Sie können Ihre eigene Binärinstallation aus einer kompilierten Quelldistribution erzeugen, indem Sie das Skript `Skripts/make_binary_Distribution' ausführen.

3.2.5 Wann und wie Updates veröffentlicht werden

MySQL entwickelt sich ziemlich schnell hier bei MySQL AB und wir wollen, dass andere MySQL-Benutzer daran teilhaben. Wir versuchen, immer dann ein neues Release heraus zu bringen, wenn wir sehr nützliche Features haben, für die offensichtlich ein Bedarf besteht.

Auch versuchen wir, unseren Benutzern zu helfen, wenn Sie nach Features anfragen, die einfach zu implementieren sind. Wir notieren, was unsere lizensierten Nutzer haben wollen, und insbesondere, was unsere Benutzer mit erweitertem E-Mail-Support haben wollen, und versuchen ihnen, eben das zu bieten.

Niemand muss einen neuen Release herunter laden. Im News-Abschnitt steht stets, ob das neue Release etwas beinhaltet, was Sie wirklich brauchen. See section G MySQL-Änderungsverlauf (Change History).

Wenn wir MySQL aktualisieren, fahren wir folgende Politik:

The current stable release ist Version 3.23; We have already moved active Entwicklung to Version 4.0. Bugs will still be fixed in the stable version. We don't believe in a complete freeze, as this also leaves out bug fixes und things that ``must be done.'' ``Somewhat frozen'' means that we may add small things that ``almost surely will not affect anything that's already working.''

3.2.6 MySQL-Binärdistributionen, die von MySQL AB kompiliert wurden

Als Service stellen wir bei MySQL AB einen Satz von Binärdistributionen von MySQL zur Verfügung, die auf unserer Site kompiliert wurden oder auf Sites von Kunden, die uns freundlicherweise Zugang zu Ihren Maschinen gewährt haben.

Diese Distributionen werden mit Skripts/make_binary_distribution erzeugt und mit folgenden Kompilern und Optionen konfiguriert:

SunOS 4.1.4 2 sun4c mit gcc 2.7.2.1
CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors" ./configure --prefix=/usr/local/mysql --disable-shared --with-extra-charsets=complex --enable-assembler
SunOS 5.5.1 (und höher) sun4u mit egcs 1.0.3a oder 2.90.27 oder gcc 2.95.2 und neuer
CC=gcc CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex --enable-assembler
SunOS 5.6 i86pc mit gcc 2.8.1
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex
Linux 2.0.33 i386 mit pgcc 2.90.29 (egcs 1.0.3a)
CFLAGS="-O3 -mpentium -mstack-align-double" CXX=gcc CXXFLAGS="-O3 -mpentium -mstack-align-double -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --with-extra-charsets=complex
Linux 2.2.x mit x686 mit gcc 2.95.2
CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-extra-charset=complex
SCO 3.2v5.0.4 i386 mit gcc 2.7-95q4
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
AIX 2 4 mit gcc 2.7.2.2
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
OSF1 V4.0 564 alpha mit gcc 2.8.1
CC=gcc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex
Irix 6.3 IP32 mit gcc 2.8.0
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
BSDI BSD/OS 3.1 i386 mit gcc 2.7.2.1
CC=gcc CXX=gcc CXXFLAGS=-O ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
BSDI BSD/OS 2.1 i386 mit gcc 2.7.2
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex

Wenn jemand optimalere Optionen für die obigen Konfigurationen hat, können diese jederzeit der Entwickler-Mailing-Liste unter internals@lists.mysql.com mitgeteilt werden.

RPM-Distributionen von MySQL-Version 3.22 wurden durch Benutzer beigesteuert. Ab Version 3.22 werden die RPMs von uns bei MySQL AB erzeugt.

Wenn Sie eine Debug-Version von MySQL kompilieren wollen, müssen Sie den oben genannten Kompilierzeilen --with-debug oder --with-debug=full hinzufügen und jegliche -fomit-frame-pointer-Optionen entfernen.

3.3 Installation der Quelldistribution

Bevor Sie mit der Quellinstallation fortfahren, sehen Sie nach, ob eine Binärdistribution für Ihre Plattform verfügbar ist, die so wie Sie wollen funktioniert. Wir geben uns viel Mühe, die Binärdistributionen mit den bestmöglichen Optionen zu bauen.

Sie benötigen folgende Werkzeuge, um MySQL aus der Quelldistribution zu bauen und zu installieren:

Wenn Sie eine aktuelle Version von gcc verwenden (aktuell genug, um die -fno-exceptions-Option zu verstehen), ist es SEHR WICHTIG, dass Sie diese Option benutzen. Ansonsten könnte es sein, dass Sie eine Binärdatei kompilieren, die zu zufälligen Zeitpunkten abstürzt. Wir empfehlen zusätzlich, dass Sie -felide-contructors und -fno-rtti zusammen mit -fno-exceptions benutzen. Im Zweifel gehen Sie wie folgt vor:


CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static

Für die meisten Systeme werden Sie dadurch eine schnelle, stabile Binärinstallation erhalten.

Wenn Sie Probleme bekommen, BITTE BENUTZEN SIE IMMER mysqlbug zum Fragenstellen die Liste mysql@lists.mysql.com. Selbst wenn das Problem kein Bug ist, sammelt mysqlbug Systeminformationen, die anderen helfen werden, Ihr Problem zu lösen. Wenn Sie mysqlbug nicht benutzen, verringern Sie die Möglichkeit, eine Lösung Ihres Problems zu bekommen! mysqlbug finden Sie im `scripts'-Verzeichnis, nachdem Sie die Distribution entpackt haben. See section 2.6.2.3 Wie man Bugs oder Probleme berichtet.

3.3.1 Schnellinstallation, Überblick

Die grundlegenden Befehle, die Sie ausführen müssen, um eine MySQL-Quelldistribution zu installieren, sind:

shell> groupadd mysql
shell> useradd -g mysql mysql
shell> gunzip < mysql-VERSION.tar.gz | tar -xvf -
shell> cd mysql-VERSION
shell> ./configure --prefix=/usr/local/mysql
shell> make
shell> make install
shell> scripts/mysql_install_db
shell> chown -R root  /usr/local/mysql
shell> chown -R mysql /usr/local/mysql/var
shell> chgrp -R mysql /usr/local/mysql
shell> cp support-files/my-medium.cnf /etc/my.cnf
shell> /usr/local/mysql/bin/safe_mysqld --user=mysql &

Wenn Sie Unterstützung für InnoDB-Tabellen haben wollen, sollten Sie die Datei /etc/my.cnf editieren und die `#'-Zeichen vor den Parametern entfernen, der mit innodb_... beginnen. See section 5.1.2 my.cnf-Optionsdateien. See section 8.5.2 Mit InnoDB anfangen - Optionen.

Wenn Sie mit einem Quell-RPM anfangen, gehen Sie wie folgt vor:

shell> rpm --rebuild MySQL-VERSION.src.rpm

Das erzeugt ein Binär-RPM, das Sie installieren können.

Sie können neue Benutzer hinzufügen, indem Sie das bin/mysql_setpermission-Skript benutzen, falls Sie die DBI- und Msql-Mysql-modules-Perl-Module installieren.

Eine detailliertere Beschreibung folgt.

Um eine Quelldistribution zu installieren, führen Sie die unten stehenden Schritte aus und gehen dann weiter zu section 3.4 Einstellungen und Tests nach der Installation, um die Schritte nach der Installation und ein paar Tests durchzuführen.

  1. Wählen Sie das Verzeichnis, in dem Sie die Distribution entpacken wollen, und wechseln Sie dort hinein.
  2. Holen Sie sich eine Distributionsdatei von einer der Sites, die unter section 3.2.1 Wie man MySQL erhält aufgelistet sind.
  3. Wenn Sie Berkeley-DB-Tabellen mit MySQL verwenden wollen, müssen Sie sich eine gepatchte Version des Berkeley-DB-Quellcodes besorgen. Bitte lesen Sie das Kapitel über Berkeley-DB-Tabellen, bevor Sie fortfahren. See section 8.6 BDB- oder Berkeley_db-Tabellen. MySQL-Quelldistributionen stehen als komprimierte tar-Archive zur Verfügung und haben Namen wie `mysql-VERSION.tar.gz', wobei VERSION eine Zahl ist, wie 4.0.5-beta.
  4. Fügen Sie einen Benutzer (User) und eine Gruppe (Group) hinzu, unter dem / der mysqld laufen soll:
    shell> groupadd mysql
    shell> useradd -g mysql mysql
    
    Diese Befehle fügen den Benutzer mysql und die Gruppe mysql hinzu. Die Syntax für useradd und groupadd kann sich auf unterschiedlichen Unix-Systemen geringfügig unterscheiden. Die Befehle können adduser und addgroup heißen. Wenn Sie wollen, können Sie Benutzer und Gruppe auch anders nennen als mysql.
  5. Entpacken Sie die Distribution ins aktuelle Verzeichnis:
    shell> gunzip < /pfad/zu/mysql-VERSION.tar.gz | tar xvf -
    
    Dieser Befehl erzeugt ein Verzeichnis namens `mysql-VERSION'.
  6. Wechseln Sie in das oberste Verzeichnis der entpackten Distribution:
    shell> cd mysql-VERSION
    
    Beachten Sie, dass Sie aktuell MySQL aus diesem obersten Verzeichnis konfigurieren und bauen müssen. Sie können MySQL nicht in ein anderes Verzeichnis bauen.
  7. Konfigurieren Sie das Release und kompilieren Sie alles:
    shell> ./configure --prefix=/usr/local/mysql
    shell> make
    
    Wenn Sie configure laufen lassen, können Sie dabei einige Optionen angeben. Geben Sie ./configure --help ein, um eine Liste von Optionen zu erhalten. section 3.3.3 Typische configure-Optionen erörtert einige der nützlicheren Optionen. Wenn configure fehlschlägt und Sie sich wegen Hilfe an mysql@lists.mysql.com wenden, geben Sie bitte alle Zeilen aus `config.log' an, von denen Sie annehmen, dass sie bei der Problembehebung hilfreich sein könnten. Fügen Sie auch die letzten Zeilen der Ausgabe von configure hinzu, wenn configure abbricht. Schicken Sie den Bug-Bericht ein, indem Sie das mysqlbug-Skript benutzen. See section 2.6.2.3 Wie man Bugs oder Probleme berichtet. Wenn das Kompilieren fehlschlägt, sehen Sie unter section 3.3.5 Probleme beim Kompilieren? nach, was bei einer Reihe geläufiger Probleme hilft.
  8. Installieren Sie alles:
    shell> make install
    
    Eventuell müssen Sie diesen Befehl als root ausführen.
  9. Erzeugen Sie die MySQL-Berechtigungstabellen (Grant Tables, nur notwendig, wenn Sie MySQL noch nie vorher installiert haben):
    shell> scripts/mysql_install_db
    
    Beachten Sie, dass bei MySQL-Versionen vor Version 3.22.10 der MySQL-Server startet, wenn Sie mysql_install_db laufen lassen. Das gilt für neuere Versionen nicht mehr!
  10. Ändern Sie den Besitzer der Binärdateien zu root und den Besitzer des Daten-Verzeichnisses zu dem Benutzer, unter dem Sie mysqld laufen lassen wollen:
    shell> chown -R root  /usr/local/mysql
    shell> chown -R mysql /usr/local/mysql/var
    shell> chgrp -R mysql /usr/local/mysql
    
    Der erste Befehl ändert die owner-Attribute der Dateien auf den Benutzer root, der zweite ändert die owner-Attribute des Daten-Verzeichnisses auf den Benutzer mysql und der dritte ändert die group-Attribute auf die Gruppe mysql.
  11. Wenn Sie die Unterstützung für die Perl-DBI/DBD-Schnittstelle hinzufügen wollen, sehen Sie unter section 9.2 MySQL-Perl-API nach.
  12. Wenn Sie wollen, dass MySQL automatisch startet, wenn Sie Ihre Maschine hoch fahren, kopieren Sie support-files/mysql.server an die Stelle, wo Ihr System seine Startdateien hat. Weitere Informationen finden Sie im support-files/mysql.server-Skript selbst sowie unter section 3.4.3 MySQL automatisch starten und anhalten.

Nachdem alles installiert wurde, sollten Sie Ihre Distribution initialisieren und testen:

shell> /usr/local/mysql/bin/safe_mysqld --user=mysql &

Wenn dieser Befehl sofort mit mysqld daemon ended fehlschlägt, finden Sie einige Informationen dazu in der Datei `mysql-Daten-Verzeichnis/'hostname'.err'. Der wahrscheinliche Grund ist der, dass bereits ein anderer mysqld-Server läuft. See section 5.1.4 Viele MySQL-Server auf derselben Maschine laufen lassen.

See section 3.4 Einstellungen und Tests nach der Installation.

3.3.2 Wie man Patches anwendet

Manchmal erscheinen Patches auf der Mailing-Liste oder werden auf Patches-Bereich auf der MySQL-Website eingestellt.

Um einen Patch aus der Mailing-Liste anzuwenden, speichern Sie die Nachricht, in der der Patch enthalten ist, in eine Datei. Wechseln Sie dann ins oberste Verzeichnis Ihres MySQL-Source-Trees und geben Sie folgende Befehle ein:

shell> patch -p1 < patch-datei-name
shell> rm config.cache
shell> make clean

Patches von der FTP-Site werden als Klartextdateien (Plain Text) oder als mit gzip komprimierte Dateien distribuiert. Ein Klartext-Patch wenden Sie genau so an, wie oben für die Patches von der Mailing-Liste beschrieben. Um ein komprimiertes Patch anzuwenden, wechseln Sie ins oberste Verzeichnis Ihres MySQL-Source-Trees und geben Sie folgende Befehle ein:

shell> gunzip < patch-datei-name.gz | patch -p1
shell> rm config.cache
shell> make clean

Nachdem Sie einen Patch angewendet haben, folgen Sie den Anweisungen für eine normale Installation vom Quellcode, indem Sie mit dem Schritt ./configure anfangen. Nach dem Schritt make install, starten Sie den MySQL-Server neu.

Es kann sein, dass Sie jeden laufenden Server anhalten müssen, bevor Sie make install laufen lassen können. (Das machen Sie mit mysqladmin shutdown.) Einige Systeme lassen es nicht zu, dass eine neue Programmversion installiert wird, wenn diese eine Version ersetzt, die momentan ausgeführt wird.

3.3.3 Typische configure-Optionen

Das configure-Skript gibt Ihnen in großem Umfang Kontrolle über die Konfigurationsmöglichkeiten Ihrer MySQL-Distribution. Typischerweise machen Sie das unter Verwendung der Optionen auf der configure-Kommandozeile. Sie können ausserdem configure beeinflussen, indem Sie bestimmte Umgebungsvariablen benutzen. See section I Umgebungsvariablen. Um eine Liste der Optionen zu erhalten, die configure unterstützt, geben Sie folgendes ein:

shell> ./configure --help

Einige der gebräuchlicheren configure-Optionen sind im Folgenden beschrieben:

3.3.4 Installation vom Entwicklungs-Source-Tree

VORSICHT: Sie sollten diesen Abschnitt nur lesen, wenn Sie daran interessiert sind, uns beim Testen von neuem Code zu helfen. Wenn Sie nur wollen, dass MySQL auf Ihrem System läuft, sollten Sie eine Standard-Distribution wählen (entweder eine Quell- oder eine Binärdistribution).

Um unseren aktuellsten Entwicklungs-Source-Tree zu bekommen, folgen Sie diesen Anweisungen:

  1. Laden Sie BitKeeper von http://www.bitmover.com/cgi-bin/download.cgi herunter. Sie benötigen Bitkeeper 2.0 oder neuer, um auf unser Repository zuzugreifen.
  2. Folgen Sie den Anweisungen, um BitKeeper zu installieren.
  3. Nachdem BitKeeper installiert ist, benutzen Sie diesen Befehl, um den MySQL-3.23-Branch zu klonen:
    shell> bk clone bk://work.mysql.com:7000 mysql
    
    Um den 4.0-Branch zu klonen, benutzen Sie statt dessen diesen Befehl:
    shell> bk clone bk://work.mysql.com:7001 mysql-4.0
    
    Das erstmalige Herunterladen des Source-Trees kann eine Weile dauern, abhängig von Ihrer Verbindungsgeschwindigkeit. Bitte Geduld.
  4. Sie brauchen GNU autoconf, automake, libtool und m4, um die nächsten Befehle auszuführen. Wenn Sie in diesem Stadium seltsame Fehler erhalten, überprüfen Sie bitte, ob Sie wirklich libtool installiert haben!
    shell> cd mysql
    shell> bk -r edit
    shell> aclocal; autoheader; autoconf;  automake;
    shell> ./configure  # Geben Sie hier Ihre Lieblingsoptionen an
    shell> make
    
    Eine Sammlung unserer Standard-configure-Skripts befindet sich im `BUILD/' Unterverzeichnis. Wenn Sie faul sind, können Sie `BUILD/compile-pentium-debug' benutzen. Um für unterschiedliche Architekturen zu kompilieren, ändern Sie das Skript ab und entfernen die Flags, die Pentium-spezifisch sind.
  5. Wenn der Build fertig ist, lassen Sie make install laufen. Seien Sie damit vorsichtig auf Produktionsmaschinen, denn dieser Befehl kann Ihre Live-Release-Installation überschreiben! Wenn Sie eine weitere Installation von MySQL haben, empfehlen wir, dass Sie ./configure mit anderen Werten für die prefix-, tcp-port- und unix-socket-path-Optionen ausführen als die, die für Ihren Produktionsserver benutzt werden.
  6. Spielen Sie reichlich mit Ihrer neuen Installation herum und versuchen Sie, die neuen Features zum Absturz zu bringen. Fangen Sie an, indem Sie make test laufen lassen. See section 10.3.2 MySQL-Test-Suite.
  7. Wenn Sie bis zum make-Stadium gekommen sind und die Distribution sich nicht kompilieren läßt, berichten Sie das bitte an bugs@lists.mysql.com. Wenn Sie die letzten Versionen der erforderlichen GNU-Werkzeuge installiert haben und sie abstürzen, wenn Sie versuchen, Ihre Konfigurationsdateien zu verarbeiten, berichten Sie das bitte ebenfalls. Wenn Sie jedoch aclocal und einen Befehl nicht gefunden-Fehler erhalten, berichten Sie diesen nicht. Stellen Sie statt dessen sicher, dass alle notwendigen Werkzeuge installiert sind und dass Ihre PATH-Variable korrekt gesetzt ist, damit Ihre Shell diese finden kann.
  8. Nach der erstmaligen bk clone-Operation, um den Source-Tree zu erhalten, sollten Sie in regelmäßigen Abständen bk pull laufen lassen, um Aktualisierungen zu erhalten.
  9. Sie erhalten die Änderungen-Geschichte (Change History) des Trees mit allen Diffs, indem Sie bk sccstool benutzen. Wenn Sie seltsame Diffs sehen oder Code, zu dem Sie Fragen haben, zögern Sie nicht, uns eine E-Mail an internals@lists.mysql.com zu schicken. Auch wenn Sie meinen, eine bessere Idee zu haben, wie etwas gemacht werden sollte, schicken Sie uns eine E-Mail an dieselbe Adresse, mit einem Patch. bk diffs erzeugt ein Patch für Sie, nachdem Sie Änderungen am Quellcode durchgeführt haben. Wenn Sie keine Zeit haben, Ihre Idee zu kodieren, schicken Sie einfach eine Beschreibung.
  10. BitKeeper hat ein nettes Hilfe-Dienstprogramm, auf das Sie über bk helptool zugreifen können.

3.3.5 Probleme beim Kompilieren?

Alle MySQL-Programme lassen sich sauber ohne Warnungen auf Solaris mit gcc kompilieren. Auf anderen Systemen können Warnungen wegen Unterschieden in System-Include-Dateien auftreten. Siehe section 3.3.6 Anmerkungen zu MIT-pThreads wegen Warnungen, die auftreten können, wenn Sie MIT-pThreads verwenden. Wegen anderer Probleme sehen Sie bitte in der unten stehenden Liste nach.

Die Lösung für viele Probleme beinhaltet Rekonfigurieren. Wenn Sie rekonfigurieren müssen, beachten Sie Folgendes:

Um zu verhindern, dass alte Konfigurationsinformationen oder Objektdateien benutzt werden, geben Sie vor dem erneuten Aufruf von configure folgende Befehle ein:

shell> rm config.cache
shell> make clean

Alternativ können Sie auch make distclean laufen lassen.

Die unten stehende Liste beschreibt einige der Probleme, die beim Kompilieren von MySQL am häufigsten auftreten:

3.3.6 Anmerkungen zu MIT-pThreads

Dieser Abschnitt beschreibt einige der Themen im Zusammenhang mit MIT-pThreads.

Beachten Sie, dass Sie auf Linux KEINE MIT-pThreads benutzen, sondern statt dessen LinuxThreads installieren sollten! See section 3.6.1 Linux (alle Linux-Versionen).

Wenn Ihr System keine native Thread-Unterstützung bietet, müssen Sie MySQL unter Verwendung des MIT-pThread-Pakets bauen. Das betrifft ältere FreeBSD-Systeme, SunOS 4.x, Solaris 2.4 und früher und einige andere. See section 3.2.2 Betriebssysteme, die von MySQL unterstützt werden.

3.3.6.1 Vorbereitung der Windows-Umgebung

3.3.7 Windows-Quelldistribution

Sie benötigen folgendes:

MySQL bauen

  1. Erzeugen Sie ein Arbeitsverzeichnis (z. B. workdir).
  2. Entpacken Sie die Quelldistribution in dieses Verzeichnis.
  3. Starten Sie den VC++-6.0-Kompiler.
  4. Wählen Sie im File-Menü Open Workspace.
  5. Öffnen Sie den `mysql.dsw'-Workspace, den Sie im Arbeitsverzeichnis finden.
  6. Wählen Sie im Build-Menü das Set Active Configuration- Menü.
  7. Wählen Sie mysqld - Win32 Debug und klicken Sie auf OK.
  8. Drücken Sie F7, um mit dem Bauen des Debug-Servers, der Bibliotheken und einiger Client-Applikationen zu beginnen.
  9. Wenn das Kompilieren beendet ist, kopieren Sie die Bibliotheken und die ausführbaren Dateien in ein separates Verzeichnis.
  10. Kompilieren Sie die Release-Versionen, die Sie haben wollen, auf dieselbe Art.
  11. Erzeugen Sie das Verzeichnis für die MySQL-Dateien, z. B. `c:\mysql'.
  12. Kopieren Sie aus dem Arbeitsverzeichnis folgende Verzeichnisse in das c:\mysql-Verzeichnis:
  13. Erzeugen Sie das Verzeichnis `c:\mysql\bin' und kopieren Sie alle Server und Clients, die Sie vorher kompiliert haben, hinein.
  14. Wenn Sie wollen, können Sie auch das `lib'-Verzeichnis erzeugen und die vorher kompilierten Bibliotheken hinein kopieren.
  15. Führen Sie mit Visual Studio ein Clean durch.

Konfigurieren und starten Sie den Server auf dieselbe Weise wie bei der Windows-Binärdistribution. See section 3.3.6.1 Vorbereitung der Windows-Umgebung.

3.4 Einstellungen und Tests nach der Installation

Wenn Sie MySQL erst einmal installiert haben (aus einer Binär- oder einer Quelldistribution), müssen Sie die Berechtigungstabellen (Grant Tables) initialisieren, den Server starten und sicherstellen, dass der Server korrekt funktioniert. Eventuell wollen Sie auch einrichten, dass der Server automatisch gestartet und angehalten wird, wenn Ihr System startet oder herunter gefahren wird.

Normalerweise installieren Sie die Berechtigungstabellen und starten den Server wie folgt: Bei der Installation einer Quelldistribution:

shell> ./scripts/mysql_install_db
shell> cd mysql_installations_verzeichnis
shell> ./bin/safe_mysqld --user=mysql &

Bei einer Binärdistribution (nicht RPM- oder pkg-Pakete) tun Sie folgendes:

shell> cd mysql_installations_verzeichnis
shell> ./bin/mysql_install_db
shell> ./bin/safe_mysqld --user=mysql &

Das legt die mysql-Datenbank an, die alle Zugriffsrechte auf Datenbanken enthält, die test-Datenbank, die Sie benutzen können, um MySQL zu testen und zusätzlich Berechtigungseinträge für den Benutzer, der mysql_install_db ausführt sowie einen root-Benutzer (ohne Passworte!). Durch den letzten Befehl wird der mysqld-Server gestartet.

mysql_install_db überschreibt keine alten Berechtigungstabellen, deshalb sollte es unter allen Umständen sicher sein. Wenn Sie die test-Datenbank nicht haben wollen, können Sie sie mit mysqladmin -u root drop test entfernen.

Am einfachsten läßt sich das Durchtesten vom obersten Verzeichnis der MySQL-Distribution durchführen. Bei einer Binärdistribution ist das Ihr Installationsverzeichnis (üblicherweise etwas wie `/usr/local/mysql'). Bei einer Quelldistribution ist es das Hauptverzeichnis Ihres MySQL-Source-Trees.

In den unten dargestellten Befehlen dieses Abschnitts und der folgenden Unterabschnitte ist BINDIR der Pfad zu dem Speicherort, wo Programme wie mysqladmin und safe_mysqld installiert sind. Bei einer Binärdistribution ist das `bin'-Verzeichnis innerhalb der Distribution. Bei einer Quelldistribution ist BINDIR wahrscheinlich `/usr/local/bin', es sei denn, Sie haben ein anderes Installationsverzeichnis als `/usr/local' angegeben, als Sie configure laufen ließen. EXECDIR ist der Speicherort, in dem der mysqld-Server installiert ist. Bei einer Binärdistribution ist das derselbe wie BINDIR. Bei einer Quelldistribution ist EXECDIR wahrscheinlich `/usr/local/libexec'.

Das Durchtesten wird im Folgenden detailliert beschrieben.

  1. Falls notwendig, starten Sie den mysqld-Server und richten die anfänglichen MySQL-Berechtigungstabellen ein, die alle Zugriffsrechte enthalten, die festlegen, wie sich Benutzer mit dem Server verbinden dürfen. Das wird normalerweise mit dem mysql_install_db-Skript gemacht:
    shell> scripts/mysql_install_db
    
    Typischerweise müssen Sie mysql_install_db nur laufen lassen, wenn Sie MySQL zum ersten Mal installieren. Wenn Sie eine existierende Installation aktualisieren (Update), können Sie deshalb diesen Schritt überspringen. (mysql_install_db ist jedoch ziemlich sicher und aktualisiert keine bereits existierenden Tabellen, daher können Sie im Zweifel immer mysql_install_db laufen lassen.) mysql_install_db erzeugt sechs Tabellen (user, db, host, tables_priv, columns_priv und func) in der mysql-Datenbank. Eine Beschreibung der anfänglichen Zugriffsrechte wird in section 5.2.5 Wie das Berechtigungssystem funktioniert festgelegt. Kurz gesagt erlauben diese Zugriffsrechte dem MySQL-Benutzer root, alles zu tun, und jedem, Datenbanken anzulegen oder zu benutzen, deren Name 'test' ist oder mit 'test_' beginnt. Wenn Sie die Zugriffsberechtigungstabellen (Grant Tables) nicht einrichten, wird folgender Fehler in der Logdatei erscheinen, wenn Sie den Server starten:
    mysqld: Can't find file: 'host.frm'
    
    Dasselbe kann auch bei einer MySQL-Binärdistribution passieren, wenn Sie MySQL nicht mit exakt ./bin/safe_mysqld starten! See section 5.7.2 safe_mysqld, der Wrapper um mysqld. Eventuell müssen Sie mysql_install_db als root laufen lassen. Wenn Sie wollen, können Sie jedoch den MySQL-Server als unprivilegierter (non-root)-Benutzer laufen lassen, vorausgesetzt, dieser Benutzer darf Dateien im Datenbank-Verzeichnis lesen und schreiben. Anweisungen, wie Sie MySQL als unprivilegierter Benutzer laufen lassen können, finden Sie in section 5.3.3 Wann Berechtigungsänderungen wirksam werden. Wenn Sie Probleme mit mysql_install_db bekommen, sehen Sie bitte unter section 3.4.1 Probleme mit mysql_install_db nach. Es gibt eine Reihe von Alternativen zum Laufenlassen des mysql_install_db-Skripts, was mit der MySQL-Distribution mitgeliefert wird: Zu weiteren Informationen über diese Alternativen siehe section 5.2 Allgemeine Sicherheitsthemen und das MySQL-Zugriffsberechtigungssystem.
  2. Starten Sie den MySQL-Server wie folgt:
    shell> cd mysql_installations_verzeichnis
    shell> bin/safe_mysqld &
    
    Wenn Sie Probleme haben, den Server zu starten, sehen Sie unter section 3.4.2 Probleme mit dem Start des MySQL-Servers nach.
  3. Benutzen Sie mysqladmin, um sicherzustellen, dass der Server läuft. Die folgenden Befehle sind ein einfacher Test, um zu überprüfen, ob der Server läuft und auf Verbindungen reagiert:
    shell> BINDIR/mysqladmin version
    shell> BINDIR/mysqladmin variables
    
    Die Ausgabe von mysqladmin version kann geringfügig variieren, abhängig von Ihrer Plattform und der Version von MySQL, sollte aber etwa wie folgt aussehen:
    shell> BINDIR/mysqladmin version
    mysqladmin  Ver 8.14 Distrib 3.23.32, for linux on i586
    Copyright (C) 2000 MySQL AB & MySQL Finnland AB & TCX DataKonsult AB
    This software comes mit ABSOLUTELY NO WARRANTY. This ist free software,
    und you are welcome to modify und redistribute it under the GPL license
    
    Server version          3.23.32-debug
    Protokoll version        10
    Connection              Localhost via Unix socket
    TCP port                3306
    UNIX socket             /tmp/mysql.sock
    Uptime:                 16 sec
    
    Threads: 1  Questions: 9  Slow queries: 0  Opens: 7  Flush tables: 2  Open tables: 0 Queries per second avg: 0.000  Memory in use: 132K  Max memory used: 16773K
    
    Um ein Gefühl dafür zu bekommen, was Sie sonst noch mit BINDIR/mysqladmin tun können, rufen Sie es mit der --help-Option auf.
  4. Stellen Sie sicher, dass Sie den Server herunter fahren können:
    shell> BINDIR/mysqladmin -u root shutdown
    
  5. Stellen Sie sicher, dass Sie den Server erneut starten können. Tun Sie das unter Benutzung von safe_mysqld oder indem Sie mysqld direkt aufrufen. Beispiel:
    shell> BINDIR/safe_mysqld --log &
    
    Wenn safe_mysqld fehlschlägt, versuchen Sie, es vom MySQL-Installationsverzeichnis aus zu starten (falls Sie noch nicht dort sind). Wenn das nicht funktioniert, sehen Sie unter see section 3.4.2 Probleme mit dem Start des MySQL-Servers nach.
  6. Lassen Sie ein paar einfache Tests ablaufen um sicherzustellen, dass der Server funktioniert. Die Ausgabe sollte ähnlich der folgenden sein:
    shell> BINDIR/mysqlshow
    +-----------+
    | Databases |
    +-----------+
    | mysql     |
    +-----------+
    
    shell> BINDIR/mysqlshow mysql
    Datenbank: mysql
    +--------------+
    |    Tables    |
    +--------------+
    | columns_priv |
    | db           |
    | func         |
    | host         |
    | tables_priv  |
    | user         |
    +--------------+
    
    shell> BINDIR/mysql -e "select host,db,user from db" mysql
    +------+--------+------+
    | host | db     | user |
    +------+--------+------+
    | %    | test   |      |
    | %    | test_% |      |
    +------+--------+------+
    
    Zusätzlich gibt es eine Benchmark-Suite im `sql-bench'-Verzeichnis (unterhalb des MySQL-Installationsverzeichnisses), die Sie benutzen können, um die Leistungsdaten von MySQL auf verschiedenen Plattformen zu vergleichen. Das `sql-bench/Results'-Verzeichnis enthält die Ergebnisse vieler Testläufe mit verschiedenen Datenbanken und Plattformen. Um alle Tests durchzuführen, geben Sie folgende Befehle ein:
    shell> cd sql-bench
    shell> run-all-tests
    
    Wenn Sie kein `sql-bench'-Verzeichnis haben, benutzen Sie wahrscheinlich ein RPM für eine Binärdistribution. (Quelldistributions-RPMs beinhalten das Benchmark-Verzeichnis.) In diesem Fall müssen Sie die Benchmark-Suite zuerst installieren, bevor Sie sie benutzen können. Ab MySQL Version 3.22 gibt es Benchmark-RPM-Dateien, die `mysql-bench-VERSION-i386.rpm' benannt sind, die Benchmark-Code und Daten enthalten. Wenn Sie eine Quelldistribution haben, können Sie auch die Tests im `tests'-Unterverzeichnis ausführen. Um beispielsweise `auto_increment.tst' auszuführen, geben Sie folgendes ein:
    shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tst
    
    Die Ergebnisse stehen dann in der `./tests/auto_increment.res'-Datei.

3.4.1 Probleme mit mysql_install_db

Der Zweck des mysql_install_db-Skripts ist, neue MySQL-Berechtigungstabellen zu erzeugen. Es betrifft keine anderen Daten! Es tut nichts, wenn Sie bereits MySQL-Berechtigungstabellen installiert haben!

Wenn Sie Ihre Berechtigungstabellen neu erzeugen wollen, sollten Sie den mysqld-Server herunter fahren, falls er läuft, und dann etwas Ähnliches wie folgendes tun:

mv mysql-data-verzeichnis/mysql mysql-data-verzeichnis/mysql-old
mysql_install_db

Dieser Abschnitt listet Probleme auf, denen Sie vielleicht begegnen, wenn Sie mysql_install_db laufen lassen:

mysql_install_db installiert die Berechtigungstabellen nicht.
Eventuell stellen Sie fest, dass mysql_install_db bei der Installations der Berechtigungstabellen fehlschlägt und mit folgenden Meldungen endet:
starting mysqld daemon with databases from XXXXXX
mysql daemon ended
In diesem Fall sollten Sie einen gründlichen Blick in die Log-Datei werfen! Diese sollte sich im Verzeichnis `XXXXXX' befinden, das in der Fehlermeldung ausgegeben wird, und sollte anzeigen, warum mysqld nicht startete. Wenn Sie nicht verstehen, was passiert ist, schicken Sie einen Bug-Bericht inklusive Log. Benutzen Sie hierfür mysqlbug! See section 2.6.2.3 Wie man Bugs oder Probleme berichtet.
Es läuft bereits ein mysqld-Daemon.
In diesem Fall müssen Sie wahrscheinlich mysql_install_db überhaupt nicht starten. Sie müssen mysql_install_db nur einmal starten, und zwar, wenn Sie MySQL zum ersten Mal installieren.
Die Installation eines zweiten mysqld-Daemons schlägt fehl,
wenn bereits ein Daemon läuft. Das kann vorkommen, wenn Sie bereits eine existierende MySQL-Installation haben, aber eine neue Installation an einem anderen Speicherort unterbringen wollen (zum Beispiel für Testzwecke, oder vielleicht wollen Sie auch einfach zwei Installationen zugleich laufen lassen. Im Allgemeinen ist der Grund für das Problem, wenn Sie versuchen, den zweiten Server laufen zu lassen, dass der zweite Server versucht, denselben Socket und Port wie der alte zu benutzen. In diesem Fall erhalten Sie als Fehlermeldung: Can't start server: Bind on TCP/IP port: Address already in use oder Can't start server : Bind on unix socket.... See section 5.1.4 Viele MySQL-Server auf derselben Maschine laufen lassen.
Sie haben keinen Schreibzugriff auf `/tmp'.
Wenn Sie keinen Schreibzugriff haben, um eine Socket-Datei am vorgabemäßigen Ort anzulegen (in `/tmp') oder keine Berechtigung, um temporäre Dateien in `/tmp' anzulegen, erhalten Sie einen Fehler, wenn Sie mysql_install_db laufen lassen oder starten oder wenn Sie mysqld benutzen. So können Sie einen anderen Socket und ein anderes temporäres Verzeichnis festlegen:
shell> TMPDIR=/irgendein_temporaeres_verzeichnis/
shell> MYSQL_UNIX_PORT=/irgendein_temporaeres_verzeichnis/mysqld.sock
shell> export TMPDIR MYSQL_UNIX_PORT
See section A.4.5 Wie Sie die MySQL-Socket-Datei `/tmp/mysql.sock' schützen oder ändern. `irgendein_temporaeres_verzeichnis' sollte der Pfad zu einem Verzeichnis sein, für das Sie Schreibberechtigung haben. See section I Umgebungsvariablen. Danach sollten Sie in der Lage sein, mysql_install_db laufen zu lassen und den Server zu starten, und zwar mit folgenden Befehlen:
shell> scripts/mysql_install_db
shell> BINDIR/safe_mysqld &
mysqld stürzt sofort ab
Wenn Sie RedHat Version 5.0 mit einer Version von glibc laufen lassen, die älter als 2.0.7-5 ist, sollten Sie sicherstellen, dass Sie alle glibc-Patches installiert haben! Darüber gibt es jede Menge Informationen in den MySQL-Mail-Archiven. Links zu den Mail-Archiven finden Sie online unter http://www.mysql.com/documentation/. Siehe auch section 3.6.1 Linux (alle Linux-Versionen). Sie können mysqld auch manuell starten, dabei die --skip-grant-tables-Option benutzen und dann die Berechtigungsinformationen selbst mit mysql eintragen:
shell> BINDIR/safe_mysqld --skip-grant-tables &
shell> BINDIR/mysql -u root mysql
Von mysql aus geben Sie die SQL-Befehle ein, die in mysql_install_db stehen. Stellen Sie sicher, dass Sie danach mysqladmin flush-privileges oder mysqladmin reload laufen lassen, um dem Server mitzuteilen, die Berechtigungstabellen neu zu laden.

3.4.2 Probleme mit dem Start des MySQL-Servers

Wenn Sie Tabellen einsetzen werden, die Transaktionen unterstützen (InnoDB, BDB), sollten Sie zuerst eine my.cnf-Datei anlegen und die Startoptionen für die Tabellentypen setzen, die Sie einsetzen wollen. See section 8 MySQL-Tabellentypen.

Im allgemeinen starten Sie den mysqld-Server auf eine der drei folgenden Weisen:

Wenn der mysqld-Daemon hoch fährt, wechselt er in das Daten-Verzeichnis. Dort erwartet er, Log-Dateien und die (process ID)-Datei schreiben zu können. Ebenfalls erwartet er dort, Datenbanken zu finden.

Der Speicherort des Daten-Verzeichnisses wird zum Zeitpunkt des Kompilierens der Distribution fest verdrahtet. Wenn mysqld jedoch erwartet, das Daten-Verzeichnis irgendwo sonst als an der Stelle zu finden, wo es auf Ihrem System tatsächlich ist, funktioniert er nicht richtig. Wenn Sie Probleme mit fehlerhaften Pfaden haben, können Sie durch den Aufruf von mysqld mit der --help-Option herausfinden, welche Optionen mysqld erlaubt und was die vorgabemäßigen Pfad-Einstellung sind. Sie können die Vorgaben überschreiben, indem Sie die korrekten Pfadnamen als Kommandozeilen-Argumente für mysqld festlegen. (Diese Optionen können auch bei safe_mysqld benutzt werden.)

Normalerweise sollte es lediglich nötig sein, mysqld das Basis-Verzeichnis mitzuteilen, wo MySQL installiert ist. Das können Sie mit der Option --basedir machen. Zusätzlich können Sie --help benutzen, um die Auswirkung der Pfadänderungsoptionen zu überprüfen (beachten Sie, dass --help die letzte Option des mysqld-Befehls wein muss. Beispiel:

shell> EXECDIR/mysqld --basedir=/usr/local --help

Wenn Sie die Pfadeinstellungen erst einmal festgelegt haben, die Sie wollen, starten Sie den Server ohne die --help-Option.

Mit welcher Methode auch immer Sie den Server starten: Wenn er nicht korrekt hoch fährt, untersuchen Sie die Log-Datei, um zu sehen, ob Sie den Grund dafür herausfinden können. Log-Dateien liegen im Daten-Verzeichnis (typischerweise `/usr/local/mysql/data' bei einer Binärdistribution, `/usr/local/var' bei einer Quelldistribution und `\mysql\data\mysql.err' unter Windows). Suchen Sie im Daten-Verzeichnis nach Dateien mit Namen der Form `host_name.err' und `host_name.log', wobei host_name der Name Ihres Server-Hosts ist. Sehen Sie in den letzten paar Zeilen dieser Dateien nach:

shell> tail host_name.err
shell> tail host_name.log

Wenn Sie etwas wie das Folgende in der Log-Datei finden:

000729 14:50:10  bdb:  Recovery function for LSN 1 27595 failed
000729 14:50:10  bdb:  warning: ./test/t1.db: No such file or directory
000729 14:50:10  Can't init databases

Das bedeutet, dass Sie mysqld nicht mit --bdb-no-recover gestartet haben und Berkeley DB findet, dass etwas mit seinen Log-Dateien nicht in Ordnung ist, als es versuchte, Ihre Datenbanken wiederherzustellen. Um weitermachen zu können, sollten Sie alle alten Berkeley-DB-Log-Dateien aus dem Datenbankverzeichnis an eine andere Stelle verschieben, wo Sie sie später untersuchen können. Die Log-Dateien sind wie `log.0000000001' benannt, wobei die Nummer im Zeitablauf hochgezählt wird.

Wenn Sie mysqld mit BDB-Tabellenunterstützung laufen lassen und mysqld beim Start einen Speicherauszug (Core Dump) liefert, könnte das an Problemen mit den BDB-Wiederherstellungs-Logs liegen. In diesem Fall können Sie versuchen, mysqld mit --bdb-no-recover zu starten. Wenn das hilft, sollten Sie danach alle `log.*'-Dateien aus dem Daten-Verzeichnis entfernen und versuchen, mysqld erneut zu starten.

Wenn Sie folgenden Fehler bekommen, bedeutet das, dass ein anderes Programm (oder ein anderer mysqld-Server) bereits den TCP/IP-Port oder -Socket benutzt, den mysqld versucht zu benutzen:

Can't start server: Bind on TCP/IP-Port: Address already in use
  oder
Can't start server : Bind on unix socket...

Benutzen Sie ps, um sicherzustellen, dass kein weiterer mysqld-Server läuft. Wenn Sie keinen weiteren Server finden, können Sie den Befehl telnet ihr-host-name tcp-ip-port-nummer eingeben und mehrere Male EINGABE drücken. Wenn Sie keine Fehlermeldung wie telnet: Unable to connect to remote host: Connection refused erhalten, benutzt irgend etwas anderes den TCP/IP-Port, den mysqld versucht zu benutzen. Siehe section 3.4.1 Probleme mit mysql_install_db und section 5.1.4 Viele MySQL-Server auf derselben Maschine laufen lassen.

Wenn mysqld gerade läuft, können Sie herausfinden, welche Pfadeinstellungen er benutzt, indem Sie folgenden Befehl ausführen:

shell> mysqladmin variables

oder

shell> mysqladmin -h 'ihr-host-name' variables

Wenn safe_mysqld hoch den Server hoch fährt, Sie sich aber nicht mit ihm verbinden können, stellen Sie sicher, dass Sie einen Eintrag wie den folgenden in `/etc/hosts' haben:

127.0.0.1       localhost

Dieses Problem tritt nur auf Systemen auf, die keine funktionierende Thread-Bibliothek besitzen, und für die MySQL so konfiguriert werden muss, dass es MIT-pThreads benutzt.

Wenn Sie es nicht schaffen, mysqld zu starten, können Sie versuchen, eine Trace-Datei anzulegen, um das Problem zu finden. See section H.1.2 Trace-Dateien erzeugen.

Wenn Sie InnoDB-Tabellen benutzen, sehen Sie bei den InnoDB-spezifischen Startoptionen nach. See section 8.5.2 Mit InnoDB anfangen - Optionen.

Wenn Sie BDB-(Berkeley DB)-Tabellen benutzen, sollten Sie sich mit den verschiedenen Startoptionen von BDB vertraut machen. See section 8.6.3 BDB-Startoptionen.

3.4.3 MySQL automatisch starten und anhalten

Die mysql.server- und safe_mysqld-Skripte können benutzt werden, um den Server automatisch beim Hochfahren des Systems zu starten. mysql.server kann ebenfalls dazu benutzt werden, den Server anzuhalten.

Das mysql.server-Skript kann benutzt werden, um den Server zu starten oder anzuhalten, indem man es mit den start- oder stop-Argumenten aufruft:

shell> mysql.server start
shell> mysql.server stop

mysql.server liegt im `share/mysql'-Verzeichnis unterhalb des MySQL-Installationsverzeichnisses oder im `support-files'-Verzeichnis des MySQL-Source-Trees.

Bevor mysql.server den Server startet, wechselt es in das MySQL-Installationsverzeichnis. Dann ruft es safe_mysqld auf. Eventuell müssen Sie mysql.server editieren, wenn Sie eine Binärdistribution haben, die Sie an eine nicht stardardmäßige Stelle installiert haben. Ändern Sie es so ab, dass es in das richtige Verzeichnis wechselt (cd), bevor es safe_mysqld startet. Wenn Sie wollen, dass der Server unter einem bestimmten Benutzer läuft, fügen Sie eine entsprechende user-Zeile zur `/etc/my.cnf'-Datei hinzu, so wie weiter unten in diesem Abschnitt dargestellt.

mysql.server stop hält den Server an, indem es ihm ein Signal sendet. Sie können den Server auch automatisch herunter fahren, indem Sie mysqladmin shutdown ausführen.

Wenn Sie möchten, können Sie diese Start- und Stop-Befehle an den entsprechenden Stellen Ihrer `/etc/rc*'-Dateien einfügen, wenn Sie MySQL für Produktions-Applikationen benutzen. Beachten Sie, wenn Sie mysql.server editieren und dann gelegentlich MySQL aktualisieren (Update), dass dann Ihre geänderte Version überschrieben wird. Daher sollten Sie eine Kopie Ihrer editierten Version machen, die Sie erneut installieren können.

Wenn Ihr System `/etc/rc.local' benutzt, um externe Skripte zu starten, sollten Sie folgendes anhängen:

/bin/sh -c 'cd /usr/local/mysql ; ./bin/safe_mysqld --user=mysql &'

Sie können Optionen für mysql.server in einer globalen `/etc/my.cnf'-Datei hinzufügen. Eine typische `/etc/my.cnf'-Datei sieht wie folgt aus:

[mysqld]
datadir=/usr/local/mysql/var
socket=/var/tmp/mysql.sock
port=3306
user=mysql

[mysql.server]
basedir=/usr/local/mysql

Das mysql.server-Skript kennt folgende Optionen: datadir, basedir und pid-file.

Folgende Tabelle zeigt, welche Optionsgruppen jedes der Startskripts aus den Optionsdateien liest:

Skript Optionsgruppen
mysqld mysqld und server
mysql.server mysql.server, mysqld, und server
safe_mysqld mysql.server, mysqld, und server

See section 5.1.2 my.cnf-Optionsdateien.

3.5 MySQL aktualisieren (Upgrade / Downgrade)

Sie können die MySQL-form- und data-Dateien jederzeit für verschiedene Versionen auf derselben Architektur benutzen, solange Sie dieselbe Grundversion von MySQL haben. Die aktuelle Grundversion ist 3. Wenn Sie den Zeichensatz ändern, während MySQL läuft (was auch die Sortierreihenfolge betreffen kann), müssen Sie myisamchk -r -q auf alle Tabellen ausführen. Ansonsten könnte es sein, dass Ihre Indexe nicht korrekt sortiert werden.

Wenn Sie vor neuen Versionen zurück schrecken, können Sie Ihren alten mysqld zu etwas wie mysqld-'alte-versions-nummer' umbenennen. Wenn Ihr neuer mysqld dann etwas Unerwartetes tut, können Sie ihn einfach anhalten und mit Ihrem alten mysqld neu starten!

Wenn Sie ein Upgrade vornehmen, sollte Sie natürlich Ihre alten Datenbanken sichern.

Wenn Sie nach einem Upgrade auf Probleme mit neu kompilierten Client-Programmen stoßen, zum Beispiel Commands out of sync oder unerwartete Speicherauszüge (Core Dumps), haben sie wahrscheinlich einen alten Header oder eine alte Bibliotheksdatei benutzt, als Sie die Programme kompilierten. In diesem Fall sollten Sie das Datum Ihrer `mysql.h'-Datei und `libmysqlclient.a'-Bibliothek überprüfen, um sicherzustellen, dass sie aus der neuen MySQL-Distribution stammten. Wenn nicht, kompilieren sie Ihre Programme bitte neu!

Wenn Sie Probleme der Art erhalten, dass Ihr neuer mysqld-Server nicht startet oder dass Sie sich nicht ohne Passwort verbinden können, überprüfen Sie, ob Sie nicht etwa noch die alte `my.cnf'-Datei Ihrer alten Installation haben! Sie können das mit program-name --print-defaults tun. Wenn es irgend etwas anderes als den Programmnamen ausgibt, haben Sie eine aktive my.cnf-Datei, die sich auf die Dinge auswirkt!

Es ist eine gute Idee, die Msql-Mysql-modules-Distribution neu zu bauen und neu zu installieren, wann immer Sie ein neues Release von MySQL installieren, speziell dann, wenn Sie Symptome wie die bemerken, dass alle Ihre DBI-Skripte mit Core-Dumps abbrechen, nachdem Sie MySQL aktualisiert haben.

3.5.1 Upgrade von 3.23 auf Version 4.0

Sie können Ihre alten data-Dateien ohne jede Änderung mit Version 4.0 benutzen. Wenn Sie Ihre Daten eines MySQL-4.0-Servers für einen älteren Server verwenden wollen, müssen Sie mysqldump benutzen.

Alte Clients sollen mit einem Server Version 4.0 ohne jedes Problem funktionieren.

Die folgende Liste stellt dar, auf was Sie aufpassen müssen, wenn Sie auf Version 4.0 aktualisieren (Upgrade):

3.5.2 Upgrade von einer Version 3.22 auf 3.23

MySQL-Version 3.23 unterstützt Tabellen des neuen MyISAM-Typs und des alten ISAM-Typs. Sie müssen Ihre alten Tabellen nicht konvertieren, um sie mit Version 3.23 einsetzen zu können. Vorgabemäßig werden alle neuen Tabellen mit dem Typ MyISAM angelegt (es sei denn, Sie starten mysqld mit der --default-table-type=isam-Option). Sie können eine ISAM-Tabelle zu einer MyISAM-Tabelle mit ALTER TABLE tabelle TYPE=MyISAM konvertieren oder mit dem Perl-Skript mysql_convert_table_format.

Clients der Versionen 3.22 und 3.21 funktionieren ohne jedes Problem mit einem Server der Version 3.23.

Die folgende Liste stellt dar, auf was Sie aufpassen müssen, wenn Sie auf Version 3.23 aktualisieren (Upgrade):

3.5.3 Upgrade von Version 3.21 auf Version 3.22

Nichts, was die Kompatibilität betrifft, hat sich zwischen Version 3.21 und 3.22 geändert. Die einzige Falle ist die, dass neue Tabellen, die unter Verwendung des DATE-Typs erzeugt werden, die neue Art der Datenspeicherung benutzen. Diese neuen Felder kann man daher nicht von einer alten Version von mysqld ansprechen.

Nachdem Sie MySQL-Version 3.22 installiert haben, starten Sie den neuen Server und lassen dann das mysql_fix_privilege_tables-Skript laufen. Dieses fügt die neuen Zugriffsberechtigungen ein, die Sie benötigen, um den GRANT-Befehl zu benutzen. Wenn Sie das vergessen, erhalten Sie ein Access denied, wenn Sie versuchen, ALTER TABLE, CREATE INDEX oder DROP INDEX zu benutzen. Wenn Ihr MySQL-Root ein Passwort benötigt, müssen Sie dieses als Argument zu mysql_fix_privilege_tables angeben.

Die C-API-Schnittstelle für mysql_real_connect() hat sich geändert. Wenn Sie ein altes Client-Programm haben, das diese Funktion aufruft, müssen Sie eine 0 als neues db-Argument einfügen (oder den Client neu kodieren, so dass er das db-Element für schnellere Verbindungen benutzt). Zusätzlich müssen Sie mysql_init() aufrufen, bevor Sie mysql_real_connect() aufrufen! Diese Änderung wurde durchgeführt, damit die neue mysql_options()-Funktion in der MYSQL-Handler-Struktur Optionen speichern kann.

The mysqld-Variable key_buffer wurde umbenannt in key_buffer_size, Sie können aber in Ihren Startdateien immer noch den alten Namen verwenden.

3.5.4 Upgrade von Version 3.20 auf Version 3.21

Wenn Sie eine Version benutzen, die älter als Version 3.20.28 ist, und auf Version 3.21 umstellen wollen, müssen Sie folgendes tun:

Sie können den mysqld-Server Version 3.21 mit safe_mysqld --old-protocol starten, um ihn mit Clients aus einer Distribution Version 3.20 zu benutzen. In diesem Fall gibt die neue Client-Funktion mysql_errno() überhaupt keine Server-Fehler zurück, nur CR_UNKNOWN_ERROR (funktioniert aber bei Client-Fehlern), und der Server benutzt die alte password()-Überprüfung statt der neuen.

Wenn Sie die --old-protocol-Option NICHT für mysqld benutzen, müssen Sie folgende Änderungen durchführen:

MySQL-Version 3.20.28 und höher kann das neue user-Tabellenformat handhaben, ohne sich auf Clients auszuwirken. Wenn Sie eine MySQL-Version vor Version 3.20.28 haben, funktionieren Passwörter damit nicht mehr, wenn Sie die user-Tabelle konvertieren. Um auf Nummer Sicher zu gehen, sollten Sie mindestens auf Version 3.20.28 aktualisieren und erst dann auf Version 3.21.

Der neue Client-Code funktioniert bei einem 3.20.x mysqld-Server. Wenn Sie daher Probleme mit 3.21.x bekommen, können Sie den alten 3.20.x-Server benutzen, ohne die Clients neu kompilieren zu müssen.

Wenn Sie nicht die --old-protocol-Option für mysqld benutzen, werden alte Clients folgende Fehlermeldung ausgeben:

ERROR: Protocol mismatch. Server Version = 10 Client Version = 9

Die neue Perl-DBI/DBD-Schnittstelle unterstützt auch die alte mysqlperl-Schnittstelle. Die einzige Änderung, die Sie machen müssen, wenn Sie mysqlperl benutzen, ist, die Argumente für die connect()-Funktion zu ändern. Die neuen Argumente sind: host, database, user und password (die user- und password-Argumente haben die Plätze getauscht. See section 9.2.2 Die DBI-Schnittstelle.

Folgende Änderungen können Anfragen in alten Applikationen betreffen:

3.5.5 Upgrade auf eine andere Architektur

Wenn Sie MySQL-Version 3.23 benutzen, können Sie die .frm-, .MYI- und .MYD-Dateien zwischen verschiedenen Architekturen kopieren, die dasselbe Fließkomma-Format unterstützen. (MySQL kümmert sich um eventuelle Byte-Tausch-Belange.)

Die MySQL-ISAM-Daten und Index-Dateien (`.ISD' und `*.ISM', je nachdem) sind Architektur-abhängig und in manchen Fällen Betriebssystem-abhängig. Wenn Sie Ihre Applikationen auf eine andere Maschine mit einer unterschiedlichen Architektur oder einem anderen Betriebssystem verlagern wollen, wollten Sie nicht einfach eine Datenbank verschieben, indem Sie deren Dateien auf die andere Maschine kopieren. Benutzen Sie statt dessen mysqldump.

Vorgabemäßig erzeugt mysqldump eine Datei mit SQL-Statements. Sie können diese Datei auf die andere Maschine übertragen und Sie als Eingabe für den mysql-Client benutzen.

mysqldump --help zeigt Ihnen, welche Optionen verfügbar sind. Wenn Sie die Daten mit einer neueren Version von MySQL benutzen werden, sollten Sie mysqldump --opt mit der neueren Version benutzen, um einen schnellen, kompakten Dump zu erhalten.

Die einfachste (wenngleich nicht schnellste) Art, eine Datenbank von einer Maschine auf eine andere zu bringen, ist, die folgenden Befehle auf der Maschine auszuführen, auf der die Datenbank liegt:

shell> mysqladmin -h 'anderer hostname' create db_name
shell> mysqldump --opt db_name \
        | mysql -h 'anderer hostname' db_name

Wenn Sie eine Datenbank von einer entfernten Maschine über ein langsames Netzwerk kopieren wollen, können Sie folgendes benutzen:

shell> mysqladmin create db_name
shell> mysqldump -h 'anderer hostname' --opt --compress db_name \
        | mysql db_name

Sie können das Ergebnis auch in einer Datei speichern, diese Datei auf die Zielmaschine übertragen und dort in die Datenbank laden. Sie können zum Beispiel wie folgt die Datenbank in eine Datei auf der Quellmaschine ausgeben (dumpen):

shell> mysqldump --quick db_name | gzip > db_name.inhalte.gz

(Die in diesem Beispiel erzeugte Datei ist komprimiert.) Übertragen Sie die Datei, die die Datenbankinhalte enthält, auf die Zielmaschine und geben Sie dort diese Befehle ein:

shell> mysqladmin create db_name
shell> gunzip < db_name.inhalte.gz | mysql db_name

Sie können auch mysqldump und mysqlimport benutzen, um den Datenbank-Transfer zu bewerkstelligen. Das ist bei großen Tabellen wesentlich schneller als die Benutzung von mysqldump. In den unten dargestellten Befehlen repräsentiert DUMPDIR den vollen Pfadnamen des Verzeichnisses, das Sie benutzen, um die Ausgabe von mysqldump zu speichern.

Legen Sie zunächst das Verzeichnis für die Ausgabe-Dateien an und geben Sie die Datenbank aus (Dump):

shell> mkdir DUMPDIR
shell> mysqldump --tab=DUMPDIR db_name

Übertragen Sie dann die Dateien des DUMPDIR-Verzeichnisses in ein entsprechendes Verzeichnis auf der Zielmaschine und laden Sie dort die Dateien in MySQL:

shell> mysqladmin create db_name           # Datenbank erzeugen
shell> cat DUMPDIR/*.sql | mysql db_name   # Tabellen in der Datenbank erzeugen
shell> mysqlimport db_name DUMPDIR/*.txt   # Daten in die Tabellen laden

Vergessen Sie auch nicht, die mysql-Datenbank zu kopieren, den dort befinden Sie die Berechtigungstabellen (user, db, host). Eventuell müssen Sie die Befehle als MySQL-root-Benutzer auf der neuen Maschine eingeben, um die mysql-Datenbank angelegt zu bekommen.

Nachdem Sie die mysql-Datenbank auf die neue Maschine kopiert haben, führen Sie mysqladmin flush-privileges aus, damit der Server die Berechtigungsinformationen neu einliest.

3.6 Betriebssystem-spezifische Anmerkungen

3.6.1 Linux (alle Linux-Versionen)

Die Anmerkungen weiter unten, die glibc betreffen, gelten nur dann, wenn Sie MySQL selbst bauen. Wenn Sie Linux auf einer x86-Maschine fahren, ist es in den meisten Fällen wesentlich besser, einfach unsere Binärdateien zu benutzen. Wir linken unsere Binärdateien an die am besten gepatchte Version von glibc, die wir bieten können, und mit den besten Kompiler-Optionen, wobei wir versuchen, MySQL für Hochlast-Server geeignet zu machen. Wenn Sie also den Text unten lesen und sich nicht sicher sind, was Sie tun sollen, sollten Sie zunächst unsere Binärdateien ausprobieren, um zu sehen, ob diese Ihren Anforderungen entsprechen. Kümmern Sie sich nur dann um einen eigenen Build, wenn Sie feststellen, dass unsere Binärdateien nicht gut genug sind. In diesem Fall wären wir für einen Hinweis dazu dankbar, damit wir beim nächsten Mal eine bessere Binärdatei bauen können. Für eine typische Benutzung, selbst bei einer großen Zahl gleichzeitiger Verbindungen und / oder Tabellen, die größer als 2 GB sind, sind unsere Binärdateien in den meisten Fällen die beste Wahl.

MySQL benutzt auf Linux LinuxThreads. Wenn Sie eine alte Linux-Version benutzen, die keine glibc2 hat, müssen Sie LinuxThreads installieren, bevor Sie MySQL kompilieren. Sie erhalten LinuxThreads unter http://www.mysql.com/downloads/Linux.

ACHTUNG: Wir haben einige seltsame Probleme bei Linux 2.2.14 und MySQL auf SMP-Systemen festgestellt. Wenn Sie ein SMP-System haben, empfehlen wir, so schnell wie möglich auf Linux 2.4 zu aktualisieren (Upgrade)! Dadurch wird Ihr System ausserdem schneller und stabiler!

Beachten Sie, dass glibc-Versionen vor und einschließlich Version 2.1.1 einen schweren Fehler im pThread_mutex_timedwait-Handling haben, was benutzt wird, wenn Sie INSERT DELAYED verwenden. Wir empfehlen, vor einem Upgrade der glibc INSERT DELAYED nicht zu verwenden.

Wenn Sie planen, mehr als 1000 gleichzeitige Verbindungen zu haben, müssen Sie einige Änderungen an LinuxThreads vornehmen, es neu kompilieren und mit der neuen `libpThread.a' linken. Setzen Sie PTHREAD_THREADS_MAX in `sysdeps/unix/sysv/linux/bits/local_lim.h' auf 4096 herauf und setzen Sie STACK_SIZE in `linuxThreads/internals.h' auf 256 KB herunter. Die Pfade sind relativ zum Wurzelverzeichnis von glibc. Beachten Sie, dass MySQL bei etwa 600 bis 1000 Verbindungen nicht stabil läuft, wenn STACK_SIZE auf den Vorgabewert von 2 MB gesetzt wird.

Wenn Sie Probleme damit bekommen, dass MySQL nicht genug Dateien oder Verbindungen öffnen kann, haben Sie möglicherweise Linux nicht so konfiguriert, dass es genug Dateien handhaben kann.

In Linux 2.2 und Folgenden können Sie die Anzahl der allozierten Datei-Handler herausbekommen, wenn Sie folgendes eingeben:

cat /proc/sys/fs/file-max
cat /proc/sys/fs/dquot-max 
cat /proc/sys/fs/super-max

Wenn Sie mehr als 16M Speicher haben, sollten Sie etwas Ähnliches wie folgendes in Ihr Boot-Skript (`/etc/rc/boot.local' auf SuSE) eintragen:

echo 65536 > /proc/sys/fs/file-max
echo 8192 > /proc/sys/fs/dquot-max
echo 1024 > /proc/sys/fs/super-max

Das können Sie auch von der Kommandozeile aus als Root eingeben, aber in diesem Fall werden die alten Beschränkungen wieder benutzt, wenn Sie Ihren Computer neu starten.

Zusätzlich sollten Sie in /etc/my.cnf einfügen:

[safe_mysqld]
open-files-limit=8192

Das sollte MySQL erlauben, bis zu 8192 Verbindungen und Dateien zu erzeugen.

Die STACK_SIZE-Konstante in LinuxThreads steuert das Spacing von Thread-Stacks im Adressraum. Sie muss Groß genug sein, damit reichlich Platz für den Stack jedes individuellen Threads bleibt, aber klein genug, um den Stack irgend eines Threads davon abzuhalten, mit den globalen mysqld-Daten zu kollidieren. Wie wir durch Experimentieren heraus fanden, unmappt die Linux-Implementation von mmap() erfolgreich eine bereits gemappte Region, wenn Sie sie anweisen, eine Adresse auszumappen, die bereits in Benutzung ist, wobei sie alle Daten der gesamten Seite auf Null setzt, statt einen Fehler zurück zu geben. Daher beruht die Sicherheit von mysqld oder jeder anderen Thread-Applikation auf dem "Gentleman"-Verhalten des Codes, der Threads erzeugt. Der Benutzer muss Vorkehrungen treffen, die sicherstellen, dass die Anzahl laufender Threads jederzeit ausreichend gering ist, damit die Thread-Stacks sich vom globalen Heap fernhalten. Bei mysqld sollten Sie dieses "Gentleman"-Verhalten forcieren, indem Sie einen vernünftigen Wert für die the max_connections-Variable setzen.

Wenn Sie MySQL selbst bauen und sich nicht mit dem Patchen von LinuxThreads herum plagen wollen, sollten Sie max_connections auf einen Wert nicht größer als 500 setzen. Dieser Wert sollte sogar noch kleiner sein, wenn Sie einen großen Schlüsselpuffer (Key Buffer), große Heap-Tabellen oder andere Dinge haben, die mysqld dazu bringen könnten, eine Menge Speicher zu allozieren, oder wenn Sie einen 2.2-Kernel mit einem 2GB-Patch fahren. Wenn Sie unsere Binärdateien oder RPM-Versionen 3.23.23 oder später benutzen, können Sie max_connections sicher auf 1500 setzen, unter der Annahme, dass es keine großen Schlüsselpuffer oder Heap-Tabellen mit vielen Daten gibt. Je mehr Sie STACK_SIZE in LinuxThreads reduzieren können, desto mehr können Sie sicher Threads erzeugen. Wir empfehlen einen Wert zwischen 128K und 256K.

Wenn Sie viele gleichzeitige Verbindungen benutzen, bekommen Sie vielleicht Probleme durch ein "Feature" im 2.2-Kernel, der einen Prozess dafür bestraft, dass er sich aufspaltet (fork) oder einen Kindprozess klont, um einen Fork-Bombenangriff (Fork Bomb Attack) zu verhindern. Das bringt MySQL dazu, nicht so gut zu skalieren, wenn Sie die Anzahl gleichzeitiger Clients erhöhen. Wir konnten beobachten, dass sich das auf Einprozessor-Systemen mit sehr langsamer Thread-Erzeugung bemerkbar macht, was sich darin zeigt, dass es sehr lange dauern kann, sich mit MySQL zu verbinden (bis zu einer Minute), und genau so lange, um es herunter zu fahren. Auf Multiprozessor-Systemen haben wir einen allmählichen Abfall der Anfrage-Geschwindigkeit beobachtet, wenn die Anzahl der Clients zunimmt. Im Verlauf der Suche nach einer Lösung haben wir von einem unserer Benutzer einen Kernel-Patch erhalten, von dem dieser sagt, dass er auf seiner Site eine beträchtliche Rolle spielt. Der Patch ist hier verfügbar (http://www.mysql.com/downloads/patches/linux-fork.patch). Inzwischen haben wir recht ausführliche Tests dieses Patchs sowohl auf Entwicklungs- als auch auf Produktionssystemen gemacht. Er hat die Performance von MySQL erheblich verbessert, ohne irgend welche Probleme zu verursachen, und wir empfehlen ihn jetzt denjenigen unserer Benutzer, die immer noch Hochlast-Server auf 2.2-Kerneln fahren. Dieses Problem wurde im 2.4-Kernel behoben. Wenn Sie daher nicht zufrieden mit der momentanen Performance Ihres Systems sind, ist es wahrscheinlich einfacher, auf 2.4 zu aktualisieren, statt den 2.2-Kernel zu patchen, was zusätzlich zur Behebung dieses Fairness-Bugs auch noch Multiprozessor-Systemen einen netten Schub gibt.

Wir haben MySQL auf dem 2.4-Kernel auf einer Zweiprozessor-Maschine getestet und haben festgestellt, dass MySQL VIEL bessere Leistungsdaten bringt - es gab praktisch keine Verlangsamung bei Anfragen bis ganz herauf zu 1000 Clients, und der Skalierungsfaktor von MySQL (berechnet als Verhältnis von maximalem Durchsatz zum Durchsatz mit 1 Client) war 100%. Ähnliches haben wir auf einer Vierprozessor-Maschine beobachtet - praktisch keine Verlangsamung, während die Anzahl der Clients bis auf 1000 stieg sowie ein Skalierungsfaktor von 300%. Für einen unter Hochlast fahrenden Multiprozessor-Server empfehlen wir daher ausdrücklich den 2.4-Kernel. Weiter haben wir festgestellt, dass es essentiell wichtig ist, den mysqld-Prozess auf dem 2.4-Kernel mit der höchstmöglichen Priorität laufen zu lassen, um maximale Performance zu erreichen. Das kann dadurch erreicht werden, dass man den renice -20 $$-Befehl zu safe_mysqld hinzufügt. Bei unseren Tests auf der Vierprozessor-Maschine ergab die Erhöhung der Priorität eine 60%-ige Steigerung des Durchsatzes bei 400 Clients.

Wir sind derzeit dabei, mehr Informationen über die Performance von MySQL auf dem 2.4-Kernel auf 4-Weg- und 8-Weg-Systemen zu bekommen. Wenn Sie Zugang zu einem solchen System haben und einige Benchmarks gemacht haben, schicken Sie bitte eine Mail mit den Ergebnissen an docs@mysql.com - wir werden Sie dem Handbuch hinzufügen.

Es gibt eine weitere Sache, die die Performance von MySQL stark beeinträchtigt, besonders auf SMP-Systemen. Die Implementation von mutex in LinuxThreads in glibc-2.1 ist sehr schlecht für Programme mit vielen Threads, die den mutex nur für kurze Zeit behalten. Wenn Sie MySQL mit unveränderten LinuxThreads linken, führt ironischerweise auf einem SMP-System in manchen Fällen das Entfernen von Prozessoren zu einer Leistungssteigerung von MySQL. Für glibc 2.1.3 haben wir ein Patch bereit gestellt, um dieses Verhalten zu korrigieren: linuxThreads-2.1-patch

Bei Verwendung von glibc-2.2.2 benutzt MySQL-Version 3.23.36 den adaptiven mutex, der sogar viel besser als der gepatchte von glibc-2.1.3 ist. Seien Sie jedoch davor gewarnt, dass unter bestimmten Umständen der aktuelle mutex-Code in glibc-2.2.2 überdrehen kann, was die Performance von MySQL beeinträchtigt. Die Gefahr, dass solche Umstände eintreten, kann dadurch verringert werden, dass der mysqld-Prozess auf die höchste Priorität gesetzt wird. Zusätzlich konnten wir das Überdrehverhalten mit einem Patch korrigieren, der hier erhältlich ist. Der Patch kombiniert die Korrektur des Überdrehens, die maximale Anzahl von Threads und das Stack-Spacing in einem. Sie wenden es auf das linuxThreads-Verzeichnis mit patch -p0 </tmp/linuxThreads-2.2.2.patch an. Wir hoffen, dass der Patch in irgend einer Form in zukünftigen Releases von glibc-2.2 enthalten sein wird. Wie es auch sei, wenn Sie mit glibc-2.2.2 linken, müssen Sie immer noch STACK_SIZE und PTHREAD_THREADS_MAX korrigieren. Wir hoffen, dass diese Vorgabewerte zukünftig auf akzeptablere Werte für eine MySQL-Hochlast-Einrichtung gesetzt werden, so dass Ihr eigener Build auf ./configure; make; make install reduziert werden kann.

Wir empfehlen, dass Die die oben genannten Patches benutzen, um eine spezielle statische Version von libpThread.a zu bauen, die Sie nur für statisches Linken mit MySQL benutzen. Wir wissen, dass die Patches für MySQL sicher sind und seine Performance erheblich verbessern, aber wir können diesbezüglich nichts über andere Applikationen sagen. Wenn Sie andere Applikationen mit der gepatchten Version der Bibliothek linken oder eine gepatchte gemeinsam benutzte (shared) Version bauen und auf Ihrem System installieren, tun Sie das auf eigenes Risiko, was andere Applikationen betrifft, die von LinuxThreads abhängen.

Wenn Sie während der Installation von MySQL irgend welche seltsamen Probleme bekommen oder gebräuchliche Utilities hängen bleiben, ist es sehr wahrscheinlich, dass diese entweder Bibliotheks- oder Compiler-bezogen sind. In diesem Fall wird die Benutzung unserer Binärdatei sie beheben.

Ein bekanntes Problem der Binärdistribution ist, dass Sie auf älteren Linux-Systemen, die libc benutzen (wie RedHat 4.x oder Slackware) nicht-schwere (non-fatal) Probleme mit der Auflösung von Hostnamen bekommen. See section 3.1.1 MySQL auf Linux installieren.

Wenn Sie LinuxThreads benutzen, werden Sie feststellen, dass mindestens drei Prozesse laufen. Das sind in Wirklichkeit Threads. Es gibt einen Thread für den LinuxThreads-Manager, einen Thread, um Verbindungen zu handhaben und einen Thread, um Alarme und Signale zu handhaben.

Beachten Sie, dass der Linux-Kernel und die LinuxThread-Bibliothek vorgabemäßig nur 1024 Threads haben können. Das bedeutet, dass Sie auf einem ungepatchten System nur höchstens 1021 Verbindungen zu MySQL haben können. Die Seite http://www.volano.com/linuxnotes.html enthält Informationen, wie man diese Beschränkung umgeht.

Wenn Sie einen toten mysqld-Daemon-Prozess mit ps sehen, bedeutet das üblicherweise, dass Sie einen Bug in MySQL oder eine zerstörte Tabelle gefunden haben. See section A.4.1 Was zu tun ist, wenn MySQL andauernd abstürzt.

Um auf Linux einen Speicherauszug (Core Dump) zu erhalten, wenn mysqld mit einem SIGSEGV-Signal stirbt, können Sie mysqld mit der --core-file-Option starten. Beachten Sie, dass Sie wahrscheinlich core file size hoch setzen müssen, indem Sie ulimit -c 1000000 zu safe_mysqld hinzufügen oder safe_mysqld mit --core-file-sizes=1000000 starten. See section 5.7.2 safe_mysqld, der Wrapper um mysqld.

Wenn Sie Ihren eigenen MySQL-Client linken und bei der Ausführung diesen Fehler erhalten,

ld.so.1: ./my: fatal: libmysqlclient.so.4: open failed: No such file or directory

kann das Problem durch eine der folgenden Methoden behoben werden:

Wenn Sie den Fujitsu-Compiler (fcc / FCC) benutzen, werden Sie beim Kompilieren von MySQL einige Probleme bekommen, weil die Linux-Header-Dateien sehr gcc-orientiert sind.

Folgende configure-Zeile sollte mit fcc/FCC funktionieren:

CC=fcc CFLAGS="-O -K fast -K lib -K omitfp -Kpreex -D_GNU_SOURCE -DCONST=konstante -DNO_STRTOLL_PROTO" CXX=FCC CXXFLAGS="-O -K fast -K lib  -K omitfp -K preex --no_exceptions --no_rtti -D_GNU_SOURCE -DCONST=konstante -Dalloca=__builtin_alloca -DNO_STRTOLL_PROTO '-D_EXTERN_INLINE=static __inline'" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-low-memory

3.6.1.1 Anmerkungen zur Binärdistribution (Linux)

MySQL benötigt zumindest Linux-Version 2.0.

ACHTUNG: Wir haben Berichte von MySQL-Benutzern erhalten, die schwer wiegende Stabilitätsprobleme mit Linux-Kernel 2.2.14 mitgeteilt haben. Wenn Sie diesen Kernel benutzen, sollten Sie auf 2.2.19 (oder neuer) oder auf einen 2.4-Kernel aktualisieren. Wenn Sie eine Mehrprozessormaschine haben, sollten Sie auf jeden Fall in Betracht ziehen, 2.4 zu benutzen, weil Ihnen das erhebliche Geschwindigkeitssteigerung geben wird.

Die Binärdistribution wird mit -static gelinkt, was normalerweise heißt, dass Sie sich nicht um die Version der Systembibliotheken kümmern müssen, die Sie haben. Ausserdem brauchen Sie nicht LinuxThread installieren. Ein Programm, das mit -static gelinkt ist, ist etwas größer als ein dynamisch gelinktes Programm, und gleichzeitig etwas schneller (3-5%). Ein Problem liegt jedoch darin, dass Sie bei einem statisch gelinkten Programm keine benutzerdefinierten Funktionen (UDF) benutzen können. Wenn Sie UDF-Funktionen schreiben oder benutzen wollen (das ist nur etwas für C- oder C++-Programmierer), müssen Sie MySQL selbst kompilieren und das dynamische Linken benutzen.

Wenn Sie ein libc-basierendes System benutzen (statt eines glibc2-Systems), bekommen Sie bei der Binärdistribution wahrscheinlich Probleme mit der Auflösung von Hostnamen und mit getpwnam(). (Das liegt daran, dass glibc leider von einigen externen Bibliotheken abhängt, um Hostnamen aufzulösen und und getpwent(), selbst wenn es mit -static kompiliert wird.) In diesem Fall erhalten Sie wahrscheinlich folgende Fehlermeldung, wenn Sie mysql_install_db ausführen:

Sorry, the host 'xxxx' could not be looked up

oder den folgenden Fehler, wenn Sie versuchen, mysqld mit der --user-Option laufen zu lassen:

getpwnam: No such file or directory

Sie können dieses Problem auf eine der folgenden Weisen lösen:

Die Linux-Intel-Binärdatei und die RPM-Releases von MySQL sind für höchst mögliche Geschwindigkeit konfiguriert. Wir versuchen immer, den schnellsten stabilen Kompiler zu benutzen, der verfügbar ist.

MySQL-Perl-Unterstützung erfordert Perl-Version 5.004_03 oder neuer.

Auf einigen Linux-2.2-Versionen erhalten Sie womöglich den Fehler Resource temporarily unavailable, wenn Sie eine Menge neuer Verbindungen zu einem mysqld-Server über TCP/IP aufmachen.

Das Problem liegt darin, dass Linux eine Verzögerung zwischen dem Schließen eines TCP/IP-Sockets und dem tatsächlichen Freigeben durch das System hat. Da es nur Platz für eine bestimmte Anzahl von TCP/IP-Slots gibt, bekommen Sie den genannten Fehler, wenn Sie viele neue TCP/IP-Verbindungen innerhalb kurzer Zeit aufbauen, zum Beispiel, wenn Sie den MySQL-`test-connect'-Benchmark über TCP/IP laufen lassen.

Wir haben dieses Problem mehrfach an verschiedene Linux-Mailing-Listen geschrieben, konnten aber bislang keine saubere Lösung erhalten.

Die einzige bekannte 'Behebung' des Problems liegt darin, persistente Verbindungen bei Ihren Clients zu verwenden oder Sockets zu benutzen, wenn Sie den Datenbankserver und die Clients auf derselben Maschine laufen lassen. Wir hoffen, dass zukünftig der Linux 2.4-Kernel dieses Problem lösen wird.

3.6.1.2 Anmerkungen zu Linux x86

MySQL erfordert libc-Version 5.4.12 oder neuer. Bekannt ist, dass libc 5.4.46 funktioniert. glibc-Version 2.0.6 und später sollten ebenfalls funktionieren. Es hat einige Probleme mit den glibc-RPMs von RedHat gegeben. Wenn Sie Probleme haben, prüfen Sie daher, ob es Updates gibt! Die glibc-2.0.7-19- und -2.0.7-29-RPMs funktionieren bekanntermaßen ebenfalls.

Bei einigen älteren Linux-Distributionen kann configure einen Fehler wie folgt produzieren:

Syntaxfehler in sched.h. Ändern Sie _P zu __P in der
/usr/include/sched.h-Datei. Siehe das Installationskapitel im
Referenzhandbuch.

Machen Sie, was die (englischsprachige) Fehlermeldung sagt. Fügen Sie also einen zusätzlichen Unterstrich zum _P-Makro hinzu, das nur einen Unterstrich hat, und versuchen Sie es noch einmal.

Möglicherweise erhalten Sie beim Kompilieren Warnungen. Die folgenden davon können ignoriert werden:

mysqld.cc -o objs-thread/mysqld.o
mysqld.cc: In function `void init_signals()':
mysqld.cc:315: warning: assignment of negative value `-1' to `long unsigned int'
mysqld.cc: In function `void * signal_hand(void *)':
mysqld.cc:346: warning: assignment of negative value `-1' to `long unsigned int'

In Debian-GNU/Linux müssen Sie folgendes tun, damit MySQL beim Hochfahren des Systems automatisch startet:

shell> cp support-files/mysql.server /etc/init.d/mysql.server
shell> /usr/sbin/update-rc.d mysql.server defaults 99

mysql.server befindet sich im `share/mysql'-Verzeichnis unterhalb des MySQL-Installationsverzeichnisses oder im `support-files'-Verzeichnis des MySQL-Source-Trees.

Wenn mysqld beim Start immer einen Speicherauszug (Core Dump) erzeugt, kann das Problem darin liegen, dass Sie eine alte `/lib/libc.a' haben. Versuchen Sie sie umzubenennen, entfernen Sie dann `sql/mysqld', führen Sie ein neues make install durch und versuchen Sie es noch einmal. Dieses Problem wurde von einigen Slackware-Installationen berichtet.

Wenn Sie beim Linken von mysqld folgenden Fehler erhalten, bedeutet das, dass Ihre `libg++.a' nicht korrekt installiert ist:

/usr/lib/libc.a(putc.o): In function `_IO_putc':
putc.o(.text+0x0): multiple definition of `_IO_putc'

Sie können vermeiden, dass `libg++.a' benutzt wird, indem Sie configure wie folgt ablaufen lassen:

shell> CXX=gcc ./configure

3.6.1.3 Anmerkungen zu Linux SPARC

Bei einigen Implementationen ist readdir_r() fehlerhaft. Das äußert sich darin, dass SHOW DATABASES immer einen leeren Satz (Empty Set) zurück gibt. Das kann behoben werden, indem HAVE_READDIR_R aus

Einige Probleme erfordern, dass Sie Ihre Linux-Installation patchen. Der Patch befindet sich unter http://www.mysql.com/downloads/patches/Linux-sparc-2.0.30.diff.

Dieser Patch bezieht sich auf Linux-Distribution `sparclinux-2.0.30.tar.gz', die auf vger.rutgers.edu verfügbar ist (eine Version von Linux, die nie mit der offiziellen 2.0.30 verbunden wurde). Zusätzlich müssen Sie LinuxThreads 0.6 oder neuer installieren.

3.6.1.4 Anmerkungen zu Linux Alpha

MySQL-Version 3.23.12 ist die erste MySQL-Version, die auf Linux-Alpha getestet wurde. Wenn Sie planen, MySQL auf Linux-Alpha einzusetzen, stellen Sie sicher, dass Sie diese oder eine neuere Version haben.

Wir haben MySQL auf Alpha mit unseren Benchmarks und unserer Test-Suite getestet, und es scheint gut zu funktionieren. Hauptsächlich noch nicht getestet haben wird, wie die Dinge mit vielen gleichzeitigen Verbindungen funktionieren.

Wir kompilieren die Standard-MySQL-Binärdatei mit SuSE 6.4, Kernel 2.2.13-SMP, Compaq-C-Kompiler Version 6.2-504 und Compaq-C++-Kompiler Version 6.3-005 auf einer Compaq-DS20-Maschine mit einem Alpha-EV6-Prozessor.

Sie finden die genannten Kompiler auf http://www.support.compaq.com/alpha-tools). Durch die Verwendung dieser Kompiler anstelle von gcc erhalten wir eine 9% bis 14% bessere Performance für MySQL.

Beachten Sie, dass die Konfigurationszeile die Binärversion auf die aktuelle CPU optimiert. Das heißt, dass Sie unsere Binärdatei nur benutzen können, wenn Sie einen Alpha-EV6-Prozessor haben. Ausserdem haben wir statisch kompiliert, um Bibliothek-Probleme zu vermeiden.

CC=ccc CFLAGS="-fast" CXX=cxx CXXFLAGS="-fast -noexceptions -nortti" ./configure --prefix=/usr/local/mysql --disable-shared --with-extra-charsets=complex --enable-thread-safe-client --with-mysqld-ldflags=-non_shared --with-client-ldflags=-non_shared

Bei Benutzung von egcs funktionierte bei uns die folgende Konfigurationszeile:

CFLAGS="-O3 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --disable-shared

Einige bekannte Probleme, wenn MySQL auf Linux-Alpha läuft:

3.6.1.5 Anmerkungen zu Linux PowerPC

MySQL sollte auf MkLinux mit dem neuesten glibc-Paket funktionieren (getestet mit glibc 2.0.7).

3.6.1.6 Anmerkungen zu Linux MIPS

Um MySQL auf Qube2 zum Laufen zu bringen (Linux Mips), benötigen Sie die neuesten glibc-Bibliotheken (glibc-2.0.7-29C2 funktioniert bekanntermaßen). Ausserdem müssen Sie den egcs-C++-Kompiler (egcs-1.0.2-9, gcc 2.95.2 oder neuer) benutzen.

3.6.1.7 Anmerkungen zu Linux IA64

Um MySQL auf Linux Ia64 zu kompilieren, mussten wir folgendes tun (wir vermuten, dass das leichter wird, wenn die neue gcc-Version für ia64 herausgebracht wird).

Unter Verwendung von gcc-2.9-final:

CFLAGS="-O2" CXX=gcc CXXFLAGS="-O2 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-extra-charsets=complex

Nach make werden Sie einen Fehler erhalten, dass sql/opt_range.cc nicht kompiliert (interner Kompiler-Fehler). Um das zu beheben, gehen Sie ins sql-Verzeichnis und tippen Sie erneut make ein. Kopieren Sie die Kompilierzeile, ändern Sie aber -O2 zu -O0. Die Datei sollte nunmehr kompilieren.

Jetzt können Sie folgendes tun:

cd ..
make
make_install

und mysqld sollte lauffähig sein.

Auf Ia64 benutzen die MySQL-Client-Binärdateien gemeinsam genutzte (shared) Bibliotheken. Wenn Sie daher unsere Binärdistribution an anderer Stelle als `/usr/local/mysql' benutzen, müssen Sie entweder `/etc/ld.so.conf' ändern oder den Pfad zum Verzeichnis hinzufügen, wo Sie `libmysqlclient.so' haben, und zwar in der LD_LIBRARY_PATH-Umgebungsvariablen.

See section A.3.1 Probleme beim Linken mit der MySQL-Client-Bibliothek.

3.6.2 Anmerkungen zu Windows

Dieser Abschnitt beschreibt Installation und Benutzung von MySQL auf Windows. Diese Information steht zusätzlich in der `README'-Datei, die mit der MySQL-Windows-Distribution mitgeliefert wird.

3.6.2.1 Wie man MySQL auf Win95 / Win98 startet

MySQL benutzt TCP/IP, um einen Client mit einem Server zu verbinden. (Das erlaubt jeder beliebigen Maschine in Ihrem Netzwerk, sich mit Ihrem MySQL-Server zu verbinden.) Aus diesem Grund müssen Sie MySQL auf Ihrer Maschine installieren, bevor Sie MySQL starten. Sie finden TCP/IP auf Ihrer Windows-CD-ROM.

Beachten Sie, dass Sie bei Verwendung eines alten Win95-Releases (zum Beispiel OSR2) wahrscheinlich ist, dass Sie ein altes Winsock-Paket haben! MySQL erfordert Winsock 2! Sie erhalten das neueste Winsock von http://www.microsoft.com/. Win98 enthält die neue Winsock-2-Bibliothek, deshalb trifft das Gesagte nicht auf Win98 zu.

Um den mysqld-Server zu starten, öffnen Sie ein MS-DOS-Fenster (MS-DOS-Eingabeaufforderung) und geben Sie ein:

C:\> C:\mysql\bin\mysqld

Das startet mysqld im Hintergrund ohne Fenster.

Sie können den MySQL-Server killen, indem Sie eingeben:

C:\> C:\mysql\bin\mysqladmin -u root shutdown

Beachten Sie, dass Win95 und Win98 die Erzeugung von Named Pipes nicht unterstützen. Auf Win95 und Win98 können Sie Named Pipes nur benutzen, um sich zu einem entfernten MySQL-Server zu verbinden, der auf einem NT-Server-Host läuft. (Natürlich muss auch der MySQL-Server Named Pipes unterstützen. Beispielsweise läßt die Verwendung von mysqld-opt unter NT keine Named-Pipe-Verbindungen zu. Sie sollten daher entweder mysqld-nt oder mysqld-max-nt verwenden.)

Wenn mysqld nicht startet, überprüfen Sie bitte die `\mysql\data\mysql.err'-Datei um zu sehen, ob der Server eine Meldung ausgegeben hat, die auf die Ursache des Problems hinweist. Sie können auch versuchen, den Server mit mysqld --standalone zu starten. In diesem Fall erscheinen vielleicht nützliche Informationen auf dem Bildschirm, die Ihnen bei der Lösung des Problems helfen.

Die letzte Option besteht darin, mysqld mit --standalone --debug zu starten. In diesem Fall schreibt mysqld eine Log-Datei `C:\mysqld.trace', die die Ursache enthalten könnte, warum mysqld nicht startet. See section H.1.2 Trace-Dateien erzeugen.

3.6.2.2 MySQL auf Windows NT oder Windows 2000 starten

Der Win95-/Win98-Abschnitt trifft auch auf NT/Win2000 zu, mit folgenden Unterschieden:

Damit MySQL mit TCP/IP auf NT läuft, müssen Sie Service-Pack 3 (oder neuer) installieren!

Beachten Sie, dass alles Folgende, das für NT zutrifft, ebenfalls für Win2000 zutrifft!

Für NT/Win2000 ist der Servername mysqld-nt. Normalerweise sollten Sie MySQL auf NT/Win2000 als Systemdienst installieren:

C:\> C:\mysql\bin\mysqld-nt --install

oder

C:\> C:\mysql\bin\mysqld-max-nt --install

(Unter Windows NT können Sie in der Tat jede der Server-Binärdateien als Systemdienst installieren, aber nur diejenigen, die Namen haben, die auf -nt.exe enden, bieten Unterstützung für Named Pipes.)

Sie können MySQL mit diesen Befehlen starten und anhalten:

C:\> NET START mysql
C:\> NET STOP mysql

Beachten Sie, dass Sie in diesem Fall keine weiteren Optionen für mysqld-nt angeben können!

Sie können mysqld-nt auf NT auch als allein ablaufendes Programm (Stand-alone) laufen lassen, wenn Sie mysqld-nt mit irgend welchen Optionen starten wollen! Wenn Sie mysqld-nt auf NT ohne Optionen laufen lassen, versucht mysqld-nt, sich mit den Vorgabeoptionen als Systemdienst zu starten. Wenn Sie mysqld-nt angehalten haben, müssen Sie es mit NET START mysql neu starten.

Der Systemdienst wird installiert mit dem Namen MySQL. Einmal installiert, muss er mit dem Systemdienst-Steuerungs-Manager (SCM) in der Systemsteuerung gestartet werden, oder indem Sie den NET START MySQL-Befehl benutzen. Wenn irgend welche Optionen angegeben werden sollen, müssen diese als ``Startparameter'' im SCM-Dienstprogramm angegeben werden, bevor Sie den MySQL-Dienst starten. Wenn mysqld-nt läuft, kann er mit mysqladmin oder dem SCM-Dienstprogramm angehalten werden, oder indem Sie den Befehl NET STOP MySQL benutzen. Wenn Sie SCM benutzen mysqld-nt, um den Server anzuhalten, gibt es eine seltsame Meldung von SCM über mysqld shutdown normally. Wenn er als Systemdienst läuft, hat mysqld-nt keinen Zugriff auf die Konsole. Daher werden auch keine Meldungen angezeigt.

Auf NT erhalten Sie möglicherweise folgende Systemdienst-Fehlermeldungen:
Zugriff verboten Bedeutung: mysqld-nt.exe kann nicht gefunden werden.
Kann nicht registrieren Bedeutung: Der Pfad ist falsch.
Installation des Systemdienstes fehlgeschlagen. Bedeutung: Der Systemdienst ist bereits installiert oder der Systemdienst-Steuerungs-Manager ist in einem schlechten Zustand.

Wenn Sie Problem haben, mysqld-nt als Systemdienst zu installieren, versuchen Sie, ihn mit dem vollen Pfad zu installieren:

C:\> C:\mysql\bin\mysqld-nt --install

Wenn das nicht funktioniert, können Sie erreichen, dass mysqld-nt korrekt startet, indem Sie den Pfad in der Registrierung korrigieren!

Wenn Sie nicht wollen, dass mysqld-nt als Systemdienst startet, können Sie ihn wie folgt starten:

C:\> C:\mysql\bin\mysqld-nt --standalone

oder

C:\> C:\mysql\bin\mysqld --standalone --debug

Letztgenanntes gibt Ihnen eine Debug-Spur in `C:\mysqld.trace'. See section H.1.2 Trace-Dateien erzeugen.

3.6.2.3 MySQL auf Windows laufen lassen

MySQL unterstützt TCP/IP auf allen Windows-Plattformen und Named Pipes auf NT. Vorgabemäßig werden Named Pipes für lokale Verbindungen auf NT und TCP/IP für alle anderen Fälle benutzt, wenn der Client TCP/IP installiert hat. Der Hostname legt fest, welches Protokoll benutzt wird:

Hostname
Protokoll
NULL (keiner) Auf NT zuerst Named Pipes versuchen. Wenn das nicht funktioniert, TCP/IP benutzen. Auf Win95/Win98 wird TCP/IP benutzt.
. Named Pipes
localhost TCP/IP zum aktuellen Host
hostname TCP/IP

Sie können erzwingen, dass ein MySQL-Client Named Pipes benutzt, indem Sie die --pipe-Option oder . als Hostnamen angeben. Benutzen Sie die --socket-Option, um den Namen der Pipe festzulegen.

Sie können feststellen, ob MySQL funktioniert, indem Sie die folgenden Befehle eingeben:

C:\> C:\mysql\bin\mysqlshow
C:\> C:\mysql\bin\mysqlshow -u root mysql
C:\> C:\mysql\bin\mysqladmin version status proc
C:\> C:\mysql\bin\mysql test

Wenn mysqld nur langsam auf Verbindungen auf Win95/Win98 antwortet, gibt es wahrscheinlich ein Problem mit Ihrem DNS. Starten Sie in diesem Fall mysqld mit --skip-name-resolve und benutzen Sie nur localhost und IP-Nummern in den MySQL Berechtigungstabellen. Sie können DNS bei einer Verbindung zu einem mysqld-nt-MySQL-Server, der auf NT läuft, ebenfalls dadurch vermeiden, dass Sie das --pipe-Argument verwenden, um die Benutzung von Named Pipes festzulegen. Das funktioniert bei den meisten MySQL-Clients.

Es gibt zwei Versionen des MySQL-Kommadozeilen-Werkzeugs:
mysql Kompiliert auf nativem Windows, was sehr eingeschränkte Texteditiermöglichkeiten bietet.
mysqlc Kompiliert mit dem Cygnus-GNU-Kompiler und -Bibliotheken, was readline-Editiermöglichkeit bietet.

Wenn Sie mysqlc.exe benutzen wollen, müssen Sie `C:\mysql\lib\cygwinb19.dll' in Ihr Windows-Systemverzeichnis kopieren (`\windows\system' oder ein ähnlicher Ort).

Vorgabemäßig geben die Berechtigungen auf Windows allen lokalen Benutzern volle Zugriffsrechte auf alle Datenbanken, ohne ein Passwort anzugeben. Um MySQL sicherer zu machen, sollten Sie für alle Benutzer ein Passwort setzen und die Zeile in der Tabelle mysql.user, die Host='localhost' und User='' enthält, löschen.

Sie sollten auch für den root-Benutzer ein Passwort vergeben. Das folgende Beispiel entfernt den anonymen Benutzer, der von jedem genutzt werden kann, um auf die test-Datenbank zuzugreifen und setzt dann für den root-Benutzer ein Passwort:

C:\> C:\mysql\bin\mysql mysql
mysql> DELETE FROM user WHERE Host='localhost' AND User='';
mysql> QUIT
C:\> C:\mysql\bin\mysqladmin reload
C:\> C:\mysql\bin\mysqladmin -u root password ihr_passwort

Nachdem Sie das Passwort gesetzt haben, sollten Sie den mysqld-Server herunter fahren, was Sie mit folgendem Befehl bewerkstelligen können:

C:\> mysqladmin --user=root --password=ihr_passwort shutdown

Wenn Sie die alte Shareware-Version von MySQL-Version 3.21 unter Windows benutzen, schlägt der genannte Befehl mit einem Fehler fehl: parse error near 'SET OPTION password'. Die Lösung besteht darin, auf die aktuelle MySQL-Version zu aktualisieren, die frei verfügbar ist.

Mit den neuen MySQL-Versionen können Sie auf einfache Art neue Benutzer hinzufügen und Zugriffsrechte mit den GRANT- und REVOKE-Befehlen ändern. See section 5.3.1 GRANT- und REVOKE-Syntax.

3.6.2.4 Verbinden mit einem entfernten MySQL-Server von Windows mit SSH aus

Hier ist eine Anmerkung dazu, wie man sich über eine sichere Verbindung zu einem entfernten MySQL-Server mit SSH verbindet (von David Carlson dcarlson@mplcomm.com):

Jetzt sollten Sie eine ODBC-Verbindung zu MySQL haben, die mit SSH verschlüsselt ist.

3.6.2.5 Daten auf verschiedenen Platten unter Win32 aufteilen

Ab MySQL-Version 3.23.16 werden die mysqld-max- und mysql-max-nt-Server in der MySQL-Distribution mit der -DUSE_SYMDIR-Option kompiliert. Das gibt Ihnen die Möglichkeit, Datenbanken auf verschiedene Festplatten zu verteilen, indem Sie symbolische Links darauf machen (in ähnlicher Weise, wie symbolische Links unter Unix funktionieren).

Unter Windows legen Sie einen symbolischen Link auf eine Datenbank an, indem Sie eine Datei erzeugen, die den Pfad zum Zielverzeichnis enthält, und diese Datei im `mysql_data'-Verzeichnis unter dem Dateiname `Datenbank.sym' speichern. Beachten Sie, dass der symbolische Link nur dann benutzt wird, wenn das Verzeichnis `mysql_data_dir\datenbank' nicht existiert.

Wenn Ihr MySQL-Daten-Verzeichnis beispielsweise `C:\mysql\data' ist und Sie die Datenbank foo dort haben wollen, die aber in `D:\data\foo' liegt, erzeugen Sie die Datei `C:\mysql\data\foo.sym', die als Text D:\data\foo\ enthält. Dann werden alle Tabellen, die in der Datenbank foo sind, in `D:\data\foo' erzeugt.

Beachten Sie, dass wir dieses Feature nicht vorgabemäßig aktiviert haben, weil es mit Geschwindigkeitsnachteilen verbunden ist. Es ist selbst dann nicht aktiviert, wenn Sie MySQL mit Unterstützung dafür kompiliert haben. Um symbolische Links zu aktivieren, müssen Sie in Ihre my.cnf- oder my.ini-Datei folgenden Eintrag machen:

[mysqld]
use-symbolic-links

In MySQL 4.0 werden symbolische Links vorgabemäßig aktiviert sein. Wenn Sie dies deaktivieren wollen, benutzen Sie die skip-symlink-Option.

3.6.2.6 MySQL-Clients auf Windows kompilieren

In Ihren Quell-Dateien sollten Sie `windows.h' einschließen, bevor Sie `mysql.h' einschließen:

#if defined(_WIN32) || defined(_WIN64)
#include <windows.h>
#endif
#include <mysql.h>

Sie können Ihren Code entweder mit der dynamischen `libmysql.lib'-Bibliothek linken, die nur ein Wrapper zum Laden der `libmysql.dll' bei Bedarf ist, oder mit der statischen `mysqlclient.lib'-Bibliothek.

Beachten Sie, dass MySQL-Client-Bibliotheken als threaded Bibliotheken kompiliert werden, daher sollten Sie auch Ihren Code so kompilieren, dass er multi-threaded ist!

3.6.2.7 MySQL-Windows im Vergleich zu Unix-MySQL

MySQL-Windows hat sich mittlerweile als sehr stabil erwiesen. Diese Version von MySQL hat dieselben Features wie die entsprechende Unix-Version, allerdings mit folgenden Ausnahmen:

Windows 95 und Threads
Windows 95 hat ein etwa 200 Bytes großes Hauptspeicher-Leck (Memory Leak) für jede Thread-Erzeugung. Jede Verbindung zu MySQL erzeugt eine neues Thread, daher sollten Sie mysqld nicht für längere Zeiträume auf Windows 95 laufen lassen, wenn Ihr Server viele Verbindungen handhabt! Windows NT und Windows 98 haben diesen Bug nicht.
Gleichzeitige Lesezugriffe
MySQL vertraut auf pread()- und pwrite()-Aufrufe, um in der Lage zu sein, INSERT und SELECT zu mischen. Momentan benutzen wir mutexes, um pread() / pwrite() zu emulieren. Langfristig werden wir die Dateiebenen-Schnittstelle durch eine virtuelle Schnittstelle ersetzen, um die readfile()- / writefile()-Schnittstelle auf NT mit höherer Geschwindigkeit benutzen zu können. Die aktuelle Implementation begrenzt die Anzahl offener Dateien, die MySQL benutzen kann, auf 1024, was bedeutet, dass Sie nicht so viele gleichzeitige Threads auf NT benutzen können wie auf Unix.
Blockierendes Lesen
MySQL benutzt blockierendes Lesen (Blocking Read) für jede Verbindung. Das bedeutet in der Anwendung: Geplant ist, dieses Problem zu beheben, sobald unsere Windows-Entwickler ein nettes Workaround heraus gefunden haben.
UDF-Funktionen
Momentan unterstützt MySQL-Windows keine benutzerdefinierten Funktionen (UDF, user defined functions).
DROP DATABASE
Sie können keine Datenbank löschen, die durch irgend einen Thread in Benutzung ist.
MySQL vom Task-Manager aus killen
Sie können MySQL nicht vom Task-Manager oder mit dem Shutdown-Dienstprogramm unter Windows 95 killen. Sie müssen es mit mysqladmin shutdown herunter fahren.
Von Groß-/Kleinschreibung unabhängige Namen
Unter Windows sind Dateinamen unabhängig von der Groß-/Kleinschreibung. Daher sind Datenbank- und Tabellennamen in MySQL für Windows ebenfalls unabhängig von der Groß-/Kleinschreibung. Die einzige Einschränkung ist die, dass Datenbank- und Tabellennamen innerhalb eines bestimmten Statements dieselbe Groß-/Kleinschreibung haben müssen. See section A.5.1 Groß-/Kleinschreibung beim Suchen.
Das `\'-Verzeichnis-Zeichen
Bestandteile von Pfadnamen werden unter Windows mit dem `\'-Zeichen getrennt, das in MySQL als Fluchtzeichen (Escape Character) dient. Wenn Sie LOAD DATA INFILE oder SELECT ... INTO OUTFILE benutzen, müssen Sie `\' an solchen Stellen doppelt eingeben:
mysql> LOAD DATA INFILE "C:\\tmp\\skr.txt" INTO TABLE skr;
mysql> SELECT * INTO OUTFILE 'C:\\tmp\\skr.txt' FROM skr;
Alternativ können Sie auch Dateinamen im Unix-Stil mit `/'-Zeichen benutzen:
mysql> LOAD DATA INFILE "C:/tmp/skr.txt" INTO TABLE skr;
mysql> SELECT * INTO OUTFILE 'C:/tmp/skr.txt' FROM skr;
Can't open named pipe-Fehler
Wenn Sie MySQL-Version 3.22 auf NT mit den neuesten MySQL-Clients benutzen, erhalten Sie folgende Fehlermeldung:
error 2017: can't open named pipe to host: . pipe...
Das liegt daran, dass die MySQL-Version für NT auf NT vorgabemäßig Named Pipes benutzt. Sie können diesen Fehler vermeiden, indem Sie bei den neuen MySQL-Clients die --host=localhost-Option benutzen oder eine Optionsdatei `C:\my.cnf' anlegen, die folgendes enthält:
[client]
host = localhost
Access denied for user-Fehler
Wenn Sie den Fehler Access denied for user: 'ein-benutzer@unknown' to database 'mysql' erhalten, wenn Sie auf einen MySQL-Server auf derselben Maschine zugreifen, heißt das, dass MySQL Ihren Hostnamen nicht richtig auflösen kann. Um das zu beheben, legen Sie eine Datei `\windows\hosts' mit folgender Zeile an:
127.0.0.1       localhost
ALTER TABLE
Wenn Sie ein ALTER TABLE-Statement ausführen, ist die Tabelle gegen Benutzung durch andere Threads gesperrt. Das hat damit zu tun, dass Sie unter Windows keine Datei löschen können, die durch andere Threads in Benutzung ist. (Zukünftig finden wir möglicherweise einen Weg, dieses Problem zu umgehen.)
DROP TABLE auf eine Tabelle, die durch eine
MERGE-Tabelle in Benutzung ist, funktioniert nicht. Der MERGE-Handler führt sein Tabellen-Mapping versteckt vor MySQL durch. Weil Windows das Löschen von Dateien verbietet, die offen sind, müssen Sie zuerst alle MERGE-Tabellen flushen (mit FLUSH TABLES) oder die MERGE-Tabelle löschen, bevor Sie die Tabelle löschen. Wir werden das zusammen mit der Einführung von Sichten (VIEWs) beheben.

Hier sind einige Themen für diejenigen, die uns beim Windows-Release helfen wollen:

Weitere Windows-spezifische Themen sind in der `README'-Datei beschrieben, die mit der MySQL-Windows-Distribution ausgeliefert wird.

3.6.3 Anmerkungen zu Solaris

Auf Solaris bekommen Sie vielleicht schon Probleme, bevor Sie überhaupt Ihre MySQL-Distribution entpackt haben! Solaris-tar kann nicht mit langen Dateinamen umgehen. Daher sehen Sie vielleicht einen Fehler wie den folgenden, wenn Sie MySQL entpacken:

x mysql-3.22.12-beta/bench/Results/ATIS-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase, 0 Bytes, 0 tape blocks
tar: directory checksum error (Verzeichnis-Prüfsummenfehler)

In diesem Fall müssen Sie GNU-tar (gtar) benutzen, um die Distribution zu entpacken. Sie finden eine vorkompilierte Version für Solaris auf http://www.mysql.com/downloads/.

Native Sun-Threads funktinieren nur auf Solaris 2.5 und höher. Auf 2.4 und früher benutzt MySQL automatisch MIT-pThreads. See section 3.3.6 Anmerkungen zu MIT-pThreads.

Vielleicht erhalten Sie von configure folgenden Fehler:

checking for restartable system calls... configure: error can not run test
programs while cross compiling

Das bedeutet, dass mit Ihrer Kompiler-Installation etwas nicht stimmt! In diesem Fall sollten Sie Ihren Kompiler auf eine neuere Version aktualisieren. Eventuell sind Sie in der Lage, das Problem zu lösen, indem Sie folgende Zeile in die `config.cache'-Datei einfügen:

ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls='no'}

Wenn Sie Solaris auf einer SPARC benutzen, ist der empfohlene Kompiler gcc 2.95.2. Sie finden ihn auf http://gcc.gnu.org/. Beachten Sie, dass egcs 1.1.1 und gcc 2.8.1 auf SPARC nicht zuverlässig laufen!

Die empfohlene configure-Zeile ist bei der Benutzung von gcc 2.95.2:

CC=gcc CFLAGS="-O3" \
CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" \
./configure --prefix=/usr/local/mysql --with-low-memory --enable-assembler

Wenn Sie eine Ultra-Sparc haben, erhalten Sie 4 % mehr Performance, wenn Sie "-mcpu=v8 -Wa,-xarch=v8plusa" zu CFLAGS und CXXFLAGS hinzufügen.

Wenn Sie einen Sun Workshop (Fortre) 5.3 (oder neueren) Kompiler haben, können Sie configure wie folgt laufen lassen:

CC=cc CFLAGS="-Xa -fast -xO4 -native -xstrconst -mt" \
CXX=CC CXXFLAGS="-noex -xO4 -mt" \
./configure --prefix=/usr/local/mysql --enable-assembler

In den MySQL-Benchmarks haben wir auf einer Ultra-Sparc 6% Geschwindigkeitssteigerung erreicht, wenn wir Sun Workshop 5.3 benutzen, im Vergleich mit der Benutzung von gcc mit -mcpu-Flags.

Wenn Sie Probleme mit fdatasync oder sched_yield bekommen, können Sie diese beheben, indem Sie LIBS=-lrt zur Konfigurationszeile hinzufügen.

Der folgende Absatz ist nur für ältere Kompiler als WorkShop 5.3 relevant:

Eventuell müssen Sie auch das configure-Skript editieren und folgende Zeile ändern:

#if !defined(__STDC__) || __STDC__ != 1

Ändern zu:

#if !defined(__STDC__)

Wenn Sie __STDC__ mit der -Xc-Option anschalten, kann der Sun-Kompiler nicht mit der Solaris-`pThread.h'-Header-Datei kompilieren. Das ist ein Bug von Sun (Kompiler-Problem oder beschädigte Include-Datei).

Wenn mysqld beim Laufenlassen eine Fehlermeldung wie die unten stehende ausgibt, haben Sie versucht, MySQL mit dem Sun-Kompiler zu kompilieren, ohne die Multi-Thread-Option (-mt) anzuschalten:

libc internal error: _rmutex_unlock: rmutex not held

Fügen Sie -mt zu CFLAGS und CXXFLAGS hinzu und versuchen Sie es noch einmal.

Wenn Sie folgenden Fehler beim Kompilieren von MySQL mit gcc erhalten, ist Ihr gcc nicht für Ihre Version von Solaris konfiguriert:

shell> gcc -O3 -g -O2 -DDBUG_OFF  -o thr_alarm ...
./thr_alarm.c: In function `signal_hand':
./thr_alarm.c:556: too many arguments to function `sigwait'

Die einzige richtige Möglichkeit in diesem Fall ist, sich die neueste Version von gcc zu besorgen und Sie mit Ihrem aktuellen gcc-Kompiler zu kompilieren. Zumindest auf Solaris 2.5 haben fast alle Binärversionen von gcc alte, unbrauchbare Include-Dateien, die alle Programme beschädigen, die Threads benutzen (und möglicherweise auch andere Programme)!

Solaris stellt keine statischen Versionen aller Systembibliotheken zur Verfügung (libpThreads und libdl). Daher können Sie MySQL nicht mit --static kompilieren. Wenn Sie es dennoch versuchen, erhalten Sie folgenden Fehler:

ld: fatal: library -ldl: not found

oder

undefined reference to `dlopen'

oder

cannot find -lrt

Wenn zu viele Prozesse zu schnell hintereinander versuchen, sich mit mysqld zu verbinden, werden Sie folgenden Fehler im MySQL-Log sehen:

Error in accept: Protocol error

Als Workaround können Sie versuchen, den Server mit der --set-variable back_log=50-Option zu starten. See section 5.1.1 mysqld-Kommandozeilenoptionen.

Wenn Sie Ihren eigenen MySQL-Client linken, erhalten Sie möglicherweise folgenden Fehler, wenn Sie versuchen, ihn auszuführen:

ld.so.1: ./my: fatal: libmysqlclient.so.#: open failed: No such file or directory

Dieses Problem kann mit einer der folgenden Methoden vermieden werden:

Wenn Sie die --with-libwrap-configure-Option benutzen, müssen Sie auch die Bibliotheken einschließen, die `libwrap.a' benötigt:

--with-libwrap="/opt/NUtcpwrapper-7.6/lib/libwrap.a -lnsl -lsocket

Wenn Sie Probleme mit configure haben, wenn Sie versuchen, mit -lz zu linken und keine zlib installiert haben, haben Sie zwei Möglichkeiten:

Wenn Sie gcc benutzen und Probleme mit dem Laden von UDF-Funktionen in MySQL haben, versuchen Sie, -lgcc zur Link-Zeile für die UDF-Funktion hinzuzufügen.

Wenn Sie wollen, dass MySQL automatisch startet, kopieren Sie `Support-files/mysql.server' nach `/etc/init.d' und erzeugen Sie einen symbolischen Link darauf, den Sie `/etc/rc3.d/S99mysql.server' nennen.

3.6.3.1 Anmerkungen zu Solaris 2.7/2.8

Normalerweise können Sie eine Solaris-2.6-Binärdatei für Solaris 2.7 und 2.8 benutzen. Die meisten Dinge, die Solaris 2.6 betreffen, treffen auch für Solaris 2.7 und 2.8 zu.

Beachten Sie, dass MySQL-Version 3.23.4 und höher in der Lage sein sollte, automatisch neue Versionen von Solaris zu erkennen und Workarounds für die folgenden Probleme zu aktivieren!

Solaris 2.7 / 2.8 hat einige Bugs in den Include-Dateien. Eventuell sehen Sie folgenden Fehler, wenn Sie gcc benutzen:

/usr/include/widec.h:42: warning: `getwc' redefined
/usr/include/wchar.h:326: warning: this is the location of the previous
definition

Wenn das auftritt, können Sie folgendes tun, um das Problem zu lösen:

Kopieren Sie /usr/include/widec.h nach .../lib/gcc-lib/os/gcc-version/include und ändern Sie Zeile 41 von:

#if     !defined(lint) && !defined(__lint)

nach

#if     !defined(lint) && !defined(__lint) && !defined(getwc)

Alternativ können Sie `/usr/include/widec.h' direkt editieren. Egal, wie Sie vorgehen: Nachdem Sie die Fehlerbehebung durchgeführt haben, sollten Sie `config.cache' entfernen und configure noch einmal laufen lassen!

Wenn Sie beim Laufenlassen von make folgende Fehler bekommen, liegt das daran, dass configure die `curses.h'-Datei nicht erkannte (vermutlich aufgrund des Fehlers in `/usr/include/widec.h'):

In file included by mysql.cc:50:
/usr/include/term.h:1060: syntax error before `,'
/usr/include/term.h:1081: syntax error before `;'

Das Problem lösen Sie auf eine der folgenden Weisen:

Wenn Sie das Problem bekommen, dass Ihr Linker -lz nicht finden kann, wenn Sie Ihr Client-Programm linken, liegt das wahrscheinlich daran, dass Ihre `libz.so'-Datei in `/usr/local/lib' installiert ist. Sie können das mit einer der folgenden Methoden beheben:

3.6.3.2 Anmerkungen zu Solaris x86

Auf Solaris 2.8 auf x86 erzeugt mysqld einen Speicherauszug (Core Dump), wenn Sie darin 'strip' laufen lassen.

Wenn Sie gcc oder egcs auf Solaris x86 benutzen und Probleme mit Speicherauszügen (Core Dumps) unter Last erleben, sollten Sie folgenden configure-Befehl benutzen:

CC=gcc CFLAGS="-O3 -fomit-frame-pointer -DHAVE_CURSES_H" \
CXX=gcc \
CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -DHAVE_CURSES_H" \
./configure --prefix=/usr/local/mysql

Das vermeidet Probleme mit der libstdc++-Bibliothek und mit C++-Ausnahmefehlern.

Wenn das nicht hilft, sollten Sie eine Debug-Version kompilieren und sie mit einer Trace-Datei oder unter gdb laufen lassen. See section H.1.3 mysqld unter gdb debuggen.

3.6.4 Anmerkungen zu BSD

3.6.4.1 Anmerkungen zu FreeBSD

FreeBSD 3.x wird für MySQL empfohlen, weil das Thread-Paket sehr viel integrierter ist.

Die einfachste und daher empfohlene Art der Installation ist die Benutzung der mysql-server- und mysql-client-Ports, die auf http://www.freebsd.org verfügbar sind.

Durch deren Benutzung erhalten Sie:

Empfohlen wird die Benutzung von MIT-pThreads auf FreeBSD 2.x und von nativen Threads auf Version 3 und höher. Es ist möglich, auf einigen späten 2.2.x-Versionen mit nativen Threads zu arbeiten, aber Sie können beim Herunterfahren von mysqld Probleme bekommen.

Die MySQL-`Makefile'-Dateien erfordern GNU-make (gmake). Wenn Sie MySQL kompilieren wollen, müssen Sie zuerst GNU-make installieren.

Stellen Sie sicher, dass Ihr Namensauflöser (Name Resolver) korrekt eingerichtet ist. Ansonsten erleben Sie vielleicht Resolver-Verzögerungen oder -Fehler, wenn Sie sich mit mysqld verbinden.

Stellen Sie sicher, dass der localhost-Eintrag in der `/etc/hosts'-Datei stimmt. Ansonsten werden Sie Probleme haben, sich mit der Datenbank zu verbinden. Die `/etc/hosts'-Datei sollte mit folgender Zeile beginnen:

127.0.0.1       localhost localhost.ihre.domain

Wenn Sie bemerken, dass configure MIT-pThreads benutzen wird, lesen Sie die Anmerkungen zu MIT-pThreads. See section 3.3.6 Anmerkungen zu MIT-pThreads.

Wenn make install meldet, dass es `/usr/include/pThreads' nicht finden kann, hat configure nicht entdeckt, dass Sie MIT-pThreads benötigen. Das kann durch die Ausführung folgender Befehle behoben werden:

shell> rm config.cache
shell> ./configure --with-mit-threads

FreeBSD ist dafür bekannt, dass es vorgabemäßig einen sehr niedrigen Wert für Datei-Handles eingestellt hat. See section A.2.16 File Not Found. Kommentieren Sie den Abschnitt ulimit -n section in safe_mysqld aus oder erhöhen Sie die Werte für den mysqld-Benutzer in /etc/login.conf (und bauen Sie es neu mit cap_mkdb /etc/login.conf). Stellen Sie ausserdem sicher, dass Sie die korrekte Klasse für diesen Benutzer in der Passwort-Datei einstellen, wenn Sie nicht den Vorgabewert benutzen (benutzen Sie chpass mysqld-user-name). See section 5.7.2 safe_mysqld, der Wrapper um mysqld.

Wenn Sie Probleme mit dem aktuellen Datum in MySQL erhalten, wird das Setzen der TZ-Variablen das wahrscheinlich beheben. See section I Umgebungsvariablen.

Um ein sicheres, stabiles System zu erhalten, sollten Sie ausschließlich FreeBSD-Kernels benutzen, die als -STABLE markiert sind.

3.6.4.2 Anmerkungen zu NetBSD

Um auf NetBSD zu kompilieren, benötigen Sie GNU make. Ansonsten wird das Kompilieren abstürzen, wenn make versucht, lint auf C++Dateien laufen zu lassen.

3.6.4.3 Anmerkungen zu OpenBSD

3.6.4.4 Anmerkungen zu OpenBSD 2.5

Auf OpenBSD-Version 2.5 können Sie MySQL mit nativen Threads mit folgenden Optionen kompilieren:

CFLAGS=-pThread CXXFLAGS=-pThread ./configure --with-mit-threads=no

3.6.4.5 Anmerkungen zu OpenBSD 2.8

Unsere Benutzer haben berichtet, dass OpenBSD 2.8 einen Thread-Bug hat, der Probleme mit MySQL verursacht. Die OpenBSD-Entwickler haben das Problem behoben, aber seit dem 25. Januar 2001 ist es nur im ``-current''-Zweig verfügbar. Die Symptome dieses Thread-Bugs sind langsames Antworten, hohe Lase, hohe Prozessorauslastung und Abstürze.

3.6.4.6 Anmerkungen zu BSD/OS

3.6.4.7 Anmerkungen zu BSD/OS Version 2.x

Wenn Sie folgenden Fehler beim Kompilieren von MySQL erhalten, ist Ihr ulimit-Wert für virtuellen Speicher zu niedrig:

item_func.h: In method `Item_func_ge::Item_func_ge(const Item_func_ge &)':
item_func.h:28: virtual memory exhausted
make[2]: *** [item_func.o] Error 1

Versuchen Sie, ulimit -v 80000 zu benutzen, und lassen Sie make erneut laufen. Wenn das nicht funktioniert und Sie bash benutzen, versuchen Sie, statt dessen csh oder sh zu benutzen. Einige BSDI-Benutzer haben Probleme mit bash und ulimit berichtet.

Wenn Sie gcc benutzen, müssen Sie eventuell auch den --with-low-memory-Flag für configure benutzen, um in der Lage zu sein, `sql_yacc.cc' zu kompilieren.

Wenn Sie Probleme mit dem aktuellen Datum in MySQL erhalten, wird das Setzen der TZ-Variablen das wahrscheinlich beheben. See section I Umgebungsvariablen.

3.6.4.8 Anmerkungen zu BSD/OS Version 3.x

Aktualisieren Sie auf BSD/OS Version 3.1. Wenn das nicht möglich ist, installieren Sie BSDI-Patch M300-038.

Benutzen Sie zur Konfiguration von MySQL folgenden Befehl:

shell> env CXX=shlicc++ CC=shlicc2 \
       ./configure \
           --prefix=/usr/local/mysql \
           --localstatedir=/var/mysql \
           --without-perl \
           --with-unix-socket-path=/var/mysql/mysql.sock

Folgendes funktioniert bekanntermaßen ebenfalls:

shell> env CC=gcc CXX=gcc CXXFLAGS=-O3 \
       ./configure \
           --prefix=/usr/local/mysql \
           --with-unix-socket-path=/var/mysql/mysql.sock

Wenn Sie wollen, können Sie die Verzeichnisorte ändern oder aber die Vorgabewerte benutzen, indem Sie einfach keine Speicherorte angeben.

Wenn Sie Performance-Probleme unter Hochlast bekommen, versuchen Sie die --skip-thread-priority-Option für mysqld! Dies führt alle Threads mit derselben Priorität aus. Auf BSDI-Version 3.1 gibt Ihnen das bessere Performance (zumindest solange, bis BSDI ihren Thread-Scheduler in Ordnung bringt).

Wenn Sie beim Kompilieren den Fehler virtual memory exhausted erhalten, probieren Sie es mit ulimit -v 80000 und lassen Sie make noch einmal laufen. Wenn das nicht funktioniert und Sie bash benutzen, versuchen Sie, statt dessen csh oder sh zu benutzen. Einige BSDI-Benutzer haben Probleme mit bash und ulimit berichtet.

3.6.4.9 Anmerkungen zu BSD/OS Version 4.x

BSDI-Version 4.x hat einige auf Threads bezogene Bugs. Wenn Sie auf dieser Plattform MySQL benutzen wollen, sollten Sie alle Patches installieren, die sich auf Threads beziehen. Zumindest M400-023 sollte installiert sein.

Auf einigen Systemen mit BSDI-Version 4.x bekommen Sie vielleicht Probleme mit gemeinsam verwendeten (shared) Bibliotheken. Das äußert sich darin, dass Sie keinerlei Client-Programme wie mysqladmin ausführen können. In diesem Fall müssen Sie MySQL so rekonfigurieren, dass keine gemeinsam genutzten Bibliotheken benutzt werden, indem Sie die --disable-shared-Option für configure benutzen.

Einige Kunden hatten auf BSDI 4.0.1 Probleme damit, dass die mysqld-Binärdatei nach einiger Zeit keine Tabellen mehr öffnen konnte. Das liegt an einigen Bugs, die sich auf Bibliothek / System beziehen, und die mysqld veranlassen, das aktuelle Verzeichnis zu wechseln, ohne danach gefragt zu haben!

Die Lösung besteht darin, entweder auf 3.23.34 zu aktualisieren oder nach dem Laufenlassen von configure die Zeile #define HAVE_REALPATH aus config.h zu entfernen, bevor Sie make laufen lassen.

Beachten Sie, dass sich aus dem Gesagten ergibt, dass Sie auf BSDI keine symbolischen Links von Datenbankverzeichnissen zu einem anderen Datenbankverzeichnis oder symbolische Links von einer Tabelle zu einer anderen Datenbank herstellen können! (Ein symbolischer Link auf eine andere Platte ist okay.)

3.6.5 Anmerkungen zu Mac OS X

3.6.5.1 Mac OS X Public Beta

MySQL sollte ohne jedes Problem auf Mac OS X Public Beta (Darwin) laufen. Die pThread-Patches für dieses Betriebssystem benötigen Sie nicht!

3.6.5.2 Mac OS X Server

Bevor Sie versuchen, MySQL auf Mac OS X Server zu konfigurieren, müssen Sie das pThread-Paket von http://www.prnet.de/RegEx/mysql.html installieren.

Unsere Binärdatei für Mac OS X wird kompiliert auf Rhapsody 5.5, mit folgender Konfigurationszeile:

CC=gcc CFLAGS="-O2 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O2 -fomit-frame-pointer" ./configure --prefix=/usr/local/mysql "--with-comment=Official MySQL binary" --with-extra-charsets=complex  --disable-shared

Wenn Sie der Ressourcen-Datei Ihrer Shell Aliase hinzufügen wollen, um auf mysql und mysqladmin von der Kommandozeile aus zuzugreifen, geben Sie ein:

alias mysql '/usr/local/mysql/bin/mysql'
alias mysqladmin '/usr/local/mysql/bin/mysqladmin'

3.6.6 Anmerkungen zu anderen Unixen

3.6.6.1 Anmerkungen zu HP-UX Notes für Binärdistributionen

Einige Binärdistributionen von MySQL für HP-UX werden als HP-Depot-Datei und als Tar-Datei ausgeliefert. Um die Depot-Datei benutzen zu können, müssen Sie mindestens HP-UX 10.x haben, um auf HP's Software-Depot-Werkzeuge zugreifen zu können.

Die HP-Version von MySQL wurde auf einem HP 9000/8xx-Server unter HP-UX 10.20 kompiliert und benutzt MIT-pThreads. Unter dieser Konfiguration arbeitet sie bekanntermaßen gut. MySQL-Version 3.22.26 und neuer kann auch mit HP's nativem Thread-Paket gebaut werden.

Weitere Konfigurationen, die ebenfalls funktionieren können:

Folgende Konfigurationen werden fast mit Sicherheit nicht laufen:

Um die Distribution zu installieren, benutzen Sie die unten stehenden Befehle, wobei /pfad/zum/depot der volle Pfadname der Depot-Datei ist:

Das Depot speichert Binärdateien und Bibliotheken in `/opt/mysql' und Daten in `/var/opt/mysql'. Es legt auch die entsprechenden Einträge in `/etc/init.d' und `/etc/rc2.d' an, um den Server automatisch beim Hochfahren zu starten. Das setzt root-Rechte zum Installieren voraus.

Um die HP-UX-tar.gz-Distribution zu installieren, müssen Sie GNU tar haben.

3.6.6.2 Anmerkungen zu HP-UX Version 10.20

Es gibt einige kleine Probleme, wenn Sie MySQL auf HP-UX kompilieren. Wir empfehlen, anstelle des nativen HP-UX-Kompilers gcc zu benutzen, weil gcc besseren Code produziert!

Wir empfehlen die Benutzung von gcc 2.95 auf HP-UX. Benutzen Sie keine hohen Optimierungs-Flags (wie -O6), weil das eventuell für HP-UX nicht sicher ist.

Beachten Sie, dass MIT-pThreads nicht mit dem HP-UX-Kompiler kompiliert werden können, weil dieser keine .S-(Assembler)-Dateien kompilieren kann.

Folgende Konfigurationszeile sollte funktionieren:

CFLAGS="-DHPUX -I/opt/dce/include" CXXFLAGS="-DHPUX -I/opt/dce/include -felide-constructors -fno-exceptions -fno-rtti" CXX=gcc ./configure --with-pThread --with-named-Thread-libs='-ldce' --prefix=/usr/local/mysql --disable-shared

Wenn Sie gcc 2.95 selbst kompilieren, sollten Sie ihn NICHT mit den DCE-Bibliotheken (libdce.a oder libcma.a) linken, wenn Sie MySQL mit MIT-pThreads kompilieren wollen. Wenn Sie DCE- und MIT-pThreads-Pakete mischen, erhalten Sie einen mysqld, mit dem Sie sich nicht verbinden können. Entfernen Sie die DCE-Bibliotheken, während Sie gcc 2.95 kompilieren!

3.6.6.3 Anmerkungen zu HP-UX Version 11.x

Für HP-UX Version 11.x empfehlen wir MySQL-Version 3.23.15 oder später.

Wegen einiger kritischer Bugs in den Standard-HP-UX-Bibliotheken sollten Sie folgende Patches installieren, bevor Sie MySQL auf HP-UX 11.0 laufen lassen:

PHKL_22840 Streams cumulative
PHNE_22397 ARPA cumulative

Das löst das Problem, dass man EWOULDBLOCK von recv() und EBADF von accept() in threaded Applikationen erhält.

Wenn Sie gcc 2.95.1 auf einem nicht-gepatchten HP-UX-11.x-System benutzen, erhalten Sie den Fehler:

In file included by /usr/include/unistd.h:11,
                 by ../include/global.h:125,
                 by mysql_priv.h:15,
                 by item.cc:19:
/usr/include/sys/unistd.h:184: declaration of C function ...
/usr/include/sys/pThread.h:440: previous declaration ...
In file included by item.h:306,
                 by mysql_priv.h:158,
                 by item.cc:19:

Das Problem liegt darin, dass HP-UX pThreads_atfork() nicht konsistent definiert. Es hat konfliktbehaftete Prototypes in `/usr/include/sys/unistd.h':184 und `/usr/include/sys/pThread.h':440 (Details weiter unten).

Eine Lösung besteht darin, `/usr/include/sys/unistd.h' nach `mysql/include' zu kopieren und `unistd.h' zu editieren, wobei es so abgeändert wird, dass es der Definition in `pThread.h' entspricht. Hier ist der Diff:

183,184c183,184
<      extern int pThread_atfork(void (*prepare)(), void (*parent)(),
<                                                void (*child)());
---
>      extern int pThread_atfork(void (*prepare)(void), void (*parent)(void),
>                                                void (*child)(void));

Danach sollte folgende Konfigurationszeile funktionieren:

CFLAGS="-fomit-frame-pointer -O3 -fpic" CXX=gcc CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -O3" ./configure --prefix=/usr/local/mysql --disable-shared

Hier sind ein paar Informationen über das Kompilieren von MySQL mit dem HP-UX:x-Kompiler, die uns ein Benutzer der HP-UX-Version 11.x geschickt hat:

 Environment:
      proper compilers.
         setenv CC cc
         setenv CXX aCC
      flags
         setenv CFLAGS -D_REENTRANT
         setenv CXXFLAGS -D_REENTRANT
         setenv CPPFLAGS -D_REENTRANT
     % aCC -V
     aCC: HP ANSI C++ B3910B X.03.14.06
     % cc -V /tmp/empty.c
     cpp.ansi: HP92453-01 A.11.02.00 HP C Preprocessor (ANSI)
     ccom: HP92453-01 A.11.01.00 HP C Compiler
     cc: "/tmp/empty.c", line 1: warning 501: Empty source file.

  configuration:
     ./configure  --with-pThread        \
     --prefix=/source-control/mysql     \
     --with-named-Thread-libs=-lpThread \
     --with-low-memory

    added '#define _CTYPE_INCLUDED' to include/m_ctype.h. This
    symbol ist the one defined in HP's /usr/include/ctype.h:

     /* Don't include std ctype.h when this is included */
     #define _CTYPE_H
     #define __CTYPE_INCLUDED
     #define _CTYPE_INCLUDED
     #define _CTYPE_USING   /* Don't put names in global namespace. */

Wenn Sie folgenden Fehler von configure erhalten:

checking for cc option to accept ANSI C... no
configure: error: MySQL requires a ANSI C compiler (and a C++ compiler). Try gcc. See the installation chapter in the reference manual.

Überprüfen Sie, dass Sie den Pfad zum K&R-Kompiler nicht vor dem Pfad zum HP-UX-C- und C++-Kompiler haben.

3.6.6.4 Anmerkungen zu IBM-AIX

Automatische Erkennung von xlC fehlt bei Autoconf, daher wird ein configure-Befehl wie folgender benötigt, wenn Sie MySQL kompilieren (dieses Beispiel benutzt den IBM-Kompiler):

export CC="xlc_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192 "
export CXX="xlC_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192"
export CFLAGS="-I /usr/local/include"
export LDLFAGS="-L /usr/local/lib"
export CPPFLAGS=$CFLAGS
export CXXFLAGS=$CFLAGS

./configure --prefix=/usr/local \
		--localstatedir=/var/mysql \
		--sysconfdir=/etc/mysql \
		--sbindir='/usr/local/bin' \
		--libexecdir='/usr/local/bin' \
		--enable-thread-safe-client \
		--enable-large-files

Das sind die Optionen, die benutzt werden, um die MySQL-Distribution zu kompilieren, die sich auf http://www-frec.bull.com/ befindet.

Wenn Sie in obiger Konfigurationszeile -O3 zu -O2 ändern, müssen Sie auch die -qstrict-Option entfernen (das ist eine Beschränkung im IBM-C-Kompiler).

Wenn Sie gcc oder egcs benutzen, um MySQL zu kompilieren, MÜSSEN Sie den -fno-exceptions-Flag benutzen, weil das Exception-Handling in gcc / egcs nicht Thread-sicher ist! (Das wurde mit egcs 1.1. getestet.) Es gibt auch ein paar bekannte Probleme mit dem IBM-Assembler, die dazu führen können, dass schlechter Code erzeugt wird, wenn er zusammen mit gcc benutzt wird.

Wir empfehlen folgende configure-Zeile für egcs und gcc 2.95 auf AIX:

CC="gcc -pipe -mcpu=power -Wa,-many" \
CXX="gcc -pipe -mcpu=power -Wa,-many" \
CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti" \
./configure --prefix=/usr/local/mysql --with-low-memory

-Wa,-many ist notwendig, damit das Kompilieren gelingt. Das Problem ist IBM bekannt, hat es aber nicht eilig, es zu beheben, weil ein Workaround verfügbar ist. Wir wissen nicht, ob -fno-exceptions für gcc 2.95 erforderlich ist, aber weil MySQL keine Exceptions benutzt und die obige Option schnelleren Code erzeugt, empfehlen wir, dass Sie diese Option für egcs / gcc immer benutzen.

Wenn Sie ein Problem mit Assembler-Code bekommen, versuchen Sie, -mcpu=xxx so anzupassen, dass es zu Ihrem Prozessor passt. Typischerweise wird man power2, power oder powerpc benutzen, alternativ kann man eventuell 604 oder 604e benutzen. Ich bin nicht ganz sicher, aber ich würde sagen, dass "power" meist sicher sein sollte, selbst auf einer power2-Maschine.

Wenn Sie nicht wissen, welchen Prozessor Sie haben, geben Sie "uname -m" ein. Das gibt eine Zeichenkette zurück, die etwa wie "000514676700" aussieht, mit dem Format xxyyyyyymmss, wobei xx und ss immer die Nullen sind (0). yyyyyy ist eine eindeutige System-ID und mm ist die ID des CPU-Planars. Eine Tabelle dieser Werte liegt auf http://www.rs6000.ibm.com/doc_link/en_US/a_doc_lib/cmds/aixcmds5/uname.htm. Darin finden Sie Maschinentyp und Maschinenmodell, was Sie benutzen können, um herauszufinden, welchen Prozessortyp Sie haben.

Wenn Sie Probleme mit Signalen haben (MySQL stirbt unerwartet unter hoher Last), haben Sie vielleicht einen Betriebssystem-Bug bei Threads und Signalen gefunden. In diesem Fall können Sie MySQL anweisen, keine Signale zu benutzen, indem Sie es wie folgt konfigurieren:

shell> CFLAGS=-DDONT_USE_THR_ALARM CXX=gcc \
       CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -DDONT_USE_THR_ALARM" \
       ./configure --prefix=/usr/local/mysql --with-debug --with-low-memory

Das berührt nicht die Performance von MySQL, hat aber den Nebeneffekt, dass Sie keine Clients auf einer Verbindung mit mysqladmin kill oder mysqladmin shutdown killen können, die ``schlafen''. Statt dessen wird der Client sterben, wenn er den nächsten Befehl sendet.

Bei einigen Versionen von AIX für das Linken mit libbind.a bei getservbyname zu einem Speicherauszug (Core Dump). Das ist ein AIX-Bug, der IBM berichtet werden sollte.

Bei AIX 4.2.1 und gcc müssen Sie folgende Änderungen durchführen:

Nach dem Konfigurieren müssen Sie `config.h' und `include/my_config.h' editieren und die Zeile ändern, in der steht:

#define HAVE_SNPRINTF 1

zu

#undef HAVE_SNPRINTF

Schließlich müssen Sie in `mysqld.cc' einen Prototype für initgoups hinzufügen:

#ifdef _AIX41
extern "C" int initgroups(const char *,int);
#endif

3.6.6.5 Anmerkungen zu SunOS 4

Auf SunOS 4 werden MIT-pThreads benötigt, um MySQL zu kompilieren, was letztlich bedeutet, dass Sie GNU-make benötigen.

Einige SunOS-4-Systeme haben Probleme mit dynamischen Bibliotheken und libtool. Sie können folgende configure-Zeile benutzen, um das Problem zu vermeiden:

shell> ./configure --disable-shared --with-mysqld-ldflags=-all-static

Wenn Sie readline kompilieren, erhalten Sie vielleicht Warnungen über duplizierte Defines. Diese können ignoriert werden.

Wenn Sie mysqld kompilieren, gibt es ein paar implicit declaration of function-Warnungen. Diese können ignoriert werden.

3.6.6.6 Anmerkungen zu Alpha-DEC-UNIX (Tru64)

Wenn Sie egcs 1.1.2 auf Digital Unix benutzen, sollten Sie auf gcc 2.95.2 aktualisieren, weil egcs auf DEC einige schwer wiegende Bugs hat!

Wenn Sie threaded Programme unter Digital Unix kompilieren, empfiehlt die Dokumentation, die -pThread-Option für cc und cxx und die Bibliotheken -lmach -lexc zu benutzen (zusätzlich zu -lpThread). Sie sollten configure wie folgt laufen lassen:

CC="cc -pThread" CXX="cxx -pThread -O" \
./configure --with-named-thread-libs="-lpThread -lmach -lexc -lc"

Wenn Sie mysqld kompilieren, sehen Sie eventuell eine Reihe von Warnungen wie die folgende:

mysqld.cc: In function void handle_connections()':
mysqld.cc:626: passing long unsigned int *' as argument 3 of
accept(int,sockadddr *, int *)'

Sie können diese Warnungen ignorieren. Sie treten auf, weil configure nur Fehler entdecken kann, keine Warnungen.

Wenn Sie den Server direkt von the Kommandozeile starten, haben Sie vielleicht Probleme, dass er stirbt, wenn Sie sich ausloggen. (Wenn Sie sich ausloggen, erhalten Ihre offenen Prozesse ein SIGHUP-Signal.) Wenn das der Fall ist, starten Sie den Server wie folgt:

shell> nohup mysqld [options] &

nohup bewirkt, dass der folgende Befehl jegliche SIGHUP-Signale, die vom Terminal gesendet werden, ignoriert. Alternativ starten Sie den Server mit safe_mysqld, was mysqld mit nohup für Sie aufruft. See section 5.7.2 safe_mysqld, der Wrapper um mysqld.

Wenn Sie ein Problem beim Kompilieren von mysys/get_opt.c bekommen, entfernen Sie einfach die Zeile #define _NO_PROTO am Anfang dieser Datei!

Wenn Sie den CC-Kompiler von Compaq benutzen, sollte die folgende Konfigurationszeile funktionieren:

CC="cc -pThread"
CFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host"
CXX="cxx -pThread"
CXXFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed all -arch host"
export CC CFLAGS CXX CXXFLAGS
./configure \
--prefix=/usr/local/mysql \
--with-low-memory \
--enable-large-files \
--enable-shared=yes \
--with-named-Thread-libs="-lpThread -lmach -lexc -lc"
gnumake

Wenn Sie ein Problem mit libtool beim Kompilieren mit gemeinsam genutzten (shared) Bibliotheken bekommen wie oben, wenn Sie mysql linken, sollten Sie dies folgendermaßen umgehen können:

cd mysql
/bin/sh ../libtool --mode=link cxx -pThread  -O3 -DDBUG_OFF \
-O4 -ansi_alias -ansi_args -fast -inline speed \
-speculate all \ -arch host  -DUNDEF_HAVE_GETHOSTBYNAME_R \
-o mysql  mysql.o readline.o sql_string.o completion_hash.o \
../readline/libreadline.a -lcurses \
../libmysql/.libs/libmysqlclient.so  -lm
cd ..
gnumake
gnumake install
Skripts/mysql_install_db

3.6.6.7 Anmerkungen zu Alpha-DEC-OSF1

Wenn Sie Probleme beim Kompilieren haben und DEC CC und gcc installiert sind, versuchen Sie, configure wie folgt laufen zu lassen:

CC=cc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 \
./configure --prefix=/usr/local/mysql

Wenn Sie Probleme mit der `c_asm.h'-Datei bekommen, können Sie wie folgt eine 'dummy'-`c_asm.h'-Datei erzeugen und benutzen:

touch include/c_asm.h
CC=gcc CFLAGS=-I./include \
CXX=gcc CXXFLAGS=-O3 \
./configure --prefix=/usr/local/mysql

Beachten Sie, dass die im Folgenden beschriebenen Probleme mit dem ld-Programm behoben werden können, indem Sie das neueste DEC-(Compaq)-Patch-Kit herunterladen, und zwar von folgender Seite: http://ftp.Support.compaq.com/public/unix/.

Auf OSF1 V4.0D und Kompiler "DEC C V5.6-071 auf Digital Unix V4.0 (Rev. 878)" zeigt der Kompiler einige seltsame Verhaltensweisen (undefinierte asm-Symbole). Ausserdem scheint /bin/ld beschädigt zu sein (Probleme mit _exit undefined-Fehlern, die auftreten, wenn Sie mysqld linken). Auf diesem System konnten wir MySQL mit folgender configure-Zeile kompilieren, nachdem wir /bin/ld mit der Version von OSF 4.0C ersetzt haben:

CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql

Beim Digital-Kompiler "C++ V6.1-029" sollte folgendes funktionieren:

CC=cc -pThread
CFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host
CXX=cxx -pThread
CXXFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host -noexceptions -nortti
export CC CFLAGS CXX CXXFLAGS
./configure --prefix=/usr/mysql/mysql --with-mysqld-ldflags=-all-static --disable-shared --with-named-thread-libs="-lmach -lexc -lc"

In einigen Versionen von OSF1 ist die alloca()-Funktion beschädigt. Beheben Sie dies, indem Sie die Zeile in `config.h' entfernen, die 'HAVE_ALLOCA' definiert.

Die alloca()-Funktion kann ebenfalls einen falschen Prototyp in /usr/include/alloca.h haben. Die Warnung, die hieraus resultiert, kann ignoriert werden.

configure benutzt automatisch folgenden Thread-Bibliotheken: --with-named-thread-libs="-lpThread -lmach -lexc -lc".

Wenn Sie gcc benutzen, können Sie auch versuchen, configure wie folgt laufen zu lassen:

shell> CFLAGS=-D_PTHREAD_USE_D4 CXX=gcc CXXFLAGS=-O3 ./configure ....

Wenn Sie Probleme mit Signalen haben (MySQL stirbt unerwartet unter Hochlast), haben Sie vielleicht einen Betriebssystem-Bug bei Threads und Signalen gefunden. In diesem Fall können Sie MySQL anweisen, keine Signale zu benutzen, indem Sie es wie folgt konfigurieren:

shell> CFLAGS=-DDONT_USE_THR_ALARM \
       CXXFLAGS=-DDONT_USE_THR_ALARM \
       ./configure ...

Das berührt nicht die Performance von MySQL, hat aber den Nebeneffekt, dass Sie keine Clients auf einer Verbindung mit mysqladmin kill oder mysqladmin shutdown killen können, die ``schlafen''. Statt dessen wird der Client sterben, wenn er den nächsten Befehl sendet.

Bei gcc 2.95.2 erhalten Sie wahrscheinlich folgenden Kompilierfehler:

sql_acl.cc:1456: Internal compiler error in `scan_region', at except.c:2566
Please submit a full bug report.

Um das zu beheben, wechseln Sie ins sql-Verzeichnis und machen ein ``Kopieren und Einfügen'' der letzten gcc-Zeile, ändern aber -O3 zu -O0 (oder fügen -O0 unmittelbar nach gcc hinzu, falls Sie keine -O-Option auf Ihrer Kompilierzeile haben.) Danach wechseln Sie einfach direkt zurück in oberste Verzeichnis und lassen make noch einmal laufen.

3.6.6.8 Anmerkungen zu SGI Irix

Wenn Sie Irix-Version 6.5.3 oder neuer benutzen, kann mysqld nur dann Threads erzeugen, wenn Sie ihn als Benutzer mit CAP_SCHED_MGT-Zugriffsrechten (wie root) laufen lassen oder dem mysqld-Server dieses Recht mit dem folgenden Befehl geben:

shell> chcap "CAP_SCHED_MGT+epi" /opt/mysql/libexec/mysqld

Sie müssen eventuell in `config.h' einige Dinge umdefinieren, nachdem Sie configure laufen gelassen haben und vor dem Kompilieren.

In einigen Irix-Implementationen ist die alloca()-Funktion beschädigt. Wenn der mysqld-Server bei manchen SELECT-Statements stirbt, entfernen Sie die Zeilen aus `config.h', die HAVE_ALLOC und HAVE_ALLOCA_H definieren. Wenn mysqladmin create nicht funktioniert, entfernen Sie die Zeile aus `config.h', die HAVE_READDIR_R definiert. Eventuell müssen Sie auch die HAVE_TERM_H-Zeile entfernen.

SGI empfiehlt, dass Sie alle Patches auf dieser Seite auf einmal installieren: http://Support.sgi.com/surfzone/patches/patchset/6.2_indigo.rps.html

Als absolutes Minimum sollten Sie das letzte Kernel-Rollup installieren, das letzte rld-Rollup und das letzte libc-Rollup.

In jedem Fall brauchen Sie für die pThread-Unterstützung alle POSIX-Patches auf dieser Seite:

http://Support.sgi.com/surfzone/patches/patchset/6.2_posix.rps.html

Wenn Sie beim Kompilieren von `mysql.cc' etwa folgenden Fehler erhalten:

"/usr/include/curses.h", line 82: error(1084): invalid combination of type

Geben Sie folgendes im obersten Verzeichnis Ihres MySQL-Source-Trees ein:

shell> extra/replace bool curses_bool < /usr/include/curses.h > include/curses.h
shell> make

Es wurden ausserdem Scheduling-Probleme berichtet. Wenn nur ein Thread läuft, läuft alles recht langsam. Das können Sie vermeiden, indem Sie einen weiteren Client-Starten. Daraus kann sich eine zwei- bis zehnfache Geschwindigkeitssteigerung für den anderen Thread ergeben. Das liegt an einem Problem mit Irix-Threads, das kaum zu verstehen ist. Eventuell müssen Sie improvisieren, um eine Lösung zu finden, bis dies behoben ist.

Wenn Sie mit gcc kompilieren, können Sie folgenden configure-Befehl benutzen:

CC=gcc CXX=gcc CXXFLAGS=-O3 \
./configure --prefix=/usr/local/mysql --enable-thread-safe-client --with-named-thread-libs=-lpThread

Auf Irix 6.5.11 mit nativen Irix-C- und C++-Kompilern der Version 7.3.1.2 soll auch folgendes funktionieren:

CC=cc CXX=CC CFLAGS='-O3 -n32 -TARG:platform=IP22 -I/usr/local/include \
-L/usr/local/lib' CXXFLAGS='-O3 -n32 -TARG:platform=IP22 \
-I/usr/local/include -L/usr/local/lib' ./configure --prefix=/usr/local/mysql \
--with-berkeley-db --with-innodb \
--with-libwrap=/usr/local --with-named-curses-libs=/usr/local/lib/libncurses.a

3.6.6.9 Anmerkungen zu Caldera

Die aktuelle Portierung wird auf ``sco3.2v5.0.4''- und-``sco3.2v5.0.5''-Systemen getestet. Die Portierung auf ``sco 3.2v4.2'' ist ebenfalls weit fortgeschritten.

Momentan ist der empfohlene Kompiler auf OpenServer gcc 2.95.2. Damit sollten Sie in der Lage sein, MySQL einfach durch folgendes zu kompilieren:

CC=gcc CXX=gcc ./configure ... (options)
  1. Bei OpenServer 5.0.X müssen Sie GDS in Skunkware 95 (95q4c) benutzen. Das ist deshalb notwendig, weil GNU-gcc 2.7.2 in Skunkware 97 kein GNU-as hat. Sie können auch egcs 1.1.2 oder neuer benutzen http://www.egcs.com/. Wenn Sie egcs 1.1.2 benutzen, müssen Sie folgenden Befehl eingeben:
    shell> cp -p /usr/include/pThread/stdtypes.h /usr/local/lib/gcc-lib/i386-pc-sco3.2v5.0.5/egcs-2.91.66/include/pThread/
    
  2. Sie brauchen die Portierung von GCC 2.5.x für dieses Produkt und das Entwicklungssystem. Sie werden auf dieser Version von Caldera (SCO) Unix benötigt. Sie können nicht lediglich das GCC-Dev-System benutzen.
  3. Sie sollten zuerst das FSU-PThreads-Paket holen und installieren. Dieses finden Sie auf http://www.cs.wustl.edu/~schmidt/ACE_wrappers/FSU-Threads.tar.gz. Sie finden ein vorkompiliertes Paket auf http://www.mysql.com/downloads/SCO/FSU-Threads-3.5c.tar.gz.
  4. FSU-PThreads kann mit SCO Unix 4.2 mit TCP/IP kompiliert werden. Oder mit OpenServer 3.0 oder Open Desktop 3.0 (OS 3.0 ODT 3.0), mit installiertem Caldera (SCO) Entwicklungssystem unter Benutzung einer guten Portierung von GCC 2.5.x ODT oder OS 3.0. Hierbei brauchen Sie eine gute Portierung von GCC 2.5.x. Ohne gute Portierung gibt es eine Menge Probleme. Die Portierung für dieses Produkt erfordert das Caldera (SCO) Unix-Entwicklungssystem. Ohne dieses fehlen die Bibliotheken und der Linker, die benötigt werden.
  5. Um FSU-PThreads auf Ihrem System zu bauen, tun Sie folgendes:
    1. Lassen Sie ./configure im `Threads/src'-Verzeichnis laufen und wählen Sie die SCO-OpenServer-Option. Dieser Befehl kopiert `Makefile.SCO5' nach `Makefile'.
    2. Lassen Sie make laufen.
    3. Um in das vorgabemäßige `/usr/include'-Verzeichnis zu installieren, loggen Sie sich als Root ein und wechseln (cd) Sie in das `thread/src'-Verzeichnis. Führen Sie dann make install aus.
  6. Denken Sie daran, GNU make zu benutzen, wenn Sie MySQL machen.
  7. Wenn Sie safe_mysqld nicht als Root starten, erhalten Sie wahrscheinlich nur die 110 offenen Dateien pro Prozess. mysqld macht darüber in der Log-Datei einen Eintrag.
  8. Bei SCO 3.2V5.0.5 sollten Sie FSU-PThreads-Version 3.5c oder neuer benutzen. Ausserdem sollten Sie gcc 2.95.2 oder neuer benutzen! Folgender configure-Befehl sollte funktionieren:
    shell> ./configure --prefix=/usr/local/mysql --disable-shared
    
  9. Bei SCO 3.2V4.2 sollten Sie FSU-PThreads-Version 3.5c oder neuer benutzen. Folgender configure-Befehl sollte funktionieren:
    shell> CFLAGS="-D_XOPEN_XPG4" CXX=gcc CXXFLAGS="-D_XOPEN_XPG4" \
           ./configure \
               --prefix=/usr/local/mysql \
               --with-named-thread-libs="-lgThreads -lsocket -lgen -lgThreads" \
               --with-named-curses-libs="-lcurses"
    
    Möglicherweise bekommen Sie Probleme mit einigen Include-Dateien. In diesem Fall finden Sie neue, SCO-spezifische Include-Dateien auf http://www.mysql.com/downloads/SCO/SCO-3.2v4.2-includes.tar.gz. Entpacken Sie diese Datei ins `include'-Verzeichnis Ihres MySQL-Source-Trees.

Anmerkungen zur Caldera (SCO) Entwicklung:

Wenn Sie DBI auf Caldera (SCO) installieren wollen, müssen Sie `Makefile' in DBI-xxx und jedem Unterverzeichnis editieren.

Beachten Sie, dass folgendes gcc 2.95.2 oder neuer voraussetzt:

ALT:                                  NEU:
CC = cc                               CC = gcc
CCCDLFLAGS = -KPIC -W1,-Bexport       CCCDLFLAGS = -fpic
CCDLFLAGS = -wl,-Bexport              CCDLFLAGS =

LD = ld                               LD = gcc -G -fpic
LDDLFLAGS = -G -L/usr/local/lib       LDDLFLAGS = -L/usr/local/lib
LDFLAGS = -belf -L/usr/local/lib      LDFLAGS = -L/usr/local/lib

LD = ld                               LD = gcc -G -fpic
OPTIMISE = -Od                        OPTIMISE = -O1

OLD:
CCCFLAGS = -belf -dy -w0 -U M_XENIX -DPERL_SCO5 -I/usr/local/include

NEW:
CCFLAGS = -U M_XENIX -DPERL_SCO5 -I/usr/local/include

Das liegt daran, dass der Perl-dynaloader keine DBI-Module lädt, die mit icc oder cc kompiliert wurden.

Perl funktioniert am besten, wenn es mit cc kompiliert wird.

3.6.6.10 Anmerkungen zu Caldera Unixware Version 7.0

Sie benötigen mindestens MySQL-Version 3.22.13, weil diese Version einige Portabilitätsprobleme unter Unixware behebt.

Wir waren in der Lage, MySQL mit folgendem configure-Befehl auf Unixware Version 7.0.1 zu kompilieren:

CC=cc CXX=CC ./configure --prefix=/usr/local/mysql

Wenn Sie gcc benutzen wollen, müssen Sie gcc 2.95.2 oder neuer benutzen.

3.6.7 Anmerkungen zu OS/2

MySQL benutzt eine ganze Menge offener Dateien. Deswegen sollten Sie Ihrer `CONFIG.SYS'-Datei folgendes hinzufügen:

SET EMXOPT=-c -n -h1024

Wenn Sie das nicht tun, erhalten Sie wahrscheinlich folgenden Fehler:

File 'xxxx' not found (Errcode: 24)

Wenn Sie MySQL auf OS/2 Warp 3 einsetzen, wird FixPack 29 oder höher benötigt. Bei OS/2 Warp 4 wird FixPack 4 oder höher benötigt. Das erfordert die PThreads-Bibliothek. MySQL muss auf einer Partition installiert werden, die lange Dateinamen unterstützt, also zum Beispiel HPFS, FAT32 usw.

Das `INSTALL.CMD'-Skript muss von OS/2's eigener `CMD.EXE' aus laufen gelassen werden und funktioniert eventuell nicht mit Ersatz-Shells wie `4OS2.EXE'.

Das `scripts/mysql-install-db'-Skript wurde umbenannt. Es heißt jetzt `install.cmd' und ist ein REXX-Skript, welches die vorgabemäßigen MySQL-Sicherheitseinstellungen einstellt und die WorkPlace-Shell-Icons für MySQL erstellt.

Unterstützung für dynamische Module wird einkompiliert, ist aber noch nicht komplett durchgetestet. Dynamische Module sollten unter Benutzung der PThreads-Runtime-Bibliothek kompiliert werden.

gcc -Zdll -Zmt -Zcrtdll=pthrdrtl -I../include -I../regex -I.. \
    -o example udf_example.cc -L../lib -lmysqlclient udf_example.def
mv example.dll example.udf

Beachten Sie: Aufgrund von Beschränkungen in OS/2 dürfen UDF-module-name-stems nicht länger als 8 Zeichen sein. Module werden im `/mysql2/udf'-Verzeichnis gespeichert; das safe-mysqld.cmd-Skript trägt dieses Verzeichnis in die BEGINLIBPATH-Umgebungsvariable ein. Wenn Sie UDF-Module benutzen, werden festgelegte Erweiterungen ignoriert - es wird nicht angenommen, dass sie `.udf' sind. Unter Unix zum Beispiel könnte das gemeinsam genutzte (shared) Module `example.so' benannt sein. Sie würden daraus eine Funktion wie folgt laden:

mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example.so";

Unter OS/2 würde das Modul `example.udf' heißen, aber Sie würden nicht die Modul-Erweiterung angeben:

mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example";

3.6.8 Anmerkungen zu BeOS

Wir sind sehr daran interessiert, MySQL auf BeOS ans Laufen zu bringen, aber leider kennen wir niemanden, der sich mit BeOS auskennt oder Zeit hat, eine Portierung durchzuführen.

Wir sind daran interessiert, jemanden für eine Portierung zu finden, und wir werden ihn / sie bei allen technischen Fragen helfen, die bei einer Portierung auftreten können.

Wir haben vor einiger Zeit mit einigen BeOS-Entwicklern gesprochen, die uns sagten, dass MySQL zu 80% auf BeOS portiert ist, aber wir haben schon eine Weile nichts von ihnen gehört.

3.6.9 Anmerkungen zu Novell NetWare

Wir sind sehr daran interessiert, MySQL auf NetWare ans Laufen zu bringen, aber leider kennen wir niemanden, der sich mit NetWare auskennt oder Zeit hat, eine Portierung durchzuführen.

Wir sind daran interessiert, jemanden für eine Portierung zu finden, und wir werden ihn / sie bei allen technischen Fragen helfen, die bei einer Portierung auftreten können.

3.7 Anmerkungen zur Perl-Installation

DBI/DBD-Schnittstelle

3.7.1 Installation von Perl unter Unix

Perl-Unterstützung für MySQL wird durch die DBI/DBD- Client-Schnittstelle zur Verfügung gestellt. See section 9.2 MySQL-Perl-API. Der Perl- DBD/DBI-Client-Code erfordert Perl Version 5.004 oder später. Die Schnittstelle funktioniert nicht, wenn Sie eine ältere Version von Perl haben.

MySQL-Perl-Unterstützung erfordert ausserdem, dass Sie MySQL-Client- Programmierunterstützung installiert haben. Wenn Sie MySQL von RPM- Dateien installiert haben, sind Client-Programme im Client-RPM enthalten, aber Client-Programmierunterstützung ist im Entwickler-RPM. Stellen Sie sicher, dass Sie auch das letztgenannte RPM installiert haben.

Ab Version 3.22.8 wird Perl-Unterstützung getrennt von der Haupt-MySQL- Unterstützung ausgeliefert. Wenn Sie Perl-Unterstützung installieren wollen, können Sie die benötigten Dateien von http://www.mysql.com/Downloads/Contrib/ herunter laden.

Die Perl-Distributionen werden als komprimierte tar-Archive zur Verfügung gestellt und haben Namen wie `MODULE-VERSION.tar.gz', wobei MODULE der Modulname und VERSION die Versionsnummer ist. Sie sollten die Data-Dumper-, DBI- und Msql- Mysql-modules-Distributionen laden und sie in dieser Reihenfolge installieren. Die Installationsprozedur ist unten dargestellt. Das Beispiel gilt für das Data-Dumper-Modul, ist aber für alle drei Distributionen dieselbe:

  1. Entpacken Sie die Distribution ins aktuelle Verzeichnis.
    shell> gunzip < Data-Dumper-VERSION.tar.gz | tar xvf -
    
    Dieser Befehl erzeugt ein Verzeichnis namens `Data-Dumper- VERSION'.
  2. Wechseln Sie ins oberste Verzeichnis der entpackten Distribution:
    shell> cd Data-Dumper-VERSION
    
  3. Bauen Sie die Distribution und kompilieren Sie alles:
    shell> perl Makefile.PL
    shell> make
    shell> make test
    shell> make install
    

Der make test-Befehl ist wichtig, weil er sicherstellt, dass die Module funktionieren. Beachten Sie, dass der MySQL-Server während der Befehlsausführung bei der Msql-Mysql-modules-Installation laufen muss, um den Schnittstellen-Code auszuführen, den ansonsten schlägt der Test fehl.

Es ist eine gute Idee, die Msql-Mysql-modules-Distribution neu zu kompilieren und zu installieren, wenn Sie ein neues Release von MySQL installieren, insbesondere, wenn Sie Symptome feststellen wie dass alle Ihre DBI-Skripte einen Coredump liefern, nachdem Sie auf eine höhere Version von MySQL aktualisiert haben.

Wenn Sie keine Rechte haben, die Perl-Module im Systemverzeichnis zu installieren, oder wenn Sie lokale Perl-Module installieren wollen, könnte Ihnen der folgende Link helfen:

http://www.iserver.com/support/contrib/perl5/modules.html

Suchen Sie nach der Überschrift Installing New Modules that Require Locally Installed Modules.

3.7.2 Installation von ActiveState-Perl unter Windows

Um das MySQL-DBD-Modul mit ActiveState-Perl unter Windows zu installieren, gehen Sie wie folgt vor:

Das sollte zumindest bei ActiveState-Perl Version 5.6 funktionieren.

Wenn Sie es nicht schaffen, dass oben Genanntes funktioniert, sollten Sie statt dessen den MyODBC-Treiber installieren und sich mit dem MySQL-Server über ODBC verbinden:

use DBI;
$dbh= DBI->connect("DBI:ODBC:$dsn","$user","$password") ||
  die "Fehler $DBI::errstr beim Verbinden mit $dsn\n";

3.7.3 Installation der MySQL-Perl-Distribution unter Windows

Die MySQL-Perl-Distribution enthält DBI, DBD:MySQL und DBD:ODBC.

3.7.4 Probleme bei der Benutzung von Perl DBI/DBD-Schnittstelle

Wenn Perl ausgibt, dass es das `../mysql/mysql.so'-Modul nicht finden kann, liegt das Problem wahrscheinlich darin, dass Perl die gemeinsam genutzte `libmysqlclient.so' nicht findet.

Das können Sie mit einer der folgenden Methoden beheben:

Wenn Sie folgende Fehler von DBD-mysql erhalten, benutzen Sie wahrscheinlich gcc (oder eine alte Binärdatei, die mit gcc kompiliert wurde):

/usr/bin/perl: can't resolve symbol '__moddi3'
/usr/bin/perl: can't resolve symbol '__divdi3'

Fügen Sie -L/usr/lib/gcc-lib/... -lgcc zum Link-Befehl hinzu, wenn die `mysql.so'-Bibliothek gebaut wird (überprüfen Sie die Ausgabe von make nach `mysql.so', wenn Sie den Perl-Client kompilieren). Die -L-Option sollte den Pfadnamen des Verzeichnisses angeben, in dem `libgcc.a' auf Ihrem System liegt.

Ein weiterer Grund für dieses Problem kann sein, dass Perl und MySQL nicht beide mit gcc kompiliert wurden. In diesem Fall können Sie die fehlende Übereinstimmung (Mismatch) durch Kompilieren von beiden mit gcc aufheben.

Wenn Sie folgende Fehler von Msql-Mysql-modules erhalten, wenn Sie die Tests laufen lassen:

t/00base............install_driver(mysql) failed: Can't load
'../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql:
../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: uncompress at
/usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 169.

Bedeutet das, dass Sie die Kompressionsbibliothek (-lz) in die Link- Zeile einschließen müssen. Das kann man durch folgende Änderung in der Datei `lib/DBD/mysql/Install.pm' tun:

$sysliblist .= " -lm";

ändern in

$sysliblist .= " -lm -lz";

Danach müssen Sie 'make realclean' laufen lassen und danach mit der Installation von Anfang an beginnen.

Wenn Sie das Perl-Modul auf einem System laufen lassen wollen, das dynamisches Linken nicht unterstützt (wie Caldera/SCO), können Sie eine statische Version von Perl erzeugen, die DBI und DBD-mysql enthält. Das bringt man zum Laufen, indem man eine Version von Perl erzeugt, in der der DBI-Code eingelinkt ist, und diese über das aktuelle Perls installiert. Dann benutzen Sie diese, um eine Version von Perl zu bauen, die zusätzlich den DBD-Code eingelinkt hat, und installieren diese.

Unter Caldera (SCO) müssen folgende Umgebungsvariablen gesetzt sein:

shell> LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib
or
shell>
LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:/usr/progressive/lib:/usr/skunk/lib
shell>
LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:/usr/progressive/lib:/usr/skunk/lib
shell>
MANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man:/usr/skunk/man:

Erzeugen Sie zuerst ein Perl, das ein statisch gelinktes DBI enthält, indem Sie diese Befehle im Verzeichnis ausführen, in dem Ihre DBI-Distribution liegt:

shell> perl Makefile.PL -static -config
shell> make
shell> make install
shell> make perl

Dann müssen Sie das neue Perl installieren. Die Ausgabe von make perl zeigt den genauen make-Befehl an, den Sie für die Installation ausführen müssen. Unter Caldera (SCO) ist das make -f Makefile.aperl inst_perl MAP_TARGET=perl.

Benutzen Sie als nächstes dieses soeben erzeugte Perl, um ein weiteres Perl zu erzeugen, dass auch ein statisch gelinktes DBD::mysql enthält, indem Sie diese Befehle im Verzeichnis ausführen, in dem Ihre Msql-Mysql-modules-Distribution liegt:

shell> perl Makefile.PL -static -config
shell> make
shell> make install
shell> make perl

Zum Schluss müssen Sie dieses neue Perl installieren. Hierbei zeigt die Ausgabe von make perl wiederum, welcher Befehl benutzt werden muss.

4 Einführung in MySQL: Ein MySQL-Tutorial

Dieses Kapitel enthält eine Einführung in MySQL in Form eines Tutorials. Datei wird gezeigt, wie Sie das mysql-Client-Programm benutzen, um eine einfache Datenbank zu erzeugen und zu benutzen. mysql (auch ``Terminal-Monitor'' oder einfach ``Monitor'' genannt) ist ein interaktives Programm, mit dem Sie sich mit einem MySQL-Server verbinden, Anfragen (Queries) absetzen und die Ergebnisse ansehen können. mysql kann auch im Stapelbetrieb (Batch Mode) benutzt werden: Sie schreiben Ihre Anfragen zuerst in eine Datei und veranlassen dann mysql, die Inhalte dieser Datei auszuführen. Hier werden beide Möglichkeiten beschrieben, mysql zu benutzen.

Sie können mysql mit der --help-Option aufrufen, um eine Liste der Optionen zu sehen:

shell> mysql --help

Dieses Kapitel setzt voraus, dass mysql auf Ihrer Maschine installiert ist und dass ein MySQL-Server verfügbar ist, mit dem Sie sich verbinden können. Wenn das nicht der Fall sein sollte, setzen Sie sich mit Ihrem MySQL-Administrator in Verbindung. (Wenn Sie der Administrator sind, müssen Sie in anderen Abschnitten des Handbuchs nachsehen.)

Dieses Kapitel beschreibt den gesamten Prozess der Einrichtung und Benutzung einer Datenbank. Wenn Sie lediglich wissen wollen, wie man auf eine bereits existierende Datenbank zugreift, können Sie die Abschnitte überspringen, die beschreiben, wie man eine Datenbank und die Tabellen, die sie enthält, erzeugt.

Weil dieses Kapitel ein Tutorial ist, wurden notwendigerweise viele Details ausgelassen. Sehen Sie in den relevanten Abschnitten dieses Handbuchs nach, wenn Sie weitere Informationen zu den Themen suchen, die hier besprochen werden.

4.1 Verbindung zum Server herstellen und trennen

Um sich zum Server zu verbinden, müssen Sie beim Aufruf von mysql in der Regel einen MySQL-Benutzernamen und üblicherweise auch ein Passwort angeben. Wenn der Server auf einer anderen Maschine als der läuft, von der Sie sich einloggen, müssen Sie auch einen Hostnamen angeben. Setzen Sie sich mit Ihrem Administrator in Verbindung, um herauszubekommen, welche Verbindungsparameter Sie benutzen sollten (das heißt welchen Host, welchen Benutzername und welches Passwort Sie verwenden sollen). Wenn Sie die richtigen Parameter kennen, sollten Sie sich wie folgt verbinden können:

shell> mysql -h host -u user -p
Enter password: ********

******** steht für Ihr Passwort. Geben Sie es ein, wenn mysql Enter password: anzeigt.

Wenn das funktioniert hat, sehen Sie ein paar einführende Informationen, gefolgt von der mysql>-Eingabeaufforderung:

shell> mysql -h host -u user -p
Enter password: ********
Welcome to the MySQL monitor.  Commands end mit ; or \g.
Your MySQL connection id ist 459 to server version: 3.22.20a-log

Type 'help' for help.

mysql>

Die Eingabeaufforderung sagt Ihnen, dass mysql bereit für die Eingabe von Befehlen ist.

Einige Einige MySQL-Installationen erlauben Benutzern, sich als anonyme (unbenannte) Benutzer mit dem Server auf dem lokalen Host zu verbinden. Wenn das auf Ihrer Maschine der Fall ist, können Sie sich mit diesem Server verbinden, indem Sie mysql ohne irgend welche Optionen aufrufen:

shell> mysql

Nachdem Sie sich erfolgreich verbunden haben, können Sie die Verbindung jederzeit trennen, indem Sie QUIT an der mysql>-Eingabeaufforderung eingeben.

mysql> QUIT
Bye

Sie können die Verbindung auch trennen, indem Sie STRG+D eingeben.

Die meisten Beispiele der folgenden Abschnitte setzen voraus, dass Sie mit dem Server verbunden sind. Das wird durch mysql> angezeigt.

4.2 Anfragen eingeben

Stellen Sie sicher, dass Sie mit dem Server verbunden sind, wie im vorherigen Abschnitt erörtert. Dadurch wird noch keine Datenbank ausgewählt, mit der Sie arbeiten können, aber das ist in Ordnung. Hier ist es erst einmal wichtiger, herauszufinden, wie Sie Anfragen (Queries) absetzen, als direkt mit dem Erzeugen von Tabellen, dem Einladen von Daten in diese und der Abfrage von Daten aus diesen zu beginnen. Dieser Abschnitt beschreibt die grundlegenden Prinzipien der Befehlseingabe, indem etliche Anfragen gezeigt werden, die Sie ausprobieren können, um sich mit der Arbeitsweise von mysql vertraut zu machen.

Hier ist ein einfacher Befehl, der den Server bittet, Ihnen seine Versionsnummer und das aktuelle Datum mitzuteilen. Geben Sie folgendes an der mysql>-Eingabeaufforderung ein und drücken Sie die Eingabetaste:

mysql> SELECT VERSION(), CURRENT_DATE;
+--------------+--------------+
| version()    | CURRENT_DATE |
+--------------+--------------+
| 3.22.20a-log | 1999-03-19   |
+--------------+--------------+
1 row in set (0.01 sec)
mysql>

Diese Anfrage erläutert verschiedene Dinge über mysql:

Schlüsselwörter können in beliebiger Schreibweise (Groß und klein) eingegeben werden. Folgende Anfragen sind gleichwertig:

mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;

Hier kommt eine weitere Anfrage. Sie zeigt, wie Sie mysql als einfachen Rechner benutzen können:

mysql> SELECT SIN(PI()/4), (4+1)*5;
+-------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+-------------+---------+
|    0.707107 |      25 |
+-------------+---------+

Die bislang gezeigten Befehle sind relativ kurze, einzeilige Statements. Sie können allerdings auch mehrfache Statements auf einer einzelnen Zeile eingeben. Beenden Sie einfach jedes davon mit einem Semikolon:

mysql> SELECT VERSION(); SELECT NOW();
+--------------+
| version()    |
+--------------+
| 3.22.20a-log |
+--------------+

+---------------------+
| NOW()               |
+---------------------+
| 1999-03-19 00:15:33 |
+---------------------+

Ein Befehl muss nicht auf einer einzelnen Zeile eingegeben werden, so dass längere Befehle, die mehrere Zeilen erfordern, kein Problem darstellen. mysql stellt anhand des beendenden Semikolons fest, wo Ihr Statement endet, und nicht etwa anhand des Zeilenendes. (Mit anderen Worten akzeptiert mysql Freiformat-Eingaben: Es sammelt Eingabezeilen, führt sie aber solange nicht aus, bis es das Semikolon sieht.)

Hier ist ein einfaches Statement, auf mehrere Zeilen verteilt:

mysql> SELECT
    -> USER()
    -> ,
    -> CURRENT_DATE;
+--------------------+--------------+
| USER()             | CURRENT_DATE |
+--------------------+--------------+
| joesmith@localhost | 1999-03-18   |
+--------------------+--------------+

Sehen Sie, wie sich die Eingabeaufforderung von mysql> zu -> ändert, nachdem Sie die erste Zeile der Mehrzeilen-Anfrage eingegeben haben. Auf diese Weise zeigt mysql an, dass es noch nicht das komplette Statement gesehen hat und auf den Rest wartet. Die Eingabeaufforderung ist Ihr Freund, denn sie stellt wertvolle Rückmeldungen zur Verfügung. Wenn Sie diese Rückmeldungen nutzen, werden Sie immer dessen gewahr sein, worauf mysql wartet.

Wenn Sie den Befehl, den Sie gerade eingeben, nicht ausführen wollen, können Sie ihn mit \c abbrechen:

mysql> SELECT
    -> USER()
    -> \c
mysql>

Beachten Sie auch hierbei die Eingabeaufforderung. Sie ändert sich zurück zu mysql>, nachdem Sie \c eingegeben haben, und diese Rückmeldung bedeutet, dass mysql für einen weiteren Befehl bereit ist.

Folgende Tabelle zeigt alle Eingabeaufforderungen, denen Sie begegnen können, und fasst zusammen, was sie über den Zustand von mysql aussagen:

Eingabeaufforderung Bedeutung
mysql> Bereit für den nächsten Befehl.
-> Wartet auf die nächste Zeile eines mehrzeiligen Befehls.
'> Wartet auf die nächste Zeile und fasst eine Zeichenkette zusammen, die mit einem Apostroph (`'') beginnt.
"> Wartet auf die nächste Zeile und fasst eine Zeichenkette zusammen, die mit Anführungszeichen (`"') beginnt.

Mehrzeilige Statements passieren häufig aus Versehen, wenn Sie vorhaben, einen Befehl auf einer einzelnen Zeile abzusetzen, aber das beendende Semikolon vergessen. In diesem Fall wartet mysql auf weitere Eingaben:

mysql> SELECT USER()
    ->

Wenn so etwas passiert (Sie dachten, Sie hätten ein Statement eingegeben, aber die einzige Antwort ist die ->-Eingabeaufforderung), wartet mysql höchstwahrscheinlich auf das Semikolon. Wenn Sie nicht darauf achten, was Ihnen die Eingabeaufforderung mitteilen will, könnten Sie eine ganze Weile herum sitzen, bevor Sie feststellen, was Sie tun müssen. Geben Sie ein Semikolon ein, um das Statement zu vollenden, und mysql wird es ausführen:

mysql> SELECT USER()
    -> ;
+--------------------+
| USER()             |
+--------------------+
| joesmith@localhost |
+--------------------+

Die '>- und ">-Eingabeaufforderungen kommen bei der Sammlung von Zeichenketten vor. In MySQL können Sie Zeichenketten wahlweise in `''- oder `"'-Zeichen eingeschlossen eingeben (zum Beispiel 'hallo' oder "tschüß"), und mysql läßt Sie auch Zeichenketten eingeben, die sich über mehrere Zeilen erstrecken. Wenn Sie eine '>- oder ">-Eingabeaufforderung sehen, heißt das, dass Sie eine Zeile eingegeben haben, die eine Zeichenkette enthält, die mit `'' oder `"' beginnt, dass Sie aber noch nicht das entsprechende beendende Zeichen (ebenfalls `'' oder `"') eingegeben haben. Das ist in Ordnung, wenn Sie tatsächlich eine mehrzeilige Zeichenkette eingeben, aber wie wahrscheinlich ist das? Nicht sehr wahrscheinlich. Wahrscheinlicher ist, dass die '>- und ">-Eingabeaufforderungen anzeigen, dass Sie versehentlich ein `''- oder `"'-Zeichen ausgelassen haben. Beispiel:

mysql> SELECT * FROM meine_tabelle WHERE name = "Schmidt AND age < 30;
    ">

Wenn Sie dieses SELECT-Statement eingeben, dann EINGABE drücken und auf das Ergebnis warten, wird nichts passieren. Statt sich zu fragen, warum diese Anfrage so lange dauert, beachten Sie des Rätsels Lösung, die die ">-Eingabeaufforderung anzeigt. Sie sagt Ihnen, dass mysql auf den Rest einer nicht beendeten Zeichenkette wartet. (Sehen Sie den Fehler im Statement? Der Zeichenkette "Schmidt fehlt das zweite Anführungszeichen.)

Was machen Sie in diesem Fall? Das einfachste ist, den Befehl abzubrechen. Sie können jetzt allerdings nicht einfach \c eingeben, weil mysql es als Teil der Zeichenkette interpretieren würde, die es gerade sammelt! Geben Sie daher zuerst das schließende Anführungszeichen ein, damit mysql weiß, dass die Zeichenkette zuende ist, und erst danach \c:

mysql> SELECT * FROM meine_tabelle WHERE name = "Schmidt AND age < 30;
    "> "\c
mysql>

Die Eingabeaufforderung ändert sich wieder zu mysql> und zeigt damit an, dass mysql für einen weiteren Befehl bereit ist.

Es ist wichtig, die Bedeutung der '>- und ">-Eingabeaufforderungen zu kennen, denn wenn Sie versehentlich eine nicht beendete Zeichenkette eingeben, werden alle folgenden Zeilen, die Sie eingeben, von mysql ignoriert - inklusive einer Zeile, die QUIT enthält! Das kann recht verwirrend sein, besonders dann, wenn Sie nicht wissen, dass Sie das schließende Anführungszeichen eingeben müssen, bevor Sie den aktuellen Befehl abbrechen können.

4.3 Eine Datenbank erzeugen und benutzen

Jetzt, wo Sie wissen, wie Sie Befehle eingeben, ist es Zeit, auf eine Datenbank zuzugreifen.

Nehmen wir an, Sie haben zuhause mehrere Haustiere (Ihre Menagerie) und Sie wollen unterschiedliche Arten von Information über sie im Überblick behalten. Das können Sie tun, indem Sie Tabellen erzeugen, die Ihre Daten beinhalten, und die Sie mit den gewünschten Informationen füllen. Dann können Sie verschiedene Arten von Fragen über Ihre Haustiere beantworten, indem Sie Daten aus den Tabellen abrufen. Dieser Abschnitt zeigt Ihnen:

Die Menagerie-Datenbank wird (bewusst) einfach sein, aber man kann sich leicht Situationen im echten Leben vorstellen, in denen ein ähnlicher Typ von Datenbank benutzt werden könnte. Beispielsweise könnte ein Bauer eine solche Datenbankbenutzung, um den Überblick über sein Vieh zu behalten, oder ein Tierarzt, um seine Patientendaten im Griff zu haben. Sie finden eine Menagerie-Distribution, die einige der benutzten Anfragen und Beispielsdaten enthält, auf der MySQL-Website. Sie finden die Distribution entweder unter komprimiertes tar-Format oder unter Zip-Format.

Benutzen Sie das SHOW-Statement, um herauszufinden, welche Datenbanken zur Zeit auf dem Server existieren:

mysql> SHOW DATABASES;
+----------+
| database |
+----------+
| mysql    |
| test     |
| tmp      |
+----------+

Die Liste der Datenbanken weicht wahrscheinlich von derjenigen auf Ihrer Maschine ab, aber wahrscheinlich befinden sich die mysql- und test-Datenbanken darunter. Die mysql-Datenbank ist notwendig, weil darin die Zugriffsrechte für Benutzer gespeichert sind. Die test-Datenbank ist meist als Arbeitsbereich zum Ausprobieren dabei.

Wenn die test-Datenbank existiert, versuchen Sie, darauf zuzugreifen:

mysql> USE test
database changed

Beachten Sie, dass USE - wie QUIT - kein Semikolon erfordert. (Sie können solche Statements mit einem Semikolon beenden, wenn Sie wollen, es schadet nicht.) Das USE-Statement ist auch auf andere Art besonders: Es muss auf einer einzigen Zeile eingegeben werden.

Sie können die test-Datenbank für die folgenden Beispiele benutzen (wenn Sie Zugriff darauf haben), aber alles, was Sie dort anlegen, kann von jedem sonstigen, der Zugriff darauf hat, entfernt werden. Aus diesem Grund sollten Sie besser Ihren MySQL-Administrator um Erlaubnis bitten, eine eigene Datenbankbenutzung zu können. Nehmen wir an, Sie wollen Ihre Datenbank menagerie nennen. Dafür muss der Administrator folgenden Befehl eingeben:

mysql> GRANT ALL ON menagerie.* TO ihr_mysql_name;

Wobei ihr_mysql_name der MySQL-Benutzername ist, der Ihnen zugewiesen wurde.

4.3.1 Eine Datenbank erzeugen und auswählen

Wenn der Administrator für Sie eine Datenbank erzeugt, wenn er Ihre Zugriffsrechte einträgt, können Sie sie unmittelbar benutzen. Ansonsten müssen Sie sie selbst anlegen:

mysql> CREATE DATABASE menagerie;

Unter Unix sind Datenbanknamen abhängig von der Groß-/Kleinschreibung (im Gegensatz zu SQL-Schlüsselwörtern), daher müssen Sie sich auf Ihre Datenbank immer mit menagerie beziehen, nicht mit Menagerie, MENAGERIE oder irgend einer anderen Variante. Dasselbe gilt für Tabellennamen. (Unter Windows trifft diese Beschränkung nicht zu. Dennoch muss man sich bei einer gegebenen Anfrage auf Datenbanken und Tabellen in derselben Schreibweise beziehen.)

Das Erzeugen einer Datenbank wählt diese nicht zur Benutzung aus. Das müssen Sie explizit tun. Um menagerie zur aktuell ausgewählten Datenbank zu machen, benutzen Sie folgenden Befehl:

mysql> USE menagerie
database changed

Ihre Datenbank muss nur einmal erzeugt werden, aber Sie müssen sie jedes Mal zur Benutzung auswählen, wenn Sie eine mysql-Sitzung beginnen. Das können Sie durch die Eingabe eines USE-Statements wie oben beschrieben tun. Alternativ können Sie die Datenbank auf der Kommandozeile auswählen, wenn Sie mysql aufrufen. Geben Sie einfach ihren Namen nach den Verbindungsparametern ein, die Sie ansonsten eingeben müssen. Beispiel:

shell> mysql -h host -u user -p menagerie
Enter password: ********

Beachten Sie, dass menagerie auf der gezeigten Kommandozeile nicht Ihr Passwort ist! Wenn Sie Ihr Passwort auf der Kommandozeile nach der -p-Option eingeben wollen, müssen Sie das ohne Leerzeichen dazwischen machen (beispielsweise als -pmeinpasswort, nicht als -p meinpasswort). Es wird allerdings nicht empfohlen, das Passwort auf der Kommandozeile einzugeben, denn dann kann es durch andere Benutzer, die auf Ihrer Maschine eingeloggt sind, ausspioniert werden.

4.3.2 Eine Tabelle erzeugen

Die Datenbank zu erzeugen ist leicht, aber bis jetzt ist sie noch leer, wie Ihnen SHOW TABLES zeigt:

mysql> SHOW TABLES;
Empty set (0.00 sec)

Der schwierigere Teil besteht darin, sich zu entscheiden, wie die Struktur Ihrer Datenbank sein sollte: Welche Tabellen Sie benötigen und welche Spalten in jeder Tabelle enthalten sein sollen.

Sie brauchen eine Tabelle, die für jedes Ihrer Haustiere einen Datensatz enthält. Diese kann pet-Tabelle genannt werden, und sie sollte zumindest den Namen jedes Tiers enthalten. Weil lediglich der Name nicht besonders interessant ist, sollte die Tabelle weitere Informationen enthalten. Wenn zum Beispiel mehr als eine Person in Ihrer Familie ein Haustier hält, würden Sie den Namen des Besitzers jedes Haustiers auflisten wollen. Ausserdem wollen Sie vielleicht ein paar grundlegende Informationen wie Art und Geschlecht einfügen.

Was ist mit dem Alter? Diese Information könnte interessant sein, aber es ist keine gute Idee, sie in der Datenbank zu speichern. Das Alter ändert sich, wenn die Zeit vergeht, was bedeutet, dass Sie Ihre Datensätze oft aktualisieren müssen. Statt dessen ist es besser, einen festen Wert wie das Geburtsdatum zu speichern. Immer, wenn Sie dann das Alter benötigen, berechnen Sie es als Differenz zwischen dem aktuellen Datum und dem Geburtstag. MySQL stellt Funktionen für Datumsberechnungen zur Verfügung, daher ist so etwas nicht schwer. Ausserdem hat die Speicherung von Geburtsdaten anstelle von Alter weitere Vorteile:

Wahrscheinlich fallen Ihnen weitere Informationen ein, die sinnvoller Weise in der pet-Tabelle gespeichert werden könnten. Für unser Beispiel sollen die bisher identifizierten Informationen fürs Erste ausreichen: Name, Besitzer, Art, Geschlecht, Geburtstag und Sterbetag.

Legen Sie mit einem CREATE TABLE-Statement das Layout Ihrer Tabelle fest:

mysql> CREATE TABLE pet (name VARCHAR(20), besitzer VARCHAR(20),
    -> art VARCHAR(20), geschlecht CHAR(1), geburtstag DATE, sterbetag DATE);

VARCHAR ist für die name-, besitzer- und art-Spalten eine gute Wahl, weil die Spaltenwerte in der Länge variieren werden. Diese Spalten müssen auch nicht alle gleich sein, also 20 Zeichen lang. Sie können jede beliebige Länge zwischen 1 und 255 wählen, was immer Ihnen vernünftig erscheint. (Wenn Sie eine schlechte Wahl getroffen haben und sich später herausstellt, dass Sie eine längere Spalte brauchen, stellt MySQL ein ALTER TABLE-Statement zur Verfügung.)

Das Geschlecht der Tiere kann vielfältig dargestellt werden, zum Beispiel als "m" und "w", oder auch als "männlich" und "weiblich". Am einfachsten ist es, hierfür einzelne Zeichen wie "m" und "w" zu verwenden.

Der DATE-Datentyp für geburtstag und sterbetag liegt auf der Hand.

Nachdem Sie eine Tabelle angelegt haben, sollte SHOW TABLES auch etwas zeigen:

mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| pet                 |
+---------------------+

Um sicherzustellen, dass Ihre Tabelle so wie erwartet angelegt wurde, benutzen Sie das DESCRIBE-Statement:

mysql> DESCRIBE pet;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| name       | varchar(20) | YES  |     | NULL    |       |
| besitzer   | varchar(20) | YES  |     | NULL    |       |
| art        | varchar(20) | YES  |     | NULL    |       |
| geschlecht | char(1)     | YES  |     | NULL    |       |
| geburtstag | date        | YES  |     | NULL    |       |
| sterbetag  | date        | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

Sie können DESCRIBE jederzeit benutzen, zum Beispiel, wenn Sie die Namen der Spalten Ihrer Tabelle vergessen haben oder von welchem Datentyp sie sind.

4.3.3 Daten in Tabellen einladen

Nachdem Sie Ihre Tabelle erzeugt haben, müssen Sie sie mit Daten füllen. Hierfür sind die LOAD DATA- und INSERT-Statements nützlich.

Nehmen wir an, Sie haben Haustiere wie unten aufgeführt. (Achten Sie bei den Datumsangaben bitte darauf, dass MySQL Daten im YYYY-MM-DD-Format erwartet, was von dem Format abweichen kann, an das Sie gewohnt sind.)

name besitzer art geschlecht geburtstag sterbetag
Fluffy Harold Katze w 1993-02-04
Claws Gwen Katze m 1994-03-17
Buffy Harold Hund w 1989-05-13
Fang Benny Hund m 1990-08-27
Bowser Diane Hund m 1998-08-31 1995-07-29
Chirpy Gwen Vogel w 1998-09-11
Whistler Gwen Vogel 1997-12-09
Slim Benny Schlange m 1996-04-29

Weil Sie mit einer leeren Tabelle beginnen, ist eine einfache Möglichkeit, diese mit Daten zu füllen, dass Sie eine Textdatei erzeugen, die eine Zeile für jedes Ihrer Tiere enthält, und die Inhalte dieser Datei dann mit einem einzigen Statement in die Tabelle laden.

Erzeugen Sie also eine Textdatei `pet.txt', die einen Datensatz pro Zeile enthält, mit Werten, die durch TAB-Zeichen getrennt sind, und zwar in der Reihenfolge, in der die Spalten im CREATE TABLE-Statement aufgeführt waren. Fehlende Werte (wie unbekanntes Geschlecht oder Sterbedaten für Tiere, die noch leben) ersetzen Sie mit NULL-Werten. Um das in Ihrer Textdatei darzustellen, nehmen Sie \N. Der Datensatz für den Vogel Whistler zum Beispiel sieht wie folgt aus (wobei der Leerraum zwischen den Werten ein einzelnes TAB-Zeichen darstellt):

Whistler Gwen Vogel \N 1997-12-09 \N

Um die Textdatei `pet.txt' in die pet-Tabelle zu laden, benutzen Sie folgenden Befehl:

mysql> LOAD DATA LOCAL INFILE "pet.txt" INTO TABLE pet;

Sie können das Trennzeichen für die Spalten und das Zeichen für Zeilenende im LOAD DATA-Statement explizit festlegen, wenn Sie wollen, aber vorgabemäßig sind das das TAB-Zeichen und das Zeilenvorschub-Zeichen. Das reicht für das Statement aus, um die Datei `pet.txt' korrekt einzulesen.

Wenn Sie einzeln neue Datensätze hinzufügen wollen, ist das INSERT-Statement nützlich. In seiner einfachsten Form geben Sie für jede Spalte Werte an, in genau der Reihenfolge, in der die Spalten im CREATE TABLE-Statement aufgeführt wurden. Nehmen wir an, dass Diane einen neuen Hamster namens Puffball bekommt. Sie fügen einen neuen Datensatz mittels INSERT-Statement wie folgt hinzu:

mysql> INSERT INTO pet
    -> VALUES ('Puffball','Diane','Hamster','w','1999-03-30',NULL);

Beachten Sie, dass hierbei Zeichenketten- und Datumswerte in Anführungszeichen stehen. Mit INSERT können Sie auch direkt NULL einfügen, um einen fehlenden Wert darzustellen. Sie können dafür nicht \N wie bei LOAD DATA verwenden.

Diesem Beispiel können Sie auch entnehmen, dass es einiger Tipparbeit bedurft hätte, die anfänglichen Datensätze mit mehreren INSERT-Statements einzufügen, statt hierfür ein einziges LOAD DATA-Statement zu verwenden.

4.3.4 Informationen aus einer Tabelle abfragen

Das SELECT-Statement wird benutzt, um Informationen aus einer Tabelle herauszuziehen. Die allgemeine Form des Statements ist:

SELECT auszuwählende_spalten
FROM tabelle
WHERE gewünschte_bedingungen

auszuwählende_spalten bezeichnet, was Sie sehen wollen. Das kann entweder eine Liste von Spalten sein oder *, um ``alle Spalten'' zu bezeichnen. tabelle kennzeichnet die Tabelle, aus der Sie Spalten abfragen wollen. Die WHERE-Klausel ist optional. Wenn sie vorhanden ist, kennzeichnet gewünschte_bedingungen die Bedingungen, mit denen die Zeilen übereinstimmen müssen, damit sie abgefragt werden.

4.3.4.1 Alle Daten auswählen

Die einfachste Form von SELECT fragt alles aus einer Tabelle ab:

mysql> SELECT * FROM pet;
+----------+----------+----------+------------+------------+------------+
| name     | besitzer | art      | geschlecht | geburtstag | sterbetag  |
+----------+----------+----------+------------+------------+------------+
| Fluffy   | Harold   | Katze    | w          | 1993-02-04 | NULL       |
| Claws    | Gwen     | Katze    | m          | 1994-03-17 | NULL       |
| Buffy    | Harold   | Hund     | w          | 1989-05-13 | NULL       |
| Fang     | Benny    | Hund     | m          | 1990-08-27 | NULL       |
| Bowser   | Diane    | Hund     | m          | 1998-08-31 | 1995-07-29 |
| Chirpy   | Gwen     | Vogel    | w          | 1998-09-11 | NULL       |
| Whistler | Gwen     | Vogel    | NULL       | 1997-12-09 | NULL       |
| Slim     | Benny    | Schlange | m          | 1996-04-29 | NULL       |
| Puffball | Diane    | Hamster  | w          | 1999-03-30 | NULL       |
+----------+----------+----------+------------+------------+------------+

Diese Form von SELECT ist nützlich, wenn Sie Ihre gesamte Tabelle abfragen wollen, zum Beispiel, wenn Sie sich gerade mit einem anfänglichen Satz Daten geladen haben. Wie das so passiert, zeigt die Ausgabe einen Fehler auf: Bowser scheint gestorben zu sein, bevor er geboren wurde! In den Original-Stammbaum-Papieren finden Sie, dass das korrekte Geburtsjahr 1989 ist, nicht 1998.

Es gibt eine ganze Reihe Möglichkeiten, das zu beheben:

Wie gezeigt ist es einfach, eine ganze Tabelle abzufragen. Aber typischerweise wird das selten gewünscht sein, besonders, wenn die Tabelle Groß wird. Statt dessen werden Sie an der Antwort auf bestimmte Fragen interessiert sein, wobei Sie ein paar Beschränkungen in Bezug auf die Informationen, die Sie wollen, festlegen. Schauen wir uns einige Auswahl-Anfragen an, hinsichtlich der Fragen in Bezug auf Ihre Haustiere, die sie beantworten.

4.3.4.2 Bestimmte Zeilen auswählen

Sie können nur bestimmte Zeilen Ihrer Tabelle auswählen. Wenn Sie zum Beispiel die Geburtstags-Änderung von Bowser überprüfen wollen, wählen Sie Bowsers Datensatz wie folgt aus:

mysql> SELECT * FROM pet WHERE name = "Bowser";
+--------+----------+---------+-------------+------------+------------+
| name   | besitzer | art     | geschlecht  | geburtstag | sterbetag  |
+--------+----------+---------+-------------+------------+------------+
| Bowser | Diane    | dog     | m           | 1989-08-31 | 1995-07-29 |
+--------+----------+---------+-------------+------------+------------+

Die Ausgabe bestätigt, dass das Jahr inzwischen korrekt als 1989, nicht 1998, eingetragen ist.

Vergleiche von Zeichenketten achten normalerweise nicht auf Groß-/Kleinschreibung, daher können Sie den Namen als "bowser", "BOWSER" usw. angeben. Das Anfrageergebnis wird dasselbe bleiben.

Sie können für jede Spalte Bedingungen festlegen, nicht nur für name. Wenn Sie zum Beispiel wissen wollen, welche Tiere nach 1998 geboren wurden, formulieren Sie eine Bedingung für die geburtstag-Spalte:

mysql> SELECT * FROM pet WHERE geburtstag >= "1998-1-1";
+----------+----------+---------+-------------+------------+-----------+
| name     | besitzer | art     | geschlecht  | geburtstag | sterbetag |
+----------+----------+---------+-------------+------------+-----------+
| Chirpy   | Gwen     | Vogel   | w           | 1998-09-11 | NULL      |
| Puffball | Diane    | Hamster | w           | 1999-03-30 | NULL      |
+----------+----------+---------+-------------+------------+-----------+

Sie können Bedingungen kombinieren, um zum Beispiel weibliche Hunde festzustellen:

mysql> SELECT * FROM pet WHERE art = "Hund" AND geschlecht = "w";
+-------+-----------+---------+------------+------------+-----------+
| name  | besitzer  | art     | geschlecht | geburtstag | sterbetag |
+-------+-----------+---------+------------+------------+-----------+
| Buffy | Harold    | Hund    | w          | 1989-05-13 | NULL      |
+-------+-----------+---------+------------+------------+-----------+

Die vorherige Anfrage benutzt den logischen Operator AND. Es gibt auch einen OR-Operator:

mysql> SELECT * FROM pet WHERE art = "Schlange" OR art = "Vogel";
+----------+----------+---------+-------------+------------+-----------+
| name     | besitzer | art     | geschlecht  | geburtstag | sterbetag |
+----------+----------+---------+-------------+------------+-----------+
| Chirpy   | Gwen     | Vogel   | w           | 1998-09-11 | NULL      |
| Whistler | Gwen     | Vogel   | NULL        | 1997-12-09 | NULL      |
| Slim     | Benny    | Schlange| m           | 1996-04-29 | NULL      |
+----------+----------+---------+-------------+------------+-----------+

AND und OR können gemischt werden. Wenn Sie das tun, ist es eine gute Idee, Klammern zu verwenden, um anzuzeigen, wie die Bedingungen gruppiert werden sollen:

mysql> SELECT * FROM pet WHERE (art = "Katze" AND geschlecht = "m")
    -> OR (art = "Hund" AND geschlecht = "w");
+-------+-----------+---------+-------------+------------+-----------+
| name  | besitzer  | art     | geschlecht  | geburtstag | sterbetag |
+-------+-----------+---------+-------------+------------+-----------+
| Claws | Gwen      | Katze   | m           | 1994-03-17 | NULL      |
| Buffy | Harold    | Hund    | w           | 1989-05-13 | NULL      |
+-------+-----------+---------+-------------+------------+-----------+

4.3.4.3 Bestimmte Spalten auswählen

Wenn Sie nicht ganze Zeilen Ihrer Tabelle sehen wollen, geben Sie einfach die Spalten an, an denen Sie interessiert sind, getrennt durch Kommas. Wenn Sie zum Beispiel wissen wollen, wann Ihre Tiere geboren wurden, wählen Sie die name- und geburtstag-Spalten aus:

mysql> SELECT name, geburtstag FROM pet;
+----------+------------+
| name     | geburtstag |
+----------+------------+
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Buffy    | 1989-05-13 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Puffball | 1999-03-30 |
+----------+------------+

Um herauszufinden, wem welches Haustier gehört, benutzen Sie diese Anfrage:

mysql> SELECT besitzer FROM pet;
+----------+
| besitzer |
+----------+
| Harold   |
| Gwen     |
| Harold   |
| Benny    |
| Diane    |
| Gwen     |
| Gwen     |
| Benny    |
| Diane    |
+----------+

Beachten Sie jedoch, dass diese Anfrage einfach die besitzer-Spalte jedes Datensatzes abfragt, wodurch mehrere von ihnen mehrfach erscheinen. Um die Ausgabe zu minimieren, fragen Sie jeden eindeutigen Datensatz nur einmal ab, indem Sie das Schlüsselwort DISTINCT verwenden:

mysql> SELECT DISTINCT besitzer FROM pet;
+-----------+
| besitzer  |
+-----------+
| Benny     |
| Diane     |
| Gwen      |
| Harold    |
+-----------+

Sie können eine WHERE-Klausel verwenden, um die Auswahl von Zeilen mit der Auswahl von Spalten zu kombinieren. Um zum Beispiel nur die Geburtstage von Hunden und Katzen zu erhalten, benutzen Sie diese Anfrage:

mysql> SELECT name, art, geburtstag FROM pet
    -> WHERE art = "Hund" OR art = "Katze";
+--------+---------+------------+
| name   | art     | geburtstag |
+--------+---------+------------+
| Fluffy | Katze   | 1993-02-04 |
| Claws  | Katze   | 1994-03-17 |
| Buffy  | Hund    | 1989-05-13 |
| Fang   | Hund    | 1990-08-27 |
| Bowser | Hund    | 1989-08-31 |
+--------+---------+------------+

4.3.4.4 Zeilen sortieren

Sie haben bei den vorherigen Beispielen vielleicht bemerkt, dass die Ergebniszeilen in keiner bestimmten Reihenfolge angezeigt werden. Häufig ist es jedoch einfacher, die Ausgabe der Anfrage zu überprüfen, wenn die Zeilen auf sinnvolle Art sortiert werden. Um ein Ergebnis zu sortieren, benutzen Sie die ORDER BY-Klausel.

Hier sind die Geburtstage der Haustiere, sortiert nach Geburtstag:

mysql> SELECT name, geburtstag FROM pet ORDER BY geburtstag;
+----------+------------+
| name     | geburtstag |
+----------+------------+
| Buffy    | 1989-05-13 |
| Bowser   | 1989-08-31 |
| Fang     | 1990-08-27 |
| Fluffy   | 1993-02-04 |
| Claws    | 1994-03-17 |
| Slim     | 1996-04-29 |
| Whistler | 1997-12-09 |
| Chirpy   | 1998-09-11 |
| Puffball | 1999-03-30 |
+----------+------------+

Um in umgekehrter Reihenfolge zu sortieren, fügen Sie das DESC- (descending) Schlüsselwort zum Namen der Spalte, die Sie sortieren wollen, hinzu:

mysql> SELECT name, geburtstag FROM pet ORDER BY geburtstag DESC;
+----------+------------+
| name     | geburtstag |
+----------+------------+
| Puffball | 1999-03-30 |
| Chirpy   | 1998-09-11 |
| Whistler | 1997-12-09 |
| Slim     | 1996-04-29 |
| Claws    | 1994-03-17 |
| Fluffy   | 1993-02-04 |
| Fang     | 1990-08-27 |
| Bowser   | 1989-08-31 |
| Buffy    | 1989-05-13 |
+----------+------------+

Sie können über mehrere Spalten sortieren. Um beispielsweise zuerst nach der Art des Tieres und dann nach dem Geburtsdatum innerhalb der Tierart zu sortieren (die jüngsten Tiere zuerst), benutzen Sie folgende Anfrage:

mysql> SELECT name, art, geburtstag FROM pet ORDER BY art, geburtstag DESC;
+----------+----------+------------+
| name     | art      | geburtstag |
+----------+----------+------------+
| Chirpy   | Vogel    | 1998-09-11 |
| Whistler | Vogel    | 1997-12-09 |
| Claws    | Katze    | 1994-03-17 |
| Fluffy   | Katze    | 1993-02-04 |
| Fang     | Hund     | 1990-08-27 |
| Bowser   | Hund     | 1989-08-31 |
| Buffy    | Hund     | 1989-05-13 |
| Puffball | Hamster  | 1999-03-30 |
| Slim     | Schlange | 1996-04-29 |
+----------+----------+------------+

Beachten Sie, dass sich das DESC-Schlüsselwort nur auf die Spalte bezieht, die unmittelbar davor steht (geburtstag). art-Werte werden nach wie vor in aufsteigender Reihenfolge sortiert.

4.3.4.5 Datumsberechnungen

MySQL stellt etliche Funktionen zur Verfügung, mit denen Sie Datumsberechnungen wie Altersberechnungen oder das Extrahieren von Datumsteilen durchführen können.

Um festzustellen, wie alt jedes Ihrer Haustiere ist, berechnen Sie die Differenz im Jahresanteil des aktuellen Datums und des Geburtstags und subtrahieren eins, wenn das aktuelle Datum früher im Kalender erscheint als das Geburtsdatum. Folgende Anfrage zeigt für jedes Haustier das Geburtsdatum, das aktuelle Datum und das Alter in Jahren:

mysql> SELECT name, geburtstag, CURRENT_DATE,
    -> (YEAR(CURRENT_DATE)-YEAR(geburtstag))
    -> - (RIGHT(CURRENT_DATE,5)<RIGHT(geburtstag,5))
    -> AS age
    -> FROM pet;
+----------+------------+--------------+------+
| name     | geburtstag | CURRENT_DATE | age  |
+----------+------------+--------------+------+
| Fluffy   | 1993-02-04 | 2001-08-29   |    8 |
| Claws    | 1994-03-17 | 2001-08-29   |    7 |
| Buffy    | 1989-05-13 | 2001-08-29   |   12 |
| Fang     | 1990-08-27 | 2001-08-29   |   11 |
| Bowser   | 1989-08-31 | 2001-08-29   |   11 |
| Chirpy   | 1998-09-11 | 2001-08-29   |    2 |
| Whistler | 1997-12-09 | 2001-08-29   |    3 |
| Slim     | 1996-04-29 | 2001-08-29   |    5 |
| Puffball | 1999-03-30 | 2001-08-29   |    2 |
+----------+------------+--------------+------+

Hier zieht YEAR() den Jahresanteil eines Datums heraus. RIGHT() zieht die rechts stehenden fünf Zeichen heraus, die für den MM-DD-Teil des Datums stehen. Der Teil in dem Ausdruck, der die MM-DD-Werte vergleicht, wird zu 1 oder 0 ausgewertet, was die Jahresdifferenz ein Jahr nach unten anpasst, wenn CURRENT_DATE früher im Jahr erscheint als geburtstag. Der gesamte Ausdruck ist als Überschrift etwas plump, daher wir ein Alias (age) benutzt, um die Spaltenüberschrift etwas lesbarer zu machen.

Die Anfrage funktioniert, aber das Ergebnis könnte leichter überblickt werden, wenn die Zeilen in einer bestimmten Reihenfolge angezeigt würden. Das kann man erreichen, indem man eine ORDER BY name-Klausel hinzufügt, um die Ausgabe nach Namen zu sortieren:

mysql> SELECT name, geburtstag, CURRENT_DATE,
    -> (YEAR(CURRENT_DATE)-YEAR(geburtstag))
    -> - (RIGHT(CURRENT_DATE,5)<RIGHT(geburtstag,5))
    -> AS age
    -> FROM pet ORDER BY name;
+----------+------------+--------------+------+
| name     | geburtstag | CURRENT_DATE | age  |
+----------+------------+--------------+------+
| Bowser   | 1989-08-31 | 2001-08-29   |   11 |
| Buffy    | 1989-05-13 | 2001-08-29   |   12 |
| Chirpy   | 1998-09-11 | 2001-08-29   |    2 |
| Claws    | 1994-03-17 | 2001-08-29   |    7 |
| Fang     | 1990-08-27 | 2001-08-29   |   11 |
| Fluffy   | 1993-02-04 | 2001-08-29   |    8 |
| Puffball | 1999-03-30 | 2001-08-29   |    2 |
| Slim     | 1996-04-29 | 2001-08-29   |    5 |
| Whistler | 1997-12-09 | 2001-08-29   |    3 |
+----------+------------+--------------+------+

Um die Ausgabe nach Alter (age) statt nach name zu sortieren, benutzen Sie einfach eine andere ORDER BY-Klausel:

mysql> SELECT name, geburtstag, CURRENT_DATE,
    -> (YEAR(CURRENT_DATE)-YEAR(geburtstag))
    -> - (RIGHT(CURRENT_DATE,5)<RIGHT(geburtstag,5))
    -> AS age
    -> FROM pet ORDER BY age;
+----------+------------+--------------+------+
| name     | geburtstag | CURRENT_DATE | age  |
+----------+------------+--------------+------+
| Chirpy   | 1998-09-11 | 2001-08-29   |    2 |
| Puffball | 1999-03-30 | 2001-08-29   |    2 |
| Whistler | 1997-12-09 | 2001-08-29   |    3 |
| Slim     | 1996-04-29 | 2001-08-29   |    5 |
| Claws    | 1994-03-17 | 2001-08-29   |    7 |
| Fluffy   | 1993-02-04 | 2001-08-29   |    8 |
| Fang     | 1990-08-27 | 2001-08-29   |   11 |
| Bowser   | 1989-08-31 | 2001-08-29   |   11 |
| Buffy    | 1989-05-13 | 2001-08-29   |   12 |
+----------+------------+--------------+------+

Eine ähnliche Anfrage kann benutzt werden, um das Alter am Sterbetag bei Tieren festzustellen, die gestorben sind. Das können Sie feststellen, indem Sie überprüfen, ob der sterbetag-Wert NULL ist. Dann berechnen Sie für diejenigen Tiere mit Nicht-NULL-Werten den Unterschied zwischen sterbetag- und geburtstag-Werten:

mysql> SELECT name, geburtstag, sterbetag,
    -> (YEAR(sterbetag)-YEAR(geburtstag)) - (RIGHT(sterbetag,5)<RIGHT(geburtstag,5))
    -> AS age
    -> FROM pet WHERE sterbetag IS NOT NULL ORDER BY age;
+--------+------------+------------+------+
| name   | geburtstag | sterbetag  | age  |
+--------+------------+------------+------+
| Bowser | 1989-08-31 | 1995-07-29 |    5 |
+--------+------------+------------+------+

Die Anfrage benutzt sterbetag IS NOT NULL statt sterbetag != NULL, weil NULL ein spezieller Wert ist. Das wird später erklärt. See section 4.3.4.6 Mit NULL-Werten arbeiten.

Was ist, wenn Sie wissen wollen, welche Tiere nächsten Monat Geburtstag haben? Für diese Art von Berechnung sind Jahre und Tage irrelevant. Sie wollen lediglich den Monatsanteil der geburtstag-Spalte extrahieren. MySQL bietet etliche Funktionen für die Extraktion von Datumsanteilen, wie YEAR(), MONTH() und DAYOFMONTH(). MONTH() ist hier die richtige Funktion. Um festzustellen, wie sie funktioniert, geben Sie eine Anfrage ein, die sowohl die Werte von geburtstag als auch die von MONTH(geburtstag) ausgibt:

mysql> SELECT name, geburtstag, MONTH(geburtstag) FROM pet;
+----------+------------+-------------------+
| name     | geburtstag | MONTH(geburtstag) |
+----------+------------+-------------------+
| Fluffy   | 1993-02-04 |                 2 |
| Claws    | 1994-03-17 |                 3 |
| Buffy    | 1989-05-13 |                 5 |
| Fang     | 1990-08-27 |                 8 |
| Bowser   | 1989-08-31 |                 8 |
| Chirpy   | 1998-09-11 |                 9 |
| Whistler | 1997-12-09 |                12 |
| Slim     | 1996-04-29 |                 4 |
| Puffball | 1999-03-30 |                 3 |
+----------+------------+-------------------+

Tiere mit Geburtstagen im kommenden Monat zu finden ist ebenfalls leicht. Nehmen wir an, der aktuelle Monat ist April. Dann ist der Monatswert 4 und Sie suchen nach Tieren, die im Mai (Monat 5) geboren sind, wie folgt:

mysql> SELECT name, geburtstag FROM pet WHERE MONTH(geburtstag) = 5;
+-------+------------+
| name  | geburtstag |
+-------+------------+
| Buffy | 1989-05-13 |
+-------+------------+

Ein bisschen komplizierter ist es, wenn der aktuelle Monat Dezember ist. Hier können Sie nicht einfach eins zur Monatszahl (12) hinzufügen, weil es keinen 13. Monat gibt. Statt dessen suchen Sie nach Tieren, die im Januar (Monat 1) geboren sind.

Sie können die Anfrage sogar so schreiben, dass sie unabhängig davon funktioniert, was der aktuelle Monat ist. Auf diese Art brauchen Sie keine bestimmte Monatszahl in der Anfrage benutzen. DATE_ADD() erlaubt Ihnen, einem gegebenen Datum ein Zeitintervall hinzuzufügen. Wenn Sie dem Wert von NOW() einen Monat hinzufügen und dann den Monatsanteil mit MONTH() extrahieren, ergibt das den Monat, der die kommenden Geburtstage enthält:

mysql> SELECT name, geburtstag FROM pet
    -> WHERE MONTH(geburtstag) = MONTH(DATE_ADD(NOW(), INTERVAL 1 MONTH));

Eine andere Möglichkeit, diese Aufgabe zu erfüllen, ist, 1 zu addieren, um den nächsten Monat nach dem aktuellen zu erhalten (nach Gebrauch der Modulo-Funktion (MOD), um den Monatswert auf 0 zu stellen, falls er aktuell 12) ist:

mysql> SELECT name, geburtstag FROM pet
    -> WHERE MONTH(geburtstag) = MOD(MONTH(NOW()), 12) + 1;

MONTH gibt eine Zahl zwischen 1 und 12 zurück. MOD(irgendwas,12) gibt eine Zahl zwischen 0 und 11 zurück. Daher muss die Addition nach MOD() erfolgen, weil wir ansonsten von November (11) bis Januar (1) gehen würden.

4.3.4.6 Mit NULL-Werten arbeiten

Der NULL-Wert birgt Überraschungen, bis Sie mit ihm vertraut sind. Konzeptionell bedeutet NULL einen fehlenden oder unbekannten Wert. Er wird in einiger Hinsicht anders als andere Werte behandelt. Um auf NULL zu testen, können Sie nicht die arithmetischen Vergleichoperatoren wie =, < oder != verwenden. Um sich das zu veranschaulichen, probieren Sie folgenden Anfrage:

mysql> SELECT 1 = NULL, 1 != NULL, 1 < NULL, 1 > NULL;
+----------+-----------+----------+----------+
| 1 = NULL | 1 != NULL | 1 < NULL | 1 > NULL |
+----------+-----------+----------+----------+
|     NULL |      NULL |     NULL |     NULL |
+----------+-----------+----------+----------+

Wie man sieht, erhält man aus diesen Vergleichen keine sinnvollen Ergebnisse. Benutzen Sie statt dessen die IS NULL- und IS NOT NULL-Operatoren:

mysql> SELECT 1 IS NULL, 1 IS NOT NULL;
+-----------+---------------+
| 1 IS NULL | 1 IS NOT NULL |
+-----------+---------------+
|         0 |             1 |
+-----------+---------------+

In MySQL bedeutet 0 oder NULL logisch Falsch und alles sonstige bedeutet logisch Wahr. Der vorgabemäßige Wahrheitswert einer Boolschen Operation ist 1.

Diese besondere Behandlung von NULL ist der Grund, warum es im vorherigen Abschnitt notwendig war, mit sterbetag IS NOT NULL anstelle von sterbetag != NULL festzustellen, welche Tiere nicht mehr leben.

4.3.4.7 Übereinstimmende Suchmuster

MySQL stellt Standard-SQL-Suchmuster-Übereinstimmung zur Verfügung, ebenso wie eine Art der Suchmuster-Übereinstimmung, die auf regulären Ausdrücken basiert, die denen ähnlich sind, die von Unix-Hilfsprogrammen wie vi, grep und sed benutzt werden.

SQL-Suchmuster-Übereinstimmung gestattet Ihnen, `_' zu benutzen, um ein einzelnes Zeichen und `%', um eine beliebige Anzahl von Zeichen (inklusive des 0-Zeichens) zu finden. In den MySQL-SQL-Suchmustern spielt die Groß-/Kleinschreibung vorgabemäßig keine Rolle. Einige Beispiele sind unten dargestellt. Beachten Sie, dass Sie = oder != nicht benutzen können, wenn Sie SQL-Suchmuster benutzen. Stattdessen müssen Sie die LIKE- oder NOT LIKE-Vergleichsoperatoren benutzen.

So finden Sie Namen, die mit `b' anfangen:

mysql> SELECT * FROM pet WHERE name LIKE "b%";
+--------+----------+------+------------+------------+------------+
| name   | besitzer | art  | geschlecht | geburtstag | sterbetag  |
+--------+----------+------+------------+------------+------------+
| Buffy  | Harold   | Hund | w          | 1989-05-13 | NULL       |
| Bowser | Diane    | Hund | m          | 1989-08-31 | 1995-07-29 |
+--------+----------+------+------------+------------+------------+

So finden Sie Namen, die auf `fy' enden:

mysql> SELECT * FROM pet WHERE name LIKE "%fy";
+--------+----------+-------+------------+------------+-----------+
| name   | besitzer | art   | geschlecht | geburtstag | sterbetag |
+--------+----------+-------+------------+------------+-----------+
| Fluffy | Harold   | Katze | w          | 1993-02-04 | NULL      |
| Buffy  | Harold   | Hund  | w          | 1989-05-13 | NULL      |
+--------+----------+-------+------------+------------+-----------+

So finden Sie Namen, die `w' enthalten:

mysql> SELECT * FROM pet WHERE name LIKE "%w%";
+----------+----------+---------+-------------+------------+------------+
| name     | besitzer | art     | geschlecht  | geburtstag | sterbetag  |
+----------+----------+---------+-------------+------------+------------+
| Claws    | Gwen     | Katze   | m           | 1994-03-17 | NULL       |
| Bowser   | Diane    | Hund    | m           | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen     | bird    | NULL        | 1997-12-09 | NULL       |
+----------+----------+---------+-------------+------------+------------+

Um Namen zu finden, die genau fünf Zeichen enthalten, benutzen Sie das `_'-Suchmuster-Zeichen:

mysql> SELECT * FROM pet WHERE name LIKE "_____";
+-------+----------+---------+-------------+------------+-----------+
| name  | besitzer | art     | geschlecht  | geburtstag | sterbetag |
+-------+----------+---------+-------------+------------+-----------+
| Claws | Gwen     | Katze   | m           | 1994-03-17 | NULL      |
| Buffy | Harold   | Hund    | w           | 1989-05-13 | NULL      |
+-------+----------+---------+-------------+------------+-----------+

Die andere Art von Suchmuster-Übereinstimmung benutzt erweiterte reguläre Ausdrücke. Wenn Sie bei dieser Art von Suchmuster auf Übereinstimmung prüfen, benutzen Sie die REGEXP- und NOT REGEXP-Operatoren (oder RLIKE und NOT RLIKE, die synonym sind).

Einige Charakteristika erweiterter regulärer Ausdrücke sind:

Um darzustellen, wie erweiterte reguläre Ausdrücke funktionieren, werden die LIKE-Anfragen von oben noch einmal mit REGEXP gezeigt.

Um Namen zu finden, die mit `b' anfangen, benutzen Sie `^', um auf Übereinstimmung am Anfang des Namens zu prüfen:

mysql> SELECT * FROM pet WHERE name REGEXP "^b";
+--------+-----------+---------+-------------+------------+------------+
| name   | besitzer  | art     | geschlecht  | geburtstag | sterbetag  |
+--------+-----------+---------+-------------+------------+------------+
| Buffy  | Harold    | Hund    | w           | 1989-05-13 | NULL       |
| Bowser | Diane     | Hund    | m           | 1989-08-31 | 1995-07-29 |
+--------+-----------+---------+-------------+------------+------------+

Vor MySQL-Version 3.23.4 achtet REGEXP auf Groß-/Kleinschreibung. Daher gibt diese Anfrage ein Ergebnis ohne Zeilen zurück. Um sowohl Groß- als auch Kleinschreibung von `b' zu finden, benutzen Sie statt dessen folgende Anfrage:

mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";

Ab MySQL 3.23.4 müssen Sie, um die Beachtung der Groß-/Kleinschreibung in einem REGEXP-Vergleich zu erzwingen, das BINARY-Schlüsselwort verwenden, um eine der Zeichenketten zu einer binären Zeichenkette zu machen. Diese Anfrage stimmt nur mit `b' in Kleinschreibung am Anfang eines Namens überein:

mysql> SELECT * FROM pet WHERE name REGEXP BINARY "^b";

Um Namen zu finden, die auf `fy' enden, benutzen Sie `$', um Übereinstimmung am Ende des Namens zu finden:

mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
+--------+-----------+---------+-------------+------------+-----------+
| name   | besitzer  | art     | geschlecht  | geburtstag | sterbetag |
+--------+-----------+---------+-------------+------------+-----------+
| Fluffy | Harold    | Katze   | w           | 1993-02-04 | NULL      |
| Buffy  | Harold    | Hund    | w           | 1989-05-13 | NULL      |
+--------+-----------+---------+-------------+------------+-----------+

Um Namen zu finden, die `w' in Groß- oder Kleinschreibung enthalten, benutzen Sie diese Anfrage:

mysql> SELECT * FROM pet WHERE name REGEXP "w";
+----------+----------+---------+-------------+------------+------------+
| name     | besitzer | art     | geschlecht  | geburtstag | sterbetag  |
+----------+----------+---------+-------------+------------+------------+
| Claws    | Gwen     | Katze   | m           | 1994-03-17 | NULL       |
| Bowser   | Diane    | Hund    | m           | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen     | bird    | NULL        | 1997-12-09 | NULL       |
+----------+----------+---------+-------------+------------+------------+

Weil ein Suchmuster mit regulären Ausdrücken an beliebiger Stelle im Wert gefunden wird, ist es bei der vorherigen Anfrage nicht notwendig, ein Jokerzeichen (Wildcard) auf irgendeine Seite des Suchmusters zu setzen, um nach Übereinstimmung im gesamten Wert zu suchen, wie es bei SQL-Suchmustern der Fall sein müsste.

Um Namen zu finden, die genau fünf Zeichen enthalten, benutzen Sie `^' und `$', um mit Anfang und Ende des Namens Übereinstimmung zu finden, und fünf Instanzen von `.' dazwischen:

mysql> SELECT * FROM pet WHERE name REGEXP "^.....$";
+-------+-----------+---------+-------------+------------+-----------+
| name  | besitzer  | art     | geschlecht  | geburtstag | sterbetag |
+-------+-----------+---------+-------------+------------+-----------+
| Claws | Gwen      | Katze   | m           | 1994-03-17 | NULL      |
| Buffy | Harold    | Hund    | w           | 1989-05-13 | NULL      |
+-------+-----------+---------+-------------+------------+-----------+

Sie könnten die vorherige Anfrage auch unter Verwendung des `{n}'- ``wiederhole-n-mal''-Operators schreiben:

mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";
+-------+-----------+---------+-------------+------------+-----------+
| name  | besitzer  | art     | geschlecht  | geburtstag | sterbetag |
+-------+-----------+---------+-------------+------------+-----------+
| Claws | Gwen      | Katze   | m           | 1994-03-17 | NULL      |
| Buffy | Harold    | Hund    | w           | 1989-05-13 | NULL      |
+-------+-----------+---------+-------------+------------+-----------+

4.3.4.8 Zeilen zählen

Datenbanken werden oft benutzt, um die Frage zu beantworten, wie oft eine bestimmte Art von Daten in einer Tabelle erscheint. Sie wollen beispielsweise wissen, wie viele Haustiere Sie haben, oder wie viele Haustiere jeder Besitzer hat, oder Sie wollen verschiedene Arten von Zählungen Ihrer Tiere durchführen.

Die Gesamtzahl der Tiere zählen, die Sie haben, ist dieselbe Frage wie ``Wie viele Zeilen sind in der pet-Tabelle?'', denn es gibt einen Datensatz pro Haustier. Die COUNT()-Funktion zählt die Anzahl von Nicht-NULL-Ergebnissen, daher lautet die Anfrage, um Ihre Tiere zu zählen, wie folgt:

mysql> SELECT COUNT(*) FROM pet;
+----------+
| COUNT(*) |
+----------+
|        9 |
+----------+

Sie haben vorher schon einmal die Namen der Leute abgefragt, die Haustiere besitzen. Sie können COUNT() benutzen, wenn Sie herausfinden wollen, wie viele Tiere jeder Besitzer hat:

mysql> SELECT besitzer, COUNT(*) FROM pet GROUP BY besitzer;
+-----------+----------+
| besitzer  | COUNT(*) |
+-----------+----------+
| Benny     |        2 |
| Diane     |        2 |
| Gwen      |        3 |
| Harold    |        2 |
+-----------+----------+

Beachten Sie die Benutzung von GROUP BY, um alle Datensätze für jeden besitzer zu gruppieren. Ohne das erhalten Sie eine Fehlermeldung:

mysql> SELECT besitzer, COUNT(besitzer) FROM pet;
ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT()...)
with no GROUP columns is illegal if there is no GROUP BY clause

COUNT() und GROUP BY sind nützlich, um Ihre Daten auf verschiedene Weise zu charakterisieren. Die folgenden Beispiele zeigen verschiedene Möglichkeiten, um Zählungen Ihrer Tiere durchzuführen.

Anzahl der Tiere pro Art:

mysql> SELECT art, COUNT(*) FROM pet GROUP BY art;
+---------+----------+
| art     | COUNT(*) |
+---------+----------+
| Vogel   |        2 |
| Katze   |        2 |
| Hund    |        3 |
| Hamster |        1 |
| Schlange|        1 |
+---------+----------+

Anzahl der Tiere pro Geschlecht:

mysql> SELECT geschlecht, COUNT(*) FROM pet GROUP BY geschlecht;
+-------------+----------+
| geschlecht  | COUNT(*) |
+-------------+----------+
| NULL        |        1 |
| w           |        4 |
| m           |        4 |
+-------------+----------+

(In dieser Ausgabe zeigt NULL an, dass das Geschlecht unbekannt ist.)

Anzahl der Tiere pro Kombination von Art und Geschlecht:

mysql> SELECT art, geschlecht, COUNT(*) FROM pet GROUP BY art, geschlecht;
+---------+-------------+----------+
| art     | geschlecht  | COUNT(*) |
+---------+-------------+----------+
| Vogel   | NULL        |        1 |
| Vogel   | w           |        1 |
| Katze   | w           |        1 |
| Katze   | m           |        1 |
| Hund    | w           |        1 |
| Hund    | m           |        2 |
| Hamster | w           |        1 |
| Schlange| m           |        1 |
+---------+-------------+----------+

Sie müssen nicht die gesamte Tabelle abfragen, wenn Sie COUNT() benutzen. Die vorherige Anfrage beispielsweise sieht lediglich für Hunde und Katzen wie folgt aus:

mysql> SELECT art, geschlecht, COUNT(*) FROM pet
    -> WHERE art = "Hund" OR art = "Katze"
    -> GROUP BY art, geschlecht;
+---------+-------------+----------+
| art     | geschlecht  | COUNT(*) |
+---------+-------------+----------+
| Katze   | w           |        1 |
| Katze   | m           |        1 |
| Hund    | w           |        1 |
| Hund    | m           |        2 |
+---------+-------------+----------+

Oder wenn Sie die Anzahl von Tieren pro Geschlecht wissen wollen, beschränkt auf die Tiere, deren Geschlecht bekannt ist:

mysql> SELECT art, geschlecht, COUNT(*) FROM pet
    -> WHERE geschlecht IS NOT NULL
    -> GROUP BY art, geschlecht;
+---------+-------------+----------+
| art     | geschlecht  | COUNT(*) |
+---------+-------------+----------+
| Vogel   | w           |        1 |
| Katze   | w           |        1 |
| Katze   | m           |        1 |
| Hund    | w           |        1 |
| Hund    | m           |        2 |
| Hamster | w           |        1 |
| Schlange| m           |        1 |
+---------+-------------+----------+

4.3.4.9 Mehr als eine Tabelle benutzen

In der pet-Tabelle behalten Sie die Übersicht über Ihre Haustiere. Wenn Sie weitere Informationen über sie aufzeichnen wollen, beispielsweise Ereignisse in ihrem Leben wie Besuche beim Tierarzt oder wenn Nachwuchs zur Welt kommt, brauchen Sie eine weitere Tabelle. Wie sollte diese aussehen? Sie benötigt:

Nach diesen Vorüberlegungen könnte das CREATE TABLE-Statement für die ereignis-Tabelle wie folgt aussehen:

mysql> CREATE TABLE ereignis (name VARCHAR(20), datum DATE,
    -> typ VARCHAR(15), bemerkung VARCHAR(255));

Wie bei der pet-Tabelle ist es am einfachsten, die anfänglichen Datensätze mit Hilfe einer TAB-getrennten Textdatei einzuladen, die folgende Informationen enthält:

Fluffy 1995-05-15 Nachwuchs 4 Kätzchen, 3 weiblich, 1 männlich
Buffy 1993-06-23 Nachwuchs 5 Hündchen, 2 weiblich, 3 männlich
Buffy 1994-06-19 Nachwuchs 3 Hündchen, 3 weiblich
Chirpy 1999-03-21 Tierarzt Schnabel gerade gebogen
Slim 1997-08-03 Tierarzt Gebrochene Rippe
Bowser 1991-10-12 Zwinger
Fang 1991-10-12 Zwinger
Fang 1998-08-28 Geburtstag Geschenk: neues Kauspielzeug
Claws 1998-03-17 Geburtstag Geschenk: neues Flohhalsband
Whistler 1998-12-09 Geburtstag Erster Geburtstag

Laden Sie die Datensätze wie folgt ein:

mysql> LOAD DATA LOCAL INFILE "ereignis.txt" INTO TABLE ereignis;

Auf der Grundlage dessen, was Sie durch die Abfragen der pet-Tabelle gelernt haben, sollten sie in der Lage sein, Abfragen der Datensätze der ereignis-Tabelle durchzuführen, was prinzipiell dasselbe ist. Aber wann ist die ereignis-Tabelle allein nicht ausreichend, um Fragen zu beantworten, die Sie stellen könnten?

Nehmen wir an, Sie wollen herausfinden, wie alt jedes Haustier war, als es Nachwuchs bekam. In der ereignis-Tabelle steht, wann das geschah, aber um das Alter der Mutter auszurechnen, wird ihr Geburtstag benötigt. Weil dieser in der pet-Tabelle steht, brauchen Sie für diese Anfrage beide Tabellen:

mysql> SELECT pet.name, (TO_DAYS(datum) - TO_DAYS(geburtstag))/365 AS age,anmerkung
    -> FROM pet, ereignis
    -> WHERE pet.name = ereignis.name AND typ = "Nachwuchs";
+--------+------+------------------------------------+
| name   | age  | anmerkung                          |
+--------+------+------------------------------------+
| Fluffy | 2.27 | 4 kätzchen, 3 weiblich, 1 männlich |
| Buffy  | 4.12 | 5 hündchen, 2 weiblich, 3 männlich |
| Buffy  | 5.10 | 3 hündchen, 3 weiblich             |
+--------+------+------------------------------------+

Zu dieser Anfrage gibt es einiges anzumerken:

Sie müssen nicht unbedingt zwei verschiedene Tabellen haben, um eine Verknüpfung (Join) durchzuführen. Manchmal ist es nützlich, eine Tabelle mit sich selbst zu verknüpfen, wenn Sie nämlich Datensätze in einer Tabelle mit Datensätze in derselben Tabelle vergleichen wollen. Um zum Beispiel Zuchtpaare unter Ihren Haustieren zu finden, können Sie die pet-Tabelle mit sich selbst verknüpfen, um Paare von männlichen und weiblichen Tieren derselben Art zusammen zu bringen:

mysql> SELECT p1.name, p1.geschlecht, p2.name, p2.geschlecht, p1.art
    -> FROM pet AS p1, pet AS p2
    -> WHERE p1.art = p2.art AND p1.geschlecht = "w" AND p2.geschlecht = "m";
+--------+-------------+--------+-------------+---------+
| name   | geschlecht  | name   | geschlecht  | art     |
+--------+-------------+--------+-------------+---------+
| Fluffy | w           | Claws  | m           | Katze   |
| Buffy  | w           | Fang   | m           | Hund    |
| Buffy  | w           | Bowser | m           | Hund    |
+--------+-------------+--------+-------------+---------+

In dieser Anfrage legen wir Aliase für den Tabellennamen fest, um auf die Spalten verweisen zu können und um auseinander zu halten, auf welche Instanz der Tabelle sich jede Spaltenreferenz bezieht.

4.4 Informationen über Datenbanken und Tabellen

Was ist, wenn Sie den Namen einer Datenbank oder Tabelle vergessen haben oder für eine gegebene Tabelle die Struktur nicht mehr kennen (wie zum Beispiel die Spalten heißen)? MySQL löst solcherlei Probleme mit diversen Statements, die Informationen über die Datenbanken und Tabellen bereitstellen, die es unterstützt.

SHOW DATABASES kennen Sie schon. Dieses listet die Datenbanken auf, die vom Server verwaltet werden. Um herauszufinden, welche Datenbank aktuell ausgewählt ist, benutzen Sie die DATABASE()-Funktion:

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| menagerie  |
+------------+

Wenn Sie noch keine Datenbank ausgewählt haben, ist das Ergebnis leer.

Um herauszufinden, welche Tabellen die aktuelle Datenbank enthält (wenn Sie sich zum Beispiel über den Namen einer Tabelle nicht sicher sind), benutzen Sie folgenden Befehl:

mysql> SHOW TABLES;
+---------------------+
| Tables in menagerie |
+---------------------+
| ereignis            |
| pet                 |
+---------------------+

Wenn Sie die Struktur einer Tabelle sehen wollen, ist der DESCRIBE-Befehl nützlich. Er zeigt Informationen über jede Tabellenspalte an:

mysql> DESCRIBE pet;
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| name       | varchar(20) | YES  |     | NULL    |       |
| besitzer   | varchar(20) | YES  |     | NULL    |       |
| art        | varchar(20) | YES  |     | NULL    |       |
| geschlecht | char(1)     | YES  |     | NULL    |       |
| geburtstag | date        | YES  |     | NULL    |       |
| sterbetag  | date        | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+

Field zeigt den Spaltennamen, Type ist der Datentyp der Spalte, Null zeigt an, ob die Spalte NULL-Werte enthalten darf oder nicht, Key zeigt an, ob die Spalte indiziert ist oder nicht und Default legt den Vorgabewert der Spalte fest.

Wenn Sie Indexe auf eine Tabelle haben, zeigt Ihnen SHOW INDEX FROM tabelle Informationen über diese an.

4.5 Beispiele gebräuchlicher Anfragen (Queries)

Hier finden sich Beispiele, wie geläufige Probleme mit MySQL gelöst werden können.

Einige der Beispiele benutzen die Tabelle shop, die den Stückpreis für jeden Artikel für bestimmte Händler enthält. Unter der Annahme, dass jeder Händler einen einzelnen fest Preis pro Artikel hat, ist (artikel, haendler) der Primärschlüssel für diese Datensätze.

Starten Sie das Kommandozeilen-Werkzeug mysql und wählen Sie eine Datenbank aus:

mysql ihr-datenbank-name

(Bei den meisten MySQL-Installationen können Sie die Datenbank 'test' auswählen.)

Erzeugen Sie die Beispiel-Tabelle wie folgt:

CREATE TABLE shop (
 artikel  INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
 haendler CHAR(20)                 DEFAULT ''     NOT NULL,
 preis    DOUBLE(16,2)             DEFAULT '0.00' NOT NULL,
 PRIMARY KEY(artikel, dealer));

INSERT INTO shop VALUES
(1,'A',3.45),(1,'B',3.99),(2,'A',10.99),(3,'B',1.45),(3,'C',1.69),
(3,'D',1.25),(4,'D',19.95);

Die Beispieldaten sehen jetzt so aus:

mysql> SELECT * FROM shop;

+---------+---------+-------+
| artikel | haendler| preis |
+---------+---------+-------+
|    0001 | A       |  3.45 |
|    0001 | B       |  3.99 |
|    0002 | A       | 10.99 |
|    0003 | B       |  1.45 |
|    0003 | C       |  1.69 |
|    0003 | D       |  1.25 |
|    0004 | D       | 19.95 |
+---------+---------+-------+

4.5.1 Der höchste Wert einer Spalte

``Was ist die höchste Artikelnummer?''

SELECT MAX(artikel) AS artikel FROM shop

+---------+
| artikel |
+---------+
|       4 |
+---------+

4.5.2 Die Zeile, die den höchsten Wert einer bestimmten Spalte enthält

``Suche Artikelnummer, Händler und Preis des teuersten Artikels.''

In ANSI-SQL wird das mit einer Unterabfrage (Sub-Query) durchgeführt:

SELECT artikel, haendler, preis
FROM   shop
WHERE  preis=(SELECT MAX(preis) FROM shop)

In MySQL (was noch keine Unterabfragen hat) führen Sie das in zwei Schritten durch:

  1. Mit einem SELECT-Statement ermitteln Sie den höchsten Preis in der Tabelle.
  2. Mit diesem Wert stellen Sie die aktuelle Anfrage zusammen:
    SELECT artikel, haendler, preis
    FROM   shop
    WHERE  preis=19.95
    

Eine andere Lösung besteht darin, alle Zeilen absteigend nach Preis zu sortieren und nur die erste Zeile zu nehmen, indem Sie die MySQL-spezifische LIMIT-Klausel benutzen:

SELECT artikel, haendler, preis
FROM   shop
ORDER BY preis DESC
LIMIT 1

ACHTUNG: Wenn es mehrere teuerste Artikel gibt (die zum Beispiel alle 19.95 kosten), zeigt die LIMIT-Lösung nur einen davon!

4.5.3 Höchster Wert einer Spalte pro Gruppe

``Was ist der höchste Preis pro Artikel?''

SELECT artikel, MAX(preis) AS preis
FROM   shop
GROUP BY artikel

+---------+-------+
| artikel | preis |
+---------+-------+
|    0001 |  3.99 |
|    0002 | 10.99 |
|    0003 |  1.69 |
|    0004 | 19.95 |
+---------+-------+

4.5.4 Die Zeilen, die das gruppenweise Maximum eines bestimmten Felds enthalten

``Suche für jeden Artikel den oder die Händler mit den teuersten Preisen.''

In ANSI-SQL würden Sie das wie folgt mit einer Unterabfrage erledigen:

SELECT artikel, haendler, preis
FROM   shop s1
WHERE  preis=(SELECT MAX(s2.preis)
              FROM shop s2
              WHERE s1.artikel = s2.artikel);

In MySQL macht man das am besten in mehreren Schritten:

  1. Die Liste (artikel,maxpreis) holen.
  2. Für jeden Artikel die korrespondierenden Zeilen holen, die den höchsten Preis gespeichert haben.

Das kann auf einfache Weise mit einer temporären Tabelle geschehen:

CREATE TEMPORARY TABLE tmp (
        artikel INT(4) UNSIGNED ZEROFILL DEFAULT '0000' NOT NULL,
        preis   DOUBLE(16,2)             DEFAULT '0.00' NOT NULL);

LOCK TABLES shop read;

INSERT INTO tmp SELECT artikel, MAX(preis) FROM shop GROUP BY artikel;

SELECT shop.artikel, haendler, shop.preis FROM shop, tmp
WHERE shop.artikel=tmp.artikel AND shop.preis=tmp.preis;

UNLOCK TABLES;

DROP TABLE tmp;

Wenn Sie keine TEMPORARY-Tabelle benutzen, müssen Sie zusätzlich die 'tmp'-Tabelle sperren.

``Kann das mit einer einzigen Anfrage durchgeführt werden?''

Ja, aber nur unter Verwendung eines recht ineffizienten Tricks, den wir den ``MAX-CONCAT-Trick'' nennen:

SELECT artikel,
       SUBSTRING( MAX( CONCAT(LPAD(preis,6,'0'),haendler) ), 7) AS haendler,
  0.00+LEFT(      MAX( CONCAT(LPAD(preis,6,'0'),haendler) ), 6) AS preis
FROM   shop
GROUP BY artikel;

+---------+---------+-------+
| artikel | haendler| preis |
+---------+---------+-------+
|    0001 | B       |  3.99 |
|    0002 | A       | 10.99 |
|    0003 | C       |  1.69 |
|    0004 | D       | 19.95 |
+---------+---------+-------+

Das letzte Beispiel kann etwas effizienter gemacht werden, wenn man das Aufteilen der verketteten Spalte im Client durchführt.

4.5.5 Wie Benutzer-Variablen verwendet werden

Sie können MySQL-Benutzer-Variablen verwenden, um Ergebnisse zwischenzuspeichern, ohne sie in temporäre Variablen im Client speichern zu müssen. See section 7.1.4 Benutzer-Variablen.

Um zum Beispiel die Artikel mit dem höchsten und dem niedrigsten Preis herauszufinden, können Sie folgendes machen:

select @min_preis:=min(preis),@max_preis:=max(preis) from shop;
select * from shop where preis=@min_preis or preis=@max_preis;

+---------+---------+-------+
| artikel | haendler| preis |
+---------+---------+-------+
|    0003 | D       |  1.25 |
|    0004 | D       | 19.95 |
+---------+---------+-------+

4.5.6 Wie Fremdschlüssel (Foreign Keys) verwendet werden

Sie brauchen keine Fremdschlüssel, um zwei Tabellen zu verknüpfen.

Das einzige, was MySQL nicht durchführt, ist der CHECK, um sicherzustellen, dass die Schlüssel, die Sie benutzen, in der oder den Tabelle(n) existieren, auf die Sie verweisen, und es löscht auch nicht automatisch Zeilen aus einer Tabelle mit einer Fremdschlüssel-Definition. Wenn Sie Ihre Schlüssel wie gewöhnlich benutzen, funktioniert das gut:

CREATE TABLE personen (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE hemden (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    stil ENUM('t-shirt', 'polo', 'dress') NOT NULL,
    farbe ENUM('rot', 'blau', 'orange', 'weiß', 'schwarz') NOT NULL,
    besitzer SMALLINT UNSIGNED NOT NULL references personen,
    PRIMARY KEY (id)
);

INSERT INTO personen VALUES (NULL, 'Antonio Paz');

INSERT INTO hemden VALUES
(NULL, 'polo', 'blau', LAST_INSERT_ID()),
(NULL, 'dress', 'weiß', LAST_INSERT_ID()),
(NULL, 't-shirt', 'blau', LAST_INSERT_ID());

INSERT INTO personen VALUES (NULL, 'Lilliana Angelovska');

INSERT INTO hemden VALUES
(NULL, 'dress', 'orange', LAST_INSERT_ID()),
(NULL, 'polo', 'rot', LAST_INSERT_ID()),
(NULL, 'dress', 'blau', LAST_INSERT_ID()),
(NULL, 't-shirt', 'weiß', LAST_INSERT_ID());

SELECT * FROM personen;
+----+---------------------+
| id | name                |
+----+---------------------+
|  1 | Antonio Paz         |
|  2 | Lilliana Angelovska |
+----+---------------------+

SELECT * FROM hemden;
+----+---------+--------+----------+
| id | stil    | farbe  | besitzer |
+----+---------+--------+----------+
|  1 | polo    | blau   |     1    |
|  2 | dress   | weiß  |     1    |
|  3 | t-shirt | blau   |     1    |
|  4 | dress   | orange |     2    |
|  5 | polo    | rot    |     2    |
|  6 | dress   | blau   |     2    |
|  7 | t-shirt | weiß  |     2    |
+----+---------+--------+----------+

SELECT h.* FROM personen p, hemden h
 WHERE p.name LIKE 'Lilliana%'
   AND h.besitzer = p.id
   AND h.farbe <> 'weiß';

+----+-------+--------+----------+
| id | stil  | farbe  | besitzer |
+----+-------+--------+----------+
|  4 | dress | orange |     2    |
|  5 | polo  | rot    |     2    |
|  6 | dress | blau   |     2    |
+----+-------+--------+----------+

4.5.7 Über zwei Schlüssel suchen

MySQL optimiert derzeit noch nicht, wenn Sie über zwei unterschiedliche Schlüssel suchen, die mit OR kombiniert werden (eine Suche mit einem Schlüssel mit verschiedenen OR-Teilen wird recht gut optimiert):

SELECT feld1_index, feld2_index FROM test_tabelle WHERE feld1_index = '1'
OR feld2_index = '1'

Der Grund liegt darin, dass wir bislang noch keine Zeit hatten, hierfür eine effiziente Möglichkeit zu implementieren, die das für allgemeine Fälle abhandelt. (Die AND-Handhabung ist im Vergleich jetzt komplett allgemein und funktioniert sehr gut.)

In der Zwischenzeit können Sie dieses Problem sehr effizient lösen, indem Sie eine TEMPORARY-Tabelle verwenden. Diese Art der Optimierung ist ebenfalls sehr gut, wenn Sie sehr komplizierte Anfragen verwenden, bei denen der SQL-Server die Optimierungen in falscher Reihenfolge durchführt.

CREATE TEMPORARY TABLE tmp
SELECT feld1_index, feld2_index FROM test_tabelle WHERE feld1_index = '1';
INSERT INTO tmp
SELECT feld1_index, feld2_index FROM test_tabelle WHERE feld2_index = '1';
SELECT * from tmp;
DROP TABLE tmp;

Diese Möglichkeit der Anfrage ist im Endeffekt ein UNION von zwei Anfragen.

4.5.8 Besuche pro Tag berechnen

Folgendes zeigt, wie Sie die Bit-Gruppen-Funktionen benutzen können, um die Anzahl der Tage pro Monat zu zählen, in denen ein Benutzer eine Web-Seite besucht hat.

CREATE TABLE t1 (jahr YEAR(4), monat INT(2) UNSIGNED ZEROFILL, tag INT(2) UNSIGNED ZEROFILL);                                                            
INSERT INTO t1 VALUES(2000,1,1),(2000,1,20),(2000,1,30),(2000,2,2),(2000,2,23),(2000,2,23);

SELECT jahr,monat,BIT_COUNT(BIT_OR(1<<tag)) AS tage FROM t1 GROUP BY jahr,monat;

Das gibt folgendes Ergebnis zurück:

+------+-------+------+
| jahr | monat | tage |
+------+-------+------+
| 2000 |    01 |    3 |
| 2000 |    02 |    2 |
+------+-------+------+

Dies berechnet, wie viele verschiedene Tage für eine gegebene Jahr-Monats-Kombination benutzt wurden, bei automatischer Entfernung doppelter Einträge (Duplikate).

4.6 mysql im Stapelbetrieb (Batch Mode)

In den vorherigen Abschnitten haben Sie mysql interaktiv benutzt, um Anfragen einzugeben und die Ergebnisse zu betrachten. Sie können mysql auch im Stapelbetrieb benutzen. Dafür schreiben Sie dei Befehle, die Sie ausführen wollen, in eine Datei, und teilen mysql dann mit, seine Eingaben aus dieser Datei zu lesen:

shell> mysql < stapel-datei

Wenn Sie auf der Kommandozeile Verbindungsparameter angeben müssen, könnte der Befehl wie folgt aussehen:

shell> mysql -h host -u user -p < stapel-datei
Enter password: ********

Wenn Sie mysql auf diese Weise benutzen, erzeugen Sie eine Skript-Datei und führen dann das Skript aus.

Warum sollten Sie ein Skript benutzen? Hier sind ein paar Gründe:

Das Standard-Ausgabeformat ist anders (präziser), wenn Sie mysql im Stapelbetrieb laufen lassen, als wenn Sie es interaktiv nutzen. Die Ausgabe von SELECT DISTINCT art FROM pet zum Beispiel sieht so aus, wenn Sie sie interaktiv laufen lassen:

+---------+
| art     |
+---------+
| Vogel   |
| Katze   |
| Hund    |
| Hamster |
| Schlange|
+---------+

Aber wie folgt, wenn sie im Stapelbetrieb läuft:

art
Vogel
Katze
Hund
Hamster
Schlange

Wenn Sie im Stapelbetrieb das interaktive Ausgabeformat haben wollen, benutzen Sie mysql -t. Um die Befehle auszugeben, die ausgeführt werden, benutzen Sie mysql -vvv.

4.7 Anfragen aus dem Zwillings-Projekt

Bei Analytikerna und Lentus haben wir die Systeme und die Feldarbeit für ein großes Forschungsprojekt gemacht. Dieses Projekt ist eine Zusammenarbeit zwischen dem Institut für Umweltmedizin des Karolinska Institutes, Stockholm, und der Abteilung für klinische Forschung bei Altersprozessen und Psychologie der University of Southern California.

Das Projekt beinhaltet einen Screening-Teil, bei dem alle Zwillinge in Schweden, die älter als 65 Jahre sind, per Telefon interviewt wurden. Zwillinge, die bestimmte Kriterien erfüllen, werden im nächsten Schritt weiter untersucht. In diesem späteren Stadium werden Zwillinge, die teilnehmen wollen, von einem Arzt-Schwester-Team besucht. Einige Untersuchungen beinhalten physische und neuropsychologische Untersuchungen, Labortests, Neuroimaging, Bewertungen des psychischen Zustands und eine Sammlung der Familiengeschichten. Zusätzlich werden Daten über medizinische und umweltbedingte Risikofaktoren gesammelt.

Weitere Informationen zu den Zwillingsstudien finden Sie hier:

http://www.imm.ki.se/TWIN/TWINGREATBRITAINW.HTM

Der spätere Teil des Projekts wird mit einer Web-Schnittstelle verwaltet, die Perl und MySQL benutzt.

Jeden Abend werden alle Daten der Interviews in eine MySQL-Datenbank verschoben.

4.7.1 Alle nicht verteilten Zwillinge finden

Mit folgender Anfrage wird festgelegt, wer in den zweiten Teil des Projekts geht:

select
        concat(p1.id, p1.tvab) + 0 as tvid,
        concat(p1.christian_name, " ", p1.surname) as Name,
        p1.postal_code as Code,
        p1.city as City,
        pg.abrev as Area,
        if(td.participation = "Aborted", "A", " ") as A,
        p1.dead as dead1,
        l.event as event1,
        td.suspect as tsuspect1,
        id.suspect as isuspect1,
        td.severe as tsevere1,
        id.severe as isevere1,
        p2.dead as dead2,
        l2.event as event2,
        h2.nurse as nurse2,
        h2.doctor as doctor2,
        td2.suspect as tsuspect2,
        id2.suspect as isuspect2,
        td2.severe as tsevere2,
        id2.severe as isevere2,
        l.finish_date
from
        twin_project as tp
        /* For Twin 1 */
        left join twin_data as td on tp.id = td.id and tp.tvab = td.tvab
        left join informant_data as id on tp.id = id.id and tp.tvab = id.tvab
        left join harmony as h on tp.id = h.id and tp.tvab = h.tvab
        left join lentus as l on tp.id = l.id and tp.tvab = l.tvab
        /* For Twin 2 */
        left join twin_data as td2 on p2.id = td2.id and p2.tvab = td2.tvab
        left join informant_data as id2 on p2.id = id2.id and p2.tvab = id2.tvab
        left join harmony as h2 on p2.id = h2.id and p2.tvab = h2.tvab
        left join lentus as l2 on p2.id = l2.id and p2.tvab = l2.tvab,
        person_data as p1,
        person_data as p2,
        postal_groups as pg
where
        /* p1 gets main twin and p2 gets his/her twin. */
        /* ptvab is a field inverted by tvab */
        p1.id = tp.id and p1.tvab = tp.tvab and
        p2.id = p1.id and p2.ptvab = p1.tvab and
        /* Just the sceening survey */
        tp.survey_no = 5 and
        /* Skip if partner died before 65 but allow emigration (dead=9) */
        (p2.dead = 0 or p2.dead = 9 or
         (p2.dead = 1 and
          (p2.sterbetag_date = 0 or
           (((to_days(p2.sterbetag_date) - to_days(p2.geburtstagday)) / 365)
            >= 65))))
        and
        (
        /* Twin is suspect */
        (td.future_contact = 'Yes' and td.suspect = 2) or
        /* Twin is suspect - Informant is Blessed */
        (td.future_contact = 'Yes' and td.suspect = 1 and id.suspect = 1) or
        /* No twin - Informant is Blessed */
        (ISNULL(td.suspect) and id.suspect = 1 and id.future_contact = 'Yes') or
        /* Twin broken off - Informant is Blessed */
        (td.participation = 'Aborted'
         and id.suspect = 1 and id.future_contact = 'Yes') or
        /* Twin broken off - No inform - Have partner */
        (td.participation = 'Aborted' and ISNULL(id.suspect) and p2.dead = 0))
        and
        l.event = 'Finished'
        /* Get at area code */
        and substring(p1.postal_code, 1, 2) = pg.code
        /* Not already distributed */
        and (h.nurse is NULL or h.nurse=00 or h.doctor=00)
        /* Has not refused or been aborted */
        and not (h.status = 'Refused' or h.status = 'Aborted'
        or h.status = 'Died' or h.status = 'Other')
order by
        tvid;

Einige Erläuterungen:

concat(p1.id, p1.tvab) + 0 as tvid
Wir wollen nach den verketteten id und tvab in numerischer Reihenfolge sortieren. Indem wir 0 hinzufügen, bringen wir MySQL dazu, das Ergebnis als Zahl zu behandeln.
Spalte id
Diese identifiziert ein Zwillingspaar. Sie ist in allen Tabellen Schlüssel.
Spalte tvab
Diese identifiziert ein Zwillingspaar. Sie hat einen Wert von 1 oder 2.
Spalte ptvab
Sie ist die Umkehrung von tvab. Wenn tvab 1 ist, ist sie 2, und umgekehrt. Sie ist dafür da, MySQL die Optimierung der Anfrage zu erleichtern.

Diese Anfrage demonstriert unter anderem, wie man ein Nachschlagen (Lookup) in einer Tabelle von derselben Tabelle aus mit einem Join durchführt (p1 und p2). In dem Beispiel wird das dazu benutzt, um festzustellen, ob der Partner eines Zwillings vor Erreichen des 65. Lebensjahrs starb. Wenn das der Fall ist, wird die Zeile nicht zurückgegeben.

Das Geschilderte existiert in allen Tabellen mit zwillingsbezogenen Informationen. Wir haben einen Schlüssel auf beide id,tvab (alle Tabellen), und auf id,ptvab (person_data), um Anfragen schneller zu machen.

Auf unserer Produktionsmaschine (einer 200MHz-UltraSPARC) gibt diese Anfrage etwa 150 bis 200 Zeilen zurück und benötigt weniger als eine Sekunde.

Die aktuelle Anzahl von Datensätzen in den oben benutzten Tabellen:
Tabelle Zeilen
person_data 71074
lentus 5291
twin_project 5286
twin_data 2012
informant_data 663
harmony 381
postal_groups 100

4.7.2 Eine Tabelle über den Zustand von Zwillingspaaren zeigen

Jedes Interview endet mit einem Statuscode, genannt ereignis. Die unten stehende Anfrage wird benutzt, um eine Tabelle über alle Zwillingspaare anzuzeigen, kombiniert mit dem Ereignis. Das zeigt an, wie viele Paare beider Zwillingen im Zustand beendet sind, bei wie vielen Paaren ein Zwilling im Zustand beendet ist, welche ein Interview abgelehnt haben usw.

select
        t1.event,
        t2.event,
        count(*)
from
        lentus as t1,
        lentus as t2,
        twin_project as tp
where
        /* We are looking at one pair at a time */
        t1.id = tp.id
        and t1.tvab=tp.tvab
        and t1.id = t2.id
        /* Just the sceening survey */
        and tp.survey_no = 5
        /* This makes each pair only appear once */
        and t1.tvab='1' and t2.tvab='2'
group by
        t1.event, t2.event;

4.8 MySQL mit Apache benutzen

Der Contrib-Abschnitt beinhaltet Programme, mit denen Sie Ihre Benutzer durch eine MySQL-Datenbank authentifizieren können, und mit denen Sie Ihre Logdateien in eine MySQL-Tabelle schreiben können. See section D Beigesteuerte Programme.

Sie können das Log-Format von Apache so ändern, dass es durch MySQL leicht gelesen werden kann, indem Sie folgendes in die Apache-Konfigurationsdatei schreiben:

LogFormat \
        "\"%h\",%{%Y%m%d%H%M%S}t,%>s,\"%b\",\"%{Content-Type}o\",  \
        \"%U\",\"%{Referer}i\",\"%{User-Agent}i\""

In MySQL können Sie dann etwas wie das hier tun:

LOAD DATA INFILE '/local/access_log' INTO TABLE tabelle
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '\\'

5 MySQL-Datenbankadministration

5.1 MySQL konfigurieren

5.1.1 mysqld-Kommandozeilenoptionen

mysqld akzeptiert folgende Kommandozeilenoptionen:

--ansi
ANSI-SQL-Syntax anstelle von MySQL-Syntax benutzen. See section 2.7.2 MySQL im ANSI-Modus laufen lassen.
-b, --basedir=path
Pfad zum Installationsverzeichnis. Gewöhnlich werden alle Pfade relativ zu diesem aufgelöst.
--big-tables
große Ergebnismengen zulassen, indem alle temporären Mengen in eine Datei gesichert werden. Das löst die meisten 'table full'-Fehler, verlangsamt aber in den Fällen Anfragen, in denen Tabellen im Speicher ausreichen würden. Ab Version 3.23.2 ist MySQL in der Lage, das automatisch zu lösen, indem für kleine temporäre Tabellen der Arbeitsspeicher benutzt wird und auf Festplatten-Tabellen umgeschaltet wird, wenn das nötig ist.
--bind-address=IP
IP-Adresse zum Anbinden (bind).
--character-sets-dir=path
Verzeichnis, wo Zeichensätze sind. See section 5.6.1 Der für Daten und Sortieren benutzte Zeichensatz.
--chroot=path
Chroot den mysqld-Daemon beim Start. Empfohlene Sicherheitsmaßnahme. Wird allerdings LOAD DATA INFILE und SELECT ... INTO OUTFILE etwas einschränken.
--core-file
Schreibt eine Core-Datei, wenn mysqld stirbt. Auf manchen Systemen müssen Sie zusätzliche --core-file-size für safe_mysqld angeben. See section 5.7.2 safe_mysqld, der Wrapper um mysqld.
-h, --datadir=path
Pfad zum Datenbank-Wurzelverzeichnis.
--default-character-set=charset
Setzt den vorgabemäßigen Zeichensatz. See section 5.6.1 Der für Daten und Sortieren benutzte Zeichensatz.
--default-table-type=type
Setzt den vorgabemäßigen Tabellentyp für Tabellen. See section 8 MySQL-Tabellentypen.
--debug[...]=
Wenn MySQL mit --with-debug konfiguriert ist, können Sie diese Option benutzen, um eine Trace-Datei darüber zu erhalten, was mysqld tut. See section H.1.2 Trace-Dateien erzeugen.
--delay-key-write-for-all-tables
Schlüsselpuffer (Key Buffer) für jegliche MyISAM-Tabellen nicht leeren (flush). See section 6.5.2 Serverparameter tunen.
--enable-locking
System-Sperren einschalten. Beachten Sie, dass Sie bei der Benutzung dieser Option auf Systemen, die kein voll funktionsfähiges lockd() besitzen (wie Linux), mysqld leicht zum Deadlock bringen können.
-T, --exit-info
Eine Bit-Maske verschiedener Flags, mit denen man den mysqld-Server debuggen kann. Man sollte diese Option nicht benutzen, wenn man nicht ganz genau weiß, was sie tut!
--flush
Alle Änderungen nach jedem SQL-Befehl auf Platte zurückschreiben (flush). Normalerweise schreibt MySQL alle Änderungen nach jedem SQL-Befehl auf Platte und läßt das Betriebssystem sich um das Synchronisieren auf Platte kümmern. See section A.4.1 Was zu tun ist, wenn MySQL andauernd abstürzt.
-?, --help
Kurze Hilfe ausgeben und beenden.
--init-file=file
Beim Start SQL-Befehle aus dieser Datei lesen.
-L, --language=...
Client-Fehlermeldungen in der angegebenen Sprache. Kann als voller Pfad angegeben werden. See section 5.6.2 Nicht englische Fehlermeldungen.
-l, --log[=datei]
Loggt Verbindungen und Anfragen in datei. See section 5.9.2 Die allgemeine Anfragen-Log-Datei.
--log-isam[=datei]
Loggt alle ISAM- / MyISAM-Änderungen in datei (wird nur benutzt, um ISAM / MyISAM zu debuggen).
--log-slow-queries[=datei]
Loggt alle Anfragen, die länger als long_query_time Sekunden für die Ausführung benötigt haben, in datei. See section 5.9.5 Die Anfragen-Log-Datei für langsame Anfragen.
--log-update[=datei]
Loggt Updates in datei.#, wobei # eine eindeutige Zahl ist, falls nicht vorgegeben. See section 5.9.3 Die Update-Log-Datei.
--log-long-format
Loggt einige zusätzliche Informationen ins Update-Log. Wenn Sie --log-slow-queries benutzen, werden Anfragen, die keine Indexe benutzen, in die Langsame-Anfragen-Log-Datei geloggt.
--low-priority-updates
Operationen, die Tabellen ändern (INSERT/DELETE/UPDATE), haben geringere Priorität als Selects. Das kann auch mit {INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ... durchgeführt werden, um lediglich die Priorität einer einzelnen Anfrage zu verringern, oder mit SET OPTION SQL_LOW_PRIORITY_UPDATES=1, um die Priorität in einem Thread zu ändern. See section 6.3.2 Themen, die Tabellensperren betreffen.
--memlock
Sperrt den mysqld-Prozess in den Arbeitsspeicher. Das funktioniert nur, wenn Ihr System den mlockall()-Systemaufruf versteht (wie Solaris). Das kann helfen, wenn Sie Probleme damit haben, dass Ihr Betriebssystem mysqld veranlasst, auf Platte zu swappen.
--myisam-recover [=option[,option...]]], wobei option eine
Kombination von DEFAULT, BACKUP, FORCE oder QUICK ist. Sie können sie auch explizit auf "" setzen, wenn Sie diese Option ausschalten wollen. Wenn die Option benutzt wird, überprüft mysqld beim Öffnen, ob die Tabelle als zerstört markiert ist oder ob die Tabelle nicht ordnungsgemäß geschlossen wurde. (Die letzte Option funktioniert nur, wenn Sie mysqld mit --skip-locking laufen lassen). Wenn das der Fall ist, läßt mysqld eine Überprüfung der Tabelle laufen. Wenn die Tabelle beschädigt war, versucht mysqld, sie zu reparieren. Folgende Optionen beeinflussen, wie repair funktioniert.
DEFAULT Dasselbe, als würde man für --myisam-recover keine Option angeben.
BACKUP Wenn die Tabelle während der Wiederherstellung geändert wurde, eine Datensicherung der `tabelle.MYD'-Datendatei als `tabelle-datetime.BAK' speichern.
FORCE Eine Wiederherstellung selbst dann laufen lassen, wenn man mehr als eine Zeile aus der .MYD-Datei verlieren wird.
QUICK Die Zeilen der Tabelle nicht überprüfen, wenn es keine gelöschten Blocks gibt.
Bevor eine Tabelle automatisch repariert wird, fügt MySQL darüber eine Bemerkung in das Fehler-Log. Wenn Sie in der Lage sein wollen, die meisten Sachen ohne Benutzer-Intervention zu beheben, sollten Sie die Optionen BACKUP,FORCE benutzen. Das erzwingt ein Reparieren einer Tabelle, selbst wenn dabei einige Zeilen gelöscht würden, erhält aber die alte Datendatei als Datensicherung, so dass Sie später herausfinden können, was passiert ist.
--pid-file=pfad
Pfad zur pid-Datei, die von safe_mysqld benutzt wird.
-P, --port=...
Port-Nummer, um auf TCP/IP-Verbindungen zu warten (listen).
-o, --old-protocol
Das 3.20-Protokoll für Kompatibilität mit einigen sehr alten Clients benutzen.
--one-thread
Nur einen Thread benutzen (zum Debuggen unter Linux). See section H.1 Einen MySQL-Server debuggen.
-O, --set-variable var=option
Weist einer Variablen einen Wert zu. --help listet Variablen auf. Sie finden eine komplette Beschreibung aller Variablen im SHOW VARIABLES-Abschnitt dieses Handbuchs. See section 5.5.5.4 SHOW VARIABLES. Der Abschnitt über das Tunen der Serverparameter enthält Informationen darüber, wie man diese optimiert. See section 6.5.2 Serverparameter tunen.
--safe-mode
Einige Optimierungsschritte überspringen. Setzt --skip-delay-key-write voraus.
--safe-show-database
Keine Datenbanken anzeigen, für die der Benutzer keine Zugriffsrechte hat.
--safe-user-create
Wenn das angeschaltet ist, kann ein Benutzer keine neuen Benutzer mit dem GRANT-Befehl anlegen, wenn der Benutzer kein INSERT-Zugriffsrecht auf die mysql.user-Tabelle oder irgend welche Spalten dieser Tabelle hat.
--skip-concurrent-insert
Die Fähigkeit abschalten, gleichzeitig auf MyISAM-Tabellen auszuwählen (select) und einzufügen (insert). (Sollte nur benutzt werden, wenn Sie der Meinung sind, ein Bug in diesem Feature gefunden zu haben.)
--skip-delay-key-write
Die delay_key_write-Option für alle Tabellen ignorieren. See section 6.5.2 Serverparameter tunen.
--skip-grant-tables
Diese Option veranlasst den Server, das Zugriffsrechte-System überhaupt nicht zu benutzen. Das gibt jedem vollen Zugriff auf alle Datenbanken! (Einen laufenden Server können Sie anweisen, die Berechtigungstabellen erneut zu verwenden, indem Sie mysqladmin flush-privileges oder mysqladmin reload ausführen.)
--skip-host-cache
Nie den Host-Name-Cache für schnellere Name-IP-Auflösung benutzen, sondern statt dessen bei jeder Verbindung beim DNS-Server anfragen. See section 6.5.5 Wie MySQL DNS benutzt.
--skip-locking
System-Sperren nicht benutzen. Um isamchk oder myisamchk auszuführen, müssen Sie den Server herunter fahren. See section 2.2.2 Wie stabil ist MySQL?. Beachten Sie, dass Sie in MySQL-Version 3.23 REPAIR und CHECK benutzen können, um MyISAM-Tabellen zu reparieren / zu prüfen.
--skip-name-resolve
Hostnamen werden nicht aufgelöst. Alle Host-Spaltenwerte in den Berechtigungstabellen müssen IP-Nummern oder localhost sein. See section 6.5.5 Wie MySQL DNS benutzt.
--skip-networking
Auf überhaupt keine TCP/IP-Verbindungen warten (listen). Jede Interaktion mit mysqld muss über Unix-Sockets erfolgen. Diese Option wird ausdrücklich empfohlen für Systeme, auf denen nur lokale Anfragen (Requests) erlaubt sind. See section 6.5.5 Wie MySQL DNS benutzt.
--skip-new
Keine neuen, möglicherweise falschen Routinen benutzen. Setzt --skip-delay-key-write voraus. Setzt ausserdem den vorgabemäßigen Tabellentyp auf ISAM. See section 8.3 ISAM-Tabellen.
--skip-symlink
Keine Dateien löschen oder umbenennen, auf die eine mit Symlink verknüpfte Datei im Daten-Verzeichnis zeigt.
--skip-safemalloc
Wenn MySQL mit --with-debug=full konfiguriert wird, überprüfen alle Programme den Arbeitsspeicher auf Überlauf, bei jeder Speicher-Allokation und -Freigabe. Da dieses Prüfen sehr langsam ist, können Sie es vermeiden, wenn Sie keine Arbeitsspeicherprüfung benötigten, indem Sie diese Option benutzen.
--skip-show-database
Keine 'SHOW DATABASE'-Befehle zulassen, wenn der Benutzer keine process-Berechtigung hat.
--skip-stack-trace
Keine Stack-Traces schreiben. Diese Option ist nützlich, wenn Sie mysqld unter einem Debugger laufen lassen. See section H.1 Einen MySQL-Server debuggen.
--skip-thread-priority
Benutzung von Thread-Prioritäten abschalten, um schnellere Antwortzeiten zu erzielen.
--socket=pfad
Socket-Datei, die anstelle des vorgabemäßigen /tmp/mysql.sock für lokale Verbindungen benutzt wird.
--sql-mode=option[,option[,option...]]
Option kann jede beliebige Kombination von REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, SERIALIZE und ONLY_FULL_GROUP_BY sein. Sie kann auch leer sein (""), wenn Sie dies zurücksetzen wollen. Alle oben angegebenen Optionen festlegen ist dasselbe wie --ansi benutzen. Mit dieser Option kann man nur benötigte SQL-Modi anschalten. See section 2.7.2 MySQL im ANSI-Modus laufen lassen.
transaction-isolation= { READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE }
Setzt das vorgabemäßige Transaktions-Isolations-Level. See section 7.7.3 SET TRANSACTION-Syntax.
-t, --tmpdir=pfad
Pfad für temporäre Dateien. Es kann nützlich sein, wenn Ihr vorgabemäßiges /tmp-Verzeichnis auf einer Partition liegt, die zu klein ist, um temporäre Tabellen zu speichern.
-u, --user=benutzername
Den mysqld-Daemon unter dem Benutzer benutzername laufen lassen. Diese Option ist zwingend notwendig, wenn mysqld als Root gestartet wird.
-V, --version
Versionsinformationen ausgeben und beenden.
-W, --warnings
Warnmeldungen wie Aborted connection... in die .err-Datei ausgeben. See section A.2.9 Kommunikationsfehler / Abgebrochene Verbindung.

5.1.2 my.cnf-Optionsdateien

Seit Version 3.22 kann MySQL vorgabemäßige Startoptionen für den Server und für Clients aus Optionsdateien lesen.

MySQL liest Vorgabeoptionen aus folgenden Dateien unter Unix:

Dateiname Zweck
/etc/my.cnf Globale Optionen
DATADIR/my.cnf Server-spezifische Optionen
defaults-extra-file Die Datei, die mit --defaults-extra-file=# festgelegt wird
~/.my.cnf Benutzerspezifische Optionen

DATADIR ist das MySQL-Daten-Verzeichnis (typischerweise `/usr/local/mysql/data' bei einer Binärinstallation oder `/usr/local/var' bei einer Quellinstallation). Beachten Sie, dass das das Verzeichnis ist, das zur Konfigurationszeit festgelegt wurde, nicht das, das mit --datadir festgelegt wird, wenn mysqld startet! (--datadir hat keinen Einfluss darauf, wo der Server nach Optionsdateien sucht, denn er sucht nach ihnen, bevor er irgend welche Kommandozeilenargumente verarbeitet.)

MySQL liest Vorgabeoptionen aus folgenden Dateien unter Windows:

Dateiname Zweck
Windows-System-Verzeichnis\my.ini Globale Optionen
C:\my.cnf Globale Optionen
C:\mysql\data\my.cnf Server-spezifische Optionen

Beachten Sie, dass Sie unter Windows alle Pfade mit / statt mit \ angeben sollten. Wenn Sie \ benutzen, müssen Sie das doppelt (\\) tun, weil \ in MySQL das Fluchtzeichen (Escape-Character) ist.

MySQL versucht, Optionsdateien in der oben angegebenen Reihenfolge zu lesen. Wenn es mehrere Optionsdateien gibt, erlangt eine Option, die in einer Datei festgelegt wird, die später gelesen wird, Vorrang über dieselbe Option, die in einer sonstigen Optionsdatei festgelegt wurde. Optionen, die auf der Kommandozeile festgelegt werden, erlangen Vorrang vor Optionen in jeglichen Optionsdateien. Einige Optionen können durch Umgebungsvariablen festgelegt werden. Optionen, die auf der Kommandozeile oder in Optionsdateien festgelegt werden, haben Vorrang vor Werten in Umgebungsvariablen. See section I Umgebungsvariablen. Folgende Programme unterstützen Optionsdateien: mysql, mysqladmin, mysqld, mysqldump, mysqlimport, mysql.server, myisamchk und myisampack.

Sie können Optionsdateien benutzen, um jede beliebig lange Option festzulegen, die ein Programm unterstützt! Starten Sie das Programm mit --help, um eine Liste der verfügbaren Optionen zu erhalten.

Eine Optionsdatei kann Zeilen der folgenden Formate enthalten:

#Kommentar
Kommentarzeilen fangen mit `#' oder `;' an. Leere Zeilen werden ignoriert.
[group]
group ist der Name des Programms oder der Gruppe, für das oder die Sie Optionen setzen wollen. Nach einer Gruppen-Zeile beziehen sich alle option- oder set-variable-Zeilen auf die benannte Gruppe, bis zum Ende der Optionsdatei oder bis eine andere Gruppe angegeben wird.
option
Das ist äquivalent zu --option auf der Kommandozeile.
option=value
Das ist äquivalent zu --option=value auf der Kommandozeile.
set-variable = variable=value
Das ist äquivalent zu --set-variable variable=value auf der Kommandozeile. Diese Syntax muss verwendet werden, um eine mysqld-Variable zu setzen.

Die client-Gruppe gestattet Ihnen, Optionen anzugeben, die sich auf alle MySQL-Clients (nicht auf mysqld) beziehen. Diese Gruppe eignet sich bestens dafür, das Passwort festzulegen, das Sie benutzen, um sich mit dem Server zu verbinden. (Stellen Sie jedoch sicher, dass die Optionsdatei nur für Sie les- und schreibbar ist.)

Beachten Sie, dass bei Optionen und Werten alle führenden Leerzeichen und solche am Zeilenende automatisch entfernt werden. Sie können in der Zeichenkette für den Wert die Escape-Sequenzen `\b', `\t', `\n', `\r', `\\' und `\s' benutzen (`\s' ist das Leerzeichen).

Hier ist eine typische globale Optionsdatei:

[client]
port=3306
socket=/tmp/mysql.sock

[mysqld]
port=3306
socket=/tmp/mysql.sock
set-variable = key_buffer_size=16M
set-variable = max_allowed_packet=1M

[mysqldump]
quick

Hier ist eine typische Benutzer-Optionsdatei:

[client]
# Folgendes Passwort wird an alle Standard-MySQL-Clients geschickt:
password=mein_password

[mysql]
no-auto-rehash
set-variable = connect_timeout=2

[mysqlhotcopy]
interactive-timeout

Wenn Sie eine Quelldistribution haben, finden Sie Beispielkonfigurationen in den Dateien mit Namen `my-xxxx.cnf' im `Support-files'-Verzeichnis. Wenn Sie eine Binärdistribution haben, suchen Sie im `DIR/support-files'-Verzeichnis, wobei DIR der Pfadname zum MySQL-Installationsverzeichnis ist (typischerweise `/usr/local/mysql'). Aktuell finden Sie dort beispielhafte Konfigurationsdateien für kleine, mittlere, große und sehr große Systeme. Sie können `my-xxxx.cnf' in Ihr Heimatverzeichnis kopieren, um damit zu experimentieren (benennen Sie die Kopie in `.my.cnf' um).

Alle MySQL-Clients, die Optionsdateien unterstützen, unterstützen folgende Optionen:

--no-defaults Keine Optionsdateien einlesen.
--print-defaults Den Programmnamen und alle Optionen, die das Programm erhalten wird, ausgeben.
--defaults-file=voller-pfad-zur-vorgabe-datei Nur die angegebene Konfigurationsdatei benutzen.
--defaults-extra-file=voller-pfad-zur-vorgabe-datei Diese Konfigurationsdatei nach der globalen Konfigurationsdatei einlesen, aber vor der Benutzer-Konfigurationsdatei.

Beachten Sie, dass die oben aufgeführten Optionen auf der Kommandozeile zuerst angegeben werden müssen, damit sie funktionieren! --print-defaults kann jedoch direkt nach den --defaults-xxx-file-Befehlen angegeben werden.

Hinweis für Entwickler: Optionsdatei-Handhabung ist schlicht dadurch implementiert, dass alle übereinstimmenden Optionen verarbeitet werden (das heißt, Optionen in der entsprechenden Gruppe), vor jeglichen Kommandozeilen-Argumenten. Das funktioniert sehr gut bei Programmen, die die letzte Instanz einer Option benutzen, die mehrfach festgelegt wurde. Wenn Sie ein altes Programm benutzen, das mehrfach festgelegte Optionen auf diese Art handhabt, aber keine Optionsdateien liest, müssen Sie nur zwei Zeilen hinzufügen, um diese Fähigkeit hinzuzufügen. Sehen Sie im Quellcode irgend eines Standard-MySQL-Clients nach, wie das gemacht wird.

In Shellskripts können Sie den `my_print_defaults'-Befehl benutzen, um die Konfigurationsdateien zu parsen:


shell> my_print_defaults client mysql
--port=3306
--socket=/tmp/mysql.sock
--no-auto-rehash

Die Ausgabe enthält alle Optionen für die Gruppen 'client' und 'mysql'.

5.1.3 Viele Server auf derselben Maschine installieren

In einigen Fällen brauchen Sie vielleicht viele verschiedene mysqld-Daemons (Server), die auf derselben Maschine laufen. Beispielsweise wollen Sie eine neue MySQL-Version zum Testen benutzen, während gleichzeitig eine alte Version für die Produktion läuft, oder Sie wollen verschiedenen Benutzern Zugriff auf verschiedene mysqld-Server geben, die sie selbst verwalten.

Eine Möglichkeit, einen neuen Server laufen zu lassen, besteht darin, ihn mit einem anderen Socket und einem anderen Port wie folgt zu starten:

shell> MYSQL_UNIX_PORT=/tmp/mysqld-neu.sock
shell> MYSQL_TCP_PORT=3307
shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
shell> scripts/mysql_install_db
shell> bin/safe_mysqld &

Der Umgebungsvariablen-Appendix beinhaltet eine Liste anderer Umgebungsvariablen, die Sie benutzen können, um mysqld zu steuern. See section I Umgebungsvariablen.

Der oben gezeigte Weg ist die 'schnelle und schmutzige' Lösung, die man üblicherweise zum Testen benutzt. Das nette daran ist, dass alle Verbindungen, die Sie in obiger Shell aufbauen, automatisch an den neuen laufenden Server weiter geleitet werden!

Wenn Sie dasselbe dauerhafter durchführen wollen, sollten Sie für jeden Server eine Optionsdatei erzeugen. See section 5.1.2 my.cnf-Optionsdateien. In Ihrem Startskript, das beim Hochfahren ausgeführt wird (mysql.server?) sollten Sie für beide Server folgendes festlegen:

safe_mysqld --default-file=pfad-zur-optionsdatei

Zumindest folgende Optionen sollten für jeden Server unterschiedlich sein:

port=#
socket=pfad
pid-file=pfad

Folgende Optionen sollten unterschiedlich sein, wenn sie benutzt werden:

log=pfad
log-bin=pfad
log-update=pfad
log-isam=pfad
bdb-logdir=pfad

Wenn Sie mehr Performance erreichen wollen, können Sie auch folgendes unterschiedlich festlegen:

tmpdir=pfad
bdb-tmpdir=pfad

See section 5.1.1 mysqld-Kommandozeilenoptionen.

Wenn Sie binäre MySQL-Versionen installieren (.tar-Dateien) und sie mit ./bin/safe_mysqld starten, müssen Sie in den meisten Fällen lediglich die socket- und port-Argumente in safe_mysqld hinzufügen / ändern.

5.1.4 Viele MySQL-Server auf derselben Maschine laufen lassen

Unter bestimmten Umständen wollen Sie vielleicht mehrere Server auf derselben Maschine laufen lassen. Beispielsweise wollen Sie ein neues MySQL-Release testen, Ihre bestehende Produktionseinrichtung aber unangetastet lassen. Oder Sie sind ein Internet-Service-Provider, der unabhängige MySQL-Installationen für verschiedene Kunden hat.

Wenn Sie mehrere Server laufen lassen wollen, ist es am einfachsten, die Server mit unterschiedlichen TCP/IP-Ports und Socket-Dateien laufen zu lassen, damit sie nicht beide auf demselben TCP/IP-Port oder derselben Socket-Datei auf Verbindungen warten. See section 5.7.3 mysqld_multi, Programm zur Verwaltung mehrerer MySQL-Server.

Nehmen wir einen existierenden Server an, der auf die existierende Port-Nummer und Socket-Datei konfiguriert ist. Sie konfigurieren einen neuen Server mit einem configure-Befehl, etwa wie folgt:

shell> ./configure  --with-tcp-port=port_nummer \
             --with-unix-socket-path=datei \
             --prefix=/usr/local/mysql-3.22.9

Hier müssen port_nummer und datei anders als die vorgabemäßigen Werte sein. Der --prefix-Wert sollte ein Installationsverzeichnis festlegen, das anders ist als dasjenige, unter dem die existierende MySQL-Installation liegt.

Sie können den Socket, der vom aktuell laufenden MySQL-Server benutzt wird, mit folgendem Befehl feststellen:

shell> mysqladmin -h hostname --port=port_nummer variables

Wenn Sie ``localhost'' als Hostnamen festlegen, benutzt mysqladmin Unix-Sockets anstelle von TCP/IP.

Wenn Sie einen MySQL-Server auf dem Port laufen haben, den Sie benutzt haben, bekommen Sie eine Liste der wichtigsten konfigurierbaren Variablen in MySQL, inklusive des Socketnamens.

Sie müssen keinen neuen MySQL-Server kompilieren, nur um ihn mit einem anderen Port und Socket zu starten. Sie können Port und Socket zur Laufzeit als Optionen von safe_mysqld festlegen:

shell> /pfad/zu/safe_mysqld --socket=datei --port=port_nummer

mysqld_multi kann ebenfalls safe_mysqld (oder mysqld) als Argument nehmen und die Optionen von einer Konfigurationsdatei an safe_mysqld und weiter an mysqld durchreichen.

Wenn Sie den neuen Server mit demselben Datenbankverzeichnis laufen lassen und Loggen angeschaltet haben, sollten Sie auch den Namen der Logdateien für safe_mysqld mit --log, --log-update oder --log-slow-queries festlegen. Ansonsten versuchen beide Server, in dieselbe Logdatei zu schreiben.

ACHTUNG: Normalerweise sollten Sie nie zulassen, dass zwei Server Daten in derselben Datenbank aktualisieren! Wenn Ihr Betriebssystem kein fehlerfreies System-Sperren (System Locking) unterstützt, führt das zu unliebsamen Überraschungen!

Wenn Sie für den zweiten Server ein anderes Datenbankverzeichnis benutzen wollen, können Sie das mit der --datadir=path-Option für safe_mysqld angeben.

HINWEIS: Mehrere MySQL-Server (mysqld) auf verschiedenen Maschinen laufen lassen, die auf ein gemeinsames Datenverzeichnis über NFS zugreifen, ist generell eine SCHLECHTE IDEE! Das Problem liegt darin, dass NFS zum Flaschenhals in Punkto Geschwindigkeit wird, denn es ist nicht für solche Zwecke gedacht. Und letztlich müssten Sie immer noch eine Lösung dafür finden, dass sich zwei oder mehr mysqlds nicht in die Quere kommen. Momentan gibt es keine Plattform, die mit 100%-iger Zuverlässigkeit Datei-Sperren (File Locking, gewöhnlich mit dem lockd-Daemon) in jeder Situation durchführt. Dennoch stellt NFS ein weiteres mögliches Risiko dar, denn es macht es dem lockd-Daemon noch schwieriger, Datei-Sperren zu handhaben. Machen Sie es sich also leicht und vergessen Sie diese Idee! Die funktionierende Lösung ist, einen Computer mit einem Betriebssystem einzusetzen, dass Threads effizient handhabt und mehrere Prozessoren hat.

Wenn Sie sich mit einem MySQL-Server verbinden wollen, der mit einem anderen Port läuft als mit dem, der in Ihren Client kompiliert ist, können Sie folgende Methoden benutzen:

5.2 Allgemeine Sicherheitsthemen und das MySQL-Zugriffsberechtigungssystem

MySQL hat ein fortgeschrittenes, aber nicht standardisiertes Sicherheits- bzw. Berechtigungssystem. Dieser Abschnitt beschreibt, wie es funktioniert.

5.2.1 Allgemeine Sicherheitsrichtlinien

Jeder, der MySQL auf einem Computer benutzt, der mit dem Internet verbunden ist, sollte diesen Abschnitt lesen, um die gebräuchlichsten Sicherheitsfehler zu vermeiden.

Wenn wir über Sicherheit sprechen, unterstreichen wir die Notwendigkeit, den gesamten Server-Host (und nicht nur den MySQL-Server) gegen alle Arten möglicher Angriffe abzusichern: Lauschangriffe, Änderungen (Altering), Playback und Dienstverweigerung (Denial of Service). Dieser Abschnitt deckt nicht alle Aspekte von Verfügbarkeit und Fehlertoleranz ab.

MySQL benutzt ein Sicherheitssystem, das auf Zugriffssteuerungslisten (Access Control Lists, ACLs) für alle Verbindungen, Anfragen und sonstige Operationen basiert, die ein Benutzer durchführen kann. Zusätzlich gibt es einige Unterstützung für SSL-verschlüsselte Verbindungen zwischen MySQL-Clients und -Servern. Viele der hier geschilderten Konzepte sind überhaupt nicht spezifisch für MySQL, sondern beziehen sich auf fast alle Applikationen.

Wenn Sie MySQL laufen lassen, sollten Sie möglichst immer folgende Richtlinien beachten:

5.2.2 Wie Sie MySQL gegen Cracker sicher machen

Wenn Sie sich mit einem MySQL-Server verbinden, sollten Sie normalerweise ein Passwort benutzen. Das Passwort wird nicht als Klartext über die Verbindung übermittelt. Allerdings ist der Verschlüsselungsalgorithmus nicht sehr stark, so dass ein cleverer Angreifer mit einiger Mühe das Passwort knacken kann, wenn er in der Lage ist, den Verkehr zwischen Client und Server abzuhören. Wenn die Verbindung zwischen Client und Server über ein nicht vertrauenswürdiges Netzwerk geht, sollten Sie einen SSH-Tunnel benutzen, um die Kommunikation zu verschlüsseln.

Jede sonstige Information wird als Klartext übermittelt, die von jedem gelesen werden kann, der in der Lage ist, die Verbindung abzuhören. Wenn Sie das beunruhigt, können Sie das komprimierte Protokoll benutzen (ab MySQL-Version 3.22), um so etwas zu erschweren. Um die Dinge noch sicherer zu machen, sollten Sie ssh benutzen. Sie finden einen Open-Source- ssh-Client auf http://www.openssh.org und einen kommerziellen ssh-Client auf http://www.ssh.com. Mit diesen erhalten Sie eine verschlüsselte TCP/IP-Verbindung zwischen einem MySQL-Server und einem MySQL-Client.

Um ein MySQL-System sicher zu machen, sollten Sie auf jeden Fall folgende Vorschläge in Betracht ziehen:

5.2.3 Startoptionen für mysqld in Bezug auf Sicherheit

Folgende mysqld-Optionen berühren Sicherheitsaspekte:

--safe-show-database
Mit dieser Option gibt SHOW DATABASES nur die Datenbanken zurück, für die der Benutzer irgend welche Rechte hat.
--safe-user-create
Wenn das angeschaltet ist, kann ein Benutzer keine neuen Benutzer mit dem GRANT-Befehl anlegen, wenn der kein INSERT-Zugriffsrecht auf die mysql.user-Tabelle hat. Wenn Sie dem Benutzer nur das Recht geben wollen, neue Benutzer mit den Berechtigungen anzulegen, die er vergeben darf, sollten Sie ihm folgende Berechtigung geben:
GRANT INSERT(benutzer) on mysql.user to 'benutzer''hostname';
Das stellt sicher, dass der Benutzer keine Berechtigungsspalten direkt ändern kann, sondern dafür den GRANT-Befehl benutzen muss.
--skip-grant-tables
Diese Option veranlasst den Server, das Berechtigungssystem überhaupt nicht zu benutzen. Das gibt jedem vollen Zugriff auf alle Datenbanken! (Einen laufenden Server können Sie veranlassen, die Berechtigungstabellen erneut zu verwenden, indem Sie mysqladmin flush-privileges oder mysqladmin reload ausführen.)
--skip-name-resolve
Hostnamen werden nicht aufgelöst. Alle Host-Spaltenwerte in den Berechtigungstabellen müssen IP-Nummern oder localhost sein.
--skip-networking
Keine TCP/IP-Verbindungen über das Netzwerk zulassen. Alle Verbindungen zu mysqld müssen über Unix-Sockets gemacht werden. Diese Option ist ungeeignet für Systeme, die MIT-pThreads benutzen, weil das MIT-pThreads-Paket keine Unix-Sockets unterstützt.
--skip-show-database
Mit dieser Option gibt das SHOW DATABASES-Statement nichts zurück.

5.2.4 Was das Berechtigungssystem macht

Die primäre Funktion des MySQL-Berechtigungssystem ist, einen Benutzer zu authentifizieren, der sich von einem gegebenen Host aus verbindet, und diesen Benutzer Berechtigungen auf eine Datenbank zuzuordnen, wie select, insert, update und delete.

Zusätzliche Funktionalität beinhaltet die Möglichkeit, einen anonymen Benutzer anzulegen und Berechtigungen für MySQL-spezifische Funktionen wie LOAD DATA INFILE und für administrative Operationen zu gewähren.

5.2.5 Wie das Berechtigungssystem funktioniert

Das MySQL-Berechtigungssystem stellt sicher, dass alle Benutzer nur genau die Dinge tun dürfen, zu denen sie berechtigt sind. Wenn Sie sich mit einem MySQL-Server verbinden, wird Ihre Identität durch den Host, von dem Sie sich aus verbinden, festgelegt und durch den Benutzernamen, den Sie angeben. Das System gewährt Berechtigungen gemäß Ihrer Identität und gemäß dem, was Sie tun wollen.

MySQL zieht sowohl Hostnamen als auch Benutzernamen heran, um Sie zu identifizieren, weil es kaum Grund gibt anzunehmen, dass ein gegebener Benutzername derselben Person woanders auf dem Internet gehört. So muss zum Beispiel der Benutzer bill, der sich von whitehouse.gov aus verbindet, nicht notwendigerweise dieselbe Person sein, die sich als Benutzer bill von microsoft.com aus verbindet. MySQL erlaubt Ihnen deshalb, Benutzer auf unterschiedlichen Hosts auseinander zu halten, die zufällig denselben Namen haben: Sie können bill einen Satz von Berechtigungen für Verbindungen von whitehouse.gov und einen anderen Satz von Berechtigungen für Verbindungen von microsoft.com aus gewähren.

Die MySQL-Zugriffskontrolle läuft in zwei Phasen ab:

Der Server benutzt die user-, db- und host-Tabellen in der mysql-Datenbank in beiden Phasen der Zugriffskontrolle. Die Felder in diesen Berechtigungstabellen sind unten dargestellt:

Tabellenname user db host
Geltungsbereichs-Felder Host Host Host
User Db Db
Password User
Berechtigungs-Felder Select_priv Select_priv Select_priv
Insert_priv Insert_priv Insert_priv
Update_priv Update_priv Update_priv
Delete_priv Delete_priv Delete_priv
Index_priv Index_priv Index_priv
Alter_priv Alter_priv Alter_priv
Create_priv Create_priv Create_priv
Drop_priv Drop_priv Drop_priv
Grant_priv Grant_priv Grant_priv
References_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv

In der zweiten Phase der Zugriffskontrolle (Anfrage-Verifikation), zieht der Server gegebenenfalls zusätzlich die tables_priv- und columns_priv-Tabellen heran, falls Ihre Anfrage Tabellen betrifft. Die Felder in diesen Tabellen sind unten dargestellt:

Tabellenname tables_priv columns_priv
Geltungsbereichs-Felder Host Host
Db Db
User User
Table_name Table_name
Column_name
Berechtigungs-Felder Table_priv Column_priv
Column_priv
Sonstige Felder Timestamp Timestamp
Grantor

Jede Berechtigungstabelle enthält Geltungsbereichsfelder und Berechtigungsfelder.

Geltungsbereichsfelder legen den Geltungsbereich jedes Eintrags in den Tabellen fest, das heißt, der Kontext, für den der Eintrag gilt. So würde zum Beispiel ein user-Tabelleneintrag mit Host- und User-Werten von 'thomas.loc.gov' und 'bob' benutzt werden, um Verbindungen zum Server zu authentifizieren, die von bob vom Host thomas.loc.gov gemacht werden. In ähnlicher Weise bewirkt ein db-Tabelleneintrag in die Felder Host, User und Db mit 'thomas.loc.gov', 'bob' und 'reports', dass diese benutzt werden, wenn sich bob vom Host thomas.loc.gov verbindet und auf die reports-Datenbank zugreift. Die tables_priv- und columns_priv-Tabellen enthalten Geltungsbereichsfelder, die Tabellen oder Tabellen-Spalten-Kombinationen angeben, auf die sich der jeweilige Eintrag bezieht.

Für Zwecke der Zugriffsprüfung sind Vergleiche von Host-Werten unabhängig von der verwendeten Groß-/Kleinschreibung. User, Password, Db und Table_name-Werte sind abhängig von der verwendeten Groß-/Kleinschreibung. Column_name-Werte sind ab MySQL-Version 3.22.12 unabhängig von der verwendeten Groß-/Kleinschreibung.

Berechtigungsfelder zeigen die Berechtigungen an, die durch den Tabelleneintrag gewährt werden, das heißt, welche Operationen durchgeführt werden können. Der Server kombiniert die Informationen in den verschiedenen Berechtigungstabellen, um daraus eine komplette Beschreibung der Berechtigungen des Benutzers zu formulieren. Die Regeln, nach denen hierbei vorgegangen wird, sind in section 5.2.9 Zugriffskontrolle, Phase 2: Anfrageüberprüfung beschrieben.

Geltungsbereichsfelder sind Zeichenketten, die wie unten dargestellt deklariert werden. Der Vorgabewert für jedes Feld ist die leere Zeichenkette:

Feldname Typ
Host CHAR(60)
User CHAR(16)
Password CHAR(16)
Db CHAR(64) (CHAR(60) für die tables_priv- und columns_priv-Tabellen)
Table_name CHAR(60)
Column_name CHAR(60)

In den user-, db- und host-Tabellen werden alle Felder als ENUM('N','Y') deklariert. Jedes Feld kann einen Wert von 'N' oder 'Y' haben. Der Vorgabewert ist 'N'.

In den tables_priv- und columns_priv-Tabellen werden Felder als SET-Felder deklariert:

Tabellenname Feldname Mögliche Set-Elemente
tables_priv Table_priv 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'Referenzs', 'Index', 'Alter'
tables_priv Column_priv 'Select', 'Insert', 'Update', 'References'
columns_priv Column_priv 'Select', 'Insert', 'Update', 'References'

Kurz gesagt benutzt der Server die Berechtigungstabellen wie folgt:

Beachten Sie, dass die Verwaltungsberechtigungen (reload, shutdown usw.) nur in der user-Tabelle festgelegt werden. Das liegt daran, dass Verwaltungsoperationen Operationen auf dem Server selbst sind und nicht Datenbank-spezifisch, so dass es keinen Grund gibt, solche Berechtigungen in den anderen Berechtigungstabellen aufzuführen. So muss nur die user-Tabelle untersucht werden um festzustellen, ob man Verwaltungsoperationen durchführen kann oder nicht.

Das file-Zugriffsrecht wird auch nur in der user-Tabelle festgelegt. Es ist als solches keine Verwaltungsberechtigung, aber Ihre Möglichkeit, Dateien auf dem Server zu lesen oder zu schreiben, ist unabhängig von der Datenbank, auf die Sie zugreifen.

Der mysqld-Server liest die Inhalte der Berechtigungstabellen einmal, und zwar beim Start. Änderungen in den Berechtigungstabellen werden wirksam wie in section 5.3.3 Wann Berechtigungsänderungen wirksam werden geschildert.

Wenn Sie die Inhalte der Berechtigungstabellen ändern, sollten Sie sicherstellen, dass Ihre Änderungen Berechtigungen einführen, die Sie so haben wollen. Hilfe bei der Diagnose von Problemen finden Sie unter section 5.2.10 Gründe für Access denied-Fehler. Hinweise zu Sicherheitsthemen finden Sie unter see section 5.2.2 Wie Sie MySQL gegen Cracker sicher machen.

Ein nützliches Diagnosetool ist das mysqlaccess-Skript, das Yves Carlier für die MySQL-Distribution bereit gestellt hat. Rufen Sie mysqlaccess mit der --help-Option auf, um herauszufinden, wie es funktioniert. Beachten Sie, dass mysqlaccess den Zugriff nur anhand der user-, db- und host-Tabellen überprüft. Es überprüft keine Tabellen- oder Spaltenebenen-Berechtigungen.

5.2.6 Von MySQL zur Verfügung gestellte Berechtigungen

Informationen über Benutzerberechtigungen sind in den user-, db-, host-, tables_priv- und columns_priv-Tabellen in der mysql-Datenbank gespeichert (das heißt in der Datenbank, die mysql heißt). Der MySQL-Server liest die Inhalte dieser Tabellen, wenn er startet, und in den Fällen, die unter section 5.3.3 Wann Berechtigungsänderungen wirksam werden geschildert sind.

Die Namen, die in diesem Handbuch benutzt werden, um auf die Berechtigungen zu verweisen, die MySQL zur Verfügung stellt, sind unten dargestellt, zusammen mit den Tabellenspaltennamen, die jeder Berechtigung in the Berechtigungstabellen zugeordnet sind, und dem Kontext, auf den die Berechtigung zutrifft.

Berechtigung Spalte Kontext
select Select_priv Tabellen
insert Insert_priv Tabellen
update Update_priv Tabellen
delete Delete_priv Tabellen
index Index_priv Tabellen
alter Alter_priv Tabellen
create Create_priv Datenbanken, Tabellen oder Indexe
drop Drop_priv Datenbanken oder Tabellen
grant Grant_priv Datenbanken oder Tabellen
References References_priv Datenbanken oder Tabellen
reload Reload_priv Serververwaltung
shutdown Shutdown_priv Serververwaltung
process Process_priv Serververwaltung
file File_priv Dateizugriff auf den Server

Die select-, insert-, update- und delete-Berechtigungen erlauben Ihnen, Operationen auf Zeilen in existierenden Tabellen in einer Datenbank durchzuführen.

SELECT-Statements erfordern die select-Berechtigung nur dann, wenn tatsächlich Zeilen aus einer Tabelle abgerufen werden. Sie können bestimmte SELECT-Statements selbst ohne Berechtigung durchführen, um auf jede der Datenbanken auf dem Server zuzugreifen. Beispielsweise könnten Sie den mysql-Client als einfachen Taschenrechner benutzen:

mysql> SELECT 1+1;
mysql> SELECT PI()*2;

Die index-Berechtigung erlaubt Ihnen, Indexe zu erzeugen oder zu entfernen.

Die alter-Berechtigung erlaubt Ihnen, ALTER TABLE zu benutzen.

Die create- und drop-Berechtigungen erlauben Ihnen, neue Datenbanken und Tabellen zu erzeugen oder bestehende Datenbanken und Tabellen zu entfernen.

Denken Sie daran, dass ein Benutzer, dem Sie die drop-Berechtigung für die mysql-Datenbank gewähren, in der Lage ist, die Datenbank zu löschen, in der die MySQL-Zugriffsberechtigungen gespeichert sind!

Die grant-Berechtigung erlaubt Ihnen, die Berechtigungen, die Sie selbst besitzen, an andere Benutzer zu vergeben.

Die file-Berechtigung erlaubt Ihnen, Dateien auf dem Server zu lesen und zu schreiben, wenn Sie die LOAD DATA INFILE- und SELECT ... INTO OUTFILE-Statements benutzen. Jeder Benutzer, dem diese Berechtigung gewährt wurde, kann jedwede Datei lesen oder schreiben, die der MySQL-Server lesen oder schreiben darf.

Die restlichen Berechtigungen werden für Verwaltungsoperationen benutzt, die mit dem mysqladmin-Programm durchgeführt werden. Die unten stehende Tabelle zeigt, welche mysqladmin-Befehle mit jeder Verwaltungsberechtigung ausgeführt werden können:

Berechtigung Befehle, die dem Berechtigten erlaubt sind
reload reload, refresh, flush-privileges, flush-hosts, flush-logs und flush-tables
shutdown shutdown
process processlist, kill

Der reload-Befehl weist den Server an, die Berechtigungstabellen neu einzulesen. Der refresh-Befehl schreibt alle Tabellen auf Platte (flush) und öffnet und schließt die Log-Dateien. flush-privileges ist ein Synonym für reload. Die anderen flush-*-Befehle führen Funktionen aus, die refresh ähnlich sind, aber im Umfang beschränkter und daher in einigen Fällen zu bevorzugen. Wenn Sie zum Beispiel nur die Log-Dateien flushen wollen, ist flush-logs refresh vorzuziehen.

Der shutdown-Befehl fährt den Server herunter.

Der processlist-Befehl zeigt Informationen über die Threads an, die im Server ausgeführt werden. Der kill-Befehl killt Server-Threads. Ihre eigenen Threads können Sie jederzeit anzeigen oder killen, aber Sie brauchen die process-Berechtigung, um Threads anzuzeigen oder zu killen, die von anderen Benutzern initiiert wurden. See section 5.5.4 KILL-Syntax.

Es ist generell eine gute Idee, Berechtigungen nur den Nutzern zu gewähren, die diese tatsächlich brauchen, aber speziell bei folgenden Berechtigungen sollten Sie besondere Vorsicht walten lassen:

Es gibt einige Dinge, die Sie mit dem MySQL-Berechtigungssystem nicht tun können:

5.2.7 Verbinden mit dem MySQL-Server

MySQL-Client-Programme erfordern im Allgemeinen, dass Sie Verbindungsparameter festlegen, wenn Sie sich mit einem MySQL-Server verbinden wollen: Der Host, mit dem Sie sich verbinden wollen, Ihr Benutzername und Ihr Passwort. Beispielsweise kann der mysql-Client wie folgt gestartet werden (optionale Argumente sind in `[' und `]' eingeschlossen):

shell> mysql [-h hostname] [-u benutzername] [-pihr_passwort]

Alternative Formen der -h-, -u- und -p-Optionen sind --host=hostname, --user=benutzername und --password=ihr_passwort. Beachten Sie, dass zwischen -p oder --password= und dem folgenden Passwort kein Leerzeichen steht!

ACHTUNG: Ein Passwort auf der Kommandozeile anzugeben ist nicht sicher! Jeder Benutzer auf Ihrem System kann dann Ihr Passwort herausfinden, indem er einen Befehl wie ps auxww eingibt. See section 5.1.2 my.cnf-Optionsdateien.

mysql benutzt Vorgabewerte für Verbindungsparameter, die auf der Kommandozeile nicht angegeben sind:

Für einen Unix-Benutzer joe sind daher folgende Befehle gleichbedeutend:

shell> mysql -h localhost -u joe
shell> mysql -h localhost
shell> mysql -u joe
shell> mysql

Andere MySQL-Clients verhalten sich ähnlich.

Auf Unix-Systemen können Sie andere Vorgabewerte festlegen, die benutzt werden, wenn Sie eine Verbindung aufmachen, so dass Sie diese nicht jedes Mal auf der Kommandozeile eingeben müssen, wenn Sie ein Client-Programm aufrufen. Das kann auf verschiedene Weise gemacht werden:

5.2.8 Zugriffskontrolle, Phase 1: Verbindungsüberprüfung

Wenn Sie versuchen, sich mit einem MySQL-Server zu verbinden, akzeptiert der Server die Verbindung oder weist sie zurück, abhängig von Ihrer Identität und davon, ob Sie diese mit dem korrekten Passwort verifizieren können. Falls nicht, lehnt der Server den Zugriff vollständig ab. Ansonsten akzeptiert der Server die Verbindung, geht dann in Phase 2 und wartet auf Anfragen.

Ihre Identität basiert auf zwei Informationsbestandteilen:

Die Identitätsüberprüfung wird anhand der drei Geltungsbereichs-Felder der user-Tabelle, nämlich (Host, User und Password) durchgeführt. Der Server akzeptiert die Verbindung nur, wenn ein user-Tabelleneintrag mit Ihrem Hostnamen und Benutzernamen übereinstimmt und Sie das korrekte Passwort angeben können.

Werte in den Geltungsbereichs-Feldern der user-Tabelle können wie folgt festgelegt werden:

Nicht-leere Password-Werte repräsentieren verschlüsselte Passwörter. MySQL speichert Passwörter nicht im Klartext, so dass jeder sie sehen könnte. Statt dessen wird das Passwort eines Benutzers, der sich zu verbinden versucht, verschlüsselt (unter Benutzung der PASSWORD()-Funktion). Das verschlüsselte Passwort wird dann benutzt, wenn Client / Server prüfen, ob das Passwort korrekt ist (das geschieht, ohne dass das verschlüsselte Passwort jemals über die Verbindung übertragen wird). Beachten Sie, dass aus der Sicht von MySQL das verschlüsselte Passwort das ECHTE Passwort ist, daher sollten Sie niemandem Zugriff darauf geben! Insbesondere sollten Sie keinem normalen Benutzer Lesezugriff auf die Tabellen der mysql-Datenbank geben!

Die unten stehenden Beispiele zeigen, wie unterschiedliche Kombinationen von Host- und-User-Werten in den user-Tabelleneinträgen auf hereinkommende Verbindungen zutreffen:

Host Wert User Wert Verbindungen, die mit dem Eintrag übereinstimmen
'thomas.loc.gov' 'fred' fred, der sich von thomas.loc.gov aus verbindet
'thomas.loc.gov' '' Jeder Benutzer, der sich von thomas.loc.gov aus verbindet
'%' 'fred' fred, der sich von jedem Host aus verbindet
'%' '' Jeder Benutzer, der sich von jedem Host aus verbindet
'%.loc.gov' 'fred' fred, der sich von jedem beliebigen Host in der loc.gov-Domäne aus verbindet
'x.y.%' 'fred' fred, der sich von x.y.net, x.y.com, x.y.edu usw. aus verbindet (wahrscheinlich eher unsinnig)
'144.155.166.177' 'fred' fred, der sich vom Host mit der IP-Adresse 144.155.166.177 aus verbindet
'144.155.166.%' 'fred' fred, der sich von jedem beliebigen Host im Class-C-Subnet 144.155.166 aus verbindet
'144.155.166.0/255.255.255.0' 'fred' Dasselbe wie im vorherigen Beispiel

Weil Sie im Host-Feld IP-Platzhalterwerte verwenden können (beispielsweise '144.155.166.%', was mit jedem Host in einem Subnet übereinstimmt), besteht die Möglichkeit, dass jemand diese Fähigkeit ausbeutet, indem er einen Host zum Beispiel 144.155.166.somewhere.com nennt. Um solche Versuche zu vereiteln, verbietet MySQL den Vergleich mit Hostnamen, die mit Ziffern und einem Punkt übereinstimmen. Wenn Sie daher einen Host haben, der so wie 1.2.foo.com benannt ist, wird sein Name nie mit der Host-Spalte der Berechtigungstabellen übereinstimmen. Nur eine IP-Nummer kann mit dem IP-Platzhalterwert übereinstimmen.

Eine hereinkommende Verbindung kann mit mehr als einem Eintrag in der user-Tabelle übereinstimmen. Beispielsweise würde eine Verbindung von thomas.loc.gov aus durch fred mit mehreren der oben genannten Einträge übereinstimmen. Wie entscheidet der Server, welcher der Einträge benutzt werden soll, wenn mehrere zutreffen? Der Server löst dieses Problem, indem er die user-Tabelle nach dem Einlesen beim Start sortiert, und danach die Einträge in sortierter Form durchsieht, wenn ein Benutzer versucht, sich zu verbinden. Der erste übereinstimmende Eintrag ist der, der benutzt wird.

Das Sortieren der user-Tabelle funktioniert wie folgt. Nehmen Sie an, dass die user-Tabelle so aussieht:

+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| %         | root     | ...
| %         | jeffrey  | ...
| localhost | root     | ...
| localhost |          | ...
+-----------+----------+-

Wenn der Server die Tabelle liest, ordnet er die Einträge mit den spezifischsten Einträgen für die Host-Werte zuerst ein ('%' in der Host-Spalte bedeutet ``jeder Host'' und ist am unspezifischsten). Einträge mit denselben Host-Werten werden mit den spezifischsten User-Werten zuerst geordnet (ein leerer User-Wert bedeutet ``jeder Benutzer'' und ist am unspezifischsten). Die daraus resultierende sortierte user-Tabelle sieht wie folgt aus:

+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| localhost | root     | ...
| localhost |          | ...
| %         | jeffrey  | ...
| %         | root     | ...
+-----------+----------+-

Beim Versuch einer Verbindung durchsucht der Server die sortierten Einträge und benutzt die ersten übereinstimmenden. Bei einer Verbindung von localhost aus durch jeffrey stimmen die Werte zuerst mit den Einträgen von 'localhost' in der Host-Spalte überein. Hiervon stimmt der Eintrag mit dem leeren Benutzernamen sowohl mit dem verbindenden Host als auch mit dem Benutzernamen überein. ('%'/'jeffrey' hätte auch übereingestimmt, aber er ist nicht der erste Tabelleneintrag, der gefunden wird.)

Hier ist ein weiteres Beispiel. Nehmen Sie an, die user-Tabelle sieht wie folgt aus:

+----------------+----------+-
| Host           | User     | ...
+----------------+----------+-
| %              | jeffrey  | ...
| thomas.loc.gov |          | ...
+----------------+----------+-

Die sortierte Tabelle sieht wie folgt aus:

+----------------+----------+-
| Host           | User     | ...
+----------------+----------+-
| thomas.loc.gov |          | ...
| %              | jeffrey  | ...
+----------------+----------+-

Eine Verbindung von thomas.loc.gov aus durch jeffrey stimmt mit dem ersten Eintrag überein, wohingegen eine Verbindung von whitehouse.gov aus durch jeffrey mit dem zweiten Eintrag übereinstimmt.

Ein häufiges Missverständnis besteht darin zu denken, dass bei einem angegebenen Benutzernamen alle Einträge, die explizit den Benutzer nennen, zuerst benutzt werden, wenn der Server versucht, eine Übereinstimmung für die Verbindung zu finden. Das stimmt schlicht nicht. Das vorherige Beispiel stellt das dar, wobei eine Verbindung von thomas.loc.gov aus durch jeffrey zuerst gerade nicht mit dem Eintrag übereinstimmt, der 'jeffrey' als User-Feldwert enthält, sondern mit dem Eintrag, der keinen Benutzernamen enthält!

Wenn Sie Probleme haben, sich mit dem Server zu verbinden, geben Sie die user-Tabelle aus und sortieren Sie sich von Hand, um zu sehen, wo die erste Übereinstimmung stattfindet.

5.2.9 Zugriffskontrolle, Phase 2: Anfrageüberprüfung

Wenn Sie erst einmal eine Verbindung hergestellt haben, geht der Server in Phase 2. Bei jeder Anfrage, die über diese Verbindung hereinkommt, prüft der Server, ob Sie ausreichende Berechtigungen haben, sie auszuführen, wobei es auf die Operation ankommt, die Sie ausführen wollen. Hier kommen die Berechtigungsfelder der Berechtigungstabellen ins Spiel. Diese Berechtigungen können aus jeder der user-, db-, host-, tables_priv- oder columns_priv-Tabellen stammen. Die Berechtigungstabellen werden mit GRANT- und REVOKE-Befehlen verändert. See section 5.3.1 GRANT- und REVOKE-Syntax. (Hilfreich sind die Ausführungen unter section 5.2.5 Wie das Berechtigungssystem funktioniert, wo die Felder aufgelistet sind, die sich in jeder der Berechtigungstabellen finden.)

Die user-Tabelle gewährt Berechtigungen, die Ihnen auf globaler Ebene zugeordnet sind und die unabhängig von der gerade aktuellen Datenbank zutreffen. Wenn beispielsweise die user-Tabelle Ihnen die delete-Berechtigung gewährt, können Sie Zeilen aus jeder Datenbank auf dem Server-Host löschen! Mit anderen Worten: Berechtigungen in der user-Tabelle sind Superuser-Berechtigungen. Es ist klug, Berechtigungen in der user-Tabelle nur Superusern wie Server- oder Datenbankverwaltern zu gewähren. Bei anderen Benutzern sollten Sie Berechtigungen in der user-Tabelle auf 'N' gesetzt lassen und Berechtigungen nur auf Datenbank-Ebene gewähren, indem Sie die db- und host-Tabellen benutzen.

Die db- und host-Tabellen gewähren Datenbank-spezifische Berechtigungen. Werte in den Geltungsbereichs-Feldern können wie folgt festgelegt werden:

Die db- und host-Tabellen werden eingelesen und sortiert, wenn der Server hoch fährt (zur gleichen Zeit, wenn er die user-Tabelle einliest). Die db-Tabelle wird nach den Geltungsbereichs-Feldern Host, Db und User sortiert. Die host-Tabelle wird nach den Geltungsbereichs-Feldern Host und Db sortiert. Bei der user-Tabelle werden die spezifischsten Werte zuerst und die unspezifischsten Werte zuletzt einsortiert, und wenn der Server nach übereinstimmenden Einträgen sucht, benutzt er die erste Übereinstimmung, die er findet.

Die tables_priv- und columns_priv-Tabellen gewähren Tabellen- und Spalten-spezifische Berechtigungen. Werte in der Geltungsbereichs-Feldern können wie folgt festgelegt werden:

Die tables_priv- und columns_priv-Tabellen werden nach den Host-, Db- und User-Feldern sortiert. Das geschieht ähnlich wie das Sortieren der db-Tabelle, wenngleich das Sortieren einfacher ist, weil nur das Host-Feld Platzhalter enthalten darf.

Der Prozess der Anfragenüberprüfung ist weiter unten beschrieben. (Wenn Sie mit dem Quelltext für die Zugangsüberprüfung vertraut sind, werden Sie feststellen, dass die Beschreibung hier leicht vom im Code verwendeten Algorithmus abweicht. Die Beschreibung stellt dar, was der Code tatsächlich tut; sie weicht nur deshalb ab, um die Erklärung zu erleichtern.)

Bei Verwaltungsanfragen (shutdown, reload usw.) prüft der Server nur den user-Tabelleneintrag, weil das die einzige Tabelle ist, die Verwaltungsberechtigungen festlegt. Zugriff wird gewährt, wenn der Eintrag die verlangte Operation erlaubt, ansonsten wird er verweigert. Wenn Sie zum Beispiel mysqladmin shutdown ausführen wollen, aber Ihr user-Tabelleneintrag Ihnen nicht die shutdown-Berechtigung gewährt, wird der Zugriff verweigert, ohne dass die db- oder host-Tabellen geprüft werden. (Sie enthalten keine Shutdown_priv-Spalte, daher gibt es keinen Grund, sie zur Prüfung heranzuziehen.)

Bei Datenbank-bezogenen Anfragen (insert, update usw.) prüft der Server zuerst die globalen (superuser-) Berechtigungen, indem er im user-Tabelleneintrag nachsieht. Wenn der Eintrag die verlangte Operation erlaubt, wird der Zugriff gewährt. Wenn die globalen Berechtigungen in der user-Tabelle unzureichend sind, stellt der Server die Datenbank-spezifischen Berechtigungen des Benutzers fest, indem er die db- und host-Tabellen prüft:

  1. Der Server sieht in der db-Tabelle nach einer Übereinstimmung in den Host-, Db- und User-Feldern nach. In den Host- und User-Feldern wird nach Übereinstimmung mit dem Hostnamen gesucht, von dem aus sich der Benutzer verbindet, und nach Übereinstimmung mit dem MySQL-Benutzernamen. Im Db-Feld wird nach Übereinstimmung mit der Datenbank gesucht, mit der sich der Benutzer verbinden will. Wenn es keinen Eintrag für Host und User gibt, wird der Zugriff verweigert.
  2. Wenn es keinen übereinstimmenden db-Tabelleneintrag gibt und das Host-Feld nicht leer ist, bestimmt dieser Eintrag die Datenbank-spezifischen Berechtigungen des Benutzers.
  3. Wenn das Host-Feld des übereinstimmenden db-Tabelleneintrags leer ist, bedeutet das, dass die host-Tabelle festlegt, welchen Hosts Zugriff auf die Datenbank erlaubt werden soll. In diesem Fall schlägt der Server weiter in der host-Tabelle nach, um eine Übereinstimmung in den Host- und Db-Feldern zu finden. Wenn kein host-Tabelleneintrag passt, wird der Zugriff verweigert. Bei einer Übereinstimmung werden die Datenbank-spezifischen Berechtigungen des Benutzers als Schnittmenge (nicht Vereinigungsmenge!) der Berechtigungen in den db- und host-Tabelleneinträgen berechnet, was die Berechtigungen ergibt, die in beiden Einträgen 'Y' sind. (Auf diese Weise können Sie allgemeine Berechtigungen in den db-Tabelleneinträgen vergeben und diese dann fallweise von Host zu Host beschränken, indem Sie die host-Tabelleneinträge benutzen.)

Nachdem die Datenbank-spezifischen Berechtigungen festgestellt wurden, die durch die db- und host-Tabelleneinträge gewährt werden, fügt der Server diese zu den globalen Berechtigungen in der user-Tabelle hinzu. Wenn das Ergebnis die verlangte Operation erlaubt, wird der Zugriff gewährt. Ansonsten prüft der Server die Tabellen- und Spalten-Berechtigungen des Benutzers in den tables_priv- und columns_priv-Tabellen und fügt diese zu den Benutzerberechtigungen hinzu. Aus dem Ergebnis ergibt sich, ob der Zugriff erlaubt oder verweigert wird.

Als Boole'scher Term ausgedrückt kann die vorstehende Beschreibung der Berechnung der Benutzerrechte wie folgt zusammengefasst werden:

globale Berechtigungen
ODER (Datenbankberechtigungen UND Hostberechtigungen)
ODER Tabellenberechtigungen
ODER Spaltenberechtigungen

Vielleicht ist es nicht offensichtlich, warum der Server bei anfänglich als unzureichend herausgefundenen globalen user-Eintragsberechtigungen für die verlangte Operation diese Berechtigungen anschließend zu den Datenbank-, Tabellen- und Spalten-spezifischen Berechtigungen hinzuzählt. Der Grund liegt darin, dass eine Anfrage möglicherweise mehr als eine Sorte von Berechtigungen erfordert. Wenn Sie beispielsweise ein INSERT ... SELECT-Statement ausführen, brauchen Sie eventuell sowohl die insert- als auch die select-Berechtigung. Ihre Berechtigungen mögen so sein, dass der user-Tabelleneintrag eine Berechtigung enthält und der db-Tabelleneintrag die andere. In diesem Fall haben Sie die notwendigen Berechtigungen, die Anfrage auszuführen, aber das Server kann das nicht aus nur einer der beiden Tabellen heraus erkennen, sondern muss dafür die Einträge beider Tabellen kombinieren.

Die host-Tabelle kann benutzt werden, um eine Liste sicherer Server zu pflegen.

Bei TcX enthält die host-Tabelle eine Liste aller Maschine des lokalen Netzwerks. Diesen werden alle Berechtigungen gewährt.

Sie können die host-Tabelle auch dazu benutzen, die Host aufzuführen, die nicht sicher sind. Nehmen Sie an, Sie haben eine Maschine oeffentlich.ihre.domaene, die an einem öffentlichen Ort ist, den Sie als nicht sicher erachten. Sie können allen Hosts in Ihrem Netzwerk Zugriff gewähren ausser dieser Maschine, indem Sie die host-Tabelleneinträge wie folgt benutzen:

+--------------------------+----+-
| Host                     | Db | ...
+--------------------------+----+-
| oeffentlich.ihre.domane  | %  | ... (alle Berechtigungen auf 'N' gesetzt)
| %.ihre.domaene           | %  | ... (alle Berechtigungen auf 'Y' gesetzt)
+--------------------------+----+-

Natürlich sollten Sie Ihre Einträge in die Berechtigungstabellen immer testen (indem Sie zum Beispiel mysqlaccess benutzen), um sicherzustellen, dass Ihre Zugriffsberechtigungen tatsächlich so gesetzt sind, wie Sie denken.

5.2.10 Gründe für Access denied-Fehler

Wenn Sie beim Verbindungsversuch zu einem MySQL-Server Access denied-Fehler bekommen, gibt Ihnen die folgende Liste ein paar Hinweise, das Problem zu beheben:

5.3 MySQL-Benutzerkonten-Verwaltung

5.3.1 GRANT- und REVOKE-Syntax

GRANT berechtigung_art [(spalten_liste)] [, berechtigung_art [(spalten_liste)] ...]
    ON {tabelle | * | *.* | datenbank.*}
    TO benutzername [IDENTIFIED BY 'passwort']
        [, benutzername [IDENTIFIED BY 'passwort'] ...]
    [REQUIRE 
    	[{SSL| X509}] 
	[CIPHER cipher [AND]] 
	[ISSUER issuer [AND]] 
	[SUBJECT subject]]
    [WITH GRANT OPTION]

REVOKE berechtigung_art [(spalten_liste)] [, berechtigung_art [(spalten_liste)] ...]
    ON {tabelle | * | *.* | datenbank.*}
    FROM benutzername [, benutzername ...]

GRANT ist implementiert ab MySQL Version 3.22.11. Bei früheren MySQL-Versionen bewirkt das GRANT-Statement nichts.

Die GRANT- und REVOKE-Befehle erlauben Systemverwaltern, Benutzer anzulegen und MySQL-Benutzern Rechte auf vier Berechtigungsebenen zu gewähren und zu entziehen:

Globale Ebene
Globale Berechtigungen betreffen alle Datenbanken auf einem gegebenen Server. Diese Berechtigungen werden in der mysql.user-Tabelle gespeichert.
Datenbank-Ebene
Datenbank-Berechtigungen betreffen alle Tabellen in einer gegebenen Datenbank. Diese Berechtigungen werden in den mysql.db- und mysql.host-Tabellen gespeichert.
Tabellen-Ebene
Tabellen-Berechtigungen betreffen alle Spalten in einer gegebenen Tabelle. Diese Berechtigungen werden in der mysql.tables_priv-Tabelle gespeichert.
Spalten-Ebene
Spalten-Berechtigungen betreffen einzelne Spalten in einer gegebenen Tabelle. Diese Berechtigungen werden in der mysql.columns_priv-Tabelle gespeichert.

Wenn Sie ein GRANT für einen Benutzer angeben, den es nicht gibt, wird dieser Benutzer erzeugt. Beispiele, wie GRANT funktioniert, finden Sie unter section 5.3.5 Neue MySQL-Benutzer hinzufügen.

Bei GRANT und REVOKE-Statements kann berechtigung_art wie folgt angegeben werden:

ALL PRIVILEGES      FILE                RELOAD
ALTER               INDEX               SELECT
CREATE              INSERT              SHUTDOWN
DELETE              PROCESS             UPDATE
DROP                REFERENCES          USAGE

ALL ist ein Synonym für ALL PRIVILEGES. REFERENCES ist noch nicht implementiert. USAGE ist momentan ein Synonym für ``keine Berechtigungen''. Es kann benutzt werden, um einen Benutzer zu erzeugen, der keine Berechtigungen hat.

Um einem Benutzer die grant-Berechtigung zu entziehen, benutzen Sie einen berechtigung_art-Wert GRANT OPTION:

REVOKE GRANT OPTION ON ... FROM ...;

Die einzigen berechtigung_art-Werte, die Sie für eine Tabelle festlegen können, sind SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, INDEX und ALTER.

Die einzigen berechtigung_art-Werte, die Sie für eine Spalte festlegen können (im Falle, dass Sie eine spalten_liste-Klausel benutzen), sind SELECT, INSERT und UPDATE.

Sie können globale Berechtigungen setzen, indem Sie die ON *.*-Syntax benutzen. Datenbank-Berechtigungen setzen Sie mit der ON datenbank.*-Syntax. Wenn Sie ON * setzen und eine aktuelle Datenbank ausgewählt haben, setzen Sie die Berechtigungen für diese Datenbank. (ACHTUNG: Wenn Sie ON * festlegen und keine aktuelle Datenbank ausgewählt haben, betrifft das die globalen Berechtigungen!)

Um die Rechtegewährung für Benutzer von uneindeutigen Hosts aus zu ermöglichen, unterstützt MySQL den benutzername-Wert in der Form benutzer@host. Wenn Sie eine user-Zeichenkette festlegen wollen, die Sonderzeichen enthält (wie `-'), oder eine host-Zeichenkette, die Sonderzeichen oder Platzhalterzeichen enthält (wie `%'), können Sie Benutzernamen oder Hostnamen in Anführungszeichen setzen (beispielsweise 'test-benutzer'@'test-hostname').

Sie können im Hostnamen Platzhalter angeben. benutzer@"%.loc.gov" zum Beispiel trifft auf benutzer für jeden Host in der Domäne loc.gov zu. benutzer@"144.155.166.%" trifft auf benutzer für jeden Host im 144.155.166-Class-C-Subnetz zu.

Die einfache Form benutzer ist ein Synonym für benutzer@"%". ACHTUNG: Wenn Sie anonymen Benutzern erlauben, sich mit dem MySQL-Server zu verbinden (was vorgabemäßig der Fall ist), sollten Sie auch alle lokalen Benutzer als benutzer@localhost hinzufügen, weil ansonsten der Eintrag für den anonymen Benutzer für den lokalen Host in der mysql.user-Tabelle benutzt wird, wenn der Benutzer versucht, sich von der lokalen Maschine in den MySQL-Server einzuloggen! Anonyme Benutzer werden definiert, indem Einträge mit User='' in die mysql.user-Tabelle eingefügt werden. Das können Sie mit folgender Anfrage überprüfen:

mysql> SELECT Host,User FROM mysql.user WHERE User='';

Momentan unterstützt GRANT nur Host-, Datenbank-, Tabellen- und Spaltennamen mit maximal 60 Zeichen. Ein Benutzername kann bis zu 16 Zeichen lang sein.

Die Berechtigungen für eine Tabelle oder Spalte werden durch ein logisches ODER der Berechtigungen auf jeder der vier Berechtigungsebenen zusammen gesetzt. Wenn die mysql.user-Tabelle beispielsweise festlegt, dass ein Benutzer eine globalen select-Berechtigung hat, kann diese nicht durch Einträge auf Datenbank-, Tabellen- oder Spaltenebene widerrufen werden.

Die Berechtigungen für eine Spalte können wie folgt berechnet werden:

Globale Berechtigungen
ODER (Datenbank-Berechtigungen UND Host-Berechtigungen)
ODER Tabellen-Berechtigungen
ODER Spalten-Berechtigungen

In den meisten Fällen können Sie einem Benutzer Rechte auf lediglich einer der Berechtigungsebenen gewähren, wodurch das Leben nicht so kompliziert ist wie oben dargestellt. Die Details der Prozedur zur Überprüfung der Berechtigungen sind in section 5.2 Allgemeine Sicherheitsthemen und das MySQL-Zugriffsberechtigungssystem dargestellt.

Wenn Sie Berechtigungen für eine Benutzer-/Hostname-Kombination gewähren, die in der mysql.user-Tabelle nicht existiert, wird ein Eintrag hinzugefügt und verbleibt dort, bis der mit einem DELETE-Befehl gelöscht wird. Mit anderen Worten: GRANT kann eventuell user-Tabelleneinträge erzeugen, aber REVOKE entfernt diese nicht, sondern Sie müssen das explizit mit DELETE machen.

Ab MySQL-Version 3.22.12 wird, wenn ein neuer Benutzer erzeugt wird oder wenn Sie globale Grant-Berechtigungen haben, das Passwort des Benutzers durch die IDENTIFIED BY-Klausel festgelegt, wenn eine angegeben wird. Wenn der Benutzer bereits ein Passwort hat, wird es durch das neue ersetzt.

ACHTUNG: Wenn Sie einen neuen Benutzer anlegen, aber keine IDENTIFIED BY-Klausel angeben, hat der neue Benutzer kein Passwort. Das ist unsicher.

Passwörter können auch mit dem SET PASSWORD-Befehl gesetzt werden. See section 6.5.6 SET-Syntax.

Wenn Sie Berechtigungen für eine Datenbank gewähren, wird ein Eintrag in der mysql.db-Tabellen erzeugt, falls notwendig. Wenn alle Berechtigungen für die Datenbank mit REVOKE widerrufen wurden, wird dieser Eintrag gelöscht.

Wenn ein Benutzer überhaupt keine Berechtigungen auf eine Tabelle hat, wird die Tabelle nicht angezeigt, wenn der Benutzer nach einer Liste von Tabellen anfragt (zum Beispiel mit einem SHOW TABLES-Statement).

Die mit GRANT OPTION-Klausel gibt dem Benutzer die Möglichkeit, anderen Benutzern jegliche der Berechtigungen zu vergeben, die der Benutzer auf der angegebenen Berechtigungsebene hat. Sie sollten vorsichtig damit sein, wem Sie die grant-Berechtigung geben, denn zwei Benutzer mit unterschiedlichen Berechtigungen können in der Lage sein, Ihre Berechtigungen zu addieren!

Sie können einem Benutzer keine Berechtigung gewähren, die Sie selbst nicht haben; die grant-Berechtigung erlaubt Ihnen nur, die Berechtigungen zu vergeben, die Sie selbst besitzen.

Wenn Sie einem Benutzer die grant-Berechtigung auf einer bestimmten Berechtigungsebene geben, denken Sie daran, dass der Benutzer jegliche Berechtigungen, die der Benutzer schon besitzt (oder die ihm in Zukunft gewährt werden!), auf dieser Ebene auch an andere Benutzer gewährt werden können. Nehmen Sie an, Sie gewähren einem Benutzer die insert-Berechtigung auf eine Datenbank. Wenn Sie danach die select-Berechtigung auf die Datenbank mit WITH GRANT OPTION gewähren, kann der Benutzer nicht nur die select-Berechtigung weiter geben, sondern auch insert. Wenn Sie dem Benutzer danach die update-Berechtigung auf die Datenbank gewähren, kann der Benutzer insgesamt insert, select und update weiter geben.

Sie sollten einem normalen Benutzer keine alter-Berechtigung gewähren. Wenn Sie das tun, kann der Benutzer versuchen, das Berechtigungssystem zu unterlaufen, indem er Tabellen umbenennt!

Beachten Sie: Wenn Sie Tabellen- oder Spalten-Berechtigungen auch nur für einen Benutzer gewähren, untersucht der Server Tabellen- und Spalten-Berechtigungen für alle Benutzer. Dadurch wird MySQL etwas langsamer.

Wenn mysqld startet, werden alle Berechtigungen in den Speicher eingelesen. Datenbank-, Tabellen- und Spalten-Berechtigungen werden sofort wirksam. Berechtigungen auf Benutzerebene werden wirksam, wenn sich der Benutzer das nächste Mal verbindet. Änderungen in den Berechtigungstabellen, die Sie mit GRANT oder REVOKE durchführen, werden vom Server sofort bemerkt. Wenn Sie Berechtigungstabellen manuell ändern (mit INSERT, UPDATE usw.), müssen Sie ein FLUSH PRIVILEGES-Statement ausführen oder mysqladmin flush-privileges laufen lassen, um den Server zu veranlassen, die Berechtigungstabellen neu zu laden. See section 5.3.3 Wann Berechtigungsänderungen wirksam werden.

Die größten Unterschiede zwischen ANSI SQL und MySQL-Versionen von GRANT sind:

----------- MySQL unterstützt SSL-verschlüsselte Verbindungen. Um zu verstehen, wie MySQL SSL benutzt, müssen wir einige Grundlagen von SSL und X509 erläutern. Leute, die damit schon vertraut sind, können dieses Kapitel überspringen.

Vorgabemäßig benutzt MySQL unverschlüsselte Verbindungen zwischen Client und Server. Das heißt, dass jeder auf dem Weg dazwischen lauschen und Ihre Daten, die übertragen werden, mitlesen kann. Darüber hinaus könnten einige Leute auch den Inhalt von Daten ändern, die zwischen Client und Server ausgetauscht werden. Möglicherweise haben Sie auch wirklich geheime Daten über öffentliche Netzwerke zu übertragen, und eine Öffentlichkeit solcher Art ist unakzeptabel.

SSL ist ein Protokoll, das unterschiedliche Verschlüsselungsalgorithmen benutzt, um sicherzustellen, dass Daten aus einem öffentlichen Netzwerk vertraut werden kann. Es besitzt Mechanismen, um Veränderungen, Verlust oder wiederholtes Abspielen (Replay) von Daten zu entdecken. SSL enthält auch Algorithmen, um die Identität zu erkennen und zu überprüfen, indem der X509-Standard benutzt wird.

Mittels Verschlüsselung werden jegliche Arten von Daten unlesbar gemacht. Darüber hinaus werden in der heutigen Praxis Verschlüsselungsalgorithmen viele weitere Elemente hinzugefügt. Sie sollten vielen Arten bekannter Angriffe widerstehen, wie dem Herumspielen mit der Reihenfolge verschlüsselter Nachrichten oder dem doppelten Abspielen (Replay) von Daten.

X509 ist der Standard, der es ermöglicht, jemanden im Internet zu identifizieren. Er wird meistens beim E-Commerce über das Internet benutzt. Kurz gesagt sollte es ein Unternehmen namens "Zertifizierungsautorität" geben, die jedem elektronische Zertifikate zuordnet, der diese braucht. Zertifikate beruhen auf asymmetrischen Verschlüsselungsalgorithmen, die zwei Verschlüsselungsschlüssel haben - öffentlichen und geheimen. Zertifikatsbesitzer können ihre Identität jeder anderen Seite beweisen. Zertifikate beinhalten den öffentlichen Schlüssel des Besitzers. Alle Daten, die damit verschlüsselt werden, können nur vom Besitzer des geheimen Schlüssels entschlüsselt werden.

Frage: Warum benutzt MySQL nicht standardmäßig verschlüsselte Verbindungen? Antwort: Weil es MySQL langsamer macht. Jede zusätzliche Funktionalität erfordert, dass ein Computer zusätzliche Arbeit verrichtet, und das Verschlüsseln von Daten ist eine CPU-intensive Operation, die leicht die Zeit und Leistung übertreffen kann, die MySQL selbst verbraucht und benötigt. MySQL ist vorgabemäßig auf Geschwindigkeit optimiert. Frage: Ich brauche mehr Informationen über SSL / X509 / Verschlüsselung usw. Antwort: Benutzen Sie Ihre bevorzugte Internet-Suchmaschine und suchen Sie nach den Schlüsselwörtern, die Sie interessieren.

MySQL kann x509-Zertifikat-Attribute prüfen, zusätzlich zum meist benutzten Benutzername-/Passwort-Schema. Alle gewöhnlich Optionen werden immer noch benötigt (Benutzername, Passwörter, IP-Adressmaske, Datenbank-/Tabellenname).

Es gibt verschiedene Möglichkeiten, Verbindungen zu begrenzen:

-----------

5.3.2 MySQL-Benutzernamen und -Passwörter

Es gibt mehrere Unterschiede in der Art, wie Benutzernamen und Passwörter von MySQL benutzt werden, und der Art, wie sie von Unix oder Windows benutzt werden:

MySQL-Benutzer und ihre Berechtigungen werden normalerweise mit dem GRANT-Befehl erzeugt. See section 5.3.1 GRANT- und REVOKE-Syntax.

Wenn Sie sich an einem MySQL-Server mit einem Kommandozeilen-Client anmelden, sollten Sie das Passwort mit --password=ihr-passwort eingeben. See section 5.2.7 Verbinden mit dem MySQL-Server.

mysql --user=monty --password=rate_mal datenbankname

Wenn Sie möchten, dass der Client eine Eingabeaufforderung für das Passwort präsentiert, sollten Sie --password ohne Argument benutzen.

mysql --user=monty --password datenbankname

Oder in der kurzen Form:

mysql -u monty -p datenbankname

Beachten Sie, dass in den letzten Beispielen 'datenbankname' NICHT das Passwort ist.

Wenn Sie die -p-Option zur Eingabe des Passworts benutzen wollen, tun Sie das wie folgt:

mysql -u monty -prate_mal datenbankname

Auf einigen Systemen kürzt die Bibliothek, die MySQL benutzt, um die Eingabeaufforderung für das Passwort auszugeben, das Passwort auf 8 Zeichen. Intern hat MySQL keine Beschränkung hinsichtlich der Länge des Passworts.

5.3.3 Wann Berechtigungsänderungen wirksam werden

Wenn mysqld startet, werden alle Berechtigungstabelleninhalte in den Arbeitsspeicher eingelesen und werden zu diesem Zeitpunkt wirksam.

Änderungen in den Berechtigungstabellen, die mit GRANT, REVOKE oder SET PASSWORD durchgeführt werden, werden unmittelbar vom Server bemerkt.

Wenn Sie die Berechtigungstabellen manuell ändern (mit INSERT, UPDATE usw.), müssen Sie ein FLUSH PRIVILEGES-Statement ausführen oder mysqladmin flush-privileges oder mysqladmin reload laufen lassen, um den Server anzuweisen, die Berechtigungstabellen neu einzulesen. Ansonsten haben Ihre Änderungen keine Auswirkung, bis Sie den Server neu starten. Wenn Sie die Berechtigungstabellen manuell ändern, aber vergessen, die Berechtigungen neu zu laden, werden Sie sich wundern, warum trotz Ihrer Änderungen kein Unterschied zu bemerken ist!

Wenn der Server bemerkt, dass sich die Berechtigungstabellen geändert haben, werden bestehende Client-Verbindungen wie folgt davon betroffen:

Globale Berechtigungsänderungen und Passwortänderungen werden beim nächsten Mal wirksam, wenn sich der Client verbindet.

5.3.4 Einrichtung der anfänglichen MySQL-Berechtigungen

Nach der Installation von MySQL konfigurieren Sie die anfänglichen Zugriffsberechtigungen, indem Sie scripts/mysql_install_db laufen lassen. See section 3.3.1 Schnellinstallation, Überblick. Das mysql_install_db-Skript startet den mysqld-Server und initialisiert dann die Berechtigungstabellen, so dass diese folgenden Satz an Berechtigungen enthalten:

HINWEIS: Die vorgabemäßigen Berechtigungen sind unter Windows anders. See section 3.6.2.3 MySQL auf Windows laufen lassen.

Weil Ihre Installation anfangs weit offen ist, sollten Sie als eins der ersten Dinge ein Passwort für den MySQL-root-Benutzer anlegen. Das können Sie wie folgt tun (beachten Sie, dass das Passwort mit der PASSWORD()-Funktion angegeben wird):

shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('neues_passwort')
           WHERE user='root';
mysql> FLUSH PRIVILEGES;

Ab MySQL-Version 3.22 können Sie das SET PASSWORD-Statement benutzen:

shell> mysql -u root mysql
mysql> SET PASSWORD FOR root=PASSWORD('neues_passwort');

Eine weitere Möglichkeit, das Passwort zu setzen, besteht in der Benutzung des mysqladmin-Befehls:

shell> mysqladmin -u root password neues_passwort

Nur Benutzer mit Schreib-/Aktualisierungszugriff auf die mysql-Datenbank können das Passwort für andere Benutzer ändern. Alle normalen Benutzer (nicht anonyme Benutzer) können nur ihr eigenes Passwort ändern, entweder mit einem der obigen Befehle oder mit SET PASSWORD=PASSWORD('neues_passwort').

Denken Sie daran, wenn Sie das Passwort in der user-Tabelle direkt mit der ersten Methode ändern, dass Sie den Server anweisen müssen, die Berechtigungstabellen neu einzulesen (mit FLUSH PRIVILEGES), weil die Änderungen ansonsten nicht wahrgenommen werden.

Sobald das root-Passwort gesetzt wurde, müssen Sie in der Folge immer das Passwort angeben, wenn Sie sich als root mit dem Server verbinden.

Eventuell wollen Sie das root-Passwort leer lassen, damit Sie es für die weitere Konfiguration oder für Tests nicht angeben müssen. Stellen Sie jedoch sicher, dass Sie es setzen, bevor Sie Ihre Installation für irgend welche Produktionsaufgaben benutzen.

Sehen Sie im scripts/mysql_install_db-Skript nach, wie es die vorgabemäßigen Berechtigungen installiert. Sie können das als Grundlage für das Hinzufügen weiterer Benutzer nehmen.

Wenn Sie wollen, dass die anfänglichen Berechtigungen anders sind als die gerade beschriebenen, können Sie mysql_install_db abändern, bevor Sie es benutzen.

Um die Berechtigungstabellen komplett neu zu erzeugen, entfernen Sie alle `.frm'-, `.MYI'- und `.MYD'-Dateien im Verzeichnis, das die mysql-Datenbank enthält. (Das ist das Verzeichnis namens `mysql' unter dem Datenbank-Verzeichnis, was aufgelistet wird, wenn Sie mysqld --help laufen lassen.) Lassen Sie dann das mysql_install_db-Skript laufen, eventuell nachdem Sie es editiert haben, um die Berechtigungen zu enthalten, die Sie haben wollen.

HINWEIS: Bei MySQL-Versionen vor Version 3.22.10 sollten Sie die `.frm'-Dateien NICHT löschen. Wenn Sie das versehentlich doch tun, müssen Sie sie aus Ihrer MySQL-Distribution zurück kopieren, bevor Sie mysql_install_db laufen lassen.

5.3.5 Neue MySQL-Benutzer hinzufügen

Sie können Benutzer auf zwei Arten hinzufügen: Indem Sie GRANT-Statements verwenden oder indem Sie die MySQL-Berechtigungstabellen direkt verändern. Die bevorzugte Methode ist, GRANT-Statements zu benutzen, denn sie sind präziser und weniger fehleranfällig. See section 5.3.1 GRANT- und REVOKE-Syntax.

Ausserdem gibt es eine Menge von Dritten beigesteuerte Programme wie phpmyadmin, die benutzt werden können, um Benutzer zu erzeugen und zu verwalten. See section D Beigesteuerte Programme.

Die unten stehenden Beispiele zeigen, wie man den mysql-Client benutzt, um neue Benutzer zu erzeugen. Die Beispiele setzen voraus, dass Berechtigungen mit den Vorgabewerten eingerichtet wurden, die im vorherigen Abschnitt beschrieben wurden. Um also Änderungen machen zu können, müssen Sie sich von derselben Maschine aus verbinden, wo mysqld läuft, und Sie müssen sich als MySQL-root-Benutzer verbinden, und der root-Benutzer muss die insert-Berechtigung für die mysql-Datenbank und die reload-Verwaltungsberechtigung haben. Wenn Sie bereits das root-Benutzerpasswort geändert haben, müssen Sie es für die unten stehenden mysql-Befehle eingeben.

Sie fügen neue Benutzer mit GRANT-Statements hinzu:

shell> mysql --user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost
           IDENTIFIED BY 'ein_passwort' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"
           IDENTIFIED BY 'ein_passwort' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO dummy@localhost;

Diese GRANT-Statements richten drei neue Benutzer ein:

monty
Einen echten Superuser, der sich von irgendwo her mit dem Server verbinden kann, aber das Passwort 'ein_passwort' dafür verwenden muss. Beachten Sie, dass man GRANT-Statements sowohl für monty@localhost als auch für monty@"%" verwenden muss. Wenn man keinen Eintrag mit localhost hinzufügt, hat der Eintrag für den anonymen Benutzer für localhost Vorrang, der durch mysql_install_db angelegt wird, wenn man sich vom lokalen Host aus verbindet, weil dieser einen spezifischeren Host-Feldwert hat und daher früher in der user-Tabellen-Sortierreihenfolge auftaucht.
admin
Ein Benutzer, der sich ohne Passwort von localhost aus verbinden kann und der die reload- und process- Verwaltungsberechtigungen hat. Das erlaubt dem Benutzt, die mysqladmin reload-, mysqladmin refresh- und mysqladmin flush-*-Befehle sowie mysqladmin processlist auszuführen. Es werden keine Datenbank-bezogenen Berechtigungen gewährt. (Diese können später gewährt werden, indem zusätzliche GRANT-Statements ausgeführt werden.)
dummy
Ein Benutzer, der sich ohne Passwort verbinden kann, aber nur vom lokalen Host aus. Die globalen Berechtigungen sind alle auf 'N' gesetzt - diese USAGE-Berechtigung erlaubt Ihnen, einen Benutzer ohne Berechtigungen anzulegen. Es wird angenommen, dass Sie später Datenbank-spezifische Berechtigungen gewähren.

Sie können dieselben Benutzerzugriffsinformationen direkt mittels INSERT-Statements eingeben und dann den Server anweisen, die Berechtigungstabellen neu zu laden:

shell> mysql --user=root mysql
mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('ein_passwort'),
                'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user VALUES('%','monty',PASSWORD('ein_passwort'),
                'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user SET Host='localhost',User='admin',
                 Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
                        VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;

Abhängig von Ihrer MySQL-Version müssen Sie oben eventuell eine andere Anzahl von 'Y'-Werten eingeben (Versionen vor Version 3.22.11 hatten weniger Berechtigungsspalten). Beim admin-Benutzer wird die besser lesbare INSERT-Syntax benutzt, die ab Version 3.22.11 verfügbar ist.

Beachten Sie, dass Sie für die Einrichtung eines Superusers lediglich einen user-Tabelleneintrag mit Berechtigungsfeldern einrichten müssen, die auf 'Y' gesetzt sind. Es sind keine db- oder host-Tabelleneinträge nötig.

The Berechtigungsspalten in der user-Tabelle wurden im letzten INSERT-Statement nicht explizit gesetzt (für den Benutzer dummy), daher erhalten diese Spalten ihren Vorgabewert von 'N'. Das ist dasselbe, was GRANT USAGE macht.

Das folgende Beispiel fügt einen Benutzer custom hinzu, der sich von localhost, server.domain und whitehouse.gov aus verbinden kann. Er will auf die bankkonto-Datenbank nur von localhost aus zugreifen, auf die spesen-Datenbank nur von whitehouse.gov aus und auf die kunde-Datenbank von allen drei Hosts aus. Er will von allen drei Hosts aus das Passwort dumm benutzen.

Um die Berechtigungen dieses Benutzers mit GRANT-Statements einzurichten, geben Sie folgende Befehle ein:

shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
           ON bankkonto.*
           TO custom@localhost
           IDENTIFIED BY 'dumm';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
           ON spesen.*
           TO custom@whitehouse.gov
           IDENTIFIED BY 'dumm';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
           ON kunde.*
           TO custom@'%'
           IDENTIFIED BY 'dumm';

Der Grund, warum wir Grant-Statements für den Benutzer 'custom' eingeben, ist, dass wir dem Benutzer Zugriff auf MySQL sowohl von der lokalen Maschine mit Unix-Sockets als auch von der entfernten Maschine 'whitehouse.gov' über TCP/IP geben wollen.

Um die Benutzerberechtigungen durch direkte Änderungen an den Berechtigungstabellen einzugeben, geben Sie folgende Befehle ein (beachten Sie das FLUSH PRIVILEGES am Ende):

shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
       VALUES('localhost','custom',PASSWORD('dumm'));
mysql> INSERT INTO user (Host,User,Password)
       VALUES('server.domain','custom',PASSWORD('dumm'));
mysql> INSERT INTO user (Host,User,Password)
       VALUES('whitehouse.gov','custom',PASSWORD('dumm'));
mysql> INSERT INTO db
       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
       VALUES
       ('localhost','bankkonto','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
       VALUES
       ('whitehouse.gov','spesen','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
       (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
       VALUES('%','kunde','custom','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;

Die ersten drei INSERT-Statements fügen user-Tabelleneinträge hinzu, die dem Benutzer custom erlauben, sich von den verschiedenen Hosts aus mit dem gegebenen Passwort zu verbinden, gewähren ihm aber keine Berechtigungen (alle Berechtigungen werden auf den Vorgabewert 'N' gesetzt). Die nächsten drei INSERT-Statements fügen db-Tabelleneinträge hinzu, die custom Berechtigungen für die bankkonto-, spesen- und kunde-Datenbanken gewähren, aber nur, wenn auf sie von den korrekten Hosts aus zugegriffen wird. Wie immer, wenn die Berechtigungstabellen direkt verändert werden, muss dem Server gesagt werden, dass er sie neu laden muss (mit FLUSH PRIVILEGES), damit die Berechtigungsänderungen wirksam werden.

Wenn Sie einem bestimmten Benutzer Zugriff von irgendeiner Maschine in einer gegebenen Domäne geben wollen, können Sie ein GRANT-Statement wie das folgende absetzen:

mysql> GRANT ...
           ON *.*
           TO benutzername@"%.domaene.de"
           IDENTIFIED BY 'passwort';

Um dasselbe durch direkte Änderung der Berechtigungstabellen einzugeben, machen Sie folgendes:

mysql> INSERT INTO user VALUES ('%.domaene.de', 'benutzername',
           PASSWORD('passwort'),...);
mysql> FLUSH PRIVILEGES;

Sie können auch xmysqladmin, mysql_webadmin und sogar xmysql benutzen, um die Werte in den Berechtigungstabellen einzufügen, zu ändern und zu aktualisieren. Sie finden diese Werkzeuge unter Contrib-Verzeichnis der MySQL-Website.

5.3.6 Limiting user resources

Starting from MySQL 4.0.2 one can limit certain resources per user.

So far, the only available method of limiting user usage of MySQL server resources has been setting the max_user_connections startup variable to a non-zero value. But this method is strictly global and does not allow for management of individual users, which could be of paricular interest to Internet Service Providers.

Therefore, management of three resources is introduced on the individual user level:

A user in the aforementioned context is a single entry in the user table, which is uniquely identified by its user and host columns.

All users are by default not limited in using the above resources, unless the limits are granted to them. These limits can be granted only via global GRANT (*.*), using this syntax:

GRANT ... WITH MAX_QUERIES_PER_HOUR = N1
               MAX_UPDATES_PER_HOUR = N2
               MAX_CONNECTIONS_PER_HOUR = N3;

One can specify any combination of the above resources. N1, N2 and N3 are integers and stands for count / hour.

If user reaches any of the above limits withing one hour, his connection will be terminated or refused and the appropriate error message shall be issued.

Current usage values for a particular user can be flushed (set to zero) by issuing a GRANT statement with any of the above clauses, including a GRANT statement with the current values.

Also, current values for all users will be flushed if privileges are reloaded (in the server or using mysqladmin reload) or if the FLUSH USER_RESOURCES command is issued.

The feature is enabled as soon as a single user is granted with any of the limiting GRANT clauses.

As a prerequisite for enabling this feature, the user table in the mysql database must contain the additional columns, as defined in the table creation scripts mysql_install_db and mysql_install_db.sh in `scripts' subdirectory.

5.3.7 Passwörter einrichten

In den meisten Fällen sollten Sie GRANT benutzen, um Ihre Benutzer / Passwörter einzurichten, daher trifft das folgende nur für fortgeschrittene Benutzer zu. See section 5.3.1 GRANT- und REVOKE-Syntax.

Die Beispiele in den vorherigen Abschnitten erläutern ein wichtiges Prinzip: Wenn Sie ein nicht leeres Passwort mit INSERT- oder UPDATE-Statements setzen, müssen Sie die PASSWORD()-Funktion benutzen, um es zu verschlüsseln. Das liegt daran, dass die user-Tabelle Passwörter in verschlüsselter Form speichert, nicht als Klartext. Wenn Sie diese Tatsache vergessen, ist es möglich, dass sie Passwörter wie folgt setzen:

shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password)
       VALUES('%','heinzholger','keks');
mysql> FLUSH PRIVILEGES;

Das Ergebnis ist, dass der Klartextwert 'keks' als Passwort in der user-Tabelle gespeichert ist. Wenn der Benutzer heinzholger versucht, sich mittels dieses Passworts mit dem Server zu verbinden, verschlüsselt der mysql-Client es mit PASSWORD(), erzeugt damit einen Authentifikationsvektor, der auf dem verschlüsselten Passwort und einer Zufallszahl basiert, die er vom Server erhält, und schickt das Ergebnis zum Server. Der Server benutzt den password-Wert in der user-Tabelle (den nicht verschlüsselten Wert 'keks'), um dieselben Berechnungen durchzuführen, und vergleicht die Ergebnisse. Der Vergleich schlägt fehl und der Server verweigert die Verbindung:

shell> mysql -u heinzholger -pkeks test
Access denied

Passwörter müssen verschlüsselt sein, wenn sie in die user-Tabelle eingefügt werden, daher hätte das INSERT-Statement also wie folgt formuliert sein müssen:

mysql> INSERT INTO user (Host,User,Password)
       VALUES('%','heinzholger',PASSWORD('keks'));

Sie müssen die PASSWORD()-Funktion auch benutzen, wenn Sie SET PASSWORD-Statements gebrauchen:

mysql> SET PASSWORD FOR heinzholger@"%" = PASSWORD('keks');

Wenn Sie Passwörter mit dem GRANT ... IDENTIFIED BY-Statement oder dem mysqladmin password-Befehl setzen, wird die PASSWORD()-Funktion nicht benötigt. Beide sorgen dafür, dass das Passwort verschlüsselt wird, daher würden Sie ein Passwort 'keks' wie folgt setzen:

mysql> GRANT USAGE ON *.* TO heinzholger@"%" IDENTIFIED BY 'keks';

oder

shell> mysqladmin -u heinzholger password keks

NOTE: PASSWORD() verschlüsselt Passwörter nicht auf dieselbe Art, wie das bei Unix-Passwörtern der Fall ist. Wenn daher Ihr Unix-Passwort und Ihr MySQL-Passwort identisch sind, sollten Sie daraus nicht schließen, dass PASSWORD() denselben Verschlüsselungswert ergibt wie der, der in der Unix-Passwortdatei gespeichert ist. See section 5.3.2 MySQL-Benutzernamen und -Passwörter.

5.3.8 Wie Sie Ihre Passwörter sicher halten

Es ist nicht ratsam, Ihr Passwort so einzugeben, dass es von anderen Benutzern entdeckt werden kann. Die verschiedenen Methoden, Passwörter bei der Benutzung von Client-Programmen einzugeben, sind unten aufgeführt, jeweils mit einer Einschätzung des Risikos der Methode:

Alles in allem sind die sichersten Methoden, das Passwort entweder durch Client-Programm entgegen nehmen zu lassen oder es in einer sauber abgesicherten `.my.cnf'-Datei einzugeben.

5.4 Katastrophenschutz und Wiederherstellung

5.4.1 Datenbank-Datensicherungen

Weil MySQL-Tabellen als Dateien gespeichert werden, ist es leicht, eine Datensicherung durchzuführen. Um eine konsistente Datensicherung zu erhalten, machen Sie ein LOCK TABLES auf die relevanten Tabellen, gefolgt von FLUSH TABLES für die Tabellen. See section 7.7.2 LOCK TABLES/UNLOCK TABLES-Syntax. See section 5.5.3 FLUSH-Syntax. Sie brauchen lediglich eine Lesesperre (Read Lock); das erlaubt anderen Threads, die Tabellen weiterhin abzufragen, während Sie eine Kopie der Dateien im Datenbank-Verzeichnis machen. FLUSH TABLE wird benötigt, um sicherzustellen, dass alle aktiven Indexseiten auf Platte zurück geschrieben werden, bevor Sie die Datensicherung beginnen.

Wenn Sie eine Tabellensicherung auf SQL-Ebene machen wollen, können Sie SELECT INTO OUTFILE oder BACKUP TABLE benutzen. See section 7.4.1 SELECT-Syntax. See section 5.4.2 BACKUP TABLE-Syntax.

Eine weitere Möglichkeit, eine Datenbank zu sichern, stellt die Benutzung des mysqldump-Programms oder des mysqlhotcopy-Skripts dar. See section 5.8.5 mysqldump, Tabellenstrukturen und -daten dumpen. See section 5.8.6 mysqlhotcopy, MySQL-Datenbanken und Tabellen kopieren.

  1. Machen Sie eine komplette Sicherung Ihrer Datenbanken:
    shell> mysqldump --tab=/pfad/zum/verzeichnis/ --opt --full
    
    or
    
    shell> mysqlhotcopy Datenbank /pfad/zum/verzeichnis/
    
    Sie können auch einfach alle Tabellendateien (`*.frm'-, `*.MYD'- und `*.MYI'-Dateien) kopieren, solange der Server nicht gerade etwas aktualisiert. Das Skript mysqlhotcopy benutzt diese Methode.
  2. Halten Sie mysqld an, wenn er läuft, und starten Sie ihn mit der --log-update[=datei]-Option. See section 5.9.3 Die Update-Log-Datei. Die Update-Log-Datei(en) gibt Ihnen die Information, die Sie dafür benötigen, um Änderungen an der Datenbank zu replizieren, die ab dem Zeitpunkt durchgeführt wurden, als Sie mysqldump ausführten.

Wenn Sie etwas wiederherstellen müssen, versuchen Sie zunächst, Ihre Tabellen mit REPAIR TABLE oder myisamchk -r wieder herzustellen. Das sollte in 99,9% aller Fälle funktionieren. Wenn myisamchk fehlschlägt, probieren Sie folgende Prozedur (das funktioniert nur, wenn Sie MySQL mit --log-update gestartet haben. See section 5.9.3 Die Update-Log-Datei.):

  1. Stellen Sie die originale mysqldump-Datensicherung wieder her.
  2. Führen Sie folgenden Befehl aus, um die Aktualisierungen (Updates) im Binär-Log noch einmal laufen zu lassen:
    shell> mysqlbinlog hostname-bin.[0-9]* | mysql
    
    Wenn Sie das Update-Log benutzen, können Sie folgendes machen:
    shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
    

ls wird benutzt, um alle Update-Log-Dateien in der richtigen Reihenfolge zu erhalten.

Mit SELECT * INTO OUTFILE 'datei' FROM tabelle können Sie auch selektive Datensicherungen herstellen und diese wieder herstellen mit LOAD DATA INFILE 'datei' REPLACE .... Um Duplikate zu vermeiden, benötigen Sie einen Primärschlüssel (PRIMARY KEY) oder einen eindeutigen Schlüssel (UNIQUE) in der Tabelle. Das Schlüsselwort REPLACE führt dazu, dass alte Datensätze durch neue ersetzt werden, wenn ein neuer Datensatz einen alten auf einem eindeutigen Schlüsselwert duplizieren würde.

Wenn Sie bei der Datensicherung auf Ihrem System Performance-Probleme bekommen, können Sie diese lösen, indem Sie Replikation einrichten und die Datensicherungen auf dem Slave statt auf dem Master durchführen. See section 5.10.1 Einführung in die Replikation.

Wenn Sie ein Veritas-Dateisystem benutzen, können Sie folgendes tun:

  1. Führen Sie einen Client- (Perl ?) FLUSH TABLES mit READ LOCK aus.
  2. Forken Sie eine Shell oder führen Sie einen anderen Client aus mount vxfs snapshot.
  3. Führen Sie im ersten Client UNLOCK TABLES aus.
  4. Kopieren Sie die Dateien von snapshot
  5. Unmounten Sie snapshot

5.4.2 BACKUP TABLE-Syntax

BACKUP TABLE tabelle[,tabelle...] TO '/pfad/zum/backup/verzeichnis'

Machen Sie eine Kopie aller Tabellendateien ins Datensicherungsverzeichnis, was die Mindestanforderung für die Wiederherstellung darstellt. Momentan funktioniert das nur bei MyISAM-Tabellen. Bei MyISAM-Tabellen kopiert man .frm- (Definition) und .MYD- (Daten) Dateien. Die Indexdatei kann aus diesen beiden aufgebaut werden.

Bevor Sie diesen Befehl ausführen, sehen Sie bitte unter section 5.4.1 Datenbank-Datensicherungen nach.

Während der Datensicherung gilt eine Lesesperre (Read Lock) für jede Tabelle, eine nach der anderen, während sie gesichert werden. Wenn Sie mehrere Tabellen als Schnappschuss sichern wollen, müssen Sie zuerst ein LOCK TABLES ausführen, das eine Lesesperre für jede Tabelle in der zu sichernden Gruppe enthält.

Der Befehl gibt eine Tabelle mit folgenden Spalten zurück:

Spalte Wert
Table Tabellenname
Op Immer ``backup''
Msg_type status, error, info oder warning.
Msg_text Die Meldung.

Beachten Sie, dass BACKUP TABLE erst ab MySQL 3.23.25 verfügbar ist.

5.4.3 RESTORE TABLE-Syntax

RESTORE TABLE tabelle[,tabelle...] FROM '/pfad/zum/backup/verzeichnis'

Stellt die Tabelle(n) aus der Datensicherung her, die mit BACKUP TABLE gesichert wurde(n). Bestehende Tabellen werden nicht überschrieben; wenn Sie über bestehende Tabellen wiederherstellen wollen, erhalten Sie eine Fehlermeldung. RESTORE benötigt länger als Datensicherung, weil der Index neu aufgebaut werden muss. Je mehr Schlüssel Sie haben, desto länger dauert es. Genau wie BACKUP TABLE funktioniert RESTORE momentan nur mit MyISAM-Tabellen.

Der Befehl gibt eine Tabelle mit folgenden Spalten zurück:

Spalte Wert
Table Tabellenname
Op Immer ``restore''
Msg_type status, error, info oder warning.
Msg_text Die Meldung.

5.4.4 CHECK TABLE-Syntax

CHECK TABLE tabelle[,tabelle...] [option [option...]]

option = QUICK | FAST | MEDIUM | EXTENDED | CHANGED

CHECK TABLE funktioniert nur bei MyISAM-Tabellen. Bei MyISAM-Tabellen ist es dasselbe, wie myisamchk -m tabelle über die Tabelle laufen zu lassen.

Wenn Sie keine Option angeben, wird MEDIUM benutzt.

Prüft die Tabelle(n) auf Fehler. Bei MyISAM-Tabellen werden die Schlüssel-Statistiken aktualisiert. Der Befehl gibt eine Tabelle mit folgenden Spalten zurück:

Spalte Wert
Table Tabellenname
Op Immer ``check''.
Msg_type status, error, info oder warning.
Msg_text Die Meldung.

Beachten Sie, dass Sie viele Zeilen an Information für jede geprüfte Tabelle erhalten. Die letzte Zeile enthält den Msg_type status und sollte normalerweise OK sein. Wenn Sie nicht OK erhalten, oder Not checked, sollten Sie im Normalfall eine Reparatur der Tabelle durchführen. See section 5.4.6 Benutzung von myisamchk für Tabellenwartung und Absturzreparatur. Not checked bedeutet, dass bei der Tabelle der angegebene TYPE MySQL mitgeteilt hat, dass es keinerlei Notwendigkeit gab, die Tabelle zu prüfen.

Die unterschiedlichen Prüfoptionen stehen für folgendes:

Option Bedeutung
QUICK Keine Zeilen nach falschen Verknüpfungen (Links) durchsehen (scannen).
FAST Nur Tabellen prüfen, die nicht ordnungsgemäß geschlossen wurden.
CHANGED Nur Tabellen prüfen, die seit der letzten Prüfung geändert wurden oder die nicht ordnungsgemäß geschlossen wurden.
MEDIUM Zeilen durchsehen (scannen), um zu bestätigen, dass gelöschte Verknüpfungen (Links) in Ordnung sind. Diese Option berechnet auch eine Schlüssel-Prüfsumme für die Zeilen und bestätigt diese mit einer berechneten Prüfsumme für die Schlüssel.
EXTENDED Schlägt komplett alle Schlüssel für jede Zeile nach (Lookup). Hierdurch wird sichergestellt, dass die Tabelle 100% konsistent ist, aber das benötigt lange Zeit!

Bei MyISAM-Tabellen dynamischer Größe führt eine Prüfung immer eine MEDIUM-Prüfung durch. Bei Zeilen statischer Länge wird das Durchsehen (Scan) der Zeilen durch QUICK und FAST übersprungen, weil solche Zeilen sehr selten beschädigt sind.

Sie können Prüfoptionen wie folgt kombinieren:

CHECK TABLE test_tabelle FAST QUICK;

Das würde nur eine QUICK-Prüfung der Tabelle durchführen, wenn diese nicht ordnungsgemäß geschlossen worden wäre.

HINWEIS: In einigen Fällen kann CHECK TABLE zu einer Änderung der Tabelle führen! Das geschieht, wenn die Tabelle als 'beschädigt' oder 'nicht ordnungsgemäß geschlossen' gekennzeichnet ist, aber CHECK TABLE keine Probleme in der Tabelle gefunden hat. In diesem Fall kennzeichnet CHECK TABLE die Tabelle als in Ordnung.

Wenn eine Tabelle beschädigt ist, liegt das Problem höchst wahrscheinlich in den Indexen und nicht im Daten-Teil. Alle oben genannten Prüfoptionen prüfen die Indexe gründlich und sollten daher die meisten Fehler finden.

Wenn Sie lediglich eine Tabelle prüfen wollen, von der Sie annehmen, dass sie in Ordnung ist, sollten Sie keine Prüfoptionen oder die QUICK-Option angeben. Letztere sollte benutzt werden, wenn Sie es eilig haben und das sehr geringe Risiko auf sich nehmen können, dass QUICK keinen Fehler in der Daten-Datei findet. (In den meisten Fällen sollte MySQL bei normalem Gebrauch jeden Fehler in der Daten-Datei finden. Wenn das geschieht, wird die Tabelle als 'beschädigt' gekennzeichnet, was bedeutet, dass die Tabelle solange nicht benutzt werden kann, bis sie repariert ist.)

FAST und CHANGED sind in erster Linie für die Benutzung durch ein Skript vorgesehen (zum Beispiel für die Ausführung durch cron), wenn Sie Ihre Tabellen von Zeit zu Zeit prüfen wollen. Für die meisten Anwendungsfälle sollte man FAST vor CHANGED bevorzugen. (Der einzige Fall, wo das nicht so ist, ist, wenn Sie vermuten, einen Bug im MyISAM-Code gefunden zu haben.)

EXTENDED ist nur für den Fall vorgesehen, dass Sie eine normale Prüfung haben durchlaufen lassen, aber immer noch seltsame Fehler von einer Tabelle erhalten, wenn MySQL versucht, eine Zeile zu aktualisieren oder eine Zeile über einen Schlüssel zu finden (das ist sehr unwahrscheinlich, wenn eine normale Prüfung durchgelaufen ist!).

Es wurde berichtet, dass bei der Tabellenprüfung einige Dinge nicht automatisch korrigiert werden können:

5.4.5 REPAIR TABLE-Syntax

REPAIR TABLE tabelle[,tabelle...] [QUICK] [EXTENDED]

REPAIR TABLE funktioniert nur bei MyISAM-Tabellen und ist dasselbe, wie myisamchk -r tabelle auf die Tabelle auszuführen.

Normalerweise sollten sie diesen Befehl nie ausführen müssen, aber wenn ein Unglück passiert, ist es sehr wahrscheinlich, dass Sie alle Daten einer MyISAM-Tabelle mit REPAIR TABLE retten können. Wenn Ihre Tabellen häufig beschädigt werden, sollten Sie versuchen, den Grund hierfür herauszufinden! See section A.4.1 Was zu tun ist, wenn MySQL andauernd abstürzt. See section 8.1.3 MyISAM-Tabellenprobleme.

REPAIR TABLE repariert eine möglicherweise beschädigte Tabelle. Der Befehl gibt eine Tabelle mit folgenden Spalten zurück:

Spalte Wert
Table Tabellenname
Op Immer ``repair''
Msg_type status, error, info oder warning.
Msg_text Die Meldung.

Beachten Sie, dass Sie viele Zeilen an Informationen für jede reparierte Tabelle erhalten. Die letzte Zeile enthält den Msg_type status und sollte normalerweise OK sein. Wenn Sie nicht OK erhalten, sollten Sie versuchen, die Tabelle mit myisamchk -o zu reparieren, weil REPAIR TABLE noch nicht alle Optionen von myisamchk enthält. In naher Zukunft werden wir das flexibler gestalten.

Wenn QUICK angegeben wird, versucht MySQL lediglich ein REPAIR des Indexbaums.

Wenn Sie EXTENDED benutzen, erzeugt MySQL den Index Zeile für Zeile, anstatt einen Index auf einmal durch Sortieren zu erzeugen. Das kann bei Schlüsseln fester Länge besser sein, wenn Sie lange char()-Schlüssel haben, die sich gut komprimieren lassen.

5.4.6 Benutzung von myisamchk für Tabellenwartung und Absturzreparatur

Ab MySQL-Version 3.23.13 können Sie MyISAM-Tabellen mit dem CHECK TABLE-Befehl überprüfen. See section 5.4.4 CHECK TABLE-Syntax. Mit dem REPAIR TABLE-Befehl können Sie Tabellen reparieren. See section 5.4.5 REPAIR TABLE-Syntax.

Um MyISAM-Tabellen (.MYI und .MYD) zu überprüfen und / oder zu reparieren, sollten sie das myisamchk-Dienstprogramm benutzen. Um ISAM-Tabellen (.ISM und .ISD) zu überprüfen und / oder zu reparieren, sollten Sie das isamchk-Dienstprogramm benutzen. See section 8 MySQL-Tabellentypen.

Der folgende Text behandelt myisamchk, trifft aber voll umfänglich auch auf das alte isamchk zu.

Sie können das myisamchk-Dienstprogramm benutzen, um Informationen über Ihre Datenbanktabellen zu erhalten, sie zu prüfen und zu reparieren, oder um sie zu optimieren. Die folgenden Abschnitte beschreiben, wie man myisamchk aufruft (inklusive einer Beschreibung seiner Optionen), wie man einen Wartungsplan für Tabellen erstellt und wie die unterschiedlichen Funktionen von myisamchk benutzt werden.

In den meisten Fällen können Sie auch den Befehl OPTIMIZE TABLES benutzen, um Tabellen zu optimieren und zu reparieren, aber dieser ist nicht so schnell und (in Fall wirklich schwerer Fehler) nicht so zuverlässig wie myisamchk. Auf der anderen Seite ist OPTIMIZE TABLE leichter zu benutzen, und Sie brauchen sich nicht um das Flushen von Tabellen zu kümmern. See section 5.5.1 OPTIMIZE TABLE-Syntax.

Obwohl das Reparieren bei myisamchk recht sicher ist, ist es immer eine gute Idee, eine Datensicherung zu machen, bevor eine Reparatur durchgeführt wird (oder etwas Sonstiges, das viele Änderungen an einer Tabelle durchführt).

5.4.6.1 Aufrufsyntax von myisamchk

myisamchk wird wie folgt aufgerufen:

shell> myisamchk [optionen] tabelle

optionen legt fest, was myisamchk tun soll. Die Optionen sind unten beschrieben. (Sie erhalten eine Liste der Optionen, wenn Sie myisamchk --help eingeben.) Ohne Optionen aufgerufen prüft myisamchk einfach nur Ihre Tabelle. Um mehr Informationen zu erhalten oder myisamchk anzuweisen, korrigierende Aktionen durchzuführen, geben Sie Optionen wie unten und in den folgenden Abschnitten beschrieben an.

tabelle ist die Datenbanktabelle, die Sie prüfen oder reparieren wollen. Wenn Sie myisamchk anderswo als im Datenbank-Verzeichnis ausführen, müssen Sie den Pfad zur Datei angeben, denn myisamchk weiß nicht, wo Ihre Datenbank liegt. In der Tat kümmert sich myisamchk nicht darum, ob die Dateien, die es bearbeiten soll, in einem Datenbank-Verzeichnis liegen oder nicht; sie können diese Dateien daher an eine andere Stelle kopieren und die Wiederherstellungsoperationen dort durchführen.

Sie können in der myisamchk-Befehlszeile mehrere Tabellen angeben, wenn Sie wollen. Sie können auch einen Namen als Indexdateinamen angeben (mit dem Suffix `.MYI'), was Ihnen gestattet, alle Tabellen in einem Verzeichnis anzugeben, indem Sie das Muster `*.MYI' benutzen. Wenn Sie zum Beispiel in einem Datenbank-Verzeichnis sind, können Sie alle Tabellen im Verzeichnis wie folgt prüfen:

shell> myisamchk *.MYI

Wenn Sie nicht im Datenbank-Verzeichnis sind, können Sie alle dortigen Tabellen prüfen, indem Sie den Pfad zum Verzeichnis angeben:

shell> myisamchk /pfad/zum/datenbank_verzeichnis/*.MYI

Sie können sogar alle Tabellen in allen Datenbanken prüfen, indem Sie einen Platzhalter im Pfad zum MySQL-Daten-Verzeichnis angeben:

shell> myisamchk /pfad/zum/datadir/*/*.MYI

Um schnell alle Tabellen zu prüfen, wird folgender Befehl empfohlen:

myisamchk --silent --fast /pfad/zum/datadir/*/*.MYI
isamchk --silent /pfad/zum/datadir/*/*.ISM

Wenn Sie alle Tabellen prüfen und alle Tabellen reparieren wollen, die beschädigt sind, können Sie folgende Kommandozeile eingeben:

myisamchk --silent --force --fast --update-state -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /pfad/zum/datadir/*/*.MYI
isamchk --silent --force -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /pfad/zum/datadir/*/*.ISM

Hierbei wird angenommen, dass Sie mehr als 64 MB Arbeitsspeicher frei haben.

Wenn Sie einen Fehler wie den folgenden erhalten:

myisamchk: warning: 1 clients is using oder hasn't closed the table properly

Bedeutet das, dass Sie versuchen, eine Tabelle zu überprüfen, die durch ein anderes Programm aktualisiert wurde (wie dem mysqld-Server), das die Datei noch nicht geschlossen hat oder das abgestürzt ist, ohne die Datei ordnungsgemäß zu schließen.

Wenn mysqld läuft, müssen Sie ein Sync/Schließen aller Tabellen mit FLUSH TABLES erzwingen und sicherstellen, dass niemand die Tabellen benutzt, während Sie myisamchk laufen lassen. In MySQL-Version 3.23 ist die einfachste Möglichkeit, dieses Problem zu vermeiden, die Benutzung von CHECK TABLE anstelle von myisamchk.

5.4.6.2 Allgemeine Optionen für myisamchk

myisamchk unterstützt folgende Optionen:

-# oder --debug=debug_optionen
Ausgabe eines Debug-Logs. Die Zeichenkette debug_optionen ist häufig 'd:t:o,dateiname'.
-? oder --help
Hilfetext ausgeben und beenden.
-O var=option, --set-variable var=option
Setzt den Wert einer Variablen. Mögliche Variablen und ihre Vorgabewerte für myisamchk können mit myisamchk --help herausgefunden werden:
key_buffer_size 523264
read_buffer_size 262136
write_buffer_size 262136
sort_buffer_size 2097144
sort_key_blocks 16
decode_bits 9
sort_buffer_size wird benutzt, wenn Schlüssel repariert werden, indem Schlüssel sortiert werden, was der Normalfall ist, wenn Sie --recover benutzen. key_buffer_size wird benutzt, wenn Sie die Tabelle mit --extended-check prüfen oder wenn die Schlüssel repariert werden, indem Schlüssel Zeile für Zeile in die Tabelle eingefügt werden (als wenn normale Einfügeoperationen (Insert) durchgeführt werden). Eine Reparatur mittels Key-Buffer (Schlüsselpuffer) wird in folgenden Fällen benutzt: Die Reparatur durch den Key-Buffer (Schlüsselpuffer) nimmt weit weniger Plattenplatz in Anspruch als wenn Sortieren benutzt wird, ist aber auch viel langsamer. Wenn Sie eine schnellere Reparatur wollen, setzen Sie die obigen Variablen auf ungefähr 1/4 Ihres verfügbaren Arbeitsspeichers. Sie können beide Variablen auf große Werte setzen, weil nur einer der oben aufgeführten Puffer zur gleichen Zeit benutzt wird.
-s oder --silent
Schweigsamer Modus. Ausgaben erfolgen nur im Fehlerfall. Sie können -s doppelt benutzen (-ss), um myisamchk sehr schweigsam zu machen.
-v oder --verbose
Geschwätziger Modus. Es werden mehr Informationen ausgegeben. Dies kann auch bei -d und -e benutzt werden. Benutzen Sie -v mehrfach (-vv, -vvv), um noch ausführlichere Meldungen auszugeben!
-V oder --version
Die aktuelle Version von myisamchk ausgeben und beenden.
-w or, --wait
Statt einen Fehler auszugeben, wenn die Tabelle gesperrt ist, warten, bis die Tabelle entsperrt ist, bevor fortgefahren wird. Beachten Sie: Wenn Sie mysqld auf der Tabelle mit --skip-locking laufen lassen, kann die Tabelle nur mit einem weiteren myisamchk-Befehl gesperrt werden.

5.4.6.3 Prüfoptionen für myisamchk

-c oder --check
Tabelle auf Fehler überprüfen. Das ist die vorgabemäßige Operation, wenn Sie myisamchk keine sonstigen Optionen angeben, die dies überschreiben.
-e oder --extend-check
Tabelle SEHR gründlich prüfen (was recht langsam ist, wenn Sie viele Indexe haben). Diese Option sollte nur in Extremfällen benutzt werden. Normalerweise sollten myisamchk oder myisamchk --medium-check in fast allen Fällen in der Lage sein, herauszufinden, ob es in der Tabelle irgend welche Fehler gibt. Wenn Sie --extended-check benutzen und viel Arbeitsspeicher haben, setzen Sie den Wert von key_buffer_size um etliches herauf!
-F oder --fast
Nur Tabellen prüfen, die nicht ordnungsgemäß geschlossen wurden.
-C oder --check-only-changed
Nur Tabellen prüfen, die seit der letzten Prüfung geändert wurden.
-f oder --force
myisamchk mit -r (repair) auf die Tabelle neu starten, wenn myisamchk in der Tabelle irgend welche Fehler findet.
-i oder --information
Statistische Informationen über die Tabelle, die geprüft wird, ausgeben.
-m oder --medium-check
Schneller als extended-check, findet aber nur 99,99% aller Fehler. Das sollte allerdings in den meisten Fällen ausreichen.
-U oder --update-state
In der `.MYI'-Datei speichern, wann die Tabelle geprüft wurde und ob die Tabelle beschädigt wurde. Das sollte benutzt werden, um vollen Nutzen aus der --check-only-changed-Option ziehen zu können. Sie sollten diese Option nicht benutzen, wenn der mysqld-Server die Tabelle benutzt und Sie ihn mit --skip-locking laufen lassen.
-T oder --read-only
Die Tabelle nicht als geprüft kennzeichnen. Das ist hilfreich, wenn Sie myisamchk benutzen, um eine Tabelle zu prüfen, die von irgend einer anderen Applikation benutzt wird, die kein Sperren durchführt (wie mysqld --skip-locking).

5.4.6.4 Reparaturoptionen für myisamchk

Folgende Optionen werden benutzt, wenn Sie myisamchk mit -r oder -o starten:

-D # oder --data-file-length=#
Maximale Länge der Daten-Datei (wenn die Daten-Datei neu erzeugt wird, wenn sie 'voll' ist).
-e oder --extend-check
Es wird versucht, jede mögliche Zeile der Daten-Datei wiederherzustellen. Normalerweise wird dies auch eine Menge Zeilen-'Müll' finden. Benutzen Sie diese Option nur dann, wenn Sie völlig verzweifelt sind.
-f oder --force
Alte temporäre Dateien (tabelle.TMD) werden überschrieben, anstatt abzubrechen.
-k # oder keys-used=#
Wenn Sie ISAM benutzen, weist das den ISAM-Tabellen-Handler an, nur die ersten #-Indexe zu benutzen. Wenn Sie MyISAM benutzen, sagt es dem Handler, welche Schlüssel benutzt werden sollen, wobei jedes Binärbit für einen Schlüssel steht (der erste Schlüssel ist Bit 0). Das kann benutzt werden, um schnelleres Einfügen (Insert) zu erreichen! Deaktivierte Indexe können reaktiviert werden, indem man myisamchk -r benutzt.
-l oder --no-symlinks
Symbolischen Links wird nicht gefolgt. Normalerweise repariert myisamchk die Tabelle, auf die ein Symlink verweist. Diese Option gibt es in MySQL 4.0 nicht, weil MySQL 4.0 während der Reparatur keine Symlinks entfernt.
-r oder --recover
Kann fast alles reparieren, ausser eindeutige Schlüssel, die nicht eindeutig sind (was ein extrem unwahrscheinlicher Fehler bei ISAM- / MyISAM-Tabellen ist). Wenn Sie eine Tabelle wiederherstellen wollen, sollten Sie zuerst diese Option ausprobieren. Nur wenn myisamchk berichtet, dass die Tabelle mit -r nicht wiederhergestellt werden kann, sollten Sie -o probieren. (Hinweis: Im unwahrscheinlichen Fall, dass -r fehlschlägt, ist die Daten-Datei immer noch intakt.) Wenn Sie viel Arbeitsspeicher haben, sollten Sie die Größe von sort_buffer_size herauf setzen!
-o oder --safe-recover
Benutzt eine alte Wiederherstellungsmethode (liest alle Zeilen der Reihe nach und aktualisiert alle Indexbäume, basierend auf den gefundenen Zeilen); das ist sehr viel langsamer als -r, kann aber eine Reihe sehr unwahrscheinlicher Fälle behandeln, die -r nicht behandeln kann. Diese Wiederherstellungsmethode benutzt viel weniger Plattenspeicher als -r. Normalerweise sollte man immer zuerst versuchen, mit -r zu reparieren und nur im Falle des Fehlschlagens -o benutzen. Wenn Sie viel Arbeitsspeicher haben, sollten Sie die Größe von key_buffer_size herauf setzen!
-n oder --sort-recover
Zwingt myisamchk zu sortieren, um Schlüssel aufzulösen, selbst wenn die temporären Dateien sehr Groß sein sollten. Diese Option hat keine Auswirkung, wenn Sie Volltextschlüssel in der Tabelle haben.
--character-sets-dir=...
Verzeichnis, wo Zeichensätze gespeichert sind.
--set-character-set=name
Ändert den Zeichensatz, der vom Index benutzt wird.
-t oder --tmpdir=path
Pfad zum Speichern temporärer Dateien. Wenn dieser nicht gesetzt ist, benutzt myisamchk hierfür die Umgebungsvariable TMPDIR.
-q oder --quick
Repariert schneller, indem die Daten-Datei nicht verändert wird. Man kann ein zweites -q angeben, um myisamchk zu zwingen, die Original-Daten-Datei zu ändern, falls doppelte Schlüssel auftreten.
-u oder --unpack
Datei entpacken, die mit myisampack gepackt wurde.

5.4.6.5 Weitere Optionen für myisamchk

Weitere Aktionen, die myisamchk ausführen kann, neben der Prüfung und Reparatur von Tabellen:

-a oder --analyze
Analysiert die Verteilung von Schlüsseln. Das verbessert die Performance bei Tabellenverknüpfungen (Joins), indem der Join-Optimierer in die Lage versetzt wird, besser auszuwählen, in welcher Reihenfolge die Tabellen verknüpft werden sollten und welche Schlüssel er dabei verwenden sollte: myisamchk --describe --verbose tabelle' oder Benutzung von SHOW KEYS in MySQL.
-d oder --description
Gibt ein paar Informationen über die Tabelle aus.
-A oder --set-auto-increment[=value]
Zwingt auto_increment, mit diesem oder einem höheren Wert anzufangen. Wenn kein Wert angegeben wird, wird der nächste auto_increment-Wert auf den höchsten benutzten Wert für den auto-Schlüssel + 1 gesetzt.
-S oder --sort-index
Sortiert die Blöcke des Indexbaums in Hoch-Niedrig-Reihenfolge. Das optimiert Suchoperationen und macht das Durchsehen (Scanning) von Tabellen nach Schlüsseln schneller.
-R oder --sort-records=#
Sortiert Datensätze in Übereinstimmung mit einem Index. Das macht Ihre Daten viel konzentrierter und kann SELECT mit Bereichen und ORDER BY-Operationen auf diesem Index erheblich beschleunigen. (Beim ersten Sortieren kann das SEHR langsam sein!) Um die Anzahl von Indexen einer Tabelle herauszufinden, benutzen Sie SHOW INDEX, was die Indexe einer Tabelle in genau der Reihenfolge zeigt, in der myisamchk sie sieht. Indexe werden mit 1 beginnend nummeriert.

5.4.6.6 Speicherbenutzung von myisamchk

Die Speicherzuordnung ist wichtig, wenn Sie myisamchk laufen lassen. myisamchk benutzt nicht mehr Speicher, als Sie mir der -O-Option festlegen. Wenn Sie myisamchk für sehr große Dateien benutzen wollen, sollten Sie zuerst entscheiden, wieviel Speicher Sie benutzen wollen. Die Vorgabe liegt bei nur etwa 3 MB, um Dinge zu reparieren. Indem größere Werte benutzt werden, können Sie myisamchk dazu bringen, schneller zu arbeiten. Wenn Sie beispielsweise 32 MB Arbeitsspeicher haben, könnten Sie Optionen wie die folgende benutzen (zusätzlich zu weiteren Optionen, die Sie eventuell angeben):

shell> myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ...

-O sort=16M sollte für die meisten Fälle ausreichen.

Denken Sie daran, dass myisamchk temporäre Dateien in TMPDIR benutzt. Wenn TMPDIR auf ein Speicher-Dateisystem zeigt, können Kein-Speicher-Fehler schnell auftreten. Wenn das passiert, setzen Sie TMPDIR so, dass es auf ein Verzeichnis mit mehr Speicherplatz zeigt und starten Sie myisamchk erneut.

Beim Reparieren benötigt myisamchk große Mengen von Festplattenspeicher:

Wenn Sie während der Reparatur ein Problem mit dem Plattenplatz bekommen, können Sie --safe-recover anstelle von --recover ausprobieren.

5.4.6.7 Benutzung von myisamchk für die Fehlerbeseitigung nach Abstürzen

Wenn Sie mysqld mit --skip-locking laufen lassen (was auf einigen Systemen wie Linux die Vorgabe ist), können Sie myisamchk nicht zuverlässig dafür benutzen, eine Tabelle zu prüfen, wenn mysqld diese Tabelle benutzt. Wenn Sie sicher sein können, dass niemand auf die Tabellen mit mysqld zugreift, während Sie myisamchk laufen lassen, müssen Sie nur ein mysqladmin flush-tables durchführen, bevor Sie anfangen, die Tabellen zu prüfen. Wenn Sie das nicht garantieren können, müssen Sie mysqld herunter fahren, während Sie die Tabellen prüfen. Wenn Sie myisamchk laufen lassen, währen mysqld die Tabellen aktualisiert, erhalten Sie möglicherweise die Meldung, dass eine Tabelle beschädigt ist, selbst wenn sie es nicht ist.

Wenn Sie --skip-locking nicht benutzen, können Sie jederzeit myisamchk benutzen, um Tabellen zu prüfen. Während Sie das tun, warten alle Clients, die versuchen, die Tabelle zu aktualisieren, bis myisamchk fertig ist, bevor sie weiter machen.

Wenn Sie myisamchk benutzen, um Tabellen zu reparieren oder zu optimieren, MÜSSEN Sie stets sicherstellen, dass der mysqld-Server die Tabelle nicht benutzt (das trifft auch zu, wenn Sie --skip-locking benutzen). Wenn Sie mysqld nicht herunter fahren, sollten Sie zumindest mysqladmin flush-tables ausführen, bevor Sie myisamchk benutzen.

Dieses Kapitel beschreibt, wie man MySQL-Datenbanken auf Datenbeschädigung prüft und damit umgeht. Wenn Ihre Tabellen häufig beschädigt sind, wollten Sie versuchen, den Grund hierfür herauszufinden! See section A.4.1 Was zu tun ist, wenn MySQL andauernd abstürzt.

Der Abschnitt über MyISAM-Tabellen enthält Gründe, warum eine Tabelle beschädigt sein könnte. See section 8.1.3 MyISAM-Tabellenprobleme.

Wenn Sie eine Wiederherstellung nach einem Absturz durchführen, ist es wichtig zu wissen, das jede Tabelle tabelle in einer Datenbank mit drei Dateien im Datenbank-Verzeichnis korrespondiert:

Datei Zweck
`tabelle.frm' Tabellendefinitionsdatei (form)
`tabelle.MYD' Daten-Datei (data)
`tabelle.MYI' Index-Datei (index)

Jeder der drei Dateitypen kann auf verschiedene Weisen beschädigt werden. Probleme treten aber zumeist bei Daten-Dateien und Index-Dateien auf.

myisamchk funktioniert so, dass Zeile für Zeile eine Kopie der `.MYD'-(data)-Datei gemacht wird. Es beendet die Reparaturphase damit, dass die alte `.MYD'-Datei entfernt wird und die neue Datei mit dem Orginal-Dateinamen benannt wird. Wenn Sie --quick benutzen, erzeugt myisamchk keine temporäre `.MYD'-Datei, sondern nimmt statt dessen an, dass die `.MYD'-Datei korrekt ist, und erzeugt nur eine neue Index-Datei, ohne die `.MYD'-Datei zu berühren. Das ist sicher, weil myisamchk automatisch feststellt, wenn die `.MYD'-Datei beschädigt ist, und die Reparatur in diesem Fall abbricht. Sie können myisamchk auch mit zwei --quick-Optionen aufrufen. In diesem Fall bricht myisamchk bei einigen Fehlern (wie doppelten Schlüsseleinträgen) nicht ab, sondern versucht statt dessen, diese aufzulösen, indem die `.MYD'-Datei verändert wird. Normalerweise ist die Benutzung von zwei --quick-Optionen nur sinnvoll, wenn Sie zu wenig frei Plattenplatz haben, um eine normale Reparatur durchzuführen. In diesem Fall sollten Sie zumindest eine Datensicherung machen, bevor Sie myisamchk laufen lassen.

5.4.6.8 Wie Tabellen auf Fehler überprüft werden

Um eine MyISAM-Tabelle zu prüfen, benutzen Sie folgende Befehle:

myisamchk tabelle
Das findet 99.99% aller Fehler. Nicht gefunden werden Beschädigungen, die NUR die Daten-Datei betreffen (was sehr ungewöhnlich ist). Wenn Sie eine Tabelle prüfen wollen, sollten Sie myisamchk normalerweise ohne Optionen oder entweder mit der -s- oder --silent-Option laufen lassen.
myisamchk -m tabelle
Das findet 99.999% aller Fehler. Zuerst prüft es alle Indexeinträge auf Fehler und liest dann alle Zeilen durch. Es berechnet eine Prüfsumme für alle Schlüssel in den Zeilen und bestätigt dann, dass die Prüfsumme mit der Prüfsumme für die Schlüssel im Indexbaum übereinstimmt.
myisamchk -e tabelle
Das führt eine vollständige, gründlich Prüfung aller Daten durch (-e bedeutet ``extended check'' - erweiterte Prüfung). Es führt ein Prüf-Lesen jedes Schlüssels für jede Zeile durch, um zu bestätigen, dass sie tatsächlich auf die richtige Zeile verweisen. Das kann bei einer großen Tabelle mit vielen Schlüsseln SEHR LANG dauern. myisamchk hält normalerweise an, wenn es den ersten Fehler gefunden hat. Wenn Sie mehr Informationen haben wollen, können Sie die --verbose-(-v)-Option benutzen. Das veranlasst myisamchk, weiterzumachen, bis maximal 20 Fehler gefunden wurden. Bei normalem Gebrauch ist ein einfaches myisamchk (ohne weitere Argumente ausser dem Tabellennamen) ausreichend.
myisamchk -e -i tabelle
Wie der vorherige Befehl, jedoch weist die -i-Option myisamchk an, zusätzlich einige statistische Informationen auszugeben.

5.4.6.9 Wie Tabellen repariert werden

Der folgende Abschnitt behandelt nur die Benutzung von myisamchk mit MyISAM-Tabellen (Erweiterungen .MYI und .MYD). Wenn Sie ISAM-Tabellen benutzen (Erweiterungen .ISM und .ISD), sollten Sie statt dessen isamchk benutzen.

Ab MySQL-Version 3.23.14 können Sie MyISAM-Tabellen mit dem REPAIR TABLE-Befehl reparieren. See section 5.4.5 REPAIR TABLE-Syntax.

Zu den Symptomen einer beschädigten Tabelle gehören Anfragen, die unerwartet abbrechen, und beobachtbare Fehler wie folgender:

In den anderen Fällen müssen Sie Ihre Tabellen reparieren. myisamchk kann üblicherweise die meisten Dinge, die schief gehen können, finden und beheben.

Der Reparaturprozess läuft in vier Phasen ab, die unten beschrieben sind. Bevor Sie anfangen, sollten Sie in das Datenbank-Verzeichnis wechseln und die Berechtigungen der Tabellen-Dateien prüfen. Stellen Sie sicher, dass diese durch den Unix-Benutzer lesbar sind, unter dem mysqld läuft (und für Sie, weil Sie auf die Dateien zugreifen müssen, wenn Sie sie prüfen). Wenn Sie in der Folge Dateien verändern müssen, müssen diese für Sie auch schreibbar sein.

Wenn Sie MySQL-Version 3.23.16 und höher benutzen, können (und sollten) Sie die CHECK- und REPAIR-Befehle benutzen, um MyISAM-Tabellen zu prüfen und zu reparieren. See section 5.4.5 REPAIR TABLE-Syntax.

Der Handbuchabschnitt über Tabellenwartung beinhaltet die Optionen für isamchk / myisamchk. See section 5.4.6 Benutzung von myisamchk für Tabellenwartung und Absturzreparatur.

Der folgende Abschnitt ist für Fälle, in denen die obigen Befehle fehlschlagen, oder wenn Sie die erweiterten Features benutzen wollen, die isamchk / myisamchk zur Verfügung stellt.

Wenn Sie eine Tabelle von der Kommandozeile aus reparieren wollen, müssen Sie zuerst den mysqld-Server herunter fahren. Beachten Sie bei mysqladmin shutdown auf einen entfernten Server, dass der mysqld-Server noch für eine Weile aktiv bleibt, nachdem mysqladmin beendet ist, bis alle Anfragen beendet und alle Schlüssel auf Platte zurück geschrieben (flush) wurden.

Phase 1: Prüfen Ihrer Tabellen

Lassen Sie myisamchk *.MYI laufen, oder myisamchk -e *.MYI, wenn Sie mehr Zeit haben. Benutzen Sie die -s-(silent)-Option, um unnötige Informationen zu unterdrücken.

Wenn der mysqld-Server herunter gefahren ist, sollten Sie die --update-Option benutzen, um myisamchk zu veranlassen, die Tabelle als 'geprüft' zu kennzeichnen.

Sie müssen nur die Tabellen reparieren, bei denen myisamchk bekannt gibt, dass sie Fehler enthalten. Gehen Sie bei solchen Tabellen zu Phase 2 über.

Wenn Sie beim Prüfen merkwürdige Fehler erhalten (wie out of memory-Fehler), oder wenn myisamchk abstürzt, gehen Sie zu Phase 3.

Phase 2: Einfache, sichere Reparatur

HINWEIS: Wenn Sie wollen, dass die Reparatur sehr viel schneller abläuft, sollten Sie allen isamchk/myisamchk-Befehlen folgendes hinzufügen: -O sort_buffer=# -O key_buffer=# (wobei # etwa 1/4 des verfügbaren Arbeitsspeichers ist).

Probieren Sie zuerst myisamchk -r -q tabelle (-r -q bedeutet ``quick recovery mode'' - schnelles Wiederherstellen). Dies versucht, die Index-Datei zu reparieren, ohne die Daten-Datei zu berühren. Wenn die Daten-Datei alles enthält, was sie sollte, und die Löschverknüpfungen auf die korrekten Stellen in der Daten-Datei zeigen, sollte das funktionieren und die Tabelle ist repariert. Machen Sie dann mit der Reparatur der nächsten Tabelle weiter. Ansonsten führen Sie folgende Prozedur durch:

  1. Machen Sie eine Datensicherung der Daten-Datei, bevor Sie fortfahren.
  2. Geben Sie myisamchk -r tabelle (-r bedeutet ``recovery mode'' - Wiederherstellung) ein. Das entfernt falsche und gelöschte Datensätze aus der Daten-Datei und stellt die Index-Datei wieder her.
  3. Wenn die vorherigen Schritte fehlschlagen, geben Sie myisamchk --safe-recover tabelle ein. Der Modus für sicheres Wiederherstellen benutzt eine alte Wiederherstellungsmethode, die ein paar Fälle behandelt, die der normale Wiederherstellungsmodus nicht behandelt (ist aber langsamer).

Wenn Sie bei der Reparatur merkwürdige Fehler erhalten (wie out of memory-Fehler), oder wenn myisamchk abstürzt, gehen Sie zu Phase 3.

Phase 3: Schwierige Reparatur

Diese Phase sollten Sie nur dann erreichen, wenn der erste 16-KB-Block der Index-Datei zerstört ist oder falsche Informationen enthält, oder wenn die Index-Datei fehlt. In diesem Fall ist es notwendig, eine neue Index-Datei zu erzeugen. Das machen Sie wie folgt:

  1. Verschieben Sie die Daten-Datei an einen sicheren Ort.
  2. Benutzen Sie die Tabellen-Beschreibungsdatei, um eine neue (leere) Daten-Datei und Index-Dateien zu erzeugen:
    shell> mysql datenbank
    mysql> SET AUTOCOMMIT=1;
    mysql> TRUNCATE TABLE tabelle;
    mysql> quit
    
    Wenn Ihre SQL-Version kein TRUNCATE TABLE hat, benutzen Sie statt dessen DELETE FROM tabelle.
  3. Kopieren Sie Ihre alte Daten-Datei zurück, über die neu erzeugte Daten-Datei. (Verschieben Sie Ihre alte Daten-Datei nicht einfach, damit Sie eine Kopie erhalten, falls etwas schief geht.)

Gehen Sie zurück zu Phase 2. myisamchk -r -q sollte jetzt funktionieren. (Das sollte keine Endlosschleife sein.)

Phase 4: Sehr schwierige Reparatur

Diese Phase sollten Sie nur dann erreichen, wenn auch die Beschreibungsdatei beschädigt ist. Das sollte nie passieren, weil die Beschreibungsdatei nicht verändert wird, nachdem die Tabelle erzeugt wurde:

  1. Stellen Sie die Beschreibungsdatei von einer Datensicherung wieder her und gehen Sie zurück zu Phase 3. Sie können auch die Index-Datei wiederherstellen und zu Phase 2 zurück gehen. Im letzteren Fall sollten Sie mit myisamchk -r anfangen.
  2. Wenn Sie keine Datensicherung haben, aber genau wissen, wie die Tabelle erzeugt wurde, erzeugen Sie eine Kopie der Tabelle in einer anderen Datenbank. Entfernen Sie die neue Daten-Datei und verschieben Sie die Beschreibungs- und Index-Dateien von der anderen Datenbank in Ihre beschädigte Datenbank. Das ergibt neue Beschreibungs- und Index-Dateien, läßt aber die Daten-Datei in Ruhe. Gehen Sie zurück zu Phase 2 und versuchen Sie, die Index-Datei wiederherzustellen.

5.4.6.10 Tabellenoptimierung

Um fragmentierte Datensätze zu vereinigen und verschwendeten Speicherplatz zu beseitigen, der sich durch Löschen und Aktualisieren von Datensätzen ergibt, lassen Sie myisamchk im Wiederherstellungsmodus laufen:

shell> myisamchk -r tabelle

Auf dieselbe Weise können Sie eine Tabelle optimieren, indem Sie das SQL-Statement OPTIMIZE TABLE benutzen. OPTIMIZE TABLE führt eine Reparatur der Tabelle und eine Analyse der Schlüssel durch und sortiert den Indexbaum, um schnelleres Nachschlagen der Schlüssel (Key Lookup) zu ermöglichen. Ausserdem schaltet es die Möglichkeit ungewollter Interaktionen zwischen einem Dienstprogramm und dem Server aus, weil der Server bei der Benutzung von OPTIMIZE TABLE die ganze Arbeit verrichtet. See section 5.5.1 OPTIMIZE TABLE-Syntax.

myisamchk hat eine Anzahl weiterer Optionen, die Sie für die Verbesserung der Performance einer Tabelle benutzen können:

-S, --sort-index
-R index_nummer, --sort-records=index_nummer
-a, --analyze

Eine detaillierte Beschreibung der Optionen steht unter See section 5.4.6.1 Aufrufsyntax von myisamchk.

5.4.7 Wartungsplan für Tabellen erstellen

Ab MySQL-Version 3.23.13 können Sie MyISAM-Tabellen mit dem CHECK TABLE-Befehl prüfen. See section 5.4.4 CHECK TABLE-Syntax. Sie können Tabellen mit dem REPAIR TABLE-Befehl reparieren. See section 5.4.5 REPAIR TABLE-Syntax.

Es ist eine gute Idee, Tabellenüberprüfungen auf regelmäßiger Basis durchzuführen statt darauf zu warten, dass Probleme auftreten. Für Wartungszwecke benutzen Sie myisamchk -s, um Tabellen zu überprüfen. Die -s-Option (Kurzform für --silent) veranlasst myisamchk, im schweigsamen Modus zu laufen, wobei Meldungen nur ausgegeben werden, wenn Fehler auftreten.

Ebenfalls eine gute Idee ist es, Tabellen zu überprüfen, wenn der Server hoch fährt. Wenn beispielsweise die Maschine mitten während einer Aktualisierung (Update) neu gebootet hat, müssen Sie üblicherweise alle Tabellen prüfen, die betroffen sein könnten. (Das ist ein Fall von ``erwarteter Tabellenbeschädigung''.) Sie können safe_mysqld einen Test hinzufügen, der myisamchk laufen läßt, um alle Tabellen zu überprüfen, die innerhalb der letzten 24 Stunden geändert wurden, wenn nach einem Reboot eine alte `.pid'-(process ID)-Datei übrig blieb. (Die `.pid'-Datei wird von mysqld erzeugt, wenn er hoch fährt, und entfernt, wenn er normal beendet wird. Die Anwesenheit einer `.pid'-Datei beim Systemstart zeigt an, dass mysqld regelwidrig abgebrochen wurde.)

Eine noch bessere Testmethode besteht darin, jede Tabelle zu prüfen, deren Zeit der letzten Änderung neuer ist als die der `.pid'-Datei.

Ausserdem sollten Sie Ihre Tabellen regelmäßig während der normalen Systemtätigkeit prüfen. Bei MySQL AB lassen wir einen cron-Job laufen, um alle wichtigen Tabellen einmal pro Woche zu prüfen, indem wir folgende Zeile in der `crontab'-Datei benutzen:

35 0 * * 0 /pfad/zu/myisamchk --fast --silent /pfad/zu/datadir/*/*.MYI

Das gibt Informationen über beschädigte Tabellen aus, so dass wir diese prüfen und reparieren können, falls notwendig.

Da wir mittlerweile seit einigen Jahren keinerlei unerwartet beschädigte Tabellen hatten (Tabellen, die aus anderen Gründen als Hardware-Schäden beschädigt wurden), reicht uns einmal pro Woche völlig aus.

Wir empfehlen, dass Sie jede Nacht myisamchk -s auf alle Tabellen ausführen, die während der letzten 24 Stunden aktualisiert wurden, bis Sie MySQL so sehr vertrauen, wie wir selbst das mittlerweile tun.

Normalerweise brauchen Sie MySQL-Tabellen nicht so sehr warten. Wenn Sie Tabellen mit Zeilen dynamischer Länge ändern (Tabellen mit VARCHAR-, BLOB- oder TEXT-Spalten) oder Tabellen mit vielen gelöschten Zeilen haben, werden Sie diese von Zeit zu Zeit (einmal im Monat?) defragmentieren wollen bzw. freien Speicherplatz schaffen.

Das können Sie mit OPTIMIZE TABLE auf die in Frage kommenden Tabellen tun, oder, wenn Sie den mysqld-Server für eine Weile herunter fahren können:

isamchk -r --silent --sort-index -O sort_buffer_size=16M */*.ISM
myisamchk -r --silent --sort-index  -O sort_buffer_size=16M */*.MYI

5.4.8 Informationen über eine Tabelle erhalten

Um eine Beschreibung einer Tabelle oder Statistiken über sie zu erhalten, benutzen Sie die unten stehenden Befehle. Einige davon werden später detaillierter erläutert:

myisamchk -d tabelle
Läßt myisamchk im ``Beschreibungsmodus'' laufen, um eine Beschreibung Ihrer Tabelle zu erzeugen. Wenn Sie den MySQL-Server mit der --skip-locking-Option starten, kann myisamchk eventuell Fehler über eine Tabelle berichten, die aktualisiert wird, während es läuft. Weil myisamchk jedoch im Beschreibungsmodus keine Tabelle ändert, gibt es kein Risiko, dass Daten zerstört werden.
myisamchk -d -v tabelle
Um mehr Informationen über das, was myisamchk tut, zu erzeugen, fügen Sie -v als Option hinzu, damit es im geschwätzigen Modus läuft.
myisamchk -eis tabelle
Zeigt nur die wichtigsten Informationen über die Tabelle. Das ist langsam, weil es die ganze Tabelle lesen muss.
myisamchk -eiv tabelle
Wie -eis, sagt aber zusätzlich, was getan werden muss.

Beispiel einer myisamchk -d-Ausgabe:

MyISAM file:     firma.MYI
Record format:   Fixed length
Data records:    1403698 Deleted blocks:         0
Recordlength:    226

table description:
Key Start Len Index   Type
1   2     8   unique  double
2   15    10  multip. text packed stripped
3   219   8   multip. double
4   63    10  multip. text packed stripped
5   167   2   multip. unsigned short
6   177   4   multip. unsigned long
7   155   4   multip. text
8   138   4   multip. unsigned long
9   177   4   multip. unsigned long
    193   1           text

Beispiel einer myisamchk -d -v-Ausgabe:

MyISAM file:         firma
Record format:       Fixed length
File-version:        1
Creation time:       1999-10-30 12:12:51
Recover time:        1999-10-31 19:13:01
Status:              checked
Data records:           1403698  Deleted blocks:              0
Datafile parts:         1403698  Deleted data:                0
Datafilepointer (bytes):      3  Keyfile pointer (bytes):     3
Max datafile length: 3791650815  Max keyfile length: 4294967294
Recordlength:               226

table description:
Key Start Len Index   Type                  Rec/key     Root Blocksize
1   2     8   unique  double                      1 15845376      1024
2   15    10  multip. text packed stripped        2 25062400      1024
3   219   8   multip. double                     73 40907776      1024
4   63    10  multip. text packed stripped        5 48097280      1024
5   167   2   multip. unsigned short           4840 55200768      1024
6   177   4   multip. unsigned long            1346 65145856      1024
7   155   4   multip. text                     4995 75090944      1024
8   138   4   multip. unsigned long              87 85036032      1024
9   177   4   multip. unsigned long             178 96481280      1024
    193   1           text

Beispiel einer myisamchk -eis-Ausgabe:

Checking MyISAMDatei: firma
Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
Total:    Keyblocks used:  98%  Packed:   17%

Records:          1403698    M.recordlength:     226   Packed:             0%
Recordspace used:     100%   Empty space:          0%  Blocks/Record:   1.00
Record blocks:    1403698    Delete blocks:        0
Recorddata:     317235748    Deleted data:         0
Lost space:             0    Linkdata:             0

User time 1626.51, System time 232.36
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 627, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 639, Involuntary context switches 28966

Beispiel einer myisamchk -eiv-Ausgabe:

Checking MyISAM file: firma
Data records: 1403698   Deleted blocks:       0
- check file-size
- check delete-chain
block_size 1024:
index  1:
index  2:
index  3:
index  4:
index  5:
index  6:
index  7:
index  8:
index  9:
No recordlinks
- check index reference
- check data record references index: 1
Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
- check data record references index: 2
Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
- check data record references index: 3
Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
- check data record references index: 4
Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
- check data record references index: 5
Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 6
Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 7
Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 8
Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 9
Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
Total:    Keyblocks used:   9%  Packed:   17%

- check records und index references
[LOTS OF ROW NUMBERS DELETED]

Records:          1403698    M.recordlength:     226   Packed:             0%
Recordspace used:     100%   Empty space:          0%  Blocks/Record:   1.00
Record blocks:    1403698    Delete blocks:        0
Recorddata:     317235748    Deleted data:         0
Lost space:             0    Linkdata:             0

User time 1639.63, System time 251.61
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0
Blocks in 4 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 10604, Involuntary context switches 122798

Hier stehen die Größen der Daten- und Index-Dateien der Tabelle, die in den vorstehenden Beispielen benutzt wurde:

-rw-rw-r--   1 monty    tcx     317235748 Jan 12 17:30 firma.MYD
-rw-rw-r--   1 davida   tcx      96482304 Jan 12 18:35 firma.MYM

Erläuterungen der Informationen, die myisamchk erzeugt, werden unten gegeben. ``keyfile'' ist die Index-Datei. ``Record'' und ``row'' sind Synonyme:

ISAM file
Name der ISAM-(Index)-Datei.
Isam-version
Version des ISAM-Formats. Momentan immer 2.
Creation time
Wann die Daten-Datei erzeugt wurde.
Recover time
Wann die Index-/Daten-Datei das letzte Mal rekonstruiert wurden.
Data records
Wie viele Datensätze in der Tabelle sind.
Deleted blocks
Wie viele gelöschte Blöcke noch Platz belegen. Sie können Ihre Tabelle optimieren, um diesen Platz zu minimieren. See section 5.4.6.10 Tabellenoptimierung.
Datafile: Parts
Bei dynamischem Datensatzformat zeigt dies an, wie viele Datenblöcke es gibt. Bei einer optimierten Tabelle ohne fragmentierte Datensätze ist das dasselbe wie Data records.
Deleted data
Wie viele Bytes nicht zurückgewonnener gelöschter Daten es gibt. Sie können Ihre Tabelle optimieren, um diesen Platz zu minimieren. See section 5.4.6.10 Tabellenoptimierung.
Datafile pointer
Die Größe des Daten-Datei-Zeigers in Bytes. Das sind normalerweise 2, 3, 4 oder 5 Bytes. Die meisten Tabellen schaffen 2 Bytes, aber das kann bislang von MySQL noch nicht gesteuert werden. Bei festen Tabellen ist das eine Datensatzadresse. Bei dynamischen Tabellen ist es eine Byte-Adresse.
Keyfile pointer
Die Größe des Index-Datei-Zeigers in Bytes. Sie beträgt normalerweise 1, 2 oder 3 Bytes. Die meisten Tabellen schaffen 2 Bytes, aber das wird von MySQL automatisch berechnet. Es ist immer die Block-Adresse.
Max datafile length
Wie lang die Daten-Datei (.MYD-Datei) der Tabelle werden kann, in Bytes.
Max keyfile length
Wie lang die Index-Datei (.MYI-Datei) der Tabelle werden kann, in Bytes.
Recordlength
Wie viel Platz jeder Datensatz benötigt, in Bytes.
Record format
Das Format, das benutzt wird, um Tabellenzeilen zu speichern. Die oben stehenden Beispiele benutzen Fixed length. Andere mögliche Werte sind Compressed und Packed.
Table description
Eine Liste aller Schlüssel in der Tabelle. Für jeden Schlüssel werden einige Low-Level-Informationen angezeigt:
Key
Die Nummer des Schlüssels.
Start
Wo im Datensatz dieser Index-Teil anfängt.
Len
Wie lang dieser Index-Teil ist. Bei gepackten Zahlen sollte das immer die gesamte Länge der Spalte sein. Bei Zeichenketten kann es kürzer als die gesamte Länge der indizierten Spalte sein, weil Sie ein Prefix einer Zeichenkettenspalte indexieren können.
Index
unique oder multip. (multiple). Zeigt an, ob ein Wert einmal oder mehrfach in diesem Index vorkommen darf.
Type
Welchen Datentyp dieser Index-Teil hat. Das ist ein ISAM-Datentyp mit den Optionen packed, stripped oder empty.
Root
Adresse des Root-Index-Blocks.
Blocksize
Die Größe jedes Index-Blocks. Vorgabemäßig ist das 1024, doch dieser Wert kann beim Kompilieren geändert werden.
Rec/key
Das ist ein statistischer Wert, der vom Optimierer benutzt wird. Es sagt aus, wie viele Datensätze es pro Wert für diesen Schlüssel gibt. Ein eindeutiger Schlüssel hat immer einen Wert von 1. Das kann aktualisiert werden, nachdem eine Tabelle geladen wurde (oder in größerem Umfang geändert) mit myisamchk -a. Wenn dies überhaupt nicht aktualisiert wurde, wird ein Wert von 30 angenommen.
Im ersten Beispiel oben ist der neunte Schlüssel ein mehrteiliger Schlüssel mit zwei Teilen.
Keyblocks used
Welcher Prozentsatz von Schlüsselblöcken benutzt wird. Weil die Tabellen, die in den Beispielen benutzt wurden, direkt vorher mit myisamchk reorganisiert wurden, sind diese Werte sehr hoch (sehr nahe am theoretischen Maximum).
Packed
MySQL versucht, Schlüssel mit einem gemeinsamen Suffix zu packen. Das geht nur bei CHAR-, VARCHAR und DECIMAL-Schlüsseln. Bei langen Zeichenketten wie Namen kann das den benutzten Platz signifikant verringern. Im dritten Beispiel oben ist der vierte Schlüssel zehn Zeichen lang, wodurch ein 60%-ige Verringerung des Platzbedarfs erreicht wird.
Max levels
Wie tief der B-Baum für diesen Schlüssel ist. große Tabellen mit langen Schlüsseln haben hohe Werte.
Records
Wie viele Zeilen in der Tabelle enthalten sind.
M.recordlength
Die durchschnittliche Datensatzlänge. Bei Tabellen mit Datensätzen fester Länge ist das die exakte Datensatzlänge.
Packed
MySQL schneidet Leerzeichen am Ende von Zeichenketten ab. Der Packed-Wert zeigt an, welcher Prozentsatz dadurch gespart wurde.
Recordspace used
Welcher Prozentsatz der Daten-Datei benutzt wird.
Empty space
Welcher Prozentsatz der Daten-Datei unbenutzt ist.
Blocks/Record
Durchschnittliche Anzahl der Blöcke pro Datensatz (das heißt, aus wie vielen Verknüpfungen (Links) ein fragmentierter Datensatz zusammengesetzt ist). Bei Tabellen mit festem Format ist das immer 1. Dieser Wert sollte so nah wie möglich an 1,0 bleiben. Wenn er zu Groß wird, können Sie die Tabelle myisamchk reorganisieren. See section 5.4.6.10 Tabellenoptimierung.
Recordblocks
Wie viele Blöcke (Verknüpfungen, Links) benutzt werden. Bei festem Format ist das die Anzahl der Datensätze.
Deleteblocks
Wie viele Blöcke (Verknüpfungen, Links) gelöscht sind.
Recorddata
Wie viele Bytes in der Daten-Datei benutzt sind.
Deleted data
Wie viele Bytes in der Daten-Datei gelöscht sind (unbenutzt).
Lost space
Wenn ein Datensatz auf eine kürzere Länge aktualisiert wird, geht etwas Platz verloren. Das ist die Summe aller solcher Verluste in Bytes.
Linkdata
When das dynamische Tabellenformat benutzt wird, werden Datensatzfragmente mit Zeigern (Pointer) verknüpft (jeder mit 4 bis 7 Bytes). Linkdata ist die Summe des Speicherplatzes, der von diesen Zeigern benutzt wird.

Wenn eine Tabelle mit myisampack komprimiert wurde, gibt myisamchk -d zusätzliche Informationen über jede Tabellenspalte aus, siehe section 5.7.4 myisampack, MySQL-Programm zum Erzeugen komprimierter Nur-Lese-Tabellen, wo sich ein Beispiel solcher Informationen und was sie bedeuten befindet.

5.5 Datenbankverwaltung Sprachreferenz

5.5.1 OPTIMIZE TABLE-Syntax

OPTIMIZE TABLE tabelle[,tabelle]...

OPTIMIZE TABLE sollte benutzt werden, wenn Sie große Teile der Tabelle gelöscht haben oder bei Tabellen mit Zeilen variabler Länge viele Änderungen durchgeführt haben (Tabellen, die VARCHAR-, BLOB- oder TEXT-Spalten enthalten). Gelöschte Datensätze werden in einer verknüpften Liste vorgehalten, und nachfolgenden INSERT-Operationen benutzen die Positionen alter Datensätze. Sie können OPTIMIZE TABLE benutzen, um unbenutzten Platz freizugeben und die Daten-Datei zu defragmentieren.

Momentan funktioniert OPTIMIZE TABLE nur auf MyISAM- und BDB-Tabellen. Bei BDB-Tabellen ist OPTIMIZE TABLE momentan auf ANALYZE TABLE gemappt. See section 5.5.2 ANALYZE TABLE-Syntax.

Sie können OPTIMIZE TABLE auf andere Tabellentypen zum Laufen bringen, indem Sie mysqld mit --skip-new oder --safe-mode starten, aber in diesem Fall wird OPTIMIZE TABLE lediglich auf ALTER TABLE gemappt.

OPTIMIZE TABLE funktioniert wie folgt:

OPTIMIZE TABLE für MyISAM-Tabellen ist äquivalent zum Laufenlassen von myisamchk --quick --check-changed-tables --sort-index --analyze auf die Tabelle.

Beachten Sie, dass die Tabelle während der Zeit, in der OPTIMIZE TABLE läuft, gesperrt ist!

5.5.2 ANALYZE TABLE-Syntax

ANALYZE TABLE tabelle[,tabelle...]

Analysiert und speichert die Schlüsselverteilung der Tabelle. Während der Analyse ist die Tabelle mit einer Lesesperre gesperrt. Das funktioniert auf MyISAM und BDB-Tabellen.

Das ist äquivalent zum Laufenlassen von myisamchk -a auf die Tabelle.

MySQL benutzt die gespeicherte Schlüsselverteilung, um zu entscheiden, in welcher Reihenfolge Tabellen verknüpft werden sollen, wenn man eine Verknüpfung (Join) auf irgend etwas anderes als eine Konstante macht.

Der Befehl gibt eine Tabelle mit folgenden Spalten zurück:

Spalte Wert
Table Tabellenname.
Op Immer ``analyze''.
Msg_type status, error, info oder warning.
Msg_text Die Meldung.

Sie können die gespeicherte Schlüsselverteilung mit dem SHOW INDEX-Befehl überprüfen. See section 5.5.5.1 Informationen über Datenbank, Tabellen, Spalten und Indexe abrufen.

Wenn die Tabelle seit dem letzten ANALYZE TABLE-Befehl nicht geändert wurde, wird sie nicht noch einmal analysiert.

5.5.3 FLUSH-Syntax

FLUSH flush_option [,flush_option]

Wenn Sie einige der internen Caches, die MySQL benutzt, löschen wollen, benutzen Sie den FLUSH-Befehl. Um FLUSH ausführen zu können, müssen Sie die RELOAD-Berechtigung haben.

flush_option kann eine der folgenden sein:

HOSTS Leert die Host-Cache-Tabellen. Sie sollten die Host-Tabellen flushen, wenn einige Ihrer Hosts die IP-Nummer ändern oder wenn Sie die Fehlermeldung Host ... is blocked erhalten. Wenn mehr als max_connect_errors Fehler in einer Zeile für einen gegebenen Host während der Verbindung zum MySQL-Server vorkommen, nimmt MySQL an, dass etwas nicht stimmt und blockiert den Host von weiteren Verbindungsversuchen. Wenn die Host-Tabellen geflusht werden, gestattet das dem Host, einen erneuten Verbindungsversuch zu machen. See section A.2.4 Host '...' is blocked-Fehler. Sie können mysqld mit -O max_connection_errors=999999999 starten, um diese Fehlermeldung zu vermeiden.
LOGS Schließt alle Log-Dateien und öffnet sie danach wieder. Wenn Sie die Update-Log-Datei oder eine binäre Log-Datei ohne Erweiterung angegeben haben, wird die Erweiterungsnummer der Log-Datei um eins relativ zur vorherigen Datei hoch gezählt. Wenn Sie eine Erweiterung im Dateinamen benutzt haben, schließt MySQL die Update-Log-Datei und öffnet sie danach wieder. See section 5.9.3 Die Update-Log-Datei. Das ist dasselbe, wie dem mysqld-Server das SIGHUP-Signal senden.
PRIVILEGES Lädt die Berechtigungen aus den Berechtigungstabellen der mysql-Datenbank neu.
TABLES Schließt alle offenen Tabellen und erzwingt, dass alle Tabellen in Benutzung geschlossen werden.
[TABLE | TABLES] tabelle [,tabelle...] Flusht nur die angegebenen Tabellen.
TABLES WITH READ LOCK Schließt alle offenen Tabellen und sperrt alle Tabellen aller Datenbanken mit einer Lesesperre, bis man UNLOCK TABLES ausführt. Das ist eine sehr bequeme Möglichkeit, Datensicherungen zu erzeugen, wenn Sie ein Dateisystem wie Veritas haben, das Schnappschüsse aufnehmen kann.
STATUS Setzt alle Status-Variablen auf null zurück. Das sollte man nur benutzen, wenn man eine Anfrage debuggt.

Jeden der oben genannten Befehle können Sie auch mit dem mysqladmin-Dienstprogramm ausführen, indem Sie flush-hosts, flush-logs, reload oder flush-tables-Befehle eingeben.

Sehen Sie sich auch den RESET-Befehl an, der bei der Replikation benutzt wird. See section 5.10.6 SQL-Befehle in Bezug auf Replikation.

5.5.4 KILL-Syntax

KILL Thread_id

Jede Verbindung zu mysqld läuft durch einen separaten Thread. Sie können sehen, welche Threads laufen, indem Sie den SHOW PROCESSLIST-Befehl ausführen, und einen Thread killen, indem Sie den KILL Thread_id-Befehl ausführen.

Wenn Sie die process-Berechtigung haben, können Sie alle Threads sehen und killen. Ansonsten können Sie nur Ihre eigenen Threads sehen und killen.

Sie können auch die mysqladmin processlist- und mysqladmin kill-Befehle benutzen, um Threads einzusehen und zu killen.

Wenn Sie ein KILL ausführen, wird ein Thread-spezifischer kill flag für den Thread gesetzt.

In den meisten Fällen kann es einige Zeit dauern, bis der Thread stirbt, weil der kill-Flag nur in bestimmten Intervallen geprüft wird:

5.5.5 SHOW-Syntax

   SHOW DATABASES [LIKE platzhalter]
oder SHOW [OPEN] TABLES [FROM datenbank] [LIKE platzhalter]
oder SHOW [FULL] COLUMNS FROM tabelle [FROM datenbank] [LIKE platzhalter]
oder SHOW INDEX FROM tabelle [FROM datenbank]
oder SHOW TABLE STATUS [FROM datenbank] [LIKE platzhalter]
oder SHOW STATUS [LIKE platzhalter]
oder SHOW VARIABLES [LIKE platzhalter]
oder SHOW LOGS
oder SHOW [FULL] PROCESSLIST
oder SHOW GRANTS FOR benutzer
oder SHOW CREATE TABLE tabelle
oder SHOW MASTER STATUS
oder SHOW MASTER LOGS
oder SHOW SLAVE STATUS

SHOW stellt Informationen über Datenbanken, Tabellen, Spalten oder Status-Informationen über den Server zur Verfügung. Wenn der LIKE platzhalter-Teil benutzt wird, kann die platzhalter-Zeichenkette eine Zeichenkette sein, die die SQL-`%'- und `_'- Platzhalterzeichen benutzt.

5.5.5.1 Informationen über Datenbank, Tabellen, Spalten und Indexe abrufen

Sie können datenbank.tabelle als Alternative zur tabelle FROM datenbank-Syntax benutzen. Diese beiden Statements sind äquivalent:

mysql> SHOW INDEX FROM tabelle FROM datenbank;
mysql> SHOW INDEX FROM datenbank.tabelle;

SHOW DATABASES listet die Datenbanken auf dem MySQL-Server-Host auf. Diese Liste erhalten Sie auch mit dem mysqlshow-Befehl.

SHOW TABLES listet die Tabellen in einer gegebenen Datenbank auf. Sie erhalten diese Liste auch mit dem mysqlshow datenbank-Befehl.

HINWEIS: Wenn ein Benutzer keinerlei Berechtigungen für eine Tabelle hat, wird die Tabelle in der Ausgabe von SHOW TABLES oder mysqlshow datenbank nicht aufgeführt.

SHOW OPEN TABLES listet die Tabellen auf, die momentan im Tabellen-Cache geöffnet sind. See section 6.4.6 Wie MySQL Tabellen öffnet und schließt. Das Comment-Feld zeigt an, wie oft die Tabelle gecachet (cached) und in Benutzung (in_use) ist.

SHOW COLUMNS listet die Spalten in einer gegebenen Tabelle auf. Wenn Sie die FULL-Option angeben, erhalten Sie auch die Berechtigungen, die Sie für jede Spalte besitzen. Wenn die Spaltentypen von dem abweichen, was Sie erwarten, nämlich, was Sie im CREATE TABLE-Statement angegeben haben, beachten Sie, dass MySQL manchmal Spaltentypen ändert. See section 7.5.3.1 Stille Spaltentyp-Änderungen.

Das DESCRIBE-Statement gibt ähnliche Informationen wie SHOW COLUMNS aus. See section 7.6.2 DESCRIBE-Syntax (Informationen über Spalten erhalten).

SHOW FIELDS ist ein Synonym für SHOW COLUMNS. SHOW KEYS ist ein Synonym für SHOW INDEX. Sie können die Spalten oder Indexe einer Tabelle auch mit mysqlshow Datenbanktabelle oder mysqlshow -k Datenbanktabelle anzeigen.

SHOW INDEX gibt die Index-Informationen in einem Format aus, das dem SQLStatistics-Aufruf in ODBC stark ähnelt. Folgende Spalten werden zurückgegeben:

Spalte Bedeutung
Table Name der Tabelle.
Non_unique 0, wenn der Index keine Duplikate enthalten darf.
Key_name Name des Indexes.
Seq_in_index Spaltensequenznummer im Index, zählt ab 1.
Column_name Spaltenname.
Collation Wie die Spalte im Index sortiert ist. In MySQL können diese Werte `A' (Ascending - aufsteigend) oder NULL (Not sorted - unsortiert) sein.
Cardinality Anzahl der eindeutigen Werte im Index. Dieser Wert wird durch Laufenlassen von isamchk -a aktualisiert.
Sub_part Anzahl der indizierten Zeichen, wenn die Spalte nur teilweise indiziert ist. NULL, wenn der gesamte Schlüssel indiziert ist.
Comment Verschiedene Anmerkungen. Momentan teilt es nur mit, ob der Index FULLTEXT ist oder nicht.

Beachten Sie: Weil Cardinality basierend auf statistischen Werten gezählt wird, die als Ganzzahlen gespeichert sind, ist es nicht notwendigerweise bei kleinen Tabellen korrekt.

5.5.5.2 SHOW TABLE STATUS

SHOW TABLE STATUS [FROM datenbank] [LIKE platzhalter]

SHOW TABLE STATUS (neu in Version 3.23) funktioniert wie SHOW STATUS, zeigt aber viele weitere Informationen über jede Tabelle. Diese Liste erhalten Sie auch mit dem mysqlshow --status datenbank-Befehl. Folgende Spalten werden zurückgegeben:

Spalte Bedeutung
Name Name der Tabelle.
Type Typ der Tabelle. See section 8 MySQL-Tabellentypen.
Row_format Das Zeilenspeicherformat (fest, dynamisch oder komprimiert).
Rows Anzahl der Zeilen.
Avg_row_length Durchschnittliche Zeilenlänge.
Data_length Länge der Daten-Datei.
Max_data_length Maximale Länge der Daten-Datei.
Index_length Länge der Index-Datei.
Data_free Anzahl der zugewiesenen (allocated), aber nicht benutzten Bytes.
Auto_increment Nächster autoincrement-Wert.
Create_time Wann die Tabelle erzeugt wurde.
Update_time Wann die Daten-Datei das letzte Mal aktualisiert wurde.
Check_time Wann die Tabelle das letzte Mal geprüft wurde.
Create_options Zusätzliche Optionen, die beim CREATE TABLE benutzt wurden.
Comment Der Kommentar, der beim Erzeugen der Tabelle angegeben wurde (oder einige Informationen, warum MySQL nicht auf die Tabelleninformationen zugreifen konnte).

Bei InnoDB-Tabellen wird im Tabellenkommentar der freie Platz im Tablespace ausgegeben.

5.5.5.3 SHOW STATUS

SHOW STATUS zeigt Server-Status-Informationen an (wie mysqladmin extended-status). Die Ausgabe ähnelt der unten stehenden, obwohl Format und Anzahl der Zeilen wahrscheinlich abweichen:

+--------------------------+------------+
| Variable_name            | Value      |
+--------------------------+------------+
| Aborted_clients          | 0          |
| Aborted_connects         | 0          |
| Bytes_received           | 155372598  |
| Bytes_sent               | 1176560426 |
| Connections              | 30023      |
| Created_tmp_disk_tables  | 0          |
| Created_tmp_tables       | 8340       |
| Created_tmp_files        | 60         |
| Delayed_insert_Threads   | 0          |
| Delayed_writes           | 0          |
| Delayed_errors           | 0          |
| Flush_commands           | 1          |
| Handler_delete           | 462604     |
| Handler_read_first       | 105881     |
| Handler_read_key         | 27820558   |
| Handler_read_next        | 390681754  |
| Handler_read_prev        | 6022500    |
| Handler_read_rnd         | 30546748   |
| Handler_read_rnd_next    | 246216530  |
| Handler_update           | 16945404   |
| Handler_write            | 60356676   |
| Key_blocks_used          | 14955      |
| Key_read_requests        | 96854827   |
| Key_reads                | 162040     |
| Key_write_requests       | 7589728    |
| Key_writes               | 3813196    |
| Max_used_connections     | 0          |
| Not_flushed_key_blocks   | 0          |
| Not_flushed_delayed_rows | 0          |
| Open_tables              | 1          |
| Open_files               | 2          |
| Open_streams             | 0          |
| Opened_tables            | 44600      |
| Questions                | 2026873    |
| Select_full_join         | 0          |
| Select_full_range_join   | 0          |
| Select_range             | 99646      |
| Select_range_check       | 0          |
| Select_scan              | 30802      |
| Slave_running            | OFF        |
| Slave_open_temp_tables   | 0          |
| Slow_launch_threads      | 0          |
| Slow_queries             | 0          |
| Sort_merge_passes        | 30         |
| Sort_range               | 500        |
| Sort_rows                | 30296250   |
| Sort_scan                | 4650       |
| Table_locks_immediate    | 1920382    |
| Table_locks_waited       | 0          |
| Threads_cached           | 0          |
| Threads_created          | 30022      |
| Threads_connected        | 1          |
| Threads_running          | 1          |
| Uptime                   | 80380      |
+--------------------------+------------+

The status variables listed höher have the following Bedeutung:

Variable Bedeutung
Aborted_clients Anzahl der Verbindungen, die abgebrochen wurden, weil der Client starb, ohne die Verbindung ordnungsgemäß zu schließen. See section A.2.9 Kommunikationsfehler / Abgebrochene Verbindung.
Aborted_connects Anzahl der fehlgeschlagenen Versuche, sich mit dem MySQL-Server zu verbinden. See section A.2.9 Kommunikationsfehler / Abgebrochene Verbindung.
Bytes_received Anzahl der Bytes, die von allen Clients empfangen wurden.
Bytes_sent Anzahl der Bytes, die an alle Clients gesendet wurden.
Connections Anzahl der Verbindungsversuche zum MySQL-Server.
Created_tmp_disk_tables Anzahl der (implizit) auf der Platte erzeugten temporären Tabellen bei der Ausführung von Statements.
Created_tmp_tables Anzahl der (implizit) im Arbeitsspeicher erzeugten temporären Tabellen bei der Ausführung von Statements.
Created_tmp_files Wie viele temporäre Dateien mysqld erzeugt hat.
Delayed_insert_Threads Anzahl der verzögerten Insert-Handler-Threads in Benutzung.
Delayed_writes Anzahl der Zeilen, die mit INSERT DELAYED geschrieben wurden.
Delayed_errors Anzahl der Zeilen, die mit INSERT DELAYED geschrieben wurden, und bei denen irgend ein Fehler auftrat (wahrscheinlich duplicate key).
Flush_commands Anzahl der ausgeführten FLUSH-Befehle.
Handler_delete Wie oft eine Zeile aus einer Tabelle gelöscht wurde.
Handler_read_first Wie oft der erste Eintrag aus einem Index gelesen wurde. Wenn dieser Wert hoch ist, legt das nahe, dass der Server viele komplette Index-Scans macht (zum Beispiel SELECT spalte1 FROM foo, unter der Annahme, dass spalte1 indiziert ist).
Handler_read_key Anzahl der Anfragen, eine Zeile basierend auf einem Schlüssel zu lesen. Wenn dieser Wert hoch ist, ist das ein gutes Indiz dafür, dass Ihre Anfragen und Tabellen korrekt indiziert sind.
Handler_read_next Anzahl der Anfragen, die nächste Zeile in der Reihenfolge des Schlüssels zu lesen. Dieser Wert wird herauf gezählt, wenn Sie eine Index-Spalte mit einer Bereichsbeschränkung (Limit) abfragen. Er wird ebenfalls herauf gezählt, wenn Sie einen Index-Scan durchführen.
Handler_read_rnd Anzahl der Anfragen, eine Zeile basierend auf einer festen Position zu lesen. Dieser Wert wird hoch sein, wenn Sie viele Anfragen ausführen, die erfordern, dass das Ergebnis sortiert wird.
Handler_read_rnd_next Anzahl der Anfragen, die nächste Zeile in der Daten-Datei zu lesen. Dieser Wert wird hoch sein, wenn Sie viele Tabellen-Scans durchführen. Im Allgemeinen weist das darauf hin, dass Ihre Tabellen nicht korrekt indiziert sind, oder dass Ihre Anfragen nicht so geschrieben sind, dass Sie Vorteile aus den Indexen ziehen, die Sie haben.
Handler_update Anzahl der Anfragen, eine Zeile in einer Tabelle zu aktualisieren.
Handler_write Anzahl der Anfragen, eine Zeile in eine Tabelle einzufügen.
Key_blocks_used Die Anzahl der benutzten Blocks im Schlüssel-Cache.
Key_read_requests Die Anzahl der Anfragen, einen Schlüssel-Block aus dem Cache zu lesen.
Key_reads Die Anzahl physikalischer Lesezugriffen eines Schlüssel-Blocks von der Platte.
Key_write_requests Die Anzahl der Anfragen, einen Schlüssel-Block in den Cache zu schreiben.
Key_writes Die Anzahl physikalischer Schreibvorgänge eines Schlüssel-Blocks auf Platte.
Max_used_connections Die höchste Anzahl von Verbindungen, die gleichzeitig in Benutzung sind.
Not_flushed_key_blocks Schlüssel-Blöcke im Schlüssel-Cache, die verändert wurden, aber noch nicht auf die Platte zurück geschrieben (flush).
Not_flushed_delayed_rows Anzahl der Zeilen, die in INSERT DELAY-Warteschleifen darauf warten, geschrieben zu werden.
Open_tables Anzahl der offenen Tabellen.
Open_files Anzahl der offenen Dateien.
Open_streams Anzahl der offenen Streams (hauptsächlich zum Loggen benutzt).
Opened_tables Anzahl der Tabellen, die geöffnet wurden.
Select_full_join Anzahl der Joins ohne Schlüssel (sollte 0 sein).
Select_full_range_join Anzahl der Joins, bei denen eine Bereichssuche auf die Referenztabelle statt fand.
Select_range Anzahl der Joins, bei denen Bereiche auf die erste Tabelle benutzt wurden. (Es ist normalerweise unkritisch, wenn dieser Wert hoch ist.)
Select_scan Anzahl der Joins, bei denen die erste Tabelle gescannt wurde.
Select_range_check Anzahl der Joins ohne Schlüssel, bei denen nach jeder Zeile auf Schlüsselbenutzung geprüft wurde (sollte 0 sein).
Questions Anzahl der Anfragen, die zum Server geschickt wurden.
Slave_open_temp_tables Anzahl der temporären Tabellen, die momentan vom Slave-Thread geöffnet sind.
Slow_launch_threads Anzahl der Threads, die länger als slow_launch_time brauchten, um sich zu verbinden.
Slow_queries Anzahl der Anfragen, die länger als long_query_time benötigten. See section 5.9.5 Die Anfragen-Log-Datei für langsame Anfragen.
Sort_merge_passes Anzahl der Verschmelzungen (Merge), die von einem Sortiervorgang benötigt wurden. Wenn dieser Wert hoch ist, sollten Sie in Betracht ziehen, sort_buffer herauf zu setzen.
Sort_range Anzahl der Sortiervorgänge, die mit Bereichen durchgeführt wurden.
Sort_rows Anzahl der sortierten Zeilen.
Sort_scan Anzahl der Sortiervorgänge, die durchgeführt wurden, indem die Tabelle gescannt wurde.
Table_locks_immediate Wie oft eine Tabellensperre sofort erlangt wurde. Verfügbar nach Version 3.23.33.
Table_locks_waited Wie oft eine Tabellensperre nicht sofort erlangt werden konnte und gewartet werden musst. Wenn dieser Wert hoch ist und Sie Performance-Probleme haben, sollten Sie zunächst Ihre Anfragen optimieren und dann entweder Ihre Tabelle(n) zerteilen oder Replikation benutzen. Verfügbar nach Version 3.23.33.
Threads_cached Anzahl der Threads im Thread-Cache.
Threads_connected Anzahl der momentan offenen Verbindungen.
Threads_created Anzahl der Threads, die zur Handhabung von Verbindungen erzeugt wurden.
Threads_running Anzahl der Threads, die nicht schlafen.
Uptime Seit wie vielen Sekunden der Server hoch gefahren ist.

Einige Anmerkungen zum oben Aufgeführten:

5.5.5.4 SHOW VARIABLES

SHOW VARIABLES [LIKE platzhalter]

SHOW VARIABLES zeigt die Werte einiger MySQL-Systemvariablen. Sie erhalten diese List auch mit dem mysqladmin variables-Befehl. Wenn die Vorgabewerte unpassend sind, können Sie die meisten dieser Variablen mit Kommandozeilenoptionen setzen, wenn Sie mysqld hoch fahren. See section 5.1.1 mysqld-Kommandozeilenoptionen.

Die Ausgabe ähnelt der unten stehenden, obwohl Format und Anzahl der Zeilen wahrscheinlich abweichen:

+-------------------------+---------------------------+
| Variable_name           | Value                     |
+-------------------------+---------------------------+
| ansi_mode               | OFF                       |
| back_log                | 50                        |
| basedir                 | /my/monty/                |
| bdb_cache_size          | 16777216                  |
| bdb_log_buffer_size     | 32768                     |
| bdb_home                | /my/monty/data/           |
| bdb_max_lock            | 10000                     |
| bdb_logdir              |                           |
| bdb_shared_data         | OFF                       |
| bdb_tmpdir              | /tmp/                     |
| binlog_cache_size       | 32768                     |
| concurrent_insert       | ON                        |
| connect_timeout         | 5                         |
| datadir                 | /my/monty/data/           |
| delay_key_write         | ON                        |
| delayed_insert_limit    | 100                       |
| delayed_insert_timeout  | 300                       |
| delayed_queue_size      | 1000                      |
| flush                   | OFF                       |
| flush_time              | 0                         |
| have_bdb                | YES                       |
| have_innodb             | YES                       |
| have_raid               | YES                       |
| have_openssl            | NO                        |
| init_file               |                           |
| interactive_timeout     | 28800                     |
| join_buffer_size        | 131072                    |
| key_buffer_size         | 16776192                  |
| language                | /my/monty/share/english/  |
| large_files_support     | ON                        |
| log                     | OFF                       |
| log_update              | OFF                       |
| log_bin                 | OFF                       |
| log_slave_updates       | OFF                       |
| long_query_time         | 10                        |
| low_priority_updates    | OFF                       |
| lower_case_table_names  | 0                         |
| max_allowed_packet      | 1048576                   |
| max_binlog_cache_size   | 4294967295                |
| max_connections         | 100                       |
| max_connect_errors      | 10                        |
| max_delayed_threads     | 20                        |
| max_heap_table_size     | 16777216                  |
| max_join_size           | 4294967295                |
| max_sort_length         | 1024                      |
| max_tmp_tables          | 32                        |
| max_write_lock_count    | 4294967295                |
| myisam_recover_options  | DEFAULT                   |
| myisam_sort_buffer_size | 8388608                   |
| net_buffer_length       | 16384                     |
| net_read_timeout        | 30                        |
| net_retry_count         | 10                        |
| net_write_timeout       | 60                        |
| open_files_limit        | 0                         |
| pid_file                | /my/monty/data/donna.pid  |
| port                    | 3306                      |
| protocol_version        | 10                        |
| record_buffer           | 131072                    |
| query_buffer_size       | 0                         |
| safe_show_database      | OFF                       |
| server_id               | 0                         |
| skip_locking            | ON                        |
| skip_networking         | OFF                       |
| skip_show_database      | OFF                       |
| slow_launch_time        | 2                         |
| socket                  | /tmp/mysql.sock           |
| sort_buffer             | 2097116                   |
| table_cache             | 64                        |
| table_type              | MYISAM                    |
| Thread_cache_size       | 4                         |
| Thread_stack            | 65536                     |
| tmp_table_size          | 1048576                   |
| tmpdir                  | /tmp/                     |
| version                 | 3.23.29a-gamma-debug      |
| wait_timeout            | 28800                     |
+-------------------------+---------------------------+

Jede Option ist unten beschrieben. Die Werte für Puffergrößen, Längen und Stack-Größen sind in Bytes angegeben. Sie können Wert mit den Suffixen `K' oder `M' angeben, um Kilobytes oder Megabytes zu kennzeichnen. 16M zum Beispiel bedeutet 16 Megabytes. Bei den Suffixen spielt Groß-/Kleinschreibung keine Rolle, 16M und 16m sind äquivalent:

ansi_mode.
Ist ON, wenn mysqld mit --ansi gestartet wurde. See section 2.7.2 MySQL im ANSI-Modus laufen lassen.
back_log
Die Anzahl unerledigter Verbindungsanforderung, die MySQL haben kann. Dies kommt ins Spiel, wenn der Haupt-Thread von MySQL SEHR viele Verbindungsanforderungen in sehr kurzer Zeit erhält. Dann dauert es etwas (wenngleich sehr kurz), damit der Haupt-Thread die Verbindung prüfen und einen neuen Thread starten kann. Der back_log-Wert zeigt an, wie viele Verbindungen während dieser kurzen Zeit gestapelt (gestackt) werden können, bevor MySQL für einen Moment aufhört, neue Anforderungen zu beantworten. Sie brauchen diesen Wert nur dann herauf setzen, wenn Sie eine große Zahl von Verbindungen in kurzer Zeit erwarten. Mit anderen Worten ist dieser Wert die Größe der Listen-Queue (Warteschlange) für herein kommende TCP/IP-Verbindungen. Ihr Betriebssystem hat seine eigene Beschränkung hinsichtlich der Größe dieser Queue. Die Handbuchseiten zum Unix-listen(2)-System sollten hier weitere Details haben. Sehen Sie in der Dokumentation Ihres Betriebssystems nach, wie hoch der Wert dieser Variablen maximal sein kann. Wenn Sie versuchen, back_log höher als die Begrenzung Ihres Betriebssystems zu setzen, ist das ineffektiv.
basedir
Der Wert der --basedir-Option.
bdb_cache_size
Der zugewiesene Puffer, um Index und Zeilen bei BDB-Tabellen zu cachen. Wenn Sie keine BDB-Tabellen benutzen, sollten Sie mysqld mit --skip-bdb starten, um für diesen Cache keinen Arbeitsspeicher zu verschwenden.
bdb_log_buffer_size
Der zugewiesene Puffer, um Index und Zeilen bei BDB-Tabellen zu cachen. Wenn Sie keine BDB-Tabellen benutzen, sollten Sie diesen Wert auf o setzen und mysqld mit --skip-bdb starten, um für diesen Cache keinen Arbeitsspeicher zu verschwenden.
bdb_home
Der Wert der --bdb-home-Option.
bdb_max_lock
Die maximale Anzahl von Sperren (Vorgabewert: 1000), die bei einer BDB-Tabelle aktiv sein können. Sie sollten diesen Wert herauf setzen, wenn Sie Fehler folgender Art bekommen: bdb: Lock table is out of available locks oder Got error 12 from ..., wenn Sie lange Transaktionen durchführen oder wenn mysqld viele Zeile untersuchen muss, um die Anfrage zu berechnen.
bdb_logdir
Der Wert der --bdb-logdir-Option.
bdb_shared_data
Ist ON, wenn Sie --bdb-shared-data benutzen.
bdb_tmpdir
Der Wert der --bdb-tmpdir-Option.
binlog_cache_size. Die Größe des Caches, in dem
SQL-Statements für das Binär-Log während einer Transaktion vorgehalten werden. Wenn Sie oft große, aus vielen Statements bestehende Transaktionen durchführen, können Sie diesen Wert herauf setzen, um mehr Performance zu erzielen. See section 7.7.1 BEGIN/COMMIT/ROLLBACK-Syntax.
character_set
Der vorgabemäßige Zeichensatz.
character_sets
Die unterstützten Zeichensätze.
concurrent_inserts
Falls ON (Vorgabe), läßt MySQL INSERT auf MyISAM-Tabellen zu, auf die zur gleichen Zeit SELECT-Anfragen laufen. Sie können diese Option ausschalten, indem Sie mysqld mit --safe oder --skip-new starten.
connect_timeout
Die Anzahl von Sekunden, die der mysqld-Server auf ein Verbindungspaket wartet, bevor er mit Bad handshake antwortet.
datadir
Der Wert der --datadir-Option.
delay_key_write
Falls angeschaltet (Vorgabe), akzeptiert MySQL die delay_key_write-Option von CREATE TABLE. Das heißt, dass der Schlüsselpuffer für Tabellen bei dieser Option nicht bei jeder Index-Aktualisierung auf Platte zurückgeschrieben (flush) wird, sondern nur, wenn eine Tabelle geschlossen wird. Das beschleunigt Schreibvorgänge auf Schlüssel ganz erheblich, aber Sie sollten eine automatische Prüfung aller Tabellen mit myisamchk --fast --force hinzufügen, wenn Sie diese Option benutzen. Beachten Sie: Wenn Sie mysqld mit der --delay-key-write-for-all-tables-Option startet, heißt das, dass alle Tabelle so behandelt werden, als wenn sie mit der delay_key_write-Option erzeugt worden wären. Sie können diesen Flag löschen, wenn Sie mysqld mit --skip-new oder --safe-mode starten.
delayed_insert_limit
Nachdem delayed_insert_limit Zeilen eingefügt wurden, prüft der INSERT DELAYED-Handler, ob noch irgend welche SELECT-Statements anhängig sind. Falls ja, wird deren Ausführung zugelassen, bevor weiter gemacht wird.
delayed_insert_timeout
Wie lange ein INSERT DELAYED-Thread auf INSERT-Statements warten soll, bevor abgebrochen wird.
delayed_queue_size
Welche Warteschleifen-(Queue)-Speichergröße (in Zeilen) für die Handhabung von INSERT DELAYED zugewiesen werden soll. Wenn die Queue voll ist, wartet jeder Client, der INSERT DELAYED ausführt, bis es wieder Platz in der Queue gibt.
flush
Ist ON, wenn Sie MySQL mit der --flush-Option gestartet haben.
flush_time
Wenn diese Variable auf einen Wert ungleich 0 gesetzt wird, dann werden alle flush_time Sekunden alle Tabelle geschlossen (um Ressourcen frei zu geben und Dinge auf Platte zurück zu schreiben). Diese Option empfehlen wir nur auf Windows 95, Windows 98 oder auf Systemen, auf denen Sie sehr wenige Ressourcen haben.
have_bdb
Ist YES, wenn mysqld Berkeley-DB-Tabellen unterstützt. Ist DISABLED, wenn --skip-bdb benutzt wird.
have_innodb
Ist YES, wenn mysqld InnoDB-Tabellen unterstützt. Ist DISABLED, wenn --skip-innodb benutzt wird.
have_raid
Ist YES, wenn mysqld die RAID-Option unterstützt.
have_openssl
Ist YES, wenn mysqld SSL (Verschlüsselung) auf dem Client-/Server-Protokoll unterstützt.
init_file
Der Name der Datei, die mit der --init-file-Option angegeben wurde, als Sie den Server starteten. Das ist eine Datei mit SQL-Statements, die der Server beim Start ausführen soll.
interactive_timeout
Die Anzahl von Sekunden, die der Server bei einer interaktiven Verbindung wartet, bis er sie schließt. Ein interaktiver Client ist definiert als Client, der die CLIENT_INTERACTIVE-Option für mysql_real_connect() benutzt. Siehe auch wait_timeout.
join_buffer_size
Die Größe des Puffers, der für volle Joins benutzt wird (Joins, die keine Indexe benutzen). Der Puffer wird einmal pro vollem Join zwischen zwei Tabellen zugewiesen. Setzen Sie diesen Wert herauf, um einen schnelleren vollen Join zu erhalten, wenn das Addieren von Indexen nicht möglich ist. (Normalerweise ist die beste Art, schnelle Joins zu erhalten, das Addieren von Indexen.)
key_buffer_size
Index-Blöcke werden gepuffert und von allen Threads geteilt. key_buffer_size ist die Größe des Puffers, der für Index-Blöcke benutzt wird. Setzen Sie diesen Wert herauf, um eine bessere Index-Handhabung zu erzielen (für alle Lesevorgänge und für mehrfache Schreibvorgänge), so weit, wie Sie es sich leisten können; 64 MB auf einer 256-MB-Maschine, auf der hauptsächlich MySQL läuft, ist ein gebräuchlicher Wert. Wenn Sie diesen Wert allerdings zu hoch setzen (mehr als 50% Ihres gesamten Arbeitsspeichers), kann es sein, dass Ihr System anfängt auszulagern (Paging), was SEHR langsam werden kann. Denken Sie daran, dass Sie Platzt für den Dateisystem-Cache des Betriebssystems lassen müssen, weil MySQL Daten-Lesen nicht cachet. Sie können die Performance des Schlüsselpuffers mit show status überprüfen und sich die Variablen Key_read_requests, Key_reads, Key_write_requests und Key_writes ansehen. Das Verhältnis Key_reads/Key_read_request sollte normalerweise < 0,01 sein. Key_write/Key_write_requests ist üblicherweise nahe 1, wenn Sie hauptsächlich Aktualisieren (Update) und Löschen (Delete) ausführen, kann aber sehr viel kleiner werden, wenn Sie tendenziell Aktualisierungen ausführen, die viele Zeilen gleichzeitig betreffen, oder wenn Sie delay_key_write benutzen. See section 5.5.5 SHOW-Syntax. Um noch mehr Geschwindigkeit beim Schreiben vieler Zeilen auf einmal zu erhalten, benutzen Sie LOCK TABLES. See section 7.7.2 LOCK TABLES/UNLOCK TABLES-Syntax.
language
Die Sprache, in der Fehlermeldungen ausgegeben werden.
large_file_support
Ob mysqld mit Optionen für die Unterstützung großer Dateien kompiliert wurde.
locked_in_memory
Ob mysqld mit --memlock in den Speicher gesperrt wurde.
log
Ob das Loggen aller Anfragen angeschaltet ist.
log_update
Ob das Update-Log angeschaltet ist.
log_bin
Ob das Binär-Log angeschaltet ist.
log_slave_updates
Ob Aktualisierungen vom Slave geloggt werden sollen.
long_query_time
Wenn eine Anfrage länger als diesen Wert (in Sekunden) benötigt, wird der Slow_queries-Zähler hoch gezählt. Wenn Sie --log-slow-queries benutzen, wird die Anfrage in die Slow-Query-Logdatei geschrieben. See section 5.9.5 Die Anfragen-Log-Datei für langsame Anfragen.
lower_case_table_names
Wenn auf 1 gesetzt, werden Tabellennamen in Kleinschreibung auf Platte gespeichert. Tabellennamen sind dann unabhängig von der verwendeten Groß-/Kleinschreibung. See section A.5.1 Groß-/Kleinschreibung beim Suchen.
max_allowed_packet
Die maximale Größe eine Pakets. Der Nachrichtenpuffer wird auf net_buffer_length Bytes Länge initialisiert, kann aber wenn nötig bis zu max_allowed_packet Bytes Groß werden. Der Vorgabewert ist klein, um große (möglicherweise falsche) Pakete abzufangen. Sie müssen diesen Wert erhöhen, wenn Sie große BLOB-Spalten verwenden. Er sollte so Groß sein wie die größte BLOB-Spalte, die Sie verwenden wollen. Das aktuelle Protokoll begrenzt max_allowed_packet auf 16 MB.
max_binlog_cache_size
Wenn eine Transaktion aus mehreren Statements mehr als diese Speichermenge benötigt, erhält man den Fehler "Multi-Statement transaction required more than 'max_binlog_cache_size' bytes of storage".
max_binlog_size
Verfügbar nach Version 3.23.33. Wenn ein Schreibvorgang ins binäre (Replikations-) Log den angegebenen Wert übersteigt, werden die Logs rotiert. Sie können den Wert auf weniger als 1024 Bytes setzen oder auf mehr als 1 GB. Vorgabe ist 1 GB.
max_connections
Die Anzahl von Clients, die gleichzeitig verbunden sind. Wenn Sie diesen Wert hoch setzen, wird die Anzahl der Datei-Deskriptoren heraufgesetzt, die mysqld benötigt. Siehe weiter unten, Bemerkungen zu Beschränkungen bei Datei-Deskriptoren. See section A.2.5 Too many connections-Fehler.
max_connect_errors
Wenn es mehr als diese Anzahl unterbrochener Verbindungen von einem Host gibt, wird dieser Host von weiteren Verbindungen abgeschnitten. Sie können diese Sperre mit dem FLUSH HOSTS-Befehl aufheben.
max_delayed_Threads
Nicht mehr als diese Anzahl von Threads zulassen, um INSERT DELAYED-Statements abzuarbeiten. Wenn Sie versuchen, Daten in eine neue Tabelle einzufügen, wenn alle INSERT DELAYED-Threads in Benutzung sind, wird die Zeile eingefügt, als ob das DELAYED-Attribut nicht angegeben wäre.
max_heap_table_size
Kein Erzeugen von Heap-Tabellen zulassen, die größer als dieser Wert sind.
max_join_size
Joins, die wahrscheinlich mehr als max_join_size Datensätze lesen werden, geben einen Fehler zurück. Setzen Sie diesen Wert, wenn Ihre Benutzer dazu neigen, Joins auszuführen, denen eine WHERE-Klausel fehlt und die daher lange Zeit benötigen und womöglich Millionen von Zeilen zurück geben.
max_sort_length
Die Anzahl von Bytes, die beim Sortieren von BLOB- oder TEXT-Werten benutzt werden (nur die ersten max_sort_length Bytes jedes Werts werden benutzt, der Rest wird ignoriert).
max_user_connections
Die maximale Anzahl aktiver Verbindungen für einen einzelnen Benutzer (0 = keine Beschränkung).
max_tmp_tables
(Diese Option macht bislang noch nichts.) Maximale Anzahl von temporären Tabellen, die ein Client zur selben Zeit offen halten darf.
max_write_lock_count
Nach dieser Anzahl Schreibsperren wird einigen Lesesperren erlaubt, zwischendurch zu laufen.
myisam_recover_options
Der Wert der --myisam-recover-Option.
myisam_sort_buffer_size
Der Puffer, der beim Sortieren des Indexes zugewiesen wird, wenn man ein REPAIR oder ausführt oder Indexe mit CREATE INDEX oder ALTER TABLE erzeugt.
myisam_max_extra_sort_file_size.
Wenn das Erzeugen der temporären Datei für schnelle Index-Erzeugung um diesen Wert größer sein würde als die Benutzung des Schlüssel-Caches, wird die Schlüssel-Cache-Methode bevorzugt. Wird hauptsächlich benutzt, um lange Zeichen-Schlüssel in großen Tabellen zu zwingen, die langsamere Schlüssel-Cache-Methode zu benutzen, um den Index zu erzeugen. HINWEIS: Dieser Parameter wird in Megabytes angegeben!
myisam_max_sort_file_size
Die maximale Größe der temporären Datei, die MySQL benutzen darf, während es den Index erzeugt (während REPAIR, ALTER TABLE oder LOAD DATA INFILE). Wenn die Datei größer als dieser Wert würde, wird der Index über den Schlüssel-Cache erzeugt (was langsamer ist). HINWEIS: Dieser Parameter wird in Megabytes angegeben!
net_buffer_length
Der Kommunikationspuffer wird zwischen Anfragen auf diesen Wert zurück gesetzt. Normalerweise sollte das nicht geändert werden, aber wenn Sie sehr wenig Arbeitsspeicher haben, können Sie ihn auf die erwartete Größe einer Anfrage setzen (also die erwartete Länge von SQL-Statements, die von Clients gesendet werden. Wenn Statements diese Länge überschreiten, wird der Puffer automatisch vergrößert, bis zu max_allowed_packet Bytes.)
net_read_timeout
Anzahl von Sekunden, die auf weitere Daten von einer Verbindung gewartet wird, bevor das Lesen abgebrochen wird. Beachten Sie: Wenn keine Daten von einer Verbindung erwartet werden, ist der Timeout durch write_timeout definiert. Siehe auch slave_read_timeout.
net_retry_count
Wenn ein Lesevorgang auf einem Kommunikations-Port unterbrochen wird, wird so oft wie angegeben neu versucht, bevor aufgegeben wird. Dieser Wert sollte auf FreeBSD recht hoch sein, weil interne Unterbrechnungsanforderungen (Interrupts) an alle Threads gesendet werden.
net_write_timeout
Anzahl von Sekunden, die auf das Schreiben eines Blocks zu einer Verbindung gewartet wird, bis das Schreiben abgebrochen wird.
open_files_limit
Wenn dieser Wert ungleich 0 ist, benutzt mysqld Datei-Deskriptoren, die mit setrlimit() benutzt werden. Wenn dieser Wert gleich 0 ist, reserviert mysqld max_connections * 5 oder max_connections + table_cache * 2 (je nachdem, was größer ist) Anzahl von Dateien. Sie sollten diesen Wert herauf setzen, wenn mysqld Ihnen die Fehlermeldung 'Too many open files' gibt.
pid_file
Der Wert der --pid-file-Option.
port
Der Wert der --port-Option.
protocol_version
Die Protokoll-Version, die vom MySQL-Server benutzt wird.
record_buffer
Jeder Thread, der einen sequentiellen Scan ausführt, alloziert einen Puffer dieser Größe für jede Tabelle, die er scannt. Wenn Sie viele sequentielle Scans ausführen, sollten Sie diesen Wert herauf setzen.
record_rnd_buffer
Wenn Zeilen nach einem Sortiervorgang in sortierter Reihenfolge gelesen werden, werden die Zeilen aus diesem Puffer gelesen, um Suchvorgänge auf der Platte zu vermeiden. Wenn dieser Wert nicht gesetzt ist, wird er auf den Wert von record_buffer gesetzt.
query_buffer_size
Die anfängliche Zuweisung des Anfragen-Puffers. Wenn die meisten Ihrer Anfragen lang sind (zum Beispiel beim Einfügen von Blobs), sollten Sie diesen Wert herauf setzen!
safe_show_databases
Keine Datenbanken zeigen, wenn der Benutzer keinerlei Datenbank- oder Tabellen-Berechtigungen dafür hat. Das kann die Sicherheit erhöhen, wenn Sie sich Sorgen machen, dass Leute in der Lage sind zu sehen, welche Datenbanken andere Benutzer haben. Siehe auch skip_show_databases.
server_id
Der Wert der --server-id-Option.
skip_locking
Ist OFF, wenn mysqld externes Sperren benutzt.
skip_networking
Ist ON, wenn nur lokale (Socket-) Verbindungen zugelassen sind.
skip_show_databases
Hält Leute davon ab, SHOW DATABASES zu benutzen, wenn sie keine the PROCESS_PRIV-Berechtigung haben. Das kann die Sicherheit erhöhen, wenn Sie sich Sorgen machen, dass Leute in der Lage sind zu sehen, welche Datenbanken andere Benutzer haben. Siehe auch safe_show_databases.
slave_read_timeout
Anzahl von Sekunden, die auf weitere Daten von einer Master-/Slave-Verbindung gewartet wird, bevor das Lesen abgebrochen wird.
slow_launch_time
Wenn das Erzeugen des Threads länger als dieser Wert (in Sekunden) dauert, word der Slow_launch_threads-Zähler herauf gezählt.
socket
Der Unix-Socket, der vom Server benutzt wird.
sort_buffer
Jeder Thread, der einen Sortierdurchgang durchführen muss, alloziert einen Puffer dieser Größe. Setzen Sie diesen Wert herauf, um schnellere ORDER BY- oder GROUP BY-Operationen zu erhalten. See section A.4.4 Wohin MySQL temporäre Dateien speichert.
table_cache
Die Anzahl offener Tabellen für alle Threads. Wenn dieser Wert herauf gesetzt wird, erhöht sich die Anzahl von Datei-Deskriptoren, die mysqld benötigt. Sie können prüfen, ob Sie den Tabellen-Cache vergrößern müssen, indem Sie die Opened_tables-Variable prüfen. See section 5.5.5 SHOW-Syntax. Wenn diese Variable sehr Groß ist und Sie FLUSH TABLES nicht oft brauchen (was lediglich alle Tabellen zwingt, geschlossen und wieder geöffnet zu werden), sollten Sie den Wert dieser Variablen herauf setzen. Wegen weiterer Informationen zum Tabellen-Cache sehen Sie unter section 6.4.6 Wie MySQL Tabellen öffnet und schließt nach.
table_type
Der vorgabemäßige Tabellentyp.
thread_cache_size
Wie viele Threads in einem Cache für weitere Benutzung offen gehalten werden sollen. Wenn eine Client die Verbindung schließt, werden die Threads des Clients in den Cache geschrieben, wenn es nicht mehr als Thread_cache_size Threads als vorher gibt. Alle neuen Threads werden zuerst aus dem Cache genommen und nur, wenn der Cache leer ist, wird ein neuer Thread erzeugt. Diese Variable kann hoch gesetzt werden, um die Performance zu verbessern, wenn Sie sehr viele neue Verbindungen haben. (Normalerweise führt das nicht zu namhafter Performance-Steigerung, wenn Sie eine gute Thread-Implementierung haben.) Wie effizient der aktuelle Thread-Cache für Sie ist, können Sie feststellen, indem Sie den Unterschied zwischen Connections und Threads_created betrachten.
thread_concurrency
On Solaris, mysqld will call thr_setconcurrency() mit this value. thr_setconcurrency() permits the Applikation to give the Threads System a hint für the desired Anzahl von Threads that should be run at the same time.
thread_stack
Die Stack-Größe jedes Threads. Viele der Beschränkungen, die durch den crash-me-Test festgestellt werden, hängen von diesem Wert ab. Der Vorgabewert ist Groß genug für normale Operationen. See section 6.1.4 Die MySQL-Benchmark-Suite.
timezone
Die Zeitzone für den Server.
tmp_table_size
Wenn eine temporäre Tabelle im Arbeitsspeicher diese Größe überschreitet, wandelt MySQL sie automatisch in eine MyISAM-Tabelle auf der Platte um. Setzen Sie den Wert von tmp_table_size herauf, wenn Sie viele fortgeschrittene GROUP BY-Anfragen und viel Arbeitsspeicher haben.
tmpdir
Das Verzeichnis, das für temporäre Dateien und temporäre Tabellen benutzt wird.
version
Die Versionsnummer des Servers.
wait_timeout
Die Anzahl von Sekunden, die der Server auf Aktivität auf einer Verbindung wartet, bevor er sie schließt. Siehe auch interactive_timeout.

Der Handbuchabschnitt, der das Tunen von MySQL beschreibt, enthält einige Informationen darüber, wie die oben aufgeführten Variablen getunt werden. See section 6.5.2 Serverparameter tunen.

5.5.5.5 SHOW LOGS

SHOW LOGS zeigt Ihnen Statusinformationen über bestehende Log-Dateien. Momentan werden nur Informationen über Berkeley-DB-Log-Dateien angezeigt.

5.5.5.6 SHOW PROCESSLIST

SHOW PROCESSLIST zeigt, welche Threads laufen. Diese Information erhalten Sie auch mit dem mysqladmin processlist-Befehl. Wenn Sie die process-Berechtigung haben, können Sie alle Threads sehen. Ansonsten sehen Sie nur Ihre eigenen Threads. See section 5.5.4 KILL-Syntax. Wenn Sie die FULL-Option nicht benutzen, werden nur die ersten 100 Zeichen jeder Anfrage gezeigt.

Dieser Befehl ist sehr nützlich, wenn Sie die 'too many connections'-Fehlermeldung erhalten und herausfinden wollen, was vor sich geht. MySQL reserviert eine zusätzliche Verbindung für einen Client mit der Process_priv-Berechtigung, um sicherzustellen, dass Sie sich jederzeit einloggen und das System prüfen können (unter der Annahme, dass Sie diese Berechtigung nicht allen Ihren Benutzern geben).

5.5.5.7 SHOW GRANTS

SHOW GRANTS FOR benutzer listet die Grant-Befehle auf, die abgesetzt werden müssen, um die Berechtigungen für einen Benutzer zu duplizieren. Beispiel:

mysql> SHOW GRANTS FOR root@localhost;
+----------------------------------------------------------------------+
| Grants for root@localhost                                           |
+----------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
+----------------------------------------------------------------------+

5.5.5.8 SHOW CREATE TABLE

Zeigt ein CREATE TABLE-Statement an, das die angegebene Tabelle erzeugt:

mysql> show create table tabelle\G
*************************** 1. row ***************************
       Table: tabelle
Create Table: CREATE TABLE tabelle (
  id int(11) default NULL auto_increment,
  s char(60) default NULL,
  PRIMARY KEY (id)
) TYPE=MyISAM

SHOW CREATE TABLE setzt Tabellen- und Spaltennamen gemäß der SQL_QUOTE_SHOW_CREATE-Option in Anführungszeichen. section 6.5.6 SET-Syntax.

5.6 MySQL-Lokalisierung und internationaler Gebrauch

5.6.1 Der für Daten und Sortieren benutzte Zeichensatz

Vorgabemäßig benutzt MySQL den ISO-8859-1-(Latin1)-Zeichensatz, wobei nach schwedischer / finnischer Reihenfolge sortiert wird. Dieser Zeichensatz ist für die USA und Westeuropa geeignet.

Alle standardmäßigen MySQL-Binärdistributionen werden mit --with-extra-charsets=complex kompiliert. Das fügt allen Standard-Programmen Code hinzu, damit diese latin1 und alle Multi-Byte-Zeichensätze in der Binärdatei handhaben können. Andere Zeichensätze werden bei Bedarf aus einer Zeichensatz-Definitionsdatei geladen.

Der Zeichensatz legt fest, welche Zeichen in Namen erlaubt sind und wie Dinge durch die ORDER BY- und GROUP BY-Klauseln des SELECT-Statements sortiert werden.

Sie können den Zeichensatz mit der --default-character-set-Option ändern, wenn Sie den Server starten. Die verfügbaren Zeichensätze hängen von den --with-charset=charset- und --with-extra-charset= list-of-charset | complex | all-Optionen für configure ab und den Zeichensatz-Konfigurationsdateien, die in `SHAREDIR/charsets/Index' aufgeführt sind. See section 3.3.3 Typische configure-Optionen.

Wenn Sie den Zeichensatz ändern, wenn Sie MySQL laufen lassen (was eventuell auch die Sortierreihenfolge ändert), müssen Sie myisamchk -r -q über alle Tabellen laufen lassen. Ansonsten sind Ihre Indexe eventuell nicht richtig sortiert.

Wenn sich ein Client mit dem MySQL-Server verbindet, schickt der Server den vorgabemäßigen Zeichensatz, der in Benutzung ist, an den Client. Der Client schaltet für diese Verbindung auf den Gebrauch dieses Zeichensatzes um.

Man sollte bei einer SQL-Anfrage mysql_real_escape_string() benutzen, wenn man Zeichenketten escapet. mysql_real_escape_string() ist identisch mit der alten mysql_escape_string()-Funktion, ausser dass es die MySQL-Connection-Handle als ersten Parameter nimmt.

Wenn der Client mit anderen Pfaden kompiliert wird, als wo der Server installiert ist, und der Benutzer, der MySQL konfigurierte, nicht alle Zeichensätze in die MySQL-Binärdatei eingeschlossen hat, muss man für den Client festlegen, wo dieser die zusätzlichen Zeichensätze finden kann, die er benötigt, falls der Server mit einem anderen Zeichensatz läuft als der Client.

Das kann man in einer MySQL-Optionsdatei festlegen:

[client]
character-sets-dir=/usr/local/mysql/share/mysql/charsets

Wobei der Pfad auf das Verzeichnis zeigt, in dem sich die dynamischen MySQL-Zeichensätze befinden.

Man kann den Client zwingen, einen bestimmten Zeichensatz zu benutzen, indem man angibt:

[client]
default-character-set=character-set-name

Aber normalerweise wird das nie benötigt.

5.6.1.1 Deutscher Zeichensatz

Um eine deutsche Sortierreihenfolge zu erhalten, startet man mysqld mit --default-character-set=latin_de. Das ergibt die folgenden Kennzeichen:

Beim Sortieren und Vergleichen von Zeichenketten wird das folgende Mapping auf die Zeichenketten durchgeführt, bevor der Vergleich ausgeführt wird:

ä  ->  ae
ö  ->  oe
ü  ->  ue
ß  ->  ss

Alle Akzentzeichen werden in ihr Nicht-Akzent-Pendant in Großschreibung umgewandelt. Alle Buchstaben werden in Großschreibung umgewandelt.

Beim Zeichenkettenvergleich mit LIKE wird das Mapping von einem auf zwei Buchstaben nicht durchgeführt. Alle Buchstaben werden in Großschreibung umgewandelt. Akzente werden aus allen Buchstaben entfernt, mit folgenden Ausnahmen: Ü, ü, Ö, ö, Ä und ä.

5.6.2 Nicht englische Fehlermeldungen

mysqld kann Fehlermeldungen in folgenden Sprachen ausgeben: tschechisch, dänisch, niederländisch, englisch (die Vorgabe), estnisch, französisch, deutsch, griechisch, ungarisch, italienisch, japanisch, koreanisch, norwegisch, norwegisch-ny, polnisch, portugiesisch, rumänisch, russisch, slowakisch, spanisch und schwedisch.

Um mysqld mit einer bestimmten Sprache zu starten, benutzen Sie die --language=sprache oder -L sprache-Optionen. Beispiel:

shell> mysqld --language=german

oder:

shell> mysqld --language=/usr/local/share/german

Beachten Sie, dass alle Sprachnamen in Kleinschreibung angegeben werden.

Die Sprachdateien liegen (vorgabemäßig) in `mysql_base_dir/share/language/'.

Um die Fehlermeldungsdatei zu aktualisieren, editieren Sie die `errmsg.txt'-Datei und führen folgenden Befehl aus, um die `errmsg.sys'-Datei zu erzeugen:

shell> comp_err errmsg.txt errmsg.sys

Wenn Sie auf eine neuere Version von MySQL aktualisieren, denken Sie daran, Ihre Änderungen mit der neuen `errmsg.txt'-Datei zu wiederholen!

5.6.3 Einen neuen Zeichensatz hinzufügen

Um MySQL einen weiteren Zeichensatz hinzuzufügen, führen Sie folgende Prozedur durch:

Entscheiden Sie, ob der Zeichensatz einfach oder komplex ist. Wenn der Zeichensatz keine besonderen Zeichenkettenvergleichsroutinen zum Sortieren und keine Multi-Byte-Unterstützung benötigt, ist er einfach. Wenn er eines oder beide Features benötigt, ist er komplex.

latin1 und dänisch zum Beispiel sind einfache Zeichensätze, wohingegen big5 oder tschechisch komplexe Zeichensätze sind.

Im folgenden Abschnitt wird angenommen, dass Sie Ihren Zeichensatz MEINSET nennen.

Bei einem einfachen Zeichensatz machen Sie folgendes:

  1. Fügen Sie MEINSET am Ende der `sql/share/charsets/Index'-Datei hinzu. Geben Sie ihm eine eindeutige Nummer.
  2. Erzeugen Sie die Datei `sql/share/charsets/MEINSET.conf'. (Sie können hierfür als Grundlage `sql/share/charsets/latin1.conf' benutzen). Die Syntax für die Datei ist sehr einfach: See section 5.6.4 Die Zeichen-Definitions-Arrays.
  3. Fügen Sie den Zeichensatznamen den CHARSETS_AVAILABLE- und COMPILED_CHARSETS-Listen in configure.in hinzu.
  4. Rekonfigurieren, rekompilieren und testen Sie.

Bei einem komplexen Zeichensatz machen Sie folgendes:

  1. Erzeugen Sie die Datei `strings/ctype-MEINSET.c' in der MySQL-Quelldistribution.
  2. Fügen Sie MEINSET am Ende der `sql/share/charsets/Index'-Datei hinzu. Weisen Sie ihm eine eindeutige Nummer zu.
  3. Sehen Sie sich eine der bestehenden `ctype-*.c'-Dateien an, um zu sehen, was definiert werden muss, zum Beispiel `strings/ctype-big5.c'. Beachten Sie, dass die Arrays in Ihrer Datei Namen wie ctype_MEINSET, to_lower_MEINSET usw. haben müssen. Das entspricht den Arrays im einfachen Zeichensatz. See section 5.6.4 Die Zeichen-Definitions-Arrays. Bei einem komplexen Zeichensatz
  4. fügen Sie am Anfang der Datei einen speziellen Kommentar wie folgt ein:
    /*
     * Dieser Kommentar wird von configure geparst, um ctype.c zu erzeugen,
     * also ändern Sie ihn nicht, wenn Sie nicht genau wissen, was Sie tun.
     *
     * .configure. number_MEINSET=MYNUMBER
     * .configure. strxfrm_multiply_MEINSET=N
     * .configure. mbmaxlen_MEINSET=N
     */
    
    Das configure-Programm benutzt diesen Kommentar, um den Zeichensatz automatisch in die MySQL-Bibliothek einzufügen. Die Zeilen mit strxfrm_multiply und mbmaxlen werden in den folgenden Abschnitten erläutert. Geben Sie diese nur dann ein, wenn Sie die Zeichenketten-Vergleichsfunktionen oder die Multi-Byte-Zeichensatzfunktionen benötigen.
  5. Danach sollten Sie einige der folgenden Funktionen erzeugen: See section 5.6.5 Unterstützung für Zeichenketten-Vergleich.
  6. Fügen Sie den Zeichensatznamen den CHARSETS_AVAILABLE- und COMPILED_CHARSETS-Listen in configure.in hinzu.
  7. Rekonfigurieren, rekompilieren und testen Sie.

Die Datei `sql/share/charsets/README' enthält einige weitere Anweisungen.

Wenn Sie wollen, dass der Zeichensatz in die MySQL-Distribution aufgenommen wird, senden Sie einen Patch an internals@lists.mysql.com.

5.6.4 Die Zeichen-Definitions-Arrays

to_lower[] und to_upper[] sind einfache Arrays, die die Buchstaben in Klein- und Großschreibung enthalten, die jedem Mitglied des Zeichensatzes entsprechen. Beispiel:

to_lower['A'] enthält 'a'
to_upper['a'] enthält 'A'

sort_order[] ist eine Map, die anzeigt, wie Buchstaben für Vergleichs- und Sortierzwecke geordnet werden sollten. Bei vielen Zeichensätzen ist das dasselbe wie to_upper[] (was bedeutet, dass das Sortieren ohne Berücksichtigung der Groß-/Kleinschreibung erfolgt). MySQL sortiert Buchstaben auf der Grundlage des Wertes von sort_order[character]. Wegen komplizierterer Sortierregeln sehen Sie die Erörterung zu Zeichenketten-Vergleichen unten an See section 5.6.5 Unterstützung für Zeichenketten-Vergleich.

ctype[] ist ein Array von Bit-Werten, mit einem Element pro Zeichen. (Beachten Sie, dass to_lower[], to_upper[] und sort_order[] durch den Buchstabenwert indiziert werden, aber ctype[] durch den Buchstabenwert + 1. Das ist aus Gründen der Abwärtskompatibilität notwendig, um EOF (Dateiende) handhaben zu können.)

Sie finden folgenden Bitmasken-Definitionen in `m_ctype.h':

#define _U      01      /* Großschreibung */
#define _L      02      /* Kleinschreibung */
#define _N      04      /* Numerisch (Ziffer) */
#define _S      010     /* Leerzeichen */
#define _P      020     /* Punkt */
#define _C      040     /* Steuerungszeichen (Control) */
#define _B      0100    /* leer */
#define _X      0200    /* heXadezimale Ziffer */

Der ctype[]-Eintrag für jeden Buchstaben sollte die Vereinigungsmenge der betreffenden Bitmasken-Werte sein, die den Buchstaben beschreiben. 'A' beispielsweise ist Buchstabe in Großschreibung (_U) und gleichzeitig eine hexadezimale Ziffer (_X), daher sollte ctype['A'+1] folgenden Wert erhalten:

_U + _X = 01 + 0200 = 0201

5.6.5 Unterstützung für Zeichenketten-Vergleich

Wenn die Sortierregeln Ihrer Sprache zu komplex sind, um durch die einfache sort_order[]-Tabelle gehandhabt zu werden, müssen Sie die Zeichenketten-Vergleichsfunktionen benutzen.

Zum jetzigen Zeitpunkt ist die beste Dokumentation hierüber die Zeichensätze, die bereits implementiert sind. Sehen Sie sich als Beispiele die Zeichensätze big5, tschechisch, gbk, sjis und tis160 an.

Sie müssen den strxfrm_multiply_MEINSET=N-Wert mit einem speziellen Kommentar am Anfang der Datei festlegen. N sollte auf das höchste Verhältnis gesetzt werden, auf das die Zeichenketten während my_strxfrm_MEINSET anwachsen können (es muss eine positive Ganzzahl sein).

5.6.6 Unterstützung für Multi-Byte-Zeichen

Wenn Sie Unterstützung für einen neuen Zeichensatz hinzufügen wollen, der Multi-Byte-Buchstaben enthält, müssen Sie die Multi-Byte-Zeichenfunktionen benutzen.

Zum jetzigen Zeitpunkt ist die beste Dokumentation hierüber die Zeichensätze, die bereits implementiert sind. Sehen Sie sich als Beispiele die Zeichensätze euc_kr, gb2312, gbk, sjis und ujis an. Diese sind in den ctype-'charset'.c-Dateien im `strings'-Verzeichnis implementiert.

Sie müssen den mbmaxlen_MEINSET=N-Wert in einem speziellen Kommentar am Anfang der Quelldatei angeben. N sollte auf die Größe in Bytes des größten Buchstabens im Zeichensatz gesetzt werden.

5.6.7 Probleme mit Zeichensätzen

Wenn Sie versuchen, einen Zeichensatz zu benutzen, der nicht in Ihre Binärdatei kompiliert ist, können Sie verschiedene Probleme bekommen:

Bei MyISAM-Tabellen können Sie den Zeichensatznamen und die Anzahl für eine Tabelle mit myisamchk -dvv tabelle prüfen.

5.7 Serverseitige Skripte und Dienstprogramme für MySQL

5.7.1 Überblick über serverseitige Programme und Dienstprogramme

Alle MySQL-Clients, die mittels der mysqlclient-Bibliothek mit dem Server kommunizieren, benutzen folgenden Umgebungsvariablen:

Name Beschreibung
MYSQL_UNIX_PORT Der vorgabemäßige Socket; benutzt für Verbindungen zu localhost
MYSQL_TCP_PORT Der vorgabemäßige TCP/IP-Port
MYSQL_PWD Das vorgabemäßige Passwort
MYSQL_DEBUG Debug-Trace-Optionen beim Debuggen
TMPDIR Das Verzeichnis, in dem temporäre Tabellen / Dateien erzeugt werden

Die Benutzung von MYSQL_PWD ist unsicher. See section 5.2.7 Verbinden mit dem MySQL-Server.

Der `mysql'-Client benutzt die Datei, die in der MYSQL_HISTFILE-Umgebungsvariablen angegeben ist, um die Kommandozeilen-History zu speichern. Der Vorgabewert für die History-Datei ist `$HOME/.mysql_history', wobei $HOME der Wert der HOME-Umgebungsvariablen ist. See section I Umgebungsvariablen.

Alle MySQL-Programme nehmen viele unterschiedliche Optionen auf. Jedes MySQL-Programm bietet jedoch eine --help-Option, die Sie benutzen können, um eine vollständige Beschreibung der unterschiedlichen Programmoptionen zu erhalten. Probieren Sie zum Beispiel mysql --help aus.

Sie können Vorgabeoptionen für alle Standard-Client-Programme mit einer Optionsdatei überschreiben. section 5.1.2 my.cnf-Optionsdateien.

Die unten stehende Liste beschreibt kurz die MySQL-Programme:

myisamchk
Dienstprogramm zur Beschreibung, Prüfung, Optimierung und Reparatur von MySQL-Tabellen. Weil myisamchk viele Funktionen hat, ist es in einem eigenen Kapitel beschrieben. See section 5 MySQL-Datenbankadministration.
make_binary_distribution
Macht ein Binär-Release eines kompilierten MySQL. Dieses könnte über FTP an `/pub/mysql/Incoming' oder an Support.mysql.com geschickt werden, damit andere MySQL-Benutzer es benutzen können.
msql2mysql
Ein Shell-Skript, das mSQL-Programme zu MySQL konvertiert. Es deckt nicht alle Fälle ab, ist aber hilfreich, um mit dem Konvertieren anzufangen.
mysqlaccess
Ein Skript, das die Zugriffsberechtigungen für eine Host-, Benutzer- und Datenbank-Kombination prüft.
mysqladmin
Dienstprogramm für die Durchführung von Verwaltungsoperationen wie Erzeugen und Löschen von Datenbanken, Neuladen der Berechtigungstabellen, Zurückschreiben von Tabellen auf Platte und Neuöffnen von Log-Dateien. mysqladmin kann auch benutzt werden, um Versionsnummer sowie Status- und Prozess-Informationen vom Server zu erhalten. See section 5.8.3 mysqladmin, Verwaltung eines MySQL-Servers.
mysqlbug
Das MySQL-Bug-Bericht-Skript. Dieses Skript sollte immer benutzt werden, wenn Sie einen Bug-Bericht an die MySQL-Liste ausfüllen.
mysqld
Der SQL-Daemon. Dieser sollte immer laufen.
mysqldump
Dumpt eine MySQL-Datenbank in eine Datei als SQL-Statements oder als Tabulator-separierte Textdateien. Verbesserte Freeware, ursprünglich von Igor Romanenko. See section 5.8.5 mysqldump, Tabellenstrukturen und -daten dumpen.
mysqlimport
Importiert Textdateien in die jeweiligen Tabellen mittels LOAD DATA INFILE. See section 5.8.7 mysqlimport, Daten aus Textdateien importieren.
mysqlshow
Zeigt Informationen über Datenbanken, Tabellen, Spalten und Indexe an.
mysql_install_db
Erzeugt die MySQL-Berechtigungstabellen mit vorgabemäßigen Berechtigungen. Dieses Skript wird gewöhnlich nur einmal ausgeführt, wenn Sie MySQL das erste Mal auf einem System installieren.
replace
Ein Dienstprogramm, das von msql2mysql benutzt wird, aber auch darüber hinaus benutzt werden kann. replace ändert Zeichenketten in Dateien oder auf der Standardeingabe. Benutzt eine finite Status-Maschine, um zuerst Übereinstimmung mit längeren Zeichenketten zu finden. Kann benutzt werden, um Zeichenketten umzudrehen. Der folgende Befehl zum Beispiel dreht a und b in den angegebenen Dateien um:
shell> replace a b b a --Datei1 Datei2 ...

5.7.2 safe_mysqld, der Wrapper um mysqld

safe_mysqld ist die empfohlene Art, einen mysqld-Daemon unter Unix zu starten. safe_mysqld fügt einige Sicherheits-Features hinzu wie das Neustarten des Servers, wenn ein Fehler auftritt, und das Mitschreiben von Laufzeitinformationen in eine Log-Datei.

Wenn Sie nicht --mysqld=# oder --mysqld-version=# benutzen, benutzt safe_mysqld eine ausführbare Datei namens mysqld-max, wenn es diese gibt. Wenn nicht, startet safe_mysqld mysqld. Das macht es sehr einfach, mysqld-max anstelle von mysqld versuchsweise zu benutzen. Kopieren Sie einfach mysqld-max dorthin, wo mysqld liegt, und es wird benutzt werden.

Normalerweise sollte man das safe_mysqld-Skript nie editieren, sondern statt dessen die Optionen für safe_mysqld in den [safe_mysqld]-Abschnitt der my.cnf-Datei einfügen. safe_mysqld liest alle Optionen des [mysqld]-, [server]- und [safe_mysqld]-Abschnitts aus den Optionsdateien. See section 5.1.2 my.cnf-Optionsdateien.

Beachten Sie, dass alle Optionen auf der Kommandozeile für safe_mysqld an mysqld durchgereicht werden. Wenn Sie in safe_mysqld irgend welche Optionen benutzen wollen, die mysqld nicht unterstützt, müssen Sie diese in der Optionsdatei angeben.

Die meisten Optionen für safe_mysqld sind dieselben wie die Optionen für mysqld. See section 5.1.1 mysqld-Kommandozeilenoptionen.

safe_mysqld unterstützt folgende Optionen:

--basedir=pfad
--core-file-size=#
Größe der Core-Datei, die mysqld in der Lage sein sollte zu erzeugen. Wird an ulimit -c durchgereicht.
--datadir=pfad
--defaults-extra-file=pfad
--defaults-file=pfad
--err-log=pfad
--ledir=pfad
Pfad zu mysqld
--log=pfad
--mysqld=mysqld-version
Name der mysqld-Version im ledir-Verzeichnis, die Sie starten wollen.
--mysqld-version=version
Ähnlich wie --mysqld=, aber hier für nur das Suffix für mysqld angegeben. Wenn Sie zum Beispiel --mysqld-version=max benutzen, startet safe_mysqld die ledir/mysqld-max-Version. Wenn das Argument für --mysqld-version leer ist, wird ledir/mysqld benutzt.
--no-defaults
--open-files-limit=#
Anzahl der Dateien, die mysqld in der Lage sein sollte zu öffnen. Wird an ulimit -n durchgereicht. Beachten Sie, dass Sie safe_mysqld als Root starten müssen, damit dies korrekt funktioniert!
--pid-file=pfad
--port=#
--socket=pfad
--timezone=#
Setzt die Zeitzone (die TZ)-Variable auf den Wert dieses Parameters.
--user=#

Das safe_mysqld-Skript ist so geschrieben, dass es normalerweise einen Server starten kann, der aus einer Quell- oder einer Binärversion von MySQL installiert wurde, selbst wenn diese den Server an etwas anderen Stellen installieren. safe_mysqld erwartet, dass eine der folgenden Bedingungen zutrifft:

Weil safe_mysqld versucht, Server und Datenbanken relativ zum eigenen Arbeitsverzeichnis zu finden, können Sie eine Binärdistribution von MySQL irgendwo hin installieren, so lange Sie safe_mysqld aus dem MySQL-Installationsverzeichnis starten:

shell> cd mysql_installations_verzeichnis
shell> bin/safe_mysqld &

Wenn safe_mysqld fehlschlägt, selbst wenn es aus dem MySQL-Installationsverzeichnis aufgerufen wurde, können Sie es so ändern, dass es den Pfad zu mysqld und die Pfadnamen-Optionen benutzt, die auf Ihrem System korrekt sind. Beachten Sie, dass bei zukünftigen Aktualisierungen von MySQL Ihre veränderte Version von safe_mysqld überschrieben wird. Daher sollten Sie eine Kopie Ihrer editierten Version machen, damit Sie diese neu installieren können.

5.7.3 mysqld_multi, Programm zur Verwaltung mehrerer MySQL-Server

mysqld_multi ist für die Verwaltung mehrerer mysqld-Prozesse gedacht, die auf unterschiedlichen UNIX-Sockets und TCP/IP-Ports laufen.

Das Programm sucht nach Gruppe(n), die [mysqld#] benannt sind, in my.cnf (oder der angegebenen --config-file=...), wobei # jede positive Zahl ab 1 sein kann. Diese Gruppen sollten dieselben sein wie die übliche [mysqld]-Gruppe (zum Beispiel Optionen für mysqld, siehe ausführliche Informationen im Handbuch über diese Gruppe), aber mit denjenigen Port-, Socket- usw. Optionen, die für jeden separaten mysqld-Prozess gewünscht sind. Die Zahl im Gruppennamen hat eine andere Funktion: Sie kann benutzt werden, um bestimmte mysqld-Server zu starten, anzuhalten, oder Berichte über sie mit diesem Programm auszugeben. Unten stehen weitere Informationen zur Benutzung und zu den Optionen.

Benutzung: mysqld_multi [OPTIONS] {start|stop|report} [GNR,GNR,GNR...]
oder       mysqld_multi [OPTIONS] {start|stop|report} [GNR-GNR,GNR,GNR-GNR,...]

Die GNR oben bedeutet die Gruppennummer. Sie können jede GNR starten, anhalten oder Berichtsinformationen über sie ausgeben, oder über mehrere von ihnen zugleich. (Siehe --example) Die GNRs in der Liste können mit Komma getrennt oder mit Bindestrich kombiniert werden, wobei letzteres heißt, dass alle GNRs zwischen GNR1-GNR2 betroffen sind. Ohne GNR-Argument werden alle gefundenen Gruppen entweder gestartet, angehalten, oder es werden Berichtsinformationen über sie ausgegeben. Beachten Sie, dass Sie in der GNR-Liste keinen Leerraum haben dürfen. Alles nach Leerraum wird ignoriert.

mysqld_multi unterstützt folgende Optionen:

--config-file=...
Alternative config-Datei. HINWEIS: Das betrifft nicht die eigenen Optionen des Programms (Gruppe [mysqld_multi]), sondern nur die Gruppen [mysqld#]. Ohne diese Option wird alles aus der normalen my.cnfDatei heraus gesucht.
--example
Zeigt ein Beispiel einer config-Datei.
--help
Hilfetext ausgeben und beenden.
--log=...
Log-Datei. Name und voller Pfad zur Log-Datei. HINWEIS: Wenn es die Datei gibt, wird alles angehängt.
--mysqladmin=...
mysqladmin-Binärdatei, die zum Herunterfahren des Servers benutzt wird.
--mysqld=...
mysqld-Binärdatei, die benutzt wird. Beachten Sie, dass Sie auch safe_mysqld diese Option angeben können. Die Optionen werden an mysqld durchgereicht. Stellen Sie jedoch sicher, dass Sie mysqld in Ihrer Umgebungsvariablen PATH haben oder bearbeiten Sie safe_mysqld.
--no-log
An stdout ausgeben statt in die Log-Datei. Vorgabemäßig ist die Log-Datei angeschaltet.
--password=...
Passwort für Benutzer von mysqladmin.
--tcp-ip
Zu MySQL-Server(n) über den TCP/IP-Port statt über den UNIX-Socket verbinden. Das betrifft das Anhalten und Berichten. Wenn eine Socket-Datei fehlt, kann der Server trotzdem laufen, aber man kann nur über den TCP/IP-Port auf ihn zugreifen. Vorgabemäßig wird die Verbindung über den UNIX-Socket hergestellt.
--user=...
MySQL-Benutzer von mysqladmin.
--version
Versionsnummer ausgeben und beenden.

Einige Anmerkungen zu mysqld_multi:

See section 5.1.4 Viele MySQL-Server auf derselben Maschine laufen lassen.

Hier ist ein Beispiel einer config-Datei für mysqld_multi.

# Diese Datei sollte wahrscheinlich in Ihrem Heimatverzeichnis liegen (~/.my.cnf) oder in /etc/my.cnf
# Version 2.1 von Jani Tolonen

[mysqld_multi]
mysqld     = /usr/local/bin/safe_mysqld
mysqladmin = /usr/local/bin/mysqladmin
user       = multi_admin
password   = multipass

[mysqld2]
socket     = /tmp/mysql.sock2
port       = 3307
pid-file   = /usr/local/mysql/var2/hostname.pid2
datadir    = /usr/local/mysql/var2
language   = /usr/local/share/mysql/english
user       = john

[mysqld3]
socket     = /tmp/mysql.sock3
port       = 3308
pid-file   = /usr/local/mysql/var3/hostname.pid3
datadir    = /usr/local/mysql/var3
language   = /usr/local/share/mysql/swedish
user       = monty

[mysqld4]
socket     = /tmp/mysql.sock4
port       = 3309
pid-file   = /usr/local/mysql/var4/hostname.pid4
datadir    = /usr/local/mysql/var4
language   = /usr/local/share/mysql/estonian
user       = tonu

[mysqld6]
socket     = /tmp/mysql.sock6
port       = 3311
pid-file   = /usr/local/mysql/var6/hostname.pid6
datadir    = /usr/local/mysql/var6
language   = /usr/local/share/mysql/japanese
user       = jani

See section 5.1.2 my.cnf-Optionsdateien.

5.7.4 myisampack, MySQL-Programm zum Erzeugen komprimierter Nur-Lese-Tabellen

myisampack wird benutzt, um MyISAM-Tabellen zu komprimieren. pack_isam wird benutzt, um ISAM-Tabellen zu komprimieren. Weil ISAM-Tabellen veraltet sind, wird hier nur myisampack erörtert, aber alles, was auf myisampack zutrifft, gilt auch für pack_isam.

myisampack funktioniert, indem jede Spalte in der Tabelle separat komprimiert wird. Die Informationen, die benötigt werden, um Spalten zu dekomprimieren, werden in den Arbeitsspeicher gelesen, wenn die Tabelle geöffnet wird. Das ergibt viel bessere Performance beim Zugriff auf einzelne Datensätze, denn man muss nur exakt einen Datensatz dekomprimieren, nicht einen viel größeren Block, wie das zum Beispiel bei der Benutzung von Stacker auf MS-DOS nötig ist. Üblicherweise komprimiert myisampack die Daten-Datei auf 40%-70%.

MySQL benutzt Speicher-Mapping (mmap()) auf komprimierte Tabellen und geht zu normalen Lesen / Schreiben von Dateien zurück, wenn mmap() nicht funktioniert.

Für myisampack gibt es momentan zwei Einschränkungen:

Die Behebung dieser Einschränkungen steht mit niedrigen Priorität auf unserer TODO-Liste.

myisampack wird wie folgt aufgerufen:

shell> myisampack [options] Dateiname ...

Jeder Dateiname sollte der Name einer Index-(`.MYI')-Datei sein. Wenn Sie nicht im Datenbank-Verzeichnis sind, müssen Sie den Pfadnamen zur Datei angeben. Die `.MYI' Erweiterung kann weggelassen werden.

myisampack unterstützt folgende Optionen:

-b, --backup
Stellt eine Datensicherung der Tabelle als tabelle.OLD her.
-#, --debug=debug_options
Debug-Log ausgeben. Die debug_options-Zeichenkette ist häufig 'd:t:o,filename'.
-f, --force
Erzwingt die Komprimierung der Tabelle, selbst wenn sie dadurch größer wird oder die temporäre Datei existiert. myisampack erzeugt eine temporäre Datei namens `tabelle.TMD', während es die Tabelle komprimiert. Wenn Sie myisampack killen, kann es sein, dass die `.TMD'-Datei nicht gelöscht wird. Normalerweise wird myisampack mit einer Fehlermeldung beendet, wenn es eine existierende `tabelle.TMD'-Datei findet. Mit --force packt myisampack die Tabelle trotzdem.
-?, --help
Hilfetext ausgeben und beenden.
-j große_tabelle, --join=große_tabelle
Verbindet alle Tabellen, die auf der Kommandozeile angegeben wurden, in eine einzige große Tabelle große_tabelle. Alle Tabellen, die kombiniert werden sollen, MÜSSEN identisch sein (dieselben Spaltennamen und -typen, dieselben Indexe usw.).
-p #, --packlength=#
Legt die Speichergröße der Datensatzlänge in Bytes fest. Der Wert sollte 1, 2 oder 3 sein. (myisampack speichert alle Zeilen mit Längenzeigern von 1, 2, oder 3 Bytes. In den meisten Fällen kann myisampack den richtigen Längenwert festlegen, bevor es anfängt, die Datei zu komprimieren. Während des Komprimierungsprozesses stellt es aber eventuell fest, dass es eine kürzere Länge hätte nehmen können. In diesem Fall gibt myisampack einen Hinweis aus, dass Sie beim nächsten Mal, wenn Sie dieselbe Datei packen, eine kürzere Datensatzlänge nehmen sollten.)
-s, --silent
Schweigsamer Modus. Ausgaben erfolgen nur, wenn Fehler auftreten.
-t, --test
Tabelle nicht tatsächlich komprimieren, sondern nur testweise packen.
-T dir_name, --tmp_dir=dir_name
Das genannte Verzeichnis als Speicherort der temporären Tabelle benutzen.
-v, --verbose
Geschwätziger Modus. Informationen über den Fortschritt und das Komprimierungsergebnis ausgeben.
-V, --version
Versionsinformationen ausgeben und beenden.
-w, --wait
Warten und noch einmal versuchen, wenn die Tabelle in Benutzung ist. Wenn der mysqld-Server mit der --skip-locking-Option aufgerufen wurde, ist es keine gute Idee, myisampack aufzurufen, wenn die Tabelle während des Komprimierungsprozesses möglicherweise aktualisiert wird.

Die unten stehende Befehlssequenz zeigt eine typische Tabellen-Komprimierungssitzung:

shell> ls -l station.*
-rw-rw-r--   1 monty    my         994128 Apr 17 19:00 station.MYD
-rw-rw-r--   1 monty    my          53248 Apr 17 19:00 station.MYI
-rw-rw-r--   1 monty    my           5767 Apr 17 19:00 station.frm

shell> myisamchk -dvv station

MyISAM file:   station
Isam-version:  2
Creation time: 1996-03-13 10:08:58
Recover time:  1997-02-02  3:06:43
Data records:              1192  Deleted blocks:              0
Datafile: Parts:           1192  Deleted data:                0
Datafile pointer (bytes):     2  Keyfile pointer (bytes):     2
Max datafile length:   54657023  Max keyfile length:   33554431
Recordlength:               834
Record format: Fixed length

table description:
Key Start Len Index   Type                       Root  Blocksize    Rec/key
1   2     4   unique  unsigned long              1024       1024          1
2   32    30  multip. text                      10240       1024          1

Field Start Length Type
1     1     1
2     2     4
3     6     4
4     10    1
5     11    20
6     31    1
7     32    30
8     62    35
9     97    35
10    132   35
11    167   4
12    171   16
13    187   35
14    222   4
15    226   16
16    242   20
17    262   20
18    282   20
19    302   30
20    332   4
21    336   4
22    340   1
23    341   8
24    349   8
25    357   8
26    365   2
27    367   2
28    369   4
29    373   4
30    377   1
31    378   2
32    380   8
33    388   4
34    392   4
35    396   4
36    400   4
37    404   1
38    405   4
39    409   4
40    413   4
41    417   4
42    421   4
43    425   4
44    429   20
45    449   30
46    479   1
47    480   1
48    481   79
49    560   79
50    639   79
51    718   79
52    797   8
53    805   1
54    806   1
55    807   20
56    827   4
57    831   4

shell> myisampack station.MYI
Compressing station.MYI: (1192 records)
- Calculating statistics

normal:     20  empty-space:      16  empty-zero:        12  empty-fill:  11
pre-space:   0  end-space:        12  table-lookups:      5  zero:         7
Original trees:  57  After join: 17
- Compressing file
87.14%

shell> ls -l station.*
-rw-rw-r--   1 monty    my         127874 Apr 17 19:00 station.MYD
-rw-rw-r--   1 monty    my          55296 Apr 17 19:04 station.MYI
-rw-rw-r--   1 monty    my           5767 Apr 17 19:00 station.frm

shell> myisamchk -dvv station

MyISAM file:     station
Isam-version:  2
Creation time: 1996-03-13 10:08:58
Recover time:  1997-04-17 19:04:26
Data records:              1192  Deleted blocks:              0
Datafile: Parts:           1192  Deleted data:                0
Datafilepointer (bytes):      3  Keyfile pointer (bytes):     1
Max datafile length:   16777215  Max keyfile length:     131071
Recordlength:               834
Record format: Compressed

table description:
Key Start Len Index   Type                       Root  Blocksize    Rec/key
1   2     4   unique  unsigned long             10240       1024          1
2   32    30  multip. text                      54272       1024          1

Field Start Length Type                         Huff tree  Bits
1     1     1      constant                             1     0
2     2     4      zerofill(1)                          2     9
3     6     4      no zeros, zerofill(1)                2     9
4     10    1                                           3     9
5     11    20     table-lookup                         4     0
6     31    1                                           3     9
7     32    30     no endspace, not_always              5     9
8     62    35     no endspace, not_always, no empty    6     9
9     97    35     no empty                             7     9
10    132   35     no endspace, not_always, no empty    6     9
11    167   4      zerofill(1)                          2     9
12    171   16     no endspace, not_always, no empty    5     9
13    187   35     no endspace, not_always, no empty    6     9
14    222   4      zerofill(1)                          2     9
15    226   16     no endspace, not_always, no empty    5     9
16    242   20     no endspace, not_always              8     9
17    262   20     no endspace, no empty                8     9
18    282   20     no endspace, no empty                5     9
19    302   30     no endspace, no empty                6     9
20    332   4      always zero                          2     9
21    336   4      always zero                          2     9
22    340   1                                           3     9
23    341   8      table-lookup                         9     0
24    349   8      table-lookup                        10     0
25    357   8      always zero                          2     9
26    365   2                                           2     9
27    367   2      no zeros, zerofill(1)                2     9
28    369   4      no zeros, zerofill(1)                2     9
29    373   4      table-lookup                        11     0
30    377   1                                           3     9
31    378   2      no zeros, zerofill(1)                2     9
32    380   8      no zeros                             2     9
33    388   4      always zero                          2     9
34    392   4      table-lookup                        12     0
35    396   4      no zeros, zerofill(1)               13     9
36    400   4      no zeros, zerofill(1)                2     9
37    404   1                                           2     9
38    405   4      no zeros                             2     9
39    409   4      always zero                          2     9
40    413   4      no zeros                             2     9
41    417   4      always zero                          2     9
42    421   4      no zeros                             2     9
43    425   4      always zero                          2     9
44    429   20     no empty                             3     9
45    449   30     no empty                             3     9
46    479   1                                          14     4
47    480   1                                          14     4
48    481   79     no endspace, no empty               15     9
49    560   79     no empty                             2     9
50    639   79     no empty                             2     9
51    718   79     no endspace                         16     9
52    797   8      no empty                             2     9
53    805   1                                          17     1
54    806   1                                           3     9
55    807   20     no empty                             3     9
56    827   4      no zeros, zerofill(2)                2     9
57    831   4      no zeros, zerofill(1)                2     9

Die Informationen, die myisampack ausgibt, sind unten beschrieben:

normal
Die Anzahl von Spalten, für die keine spezielle Komprimierung benutzt wird.
empty-space
Die Anzahl von Spalten, die Werte enthalten, die ausschließlich aus Leerzeichen bestehen. Diese Werte nehmen 1 Bit in Anspruch.
empty-zero
Die Anzahl von Spalten, die Werte enthalten, die nur aus binären Nullen bestehen. Diese Werte nehmen 1 Bit in Anspruch.
empty-fill
Die Anzahl von Ganzzahl-Spalten, die nicht den gesamten Bereich Ihres Typs einnehmen. Diese werden auf einen kleineren Typ geändert (eine INTEGER-Spalte kann zum Beispiel auf MEDIUMINT geändert werden).
pre-space
Die Anzahl von Dezimal-Spalten, die mit führenden Leerzeichen gespeichert sind. In diesem Fall enthält jeder Wert einen Zähler für die Anzahl führender Leerzeichen.
end-space
Die Anzahl von Spalten, die viele Leerzeichen am Ende enthalten. In diesem Fall enthält jeder Wert einen Zähler für die Anzahl von Leerzeichen am Ende.
table-lookup
Die Spalte hat nur eine kleine Anzahl verschiedener Werte, die in ENUM umgewandelt werden, bevor die Huffman-Kompression durchgeführt wird.
zero
Die Anzahl von Spalten, bei denen alle Werte 0 sind.
Original trees
Die anfängliche Anzahl von Huffman-Bäumen.
After join
Die Anzahl von unterschiedlichen Huffman-Bäumen, die übrig sind, nachdem Bäume zusammengefasst wurden, um etwas Header-Platz zu sparen.

Nachdem eine Tabelle komprimiert wurde, gibt myisamchk -dvv zusätzliche Informationen über jedes Feld aus:

Type
Der Feldtyp kann folgende Deskriptoren enthalten:
constant
Alle Zeilen haben denselben Wert.
no endspace
Kein Leerzeichen am Ende speichern.
no endspace, not_always
Kein Leerzeichen am Ende speichern und bei allen Werten keine Komprimierung für Leerzeichen am Ende durchführen.
no endspace, no empty
Kein Leerzeichen am Ende speichern. Keine leeren Werte speichern.
table-lookup
Die Spalte wurde zu ENUM umgewandelt.
zerofill(n)
Die wichtigsten n Bytes im Wert sind immer 0 und wurden nicht gespeichert.
no zeros
Keine Nullen speichern.
always zero
0-Werte sind in 1 Bit gespeichert.
Huff tree
Der Huffman-Baum, der zu dem Feld gehört.
Bits
Die Anzahl von Bits, die im Huffman-Baum benutzt werden.

Nachdem Sie pack_isam/myisampack laufen gelassen haben, müssen Sie isamchk / myisamchk laufen lassen, um den Index neu zu erzeugen. Zugleich können Sie die Index-Blöcke sortieren und die Statistiken erzeugen, die benötigt werden, damit der MySQL-Optimierer effizienter läuft:

myisamchk -rq --analyze --sort-index tabelle.MYI
isamchk   -rq --analyze --sort-index tabelle.ISM

Nachdem Sie die komprimierte Tabelle ins MySQL-Datenbank-Verzeichnis gespielt haben, müssen Sie mysqladmin flush-tables ausführen, um mysqld anzuweisen, die neue Tabelle zu benutzen.

Wenn Sie eine gepackte Tabelle entpacken wollen, können Sie das mit der --unpack-Option für isamchk oder myisamchk tun.

5.7.5 mysqld-max, ein erweiterter mysqld-Server

mysqld-max ist der MySQL-Server (mysqld), der mit folgenden configure-Optionen konfiguriert wurde:

Option Kommentar
--with-server-suffix=-max Zur mysqld-Versionszeichenkette ein Suffix hinzufügen.
--with-bdb Unterstützung für Berkeley-DB-(BDB)-Tabellen
--with-innodb Unterstützung für InnoDB-Tabellen.
CFLAGS=-DUSE_SYMDIR Symbolische-Links-Unterstützung für Windows.

Sie finden die MySQL-max-Binärdateien unter http://www.mysql.com/downloads/mysql-max-3.23.html.

Die Windows-MySQL-3.23-Binärdistribution beinhaltet sowohl die Standard-mysqld.exe-Binärdatei als auch die mysqld-max.exe-Binärdatei. http://www.mysql.com/downloads/mysql-3.23.html. See section 3.1.2 Installation von MySQL unter Windows.

Beachten Sie, dass, weil InnoDB und Berkeley-DB nicht für alle Plattformen verfügbar sind, einige der Max-Binärdateien eventuell noch Unterstützung für diese beiden Typen haben. Sie können überprüfen, welche Tabellentypen unterstützt werden, indem Sie die folgende Anfrage ausführen:

mysql> show variables like "have_%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_bdb      | YES   |
| have_innodb   | NO    |
| have_isam     | YES   |
| have_raid     | NO    |
| have_openssl  | NO    |
+---------------+-------+

Die Bedeutung dieser Werte ist:

Wert Bedeutung.
YES Die Option ist aktiviert und benutzbar.
NO MySQL ist nicht mit Unterstützung für diese Option kompiliert.
DISABLED Die xxxx-Option ist deaktiviert, weil mysqld mit --skip-xxxx gestartet wurde oder weil mysqld nicht mit allen notwendigen Optionen gestartet wurde, um die Option zu aktivieren. In diesem Fall sollte die hostname.err-Datei den Grund dafür enthalten, warum die Option deaktiviert wurde.

HINWEIS: Um InnoDB-Tabellen erzeugen zu können, MÜSSEN Sie Ihre Startoptionen editieren und zumindest die innodb_data_file_path-Option eingeben. See section 8.5.2 Mit InnoDB anfangen - Optionen.

Um bessere Performance für BDB-Tabellen zu erzielen, sollten Sie auch für diese einige Konfigurationsoptionen angeben. See section 8.6.3 BDB-Startoptionen.

safe_mysqld versucht automatisch, eine mysqld-Binärdatei mit dem -max-Präfix zu starten. Das macht es sehr einfach, eine andere mysqld-Binärdatei in einer bestehenden Installation auszutesten. Lassen Sie einfach configure mit den Optionen, die Sie wollen, laufen, und installieren Sie dann die neue mysqld-Binärdatei als mysqld-max im selben Verzeichnis, wo Ihre alte mysqld-Binärdatei liegt. See section 5.7.2 safe_mysqld, der Wrapper um mysqld.

Der mysqld-max-RPM benutzt das oben erwähnte safe_mysqld-Feature. Er installiert nur die ausführbare Datei mysqld-max und safe_mysqld benutzt diese automatisch, wenn safe_mysqld neu gestartet wird.

Folgende Tabelle zeigt, welche Tabellentypen unsere Standard-MySQL-Max-Binärdateien beinhalten:

System BDB InnoDB
AIX 4.3 NEIN JA
HP-UX 11.0 NEIN JA
Linux-Alpha NEIN JA
Linux-Intel JA JA
Linux-Ia64 NEIN JA
Solaris-intel NEIN JA
Solaris-sparc JA JA
Caldera (SCO) OSR5 JA JA
UnixWare JA JA
Windows/NT JA JA

5.8 Clientseitige Skripte und Hilfsprogramme von MySQL

5.8.1 Überblick über die clientseitigen Skripte und Dienstprogramme

Alle MySQL-Clients, die mittels der mysqlclient-Bibliothek mit dem Server kommunizieren, benutzen folgende Umgebungsvariablen:

Name Beschreibung
MYSQL_UNIX_PORT Der vorgabemäßige Socket, benutzt für Verbindungen zu localhost
MYSQL_TCP_PORT Der vorgabemäßige TCP/IP-Port
MYSQL_PWD Das vorgabemäßige Passwort
MYSQL_DEBUG Debug-Trace-Optionen beim Debuggen
TMPDIR Das Verzeichnis, in dem temporäre Tabellen / Dateien erzeugt werden

Die Benutzung von MYSQL_PWD ist unsicher. See section 5.2.7 Verbinden mit dem MySQL-Server.

Der `mysql'-Client benutzt die Datei in der MYSQL_HISTFILE- Umgebungsvariablen genannte Datei, um die Kommandozeilen-History zu speichern. Der Vorgabewert für die History-Datei ist `$HOME/.mysql_history', wobei $HOME der Wert der HOME-Umgebungsvariablen ist. See section I Umgebungsvariablen.

Alle MySQL-Programme haben viele verschiedene Optionen. Jedes MySQL-Programm stellt jedoch ein --help-Option zur Verfügung, die Sie benutzen können, um eine vollständige Beschreibung der verschiedenen Optionen des Programms zu erhalten. Probieren Sie zum Beispiel mysql --help aus.

Sie können die vorgabemäßigen Optionen für alle Standard-Client-Programme mit einer Optionsdatei überschreiben. section 5.1.2 my.cnf-Optionsdateien.

Die unten stehende Liste beschreibt kurz die MySQL-Programme:

myisamchk
Dienstprogramm zur Beschreibung, Prüfung, Optimierung und Reparatur von MySQL-Tabellen. Weil myisamchk viele Funktionen hat, ist es in einem eigenen Kapitel beschrieben. See section 5 MySQL-Datenbankadministration.
make_binary_distribution
Macht ein Binär-Release eines kompilierten MySQL. Dieses könnte über FTP an `/pub/mysql/Incoming' oder an Support.mysql.com geschickt werden, damit andere MySQL-Benutzer es benutzen können.
msql2mysql
Ein Shell-Skript, das mSQL-Programme zu MySQL konvertiert. Es deckt nicht alle Fälle ab, ist aber hilfreich, um mit dem Konvertieren anzufangen.
mysqlaccess
Ein Skript, das die Zugriffsberechtigungen für eine Host-, Benutzer- und Datenbank-Kombination prüft.
mysqladmin
Dienstprogramm für die Durchführung von Verwaltungsoperationen wie Erzeugen und Löschen von Datenbanken, Neulanden der Berechtigungstabellen, Zurückschreiben von Tabellen auf Platte und Neuöffnen von Log-Dateien. mysqladmin kann auch benutzt werden, um Versionsnummer sowie Status- und Prozess-Informationen vom Server zu erhalten. See section 5.8.3 mysqladmin, Verwaltung eines MySQL-Servers.
mysqlbug
Das MySQL-Bug-Bericht-Skript. Dieses Skript sollte immer benutzt werden, wenn Sie einen Bug-Bericht an die MySQL-Liste ausfüllen.
mysqld
Der SQL-Daemon. Dieser sollte immer laufen.
mysqldump
Dumpt eine MySQL-Datenbank in eine Datei als SQL-Statements oder als Tabulator-separierte Textdateien. Verbesserte Freeware, ursprünglich von Igor Romanenko. See section 5.8.5 mysqldump, Tabellenstrukturen und -daten dumpen.
mysqlimport
Importiert Textdateien in die jeweiligen Tabellen mittels LOAD DATA INFILE. See section 5.8.7 mysqlimport, Daten aus Textdateien importieren.
mysqlshow
Zeigt Informationen über Datenbanken, Tabellen, Spalten und Indexe an.
mysql_install_db
Erzeugt die MySQL-Berechtigungstabellen mit vorgabemäßigen Berechtigungen. Dieses Skript wird gewöhnlich nur einmal ausgeführt, wenn Sie MySQL das erste Mal auf einem System installieren.
replace
Ein Dienstprogramm, das von msql2mysql benutzt wird, aber auch darüber hinaus benutzt werden kann. replace ändert Zeichenketten in Dateien oder auf der Standardeingabe. Benutzt eine finite Status-Maschine, um zuerst Übereinstimmung mit längeren Zeichenketten zu finden. Kann benutzt werden, um Zeichenketten umzudrehen. Der folgende Befehl zum Beispiel dreht a und b in den angegebenen Dateien um:
shell> replace a b b a --Datei1 Datei2 ...

5.8.2 Das Kommandozeilen-Werkzeug

mysql ist eine einfache SQL-Shell (mit GNU readline-Fähigkeiten). Sie unterstützt interaktiven und nicht interaktiven Gebrauch. Wenn sie interaktiv benutzt wird, werden Anfrageergebnisse in einem ASCII-Tabellenformat ausgegeben. Wenn sie nicht interaktiv benutzt wird (zum Beispiel als Filter), wird das Ergebnis in Tabulator-separiertem Format ausgegeben. (Das Ausgabeformat kann mit den Kommandozeilenoptionen geändert werden.) Skripte können Sie einfach wie folgt laufen lassen:

shell> mysql datenbank < skript.sql > ausgabe.tab

Wenn Sie Probleme haben, die auf ungenügenden Speicher beim Client zurückzuführen sind, benutzen Sie die --quick-Option! Diese zwingt mysql, mysql_use_result() statt mysql_store_result() zu benutzen, um die Ergebnismenge zu holen.

Die Benutzung von mysql ist sehr einfach. Starten Sie es einfach wie folgt: mysql datenbank oder mysql --user=benutzername --password=ihr_passwort datenbank. Geben Sie ein SQL-Statement ein, beenden Sie es mit `;', `\g' oder `\G', und drücken Sie die Eingabetaste.

mysql unterstützt folgende Optionen:

-?, --help
Hilfetext ausgeben und beenden.
-A, --no-auto-rehash
Kein automatisches Rehashing. Man muss 'rehash' benutzen, um Tabellen- und Feld-Vervollständigung zu erhalten. Durch die Option wird mysql schneller gestartet.
-B, --batch
Ergebnisse mit einem Tabulator als Trennzeichen ausgeben, jede Tabellenzeile auf einer neuen Zeile. Keine History-Datei benutzen.
--character-sets-dir=...
Verzeichnis, in dem sich die Zeichensätze befinden.
-C, --compress
Im Client-Server-Protokoll Komprimierung benutzen.
-#, --debug[=...]
Debug loggen. Vorgabe ist 'd:t:o,/tmp/mysql.trace'.
-D, --database=...
Datenbank, die benutzt werden soll. Hauptsächlich nützlich in der my.cnf-Datei.
--default-character-set=...
Den vorgabemäßigen Zeichensatz setzen.
-e, --execute=...
Befehl ausführen und beenden. (Ausgabe wie bei --batch)
-E, --vertical
Ausgabe einer Anfrage (Zeilen) vertikal darstellen. Ohne diese Option können Sie diese Ausgabe auch dadurch erzwingen, dass Sie Ihre Statements mit \G beenden.
-f, --force
Weitermachen, auch wenn ein SQL-Fehler auftritt.
-g, --no-named-commands
Benannte Befehle werden deaktiviert. Benutzen Sie nur die \*-Form, oder benutzen Sie benannte Befehle nur bei Zeilen, die mit einem Semikolon enden. Ab Version 10.9 startet der Client vorgabemäßig mit ANGESCHALTETER Option! Wenn die -g-Option angeschaltet ist, funktionieren Befehle im Langformat jedoch immer noch von der ersten Zeile aus.
-G, --enable-named-commands
Benannte Befehle sind angeschaltet. Befehle im Langformat sind ebenso zugelassen wie die abgekürzten \*-Befehle.
-i, --ignore-space
Leerzeichen nach Funktionsnamen ignorieren.
-h, --host=...
Connect to the given host.
-H, --html
HTML-Ausgabe produzieren.
-L, --skip-line-numbers
Bei Fehlern keine Zeilennummer ausgeben. Nützlich, wenn man mit Ergebnisdateien vergleichen will, die Fehlermeldungen enthalten.
--no-pager
Pager deaktivieren und nach stdout ausgeben. Siehe auch interaktive Hilfe (\h).
--no-tee
Ausgabedatei (Outfile) deaktivieren. Siehe auch interaktive Hilfe (\h).
-n, --unbuffered
Nach jeder Anfrage Buffer zurückschreiben (flush).
-N, --skip-column-names
In Ergebnissen keine Spaltennamen ausgeben.
-O, --set-variable var=option
Einer Variablen einen Wert zuweisen. --help listet Variablen auf.
-o, --one-database
Nur die vorgabemäßige Datenbank aktualisieren. Das ist nützlich, wenn man in der Update-Logdatei Aktualisierungen (Updates) auf eine andere Datenbank überspringen will.
--pager[=...]
Ausgabetyp. Vorgabe ist Ihre ENV-Variable PAGER. Gültige Pager sind less, more, cat [> Dateiname] usw. Siehe auch interaktive Hilfe (\h). Diese Option funktioniert nicht im Stapelmodus. Der Pager funktioniert nur unter UNIX.
-p[password], --password[=...]
Passwort, das für die Verbindung zum Server benutzt wird. Wenn das Passwort nicht auf der Kommandozeile angegeben wird, wird eine Eingabeaufforderung dafür ausgegeben. Beachten Sie: Wenn Sie die Kurzform -p benutzen, darf zwischen der Option und dem Passwort kein Leerzeichen stehen.
-P --port=...
TCP/IP-Portnummer, die für die Verbindung benutzt wird.
-q, --quick
Ergebnisse nicht cachen, Zeile für Zeile ausgeben. Das kann den Server verlangsamen, wenn die Ausgabe verschoben wird. Keine History-Datei benutzen.
-r, --raw
Spaltenwerte ohne Escape-Umwandlung schreiben. Benutzt für --batch.
-s, --silent
Schweigsamer sein.
-S --socket=...
Socket-Datei, die für die Verbindung benutzt wird.
-t --table
Ausgabe im Tabellenformat. Das ist die Vorgabe im Nicht-Stapelmodus.
-T, --debug-info
Beim Verlassen einige Debug-Informationen ausgeben.
--tee=...
Alles an die Ausgabedatei anhängen. Siehe auch interaktive Hilfe (\h). Funktioniert nicht im Stapelmodus.
-u, --user=#
Benutzer zum Einloggen, falls nicht der aktuelle UNIX-Benutzer.
-U, --safe-updates[=#], --i-am-a-dummy[=#]
Läßt nur UPDATE und DELETE zu, die Schlüssel benutzen. Siehe unten wegen weiterer Informationen über diese Option. Sie können diese Option zurücksetzen, wenn Sie sie in Ihrer my.cnf-Datei haben, indem Sie --safe-updates=0 benutzen.
-v, --verbose
Geschwätzigere Ausgabe (-v -v -v ergibt das Tabellen-Ausgabeformat).
-V, --version
Versionsinformationen ausgeben und beenden.
-w, --wait
Wenn die Verbindung geschlossen wurde, warten und noch einmal versuchen, statt abzubrechen.

Mit -O oder --set-variable können Sie auch die folgenden Variablen setzen:

Variablenname Vorgabe Beschreibung
connect_timeout 0 Anzahl von Sekunden, bevor die Verbindung wegen Zeitüberschreitung abgebrochen wird
max_allowed_packet 16777216 Maximale Paketlänge, die zum Server gesendet bzw. von diesem empfangen wird
net_buffer_length 16384 Puffer für TCP/IP- und Socket-Kommunikation
select_limit 1000 Automatisches Limit für SELECT bei Benutzung von --i-am-a-dummy
max_join_size 1000000 Automatisches Limit für Zeilen in einem Join bei Benutzung von --i-am-a-dummy.

Wenn Sie 'help' auf der Kommandozeile eingeben, gibt mysql die Befehle aus, die es unterstützt:

mysql> help

MySQL-Befehle:
help    (\h)    Diesen Text anzeigen.
?       (\h)    Synonym für `help'.
clear   (\c)    Lösch-Befehl.
connect (\r)    Erneut mit dem Server verbinden. Optionale Argumente sind db und host.
edit    (\e)    Befehl mit $EDITOR editieren.
ego     (\G)    Befehl an den MySQL-Server schicken, Ergebnis vertikal anzeigen.
exit    (\q)    mysql beenden. Dasselbe wie quit.
go      (\g)    Befehl an den MySQL-Server schicken.
nopager (\n)    Pager deaktivieren, nach stdout ausgeben.
notee   (\t)    Nicht in die Ausgabedatei (Outfile) schreiben.
pager   (\P)    PAGER [auf_pager] setzen. Anfrageergebnisse über PAGER ausgeben.
print   (\p)    Aktuellen Befehl ausgeben.
quit    (\q)    mysql beenden.
rehash  (\#)    Vervollständigungs-Hash neu aufbauen.
source  (\.)    Eine SQLsSkriptdatei ausführen. Benötigt einen Dateinamen als Argument.
status  (\s)    Statusinformationen vom Server abrufen.
tee     (\T)    Ausgabedatei [auf_outfile] setzen. Alles an die angegebene Ausgabedatei anhängen.
use     (\u)    Eine andere Datenbankbenutzung. Benötigt Datenbanknamen als Argument.

Bei diesen Befehlen funktioniert PAGER nur unter UNIX.

Der status-Befehl gibt Ihnen einige Informationen über die Verbindung und den Server, den Sie benutzen. Wenn der Server im --safe-updates-Modus läuft, gibt status auch die Werte der mysql-Variablen aus, die Ihre Anfragen beeinflussen.

Eine nützliche Startoption für Anfänger (eingeführt in MySQL-Version 3.23.11) ist --safe-updates (oder --i-am-a-dummy für Benutzer, die irgendwann ein DELETE FROM tabelle eingeben, aber vergessen, die WHERE-Klausel) zu benutzen. Wenn Sie diese Option benutzen, schickt mysql beim Öffnen der Verbindung folgenden Befehl an den MySQL-Server:

SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=#select_limit#,
    SQL_MAX_JOIN_SIZE=#max_join_size#"

Wobei #select_limit# und #max_join_size# Variablen sind, die auf der mysql-Kommandozeile gesetzt werden können. See section 6.5.6 SET-Syntax.

Die Auswirkung davon ist folgende:

Einige nützliche Anmerkungen zum mysql-Client:

Einige Daten sind lesbarer, wenn sie vertikal angezeigt werden statt auf die übliche horizontale kastenähnliche Art. Langer Text zum Beispiel, der Zeilenumbrüche beinhaltet, ist bei vertikaler Ausgabe meist viel einfacher zu lesen.

mysql> select * from mails where length(txt) < 300 limit 300,1\G
*************************** 1. row ***************************
  msg_nro: 3068
     date: 2000-03-01 23:29:50
time_zone: +0200
mail_from: Monty
    reply: monty@no.spam.com
  mail_to: "Thimble Smith" <tim@no.spam.com>
      sbj: UTF-8
      txt: >>>>> "Thimble" == Thimble Smith writes:

Thimble> Hi. Meines Erachtens eine gute Idee. Kennt sich jemand mit UTF-8
Thimble> oder Unicode aus? Ansonsten packe ich das auf meine TODO-Liste
Thimble> und warte, was passiert.

Ja, mach das bitte!

Regards,
Monty
    Datei: inbox-jani-1
     hash: 190402944
1 row in set (0.09 sec)

5.8.3 mysqladmin, Verwaltung eines MySQL-Servers

Ein Dienstprogramm, um Verwaltungsoperationen durchzuführen. Die Syntax ist::

shell> mysqladmin [OPTIONS] befehl [befehl-option] befehl ...

Sie erhalten eine Auflistung der Optionen, die Ihre mysqladmin-Version unterstützt, indem Sie mysqladmin --help ausführen.

Das aktuelle mysqladmin unterstützt folgende Befehle:

create datenbank
Eine neue Datenbank erzeugen.
drop datenbank
Eine Datenbank und alle ihre Tabellen löschen.
extended-status
Eine erweiterte Statusmeldung vom Server ausgeben.
flush-hosts
Alle gecacheten Hosts zurückschreiben (flush).
flush-logs
Alle Logs zurückschreiben (flush).
flush-tables
Alle Tabellen zurückschreiben (flush).
flush-privileges
Berechtigungstabellen neu laden (dasselbe wie reload).
kill id,id,...
MySQL-Threads killen.
password
Ein neues Passwort setzen. Altes Passwort zu neuem Passwort ändern.
ping
Überprüfen, ob mysqld lebt.
processlist
Auflistung aktiver Threads im Server.
reload
Berechtigungstabellen neu laden.
refresh
Alle Tabellen zurückschreiben (flush), Log-Dateien schließen und erneut öffnen.
shutdown
Server herunter fahren.
slave-start
Slave-Replikations-Thread starten.
slave-stop
Slave-Replikations-Thread anhalten.
status
Eine kurze Statusmeldung vom Server ausgeben.
variables
Verfügbare Variablen ausgeben.
version
Versionsinformation vom Server abrufen.

Alle Befehle können auf ihr eindeutiges Präfix abgekürzt werden. Beispiel:

shell> mysqladmin proc stat
+----+-------+-----------+----+-------------+------+-------+------+
| Id | User  | Host      | db | Command     | Time | State | Info |
+----+-------+-----------+----+-------------+------+-------+------+
| 6  | monty | localhost |    | Processlist | 0    |       |      |
+----+-------+-----------+----+-------------+------+-------+------+
Uptime: 10077  Threads: 1  Questions: 9  Slow queries: 0  Opens: 6  Flush tables: 1  Open tables: 2  Memory in use: 1092K  Max memory used: 1116K

Das Ergebnis des mysqladmin status-Befehls hat folgende Spalten:

Uptime Anzahl von Sekunden, seit der MySQL-Server hoch gefahren ist.
Threads Anzahl aktiver Threads (Clients).
Questions Anzahl von Questions von Clients, seit mysqld gestartet wurde.
Slow queries Anfragen, die länger als long_query_time Sekunden benötigten. See section 5.9.5 Die Anfragen-Log-Datei für langsame Anfragen.
Opens Wie viele Tabellen mysqld geöffnet hat.
Flush Tables Anzahl von flush ...-, refresh- und reload-Befehlen.
Open Tables Anzahl der Tabellen, die gerade geöffnet sind.
Memory in use Arbeitsspeicher, der direkt vom mysqld-Code beansprucht wird (nur verfügbar, wenn MySQL mit --with-debug=full kompiliert wurde).
Max memory used Maximaler Arbeitsspeicher, der direkt vom mysqld-Code beansprucht wird (nur verfügbar, wenn MySQL mit --with-debug=full kompiliert wurde).

Wenn Sie mysqladmin shutdown auf einem Socket ausführen (mit anderen Worten, auf dem Computer, wo mysqld läuft), wartet mysqladmin, bis MySQL die pid-file entfernt hat, um sicherzustellen, dass der mysqld-Server korrekt angehalten wurde.

5.8.4 Benutzung von mysqlcheck für Tabellenwartung und Wiederherstellung nach Abstürzen

Ab MySQL-Version 3.23.38 können Sie ein neues Prüf- und Reparatur-Werkzeug für MyISAM-Tabellen einsetzen. Der Unterschied zu myisamchk ist, dass mysqlcheck benutzt werden kann, wenn der mysqld-Server läuft, wohingegen myisamchk nur benutzt werden sollte, wenn er nicht läuft. Der Vorteil ist, dass Sie den Server zum Prüfen oder zur Reparatur Ihrer Tabellen nicht mehr herunter fahren müssen.

mysqlcheck benutzt die MySQL-Server-Befehle CHECK, REPAIR, ANALYZE und OPTIMIZE auf eine für den Benutzer bequeme Weise.

Es gibt drei alternative Möglichkeiten, mysqlcheck aufzurufen:

shell> mysqlcheck [OPTIONS] datenbank [tabellen]
shell> mysqlcheck [OPTIONS] --databases datenbank1 [datenbank2 datenbank3...]
shell> mysqlcheck [OPTIONS] --all-databases

Daher kann es hinsichtlich der Auswahl von Datenbanken und Tabellen ähnlich wie mysqldump benutzt werden.

mysqlcheck besitzt im Vergleich zu den anderen Clients ein besonderes Feature: Das vorgabemäßige Verhalten, Tabellen mit -c zu prüfen, kann geändert werden, indem die Binärdatei umbenannt wird. Wenn Sie nur ein Werkzeug haben wollen, das vorgabemäßig Tabellen repariert, kopieren Sie eine mysqlcheck mit einem neuen Namen auf Ihre Festplatte, nämlich mysqlrepair, oder legen alternativ einen symbolischen Link auf mysqlrepair und benennen den Link mysqlrepair. Wenn Sie jetzt mysqlrepair aufrufen, repariert es vorgabemäßig Tabellen.

Folgende Namen können Sie benutzen, um das vorgabemäßige Verhalten von mysqlcheck zu verändern:

mysqlrepair:   Vorgabe-Option: -r (reparieren)
mysqlanalyze:  Vorgabe-Option: -a (analysieren)
mysqloptimize: Vorgabe-Option: -o (optimieren)

Die verfügbaren Optionen für mysqlcheck sind hier aufgelistet. Bitte prüfen Sie mit mysqlcheck --help, welche davon Ihre Version unterstützt.

-A, --all-databases
Prüft alle Datenbanken. Das ist dasselbe wie --databases mit allen Datenbanken ausgewählt.
-1, --all-in-1
Statt für jede Tabelle eine Anfrage auszuführen, alle Anfragen in 1 Anfrage pro Datenbank ausführen. Tabellennamen stehen in einer durch Kommas getrennten Liste.
-a, --analyze
Analysiert die angegebene Tabelle.
--auto-repair
Wenn eine geprüfte Tabelle beschädigt ist, sie automatisch reparieren. Die Reparatur wird durchgeführt, nachdem alle Tabellen geprüft wurden, falls beschädigte gefunden wurden.
-#, --debug=...
Debug-Log-Datei ausgeben. Das ist häufig 'd:t:o,filename'.
--character-sets-dir=...
Verzeichnis, wo Zeichensätze gespeichert sind.
-c, --check
Tabelle auf Fehler prüfen.
-C, --check-only-changed
Nur die Tabellen prüfen, die seit der letzten Prüfung geändert wurden oder die nicht ordnungsgemäß geschlossen wurden.
--compress
Kompression im Client-Server-Protokoll benutzen.
-?, --help
Diese Nachricht ausgeben und beenden.
-B, --databases
Mehrere Datenbanken prüfen. Beachten Sie den Unterschied im Gebrauch: In diesem Fall werden keine Tabellen angegeben. Alle Namensargumente werden als Datenbanknamen erachtet.
--default-character-set=...
Setzt den vorgabemäßigen Zeichensatz.
-F, --fast
Nur Tabellen prüfen, die nicht ordnungsgemäß geschlossen wurden.
-f, --force
Fortfahren, auch wenn ein SQL-Fehler auftritt.
-e, --extended
Wenn Sie diese Option beim Prüfen von Tabellen benutzen, stellt das sicher, dass die Tabelle zu 100% konsistent ist, dauert aber sehr lange. Wenn Sie diese Option beim Reparieren von Tabellen benutzen, wird eine erweiterte Reparatur der Tabelle durchgeführt, was nicht nur sehr lange dauern kann, sondern auch viele 'Müll'-Zeilen produzieren kann!
-h, --host=...
Mit dem angegebenen Host verbinden.
-m, --medium-check
Schneller als extended-check, findet aber nur 99,99% aller Fehler. Sollte in den meisten Fällen genügen.
-o, --optimize
Tabelle optimieren.
-p, --password[=...]
Passwort, das bei der Verbindung zum Server benutzt werden soll. Wenn das Passwort nicht angegeben wird, wird vom Terminal eine Eingabeaufforderung präsentiert.
-P, --port=...
Portnummer, die für Verbindungen zum Server benutzt werden soll.
-q, --quick
Wenn Sie diese Option beim Prüfen von Tabellen benutzen, verhindert das, dass die Zeilen nach falschen Verknüpfungen (Links) durchgesehen werden (gescannt). Das ist die schnellste Prüfmethode. Wenn Sie diese Option beim Reparieren von Tabellen benutzen, wird versucht, nur den Index-Baum zu reparieren. Das ist die schnellste Reparaturmethode.
-r, --repair
Kann fast alles reparieren, ausser eindeutige Schlüssel, die nicht eindeutig sind.
-s, --silent
Nur Fehlermeldungen ausgeben.
-S, --socket=...
Socket-Datei, die für die Verbindung benutzt werden soll.
--tables
Option --databases (-B) überschreiben.
-u, --user=#
Benutzer zum Einloggen, falls nicht der aktuelle Unix-Benutzer.
-v, --verbose
Informationen über die verschiedenen Phasen ausgeben.
-V, --version
Versionsinformationen ausgeben und beenden.

5.8.5 mysqldump, Tabellenstrukturen und -daten dumpen

Dienstprogramm, um eine Datenbank oder eine Sammlung von Datenbanken zu sichern oder um Daten auf einen anderen SQL-Server zu übertragen (nicht notwendigerweise ein MySQL-Server). Der Dump enthält SQL-Statements, um Datenbanken und Tabellen zu erzeugen und / oder Tabellen mit Daten zu füllen.

Wenn Sie eine Datensicherung auf dem Server machen, sollten Sie in Betracht ziehen, statt dessen mysqlhotcopy zu benutzen. See section 5.8.6 mysqlhotcopy, MySQL-Datenbanken und Tabellen kopieren.

shell> mysqldump [OPTIONS] datenbank [tabellen]
OR     mysqldump [OPTIONS] --databases [OPTIONS] datenbank1 [datenbank2 datenbank3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]

Wenn Sie keine Tabellen angeben oder --databases bzw. --all-databases benutzen, wird die gesamte Datenbank (bzw. werden alle Datenbanken) gedumpt.

Sie erhalten eine Auflistung der Optionen, die Ihre Version von mysqldump unterstützt, indem Sie mysqldump --help eingeben.

Wenn Sie mysqldump ohne --quick oder --opt ausführen, beachten Sie, dass mysqldump die gesamte Ergebnismenge in den Arbeitsspeicher lädt, bevor das Ergebnis gedumpt wird. Das kann zu Problemen führen, wenn Sie eine große Datenbank dumpen.

Wenn Sie eine neue Version des mysqldump-Programms benutzen und einen Dump erzeugen, der in einen sehr alten MySQL-Server eingelesen werden soll, sollten Sie die --opt- und -e-Optionen nicht benutzen.

mysqldump unterstützt folgende Optionen:

--add-locks
Führt LOCK TABLES vor und UNLOCK TABLE nach jedem Tabellen-Dump durch (um schnelleres Einfügen in MySQL zu erreichen).
--add-drop-table
Ein drop table vor jedem create-Statement hinzufügen.
-A, --all-databases
Alle Datenbanken dumpen. Das ist dasselbe wie --databases mit allen Datenbanken ausgewählt.
-a, --all
Alle MySQL-spezifischen Optionen für create benutzen.
--allow-keywords
Erzeugung von Spaltennamen zulassen, die Schlüsselwörter sind. Das funktioniert, indem jedem Spaltenname der Tabellenname als Präfix angefügt wird.
-c, --complete-insert
Vollständige insert-Statements benutzen (mit Spaltennamen).
-C, --compress
Alle Informationen zwischen Client und Server komprimieren, wenn bei Kompression unterstützen.
-B, --databases
Mehrere Datenbanken prüfen. Beachten Sie den Unterschied im Gebrauch: In diesem Fall werden keine Tabellen angegeben. Alle Namensargumente werden als Datenbanknamen erachtet. Vor jeder Ausgabe einer neuen Datenbank wird USE datenbank; eingefügt.
--delayed
Zeilen mit dem INSERT DELAYED-Befehl einfügen.
-e, --extended-insert
Die neue mehrzeilige INSERT-Syntax benutzen. (Ergibt kompaktere und schnellere inserts-Statements.)
-#, --debug[=option_string]
Programmbenutzung tracen (für Debug-Zwecke).
--help
Hilfetext ausgeben und beenden.
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--lines-terminated-by=...
Diese Optionen werden zusammen mit der -T-Option benutzt und haben dieselbe Bedeutung wie die entsprechenden Klauseln für LOAD DATA INFILE. See section 7.4.9 LOAD DATA INFILE-Syntax.
-F, --flush-logs
Log-Datei im MySQL-Server zurückschreiben, bevor der Dump durchgeführt wird.
-f, --force,
Fortfahren, selbst wenn beim Dump einer Tabelle ein SQL-Fehler auftritt.
-h, --host=..
Daten auf dem MySQL-Server auf dem genannten Host dumpen. Der vorgabemäßige Host ist localhost.
-l, --lock-tables.
Alle Tabellen sperren, bevor mit dem Dump begonnen wird. Die Tabellen werden mit READ LOCAL gesperrt, um gleichzeitiges Einfügen zu erlauben (bei MyISAM-Tabellen).
-n, --no-create-db
'CREATE DATABASE /*!32312 IF NOT EXISTS*/ datenbank;' wird nicht in die Ausgabe gschrieben. Diese Zeile wird ansonsten hinzugefügt, wenn --databases oder --all-databases angegeben wurde.
-t, --no-create-info
Keine Tabellenerzeugungsinformation schreiben (das CREATE TABLE-Statement).
-d, --no-data
Keine Zeileninformationen für die Tabelle schreiben. Das ist sehr nützlich, wenn Sie lediglich einen Dump der Tabellenstruktur erzeugen wollen.
--opt
Dasselbe wie --quick --add-drop-table --add-locks --extended-insert --lock-tables. Das sollte den schnellstmöglichen Dump zum Einlesen in einen MySQL-Server ergeben.
-pihr_passwort, --password[=ihr_passwort]
Das Passwort, das für die Verbindung zum Server benutzt werden soll. Wenn Sie keinen `=ihr_passwort'-Teil angeben, zeigt mysqldump eine Eingabeaufforderung für Ihr Passwort.
-P port_num, --port=port_num
Die TCP/IP-Portnummer, die für die Verbindung zu einem Host benutzt werden soll. (Diese wird für Verbindungen zu Hosts ausser localhost benutzt, für den Unix-Sockets benutzt werden.)
-q, --quick
Anfrage nicht puffern, sondern direkt zu stdout dumpen. Benutzt für die Durchführung mysql_use_result().
-r, --result-file=...
Direkte Ausgabe in die angegebene Datei. Diese Ausgabe sollte bei MS-DOS benutzt werden, weil sie verhindert, dass das Zeichen für neue Zeile '\n' in '\n\r' (new line + carriage return) umgewandelt werden.
-S /pfad/zu/socket, --socket=/pfad/zu/socket
Die Socket-Datei, die für die Verbindung zu localhost benutzt werden soll (was der vorgabemäßige Host ist).
--tables
Überschreibt die Option --databases (-B).
-T, --tab=pfad-zu-einem-verzeichnis
Erzeugt eine tabelle.sql-Datei, die die SQL-CREATE-Befehle enthält, und eine tabelle.txt-Datei, die die Daten enthält, für jede angegebene Tabelle. HINWEIS: Das funktioniert nur, wenn mysqldump auf derselben Maschine läuft wie der mysqld-Daemon. Das Format der .txt-Datei hängt von den --fields-xxx- und --lines--xxx-Optionen ab.
-u benutzername, --user=benutzername
Der MySQL-Benutzername, der für die Verbindung zum Server benutzt werden soll. Der Vorgabewert ist Ihr Unix-Loginname.
-O var=option, --set-variable var=option
Den Wert einer Variablen setzen. Die möglichen Werte sind unten aufgeführt.
-v, --verbose
Geschwätziger Modus. Gibt mehr Informationen darüber aus, was das Programm tut.
-V, --version
Versionsinformationen ausgeben und beenden.
-w, --where='wo-bedingung'
Nur ausgewählte Datensätze dumpen. Beachten Sie, dass Anführungszeichen zwingend erforderlich sind:
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"
-O net_buffer_length=#, where # < 16M
Beim Erzeugen von mehrzeiligen insert-Statements (wie bei der Option --extended-insert oder --opt), erzeugt mysqldump Zeilen bis zur Länge von net_buffer_length. Wenn Sie diesen Wert herauf setzen, müssen Sie sicherstellen, dass die max_allowed_packet-Variable im MySQL-Server größer als net_buffer_length ist.

Der häufigste Gebrauch von mysqldump dient wahrscheinlich der Herstellung einer Datensicherung ganzer Datenbanken. See section 5.4.1 Datenbank-Datensicherungen.

mysqldump --opt datenbank > datensicherung.sql

Diese können Sie zurück in MySQL einlesen mit:

mysql datenbank < datensicherung.sql

oder

mysql -e "source /pfad-zur-datensicherung/datensicherung.sql" datenbank

Ausserdem ist es sehr nützlich, um einen anderen MySQL-Server mit Informationen aus einer Datenbank zu füllen:

mysqldump --opt datenbank | mysql --host=entfernter-host -C datenbank

Es ist möglich, mehrere Datenbanken mit einem Befehl zu dumpen:

mysqldump --databases datenbank1 [datenbank2 datenbank3...] > meine_datenbanken.sql

Wenn Sie alle Datenbanken dumpen wollen, benutzen Sie:

mysqldump --all-databases > alle_datenbanken.sql

5.8.6 mysqlhotcopy, MySQL-Datenbanken und Tabellen kopieren

mysqlhotcopy ist a perl Skript that uses LOCK TABLES, FLUSH TABLES und cp oder scp to quickly make a backup of a Datenbank. It's the fastest way to make a backup of the Datenbank, of single Tabellen but it can only be run on the same machine where the Datenbankverzeichnisse are.

mysqlhotcopy datenbank [/pfad/zu/new_Verzeichnis]

mysqlhotcopy datenbank_1 ... datenbank_n /pfad/zu/new_Verzeichnis

mysqlhotcopy datenbank./regex/

mysqlhotcopy unterstützt folgende Optionen:

-?, --help
Hilfe ausgeben und beenden.
-u, --user=#
Benutzername zum Einloggen.
-p, --password=#
Passwort für die Verbindung zum Server.
-P, --port=#
Port zur Verbindung zum lokalen Server.
-S, --socket=#
Socket zur Verbindung zum lokalen Server.
--allowold
Nicht abbrechen, wenn das Ziel bereits existiert (sondern in _old umbenennen)
--keepold
Vorheriges (jetzt umbenanntes) Ziel nach dem Durchführen nicht löschen.
--noindices
Keine kompletten Index-Dateien in die Kopie einfügen, um die Datensicherung kleine