Go to the first, previous, next, last section, table of contents.


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 E.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 E.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 E.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 F 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 F 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 B 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 F 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 F 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 kleiner und schneller zu machen. Die Indexe können später mit myisamchk -rq. neu aufgebaut werden.
--method=#
Kopiermethode (cp oder scp).
-q, --quiet
Keine Meldungen ausgeben, ausser bei Fehlern.
--debug
Debug anschalten.
-n, --dryrun
Aktionen berichten, ohne sie auszuführen.
--regexp=#
Alle Datenbanken mit übereinstimmenden regexp-Namen sichern.
--suffix=#
Suffix für Namen kopierter Datenbanken.
--checkpoint=#
Checkpoint-Eingang in angegebene datenbank.tabelle einfügen.
--flushlog
Log-Dateien zurückschreiben, sobald alle Tabellen gesperrt sind.
--tmpdir=#
Temporäres Verzeichnis (anstelle von /tmp).

Geben Sie perldoc mysqlhotcopy ein, um eine vollständigere Dokumentation von mysqlhotcopy zu erhalten.

mysqlhotcopy liest die Gruppen [client] und [mysqlhotcopy] aus den Optionsdateien.

Damit Sie mysqlhotcopy ausführen können, benötigen Sie Schreibrechte im Datensicherungsverzeichnis, SELECT-Berechtigung auf die Tabellen, die Sie kopieren wollen, und die MySQL-Reload-Berechtigung (damit Sie FLUSH TABLES ausführen können).

5.8.7 mysqlimport, Daten aus Textdateien importieren

mysqlimport stellt eine Kommandozeilen-Schnittstelle für das LOAD DATA INFILE SQL-Statement zur Verfügung. Die meisten Optionen für mysqlimport entsprechen denselben Optionen für LOAD DATA INFILE. See section 7.4.9 LOAD DATA INFILE-Syntax.

mysqlimport wird wie folgt aufgerufen:

shell> mysqlimport [optionen] datenbank textdatei1 [textdatei2....]

Bei jeder Textdatei, die auf der Kommandozeile angegeben wird, entfernt mysqlimport jegliche Erweiterungen vom Dateinamen und benutzt das Ergebnis, um festzulegen, in welche Tabelle der Dateiinhalt importiert werden soll. Dateien namens `patient.txt', `patient.text' und `patient' beispielsweise würden alle in eine Tabelle namens patient importiert werden.

mysqlimport unterstützt folgende Optionen:

-c, --columns=...
Diese Option nimmt ein durch Kommas getrennte Auflistung von Feldnamen als Argument entgegen. Die Feldliste wird benutzt, um einen korrekten LOAD DATA INFILE-Befehl zu erzeugen, der an MySQL durchgereicht wird. See section 7.4.9 LOAD DATA INFILE-Syntax.
-C, --compress
Komprimiert alle Informationen zwischen Client und Server, wenn bei Kompression unterstützen.
-#, --debug[=option_string]
Programmbenutzung tracen (zum Debuggen).
-d, --delete
Tabelle leeren, bevor die Textdatei importiert wird.
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--lines-terminated-by=...
Diese Optionen haben dieselbe Bedeutung wie die entsprechenden Klauseln für LOAD DATA INFILE. See section 7.4.9 LOAD DATA INFILE-Syntax.
-f, --force
Fehler ignorieren. Wenn beispielsweise eine Tabelle für eine Textdatei nicht existiert, mit den verbleibenden Dateien weitermachen. Ohne --force wird mysqlimport beendet, wenn die Tabelle nicht existiert.
--help
Hilfetext ausgeben und beenden.
-h host_name, --host=host_name
Daten in den MySQL-Server auf dem genannten Host importieren. Der vorgabemäßige Host ist localhost.
-i, --ignore
Siehe Beschreibung für die --replace-Option.
-l, --lock-tables
ALLE Tabellen für Schreibvorgänge sperren, bevor irgend welche Textdateien verarbeitet werden. Das stellt sich, dass alle Tabellen auf dem Server synchronisiert werden.
-L, --local
Liest Eingabedateien vom Client. Vorgabemäßig wird angenommen, dass Textdateien auf dem Server liegen, wenn Sie sich über localhost verbinden (was der vorgabemäßige Host ist).
-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 mysqlimport 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.)
-r, --replace
Die --replace- und --ignore-Optionen steuern die Handhabung von Eingabe-Datensätzen, die bestehende Datensätze auf eindeutigen Schlüsseln duplizieren würden. Wenn Sie --replace angeben, werden bestehende Zeilen ersetzt, die denselben eindeutigen Schlüsselwert besitzen. Wenn Sie --ignore angeben, werden Zeilen, die eine bestehende Zeile duplizieren würden, übersprungen. Wenn Sie keine der beiden Optionen angeben, tritt ein Fehler auf, wenn ein doppelter Schlüsseleintrag gefunden wird, und der Rest der Textdatei wird ignoriert.
-s, --silent
Schweigsamer Modus. Ausgaben erfolgen nur, wenn Fehler auftreten.
-S /pfad/zu/socket, --socket=/pfad/zu/socket
Die Socket-Datei, die für die Verbindung zu localhost benutzt werden soll (der der vorgabemäßige Host ist).
-u benutzername, --user=benutzername
Der MySQL-Benutzername, der für die Verbindung zum Server benutzt werden soll. Der Vorgabewert ist Ihr Unix-Loginname.
-v, --verbose
Geschwätziger Modus. Mehr Informationen darüber ausgeben, was das Programm macht.
-V, --version
Versionsinformationen ausgeben und beenden.

Hier ist ein Beispiel für die Benutzung von mysqlimport:

$ mysql --version
mysql  Ver 9.33 Distrib 3.22.25, for pc-linux-gnu (i686)
$ uname -a
Linux xxx.com 2.2.5-15 #1 Mon Apr 19 22:21:09 EDT 1999 i586 unknown
$ mysql -e 'CREATE TABLE imptest(id INT, n VARCHAR(30))' test
$ ed
a
100     Max Sydow
101     Graf Dracula
.
w imptest.txt
32
q
$ od -c imptest.txt
0000000   1   0   0  \t   M   a   x       S   y   d   o   w  \n   1   0
0000020   1  \t   G r a f       D   r   a   c   u   l   a  \n
0000040
$ mysqlimport --local test imptest.txt
test.imptest: Records: 2  Deleted: 0  Skipped: 0  Warnings: 0
$ mysql -e 'SELECT * FROM imptest' test
+------+---------------+
| id   | n             |
+------+---------------+
|  100 | Max Sydow     |
|  101 | Graf Dracula  |
+------+---------------+

5.8.8 Datenbanken, Tabellen und Spalten anzeigen

mysqlshow wird benutzt, um schnell nachzusehen, welche Datenbanken, Tabellen und Tabellenspalten es gibt.

Mit dem mysql-Programm können Sie dieselben Information mit den SHOW-Befehlen erhalten. See section 5.5.5 SHOW-Syntax.

mysqlshow wird wie folgt aufgerufen:

shell> mysqlshow [optionen] [datenbank [tabelle [spalte]]]

Beachten Sie, dass Sie in neueren MySQL-Versionen nur die Datenbanken, Tabellen und Spalten sehen können, für die Sie irgend welche Berechtigungen haben.

Wenn das letzte Argument einen Shell- oder SQL-Platzhalter enthält (*, ?, % oder _), wird nur das gezeigt, was dem Platzhalter entspricht. Das kann zu Verwirrung führen, wenn Sie Spalten einer Tabelle anzeigen, die einen Unterstrich (_) enthalten, weil Ihnen mysqlshow in diesem Fall nur die Tabellennamen zeigt, die dem Muster entsprechen. Das kann leicht durch Hinzufügen eines zusätzlichen % am Ende der Kommandozeile (als separates Argument) behoben werden.

5.8.9 perror, Erklärung der Fehler-Codes

perror wird benutzt, um Fehlermeldungen auszugeben. perror wird wie folgt aufgerufen:

shell> perror [optionen] [ERRORCODE [ERRORCODE...]]

For example:

shell> perror 64 79
Error code  64:  Machine ist not on the network
Error code  79:  Can not access a needed shared library

perror wird benutzt, um eine Beschreibung für einen Systemfehler-Code anzuzeigen, oder einen Fehler-Code des MyISAM/ISAM-Tabellen-Handlers. Die Fehlermeldungen sind hauptsächlich abhängig vom Betriebssystem.

5.8.10 Wie SQL-Befehle aus einer Textdatei laufen gelassen werden

Der mysql-Client wird typischerweise interaktiv benutzt, wie folgt:

shell> mysql datenbank

Es ist jedoch möglich, Ihre SQL-Befehle in eine Datei zu schreiben und mysql anzuweisen, ihre Eingaben aus dieser Datei zu lesen. Um das zu tun, erzeugen Sie eine Textdatei `textdatei', die die Befehle enthält, die Sie ausführen wollen. Dann rufen Sie mysql wie gezeigt auf:

shell> mysql datenbank < textdatei

Sie können Ihre Textdatei auch mit einem USE datenbank-Statement beginnen lassen. In diesem Fall ist es nicht notwendig, den Datenbanknamen auf der Kommandozeile anzugeben:

shell> mysql < textdatei

See section 5.8 Clientseitige Skripte und Hilfsprogramme von MySQL.

5.9 Die MySQL-Log-Dateien

MySQL hat mehrere unterschiedliche Log-Dateien, die Ihnen helfen können herauszufinden, was innerhalb mysqld vor sich geht:

Die Fehler-Log-Datei Probleme, die beim Start, beim Laufenlassen oder beim Anhalten von mysqld auftreten.
Die ISAM-Log-Datei Loggt alle Änderungen in ISAM-Tabellen mit. Wird nur benutzt, um den ISAM-Code zu debuggen.
Die Anfragen-Log-Datei Hergestellte Verbindungen und ausgeführte Anfragen.
Die Update-Log-Datei Veraltet: Speichert Statements, die Daten verändern.
Die Binär-Log-Datei Speichert alle Statements, die etwas ändern. Wird auch für Replikation benutzt.
Die Slow-Log-Datei Speichert alle Anfragen, die länger als long_query_time zur Ausführung benötigten oder keine Indexe benutzten.

Alle Log-Dateien liegen im mysqld Daten-Verzeichnis. Sie können mysqld zwingen, die Log-Dateien neu zu öffnen (oder in manchen Fällen auf eine neue Log-Datei umzuschalten), indem Sie FLUSH LOGS ausführen. See section 5.5.3 FLUSH-Syntax.

5.9.1 Die Fehler-Log-Datei

mysqld schreibt alle Fehler nach stderr, die das safe_mysqld-Skript in eine Datei namens 'hostname'.err umleitet. (Unter Windows schreibt mysqld direkt in die Datei `\mysql\data\mysql.err'.)

Diese enthält Informationen, wann mysqld gestartet und angehalten wurde und zusätzlich jeden kritischen Fehler, der während der Laufzeit passierte. Wenn mysqld unerwartet stirbt und safe_mysqld ihn neu starten muss, schreibt safe_mysqld eine restarted mysqld-Zeile in diese Datei. Diese Log-Datei enthält auch Warnungen, wenn mysqld eine Tabelle bemerkt, die automatisch geprüft oder repariert werden muss.

Auf manchen Betriebssystemen enthält die Fehler-Log-Datei einen Stack-Trace, wo mysqld starb. Dieser kann benutzt werden, um herauszufinden, wo mysqld starb. See section E.1.4 Einen Stack-Trace benutzen.

5.9.2 Die allgemeine Anfragen-Log-Datei

Wenn Sie wissen wollen, was innerhalb mysqld geschieht, sollten Sie ihn mit --log[=file] starten. Diese Option loggt alle Verbindungen und Anfragen in die Log-Datei (vorgabemäßig `'hostname'.log' benannt). Diese Log-Datei kann sehr nützlich sein, wenn Sie einen Fehler in einem Client vermuten und wissen wollen, was genau mysqld sich bei dem dachte, was es vom Client geschickt bekam.

Vorgabemäßig startet das mysql.server-Skript den MySQL-Server mit der -l-Option. Wenn Sie bessere Performance brauchen, wenn Sie MySQL in einer Produktionsumgebung starten, können Sie die -l-Option aus mysql.server entfernen oder sie zu --log-binary ändern.

Die Einträge in diese Log-Datei werden geschrieben, wenn mysqld die Anfragen erhält. Die Reihenfolge kann vor derjenigen abweichen, in der die Statements ausgeführt werden. Das steht im Gegensatz zur Update-Log-Datei und zur Binär-Log-Datei, bei denen geschrieben wird, nachdem die Anfrage ausgeführt wurde, aber bevor irgend welche Sperren aufgehoben werden.

5.9.3 Die Update-Log-Datei

HINWEIS: Die Update-Log-Datei wird durch die binäre Log-Datei ersetzt. See section 5.9.4 Die binäre Update-Log-Datei. Mit dieser können Sie alles machen, was Sie mit der Update-Log-Datei machen können.

Wenn er mit der --log-update[=datei]-Option gestartet wird, schreibt mysqld eine Log-Datei, die alle SQL-Befehle enthält, die Daten aktualisieren. Wenn kein Dateiname angegeben wird, ist die Vorgabe der Name der Host-Maschine. Wenn ein Dateiname angegeben wird, der aber keine Pfadangabe enthält, wird die Datei ins Daten-Verzeichnis geschrieben. Wenn `datei' keine Erweiterung hat, erzeugt mysqld eine Log-Datei, die er wie folgt benennt: `datei.###', wobei ### eine Zahl ist, die jedes Mal hochgezählt wird, wenn Sie mysqladmin refresh oder mysqladmin flush-logs oder das FLUSH LOGS-Statement ausführen, oder wenn Sie den Server neu starten.

HINWEIS: Damit das dargestellte Schema funktioniert, sollten Sie NICHT eigene Dateien mit demselben Dateinamen wie die Update-Log-Datei plus Erweiterungen, die als die hochgezählte Zahl betrachtet werden könnten, im Verzeichnis anlegen, das von der Update-Log-Datei benutzt wird!

Wenn Sie die --log oder -l-Optionen benutzen, schreibt mysqld eine allgemeine Log-Datei mit dem Dateinamen `hostname.log'. Neustarts und Refresh-Operationen führen dann nicht dazu, dass eine neue Log-Datei erzeugt wird (obwohl diese geschlossen und wieder geöffnet wird). In diesem Fall können Sie sie (unter Unix) wie folgt kopieren:

mv hostname.log hostname-old.log
mysqladmin flush-logs
cp hostname-old.log ins-datensicherungs-verzeichnis
rm hostname-old.log

Das Mitloggen mittels der Update-Log-Datei ist clever, weil es nur Statements loggt, die tatsächlich Daten aktualisieren. Wenn ein UPDATE oder ein DELETE mit einem WHERE keine passenden Zeilen findet, wird nichts in die Log-Datei geschrieben. Es werden sogar UPDATE-Statements übersprungen, die eine Spalte auf einen Wert setzen, die sie bereits hat.

Das Schreiben in die Update-Log-Datei wird unmittelbar durchgeführt, nachdem eine Anfrage fertig ist, aber bevor irgend welche Sperren aufgehoben sind oder irgendein Commit durchgeführt wurde. Das stellt sicher, dass die Log-Datei stets in der Reihenfolge der Ausführung mitschreibt.

Wenn Sie eine Datenbank von Update-Log-Datei-Dateien aktualisieren wollen, könnten Sie folgendes tun (angenommen, Ihre Update-Log-Dateien haben Namen der Form `datei.###'):

shell> ls -1 -t -r datei.[0-9]* | xargs cat | mysql

ls wird benutzt, um alle Log-Dateien in der richtigen Reihenfolge zu erhalten.

Das ist nützlich, wenn Sie Datensicherungsdateien nach einem Absturz zurückspielen müssen und die Aktualisierungen neu ausführen wollen, die zwischen der Zeit der Datensicherung und dem Absturz lagen.

5.9.4 Die binäre Update-Log-Datei

In Zukunft wird die Binär-Log-Datei die Update-Log-Datei ersetzen, daher empfehlen wir, dass Sie so bald wie möglich zu diesem Log-Format wechseln!

Die Binär-Log-Datei enthält alle Informationen, die im Update-Log verfügbar sind, in einem effizienteren Format. Sie enthält ausserdem Informationen darüber, wie lange jede Anfrage brauchte, die die Datenbank aktualisierte.

Die Binär-Log-Datei wird auch benutzt, wenn Sie einen Slave von einem Master replizieren. See section 5.10 Replikation bei MySQL.

Mit der --log-bin[=datei]-Option gestartet, schreibt mysqld eine Log-Datei, die alle SQL-Befehle enthält, die Daten aktualisieren. Wenn kein Dateiname angegeben wird, ist die Vorgabe der Name der Host-Machine, gefolgt von -bin. Wenn der Dateiname angegeben wird, aber keine Pfadangabe enthält, wird die Datei ins Daten-Verzeichnis geschrieben.

Sie können folgende Optionen für mysqld benutzen, um zu beeinflussen, was in die Binär-Log-Datei geschrieben wird:

binlog-do-db=datenbank Weist den Master an, Aktualisierungen für die angegebene Datenbank zu loggen und alle anderen, nicht explizit erwähnten, auszuschließen. (Beispiel: binlog-do-db=eine_datenbank)
binlog-ignore-db=datenbank Weist den Master an, Aktualisierungen für die angegebene Datenbank nicht in die Binär-Log-Datei zu loggen (Beispiel: binlog-ignore-db=eine_datenbank).

mysqld hängt dem Binär-Log-Datei-Dateinamen eine Erweiterung an, die eine Zahl ist, die jedes Mal heraufgezählt wird, wenn Sie mysqladmin refresh, mysqladmin flush-logs oder ein FLUSH LOGS-Statement ausführen oder den Server neu starten.

Damit Sie feststellen können, welche verschiedenen Binär-Log-Datei-Dateien benutzt wurden, erzeugt mysqld auch eine Binär-Log-Index-Datei, die die Namen aller benutzten Binär-Log-Datei-Dateien enthält. Vorgabemäßig hat diese denselben Namen wie die Binär-Log-Datei, mit der Erweiterung '.index'. Sie können den Namen der Binär-Log-Index-Datei mit der --log-bin-index=[filename]-Option ändern.

Wenn Sie Replikation benutzen, sollten Sie keine alten Binär-Log-Dateien löschen, bis Sie sicher sind, dass kein Slave sie jemals wieder benötigen wird. Eine Art, das zu tun, ist, einmal pro Tag mysqladmin flush-logs auszuführen, und danach alle Logs zu entfernen, die älter als 3 Tage sind.

Sie können die Binär-Log-Datei mit dem mysqlbinlog-Befehl untersuchen. Beispielsweise können Sie einen MySQL-Server wie folgt aus der Binär-Log-Datei aktualisieren:

mysqlbinlog log-file | mysql -h server_name

Sie können auch das mysqlbinlog-Programm benutzen, um die Binär-Log-Datei direkt von einem entfernten MySQL-Server zu lesen!

mysqlbinlog --help gibt Ihnen weitere Informationen zur Benutzung dieses Programms.

Wenn Sie BEGIN [WORK] oder SET AUTOCOMMIT=0 verwenden, müssen Sie die MySQL-Binär-Log-Datei für Datensicherungen anstelle der alten Update-Log-Datei benutzen.

Das Loggen in die Binär-Log-Datei wird unmittelbar nach jeder Anfrage geschrieben, aber bevor irgend welche Sperren aufgehoben wurden oder irgend ein Commit durchgeführt wurde. Das stellt sicher, dass die Log-Datei in der Reihenfolge der Ausführung mitschreibt.

Alle Aktualisierungen (UPDATE, DELETE oder INSERT), die eine transaktionale Tabelle (like BDB-Tabellen) ändern, werden bis zu einem COMMIT gecachet. Jegliche Aktualisierungen auf eine nicht transaktionale Tabelle werden sofort in der Binär-Log-Datei gespeichert. Jedem Thread wird beim Start ein Puffer der Größe binlog_cache_size für die Pufferung von Anfragen zugewiesen. Wenn eine Anfrage größer als dieser ist, öffnet der Thread eine temporäre Datei, um den größeren Cache zu handhaben. Die temporäre Datei wird gelöscht, wenn der Thread beendet wird.

max_binlog_cache_size kann dazu benutzt werden, um die gesamte benutzte Größe zu begrenzen, und um eine Anfrage aus mehreren Transaktionen zu cachen.

Wenn Sie die Update- oder Binär-Log-Datei benutzen, funktionieren gleichzeitige Einfügeoperationen nicht im Zusammenhang mit CREATE ... INSERT und INSERT ... SELECT. Damit stellen Sie sicher, dass Sie eine exakte Kopie Ihrer Tabellen wieder herstellen können, indem Sie die Log-Datei auf eine Datensicherung anwenden.

5.9.5 Die Anfragen-Log-Datei für langsame Anfragen

Mit der --log-slow-queries[=datei]-Option gestartet schreibt mysqld eine Log-Datei, die alle SQL-Befehle enthält, die länger als long_query_time zur Ausführung brauchten. Die Zeit, um die anfänglichen Tabellensperren zu erhalten, wird nicht zur Ausführungszeit hinzugezählt.

Anfragen-Log-Datei für langsame Anfragen wird geschrieben, nachdem jede Anfrage ausgeführt wurde und nachdem alle Sperren aufgehoben wurden. Das kann von der Reihenfolge abweichen, in der die Statements ausgeführt wurden.

Wenn kein Dateiname angegeben wird, ist die Vorgabe der Name der Host-Maschine mit dem Suffix -slow.log. Wenn ein Dateiname angegeben wird, der aber keine Pfadangabe enthält, wird die Datei ins Daten-Verzeichnis geschrieben.

Die Anfragen-Log-Datei für langsame Anfragen kann benutzt werden, um Anfragen zu finden, die für die Ausführung lange Zeit benötigen und daher Kandidaten für Optimierungen sind, was bei einer großen Log-Datei allerdings eine schwierige Aufgabe werden kann. Sie können die Anfragen-Log-Datei für langsame Anfragen durch den mysqldumpslow-Befehl durchschleifen (pipen), um eine Zusammenfassung der Anfragen zu erhalten, die in der Log-Datei erscheinen.

Wenn Sie --log-long-format benutzen, erscheinen auch Anfragen, die keine Indexe benutzen. See section 5.1.1 mysqld-Kommandozeilenoptionen.

5.9.6 Wartung und Pflege der Log-Dateien

MySQL hat viele Log-Dateien, die es leicht machen festzustellen, was vor sich geht. See section 5.9 Die MySQL-Log-Dateien. Von Zeit zu Zeit jedoch muss man hinter MySQL saubermachen, damit die Log-Dateien nicht zu viel Festplattenplatz in Anspruch nehmen.

Wenn Sie MySQL mit Log-Dateien benutzen, werden Sie von Zeit zu Zeit alte Log-Dateien entfernen wollen und MySQL mitteilen, in neue Dateien zu loggen. See section 5.4.1 Datenbank-Datensicherungen.

Bei einer Linux-(RedHat)-Installation können Sie hierfür das mysql-log-rotate-Skript benutzen. Wenn Sie MySQL von einer RPM-Distribution installiert haben, sollte das Skript automatisch installiert worden sein. Beachten Sie, dass Sie damit vorsichtig umgehen sollten, wenn Sie die Log-Datei für Replikation benutzen!

Auf anderen Systemen müssen Sie selbst ein kurzes Skript installieren, dass Sie von cron starten können, um Log-Dateien zu handhaben.

Sie können MySQL zwingen, mit neuen Log-Dateien zu starten, indem Sie mysqladmin flush-logs oder den SQL-Befehl FLUSH LOGS benutzen. Wenn Sie MySQL-Version 3.21 benutzen, müssen Sie mysqladmin refresh benutzen.

Der obige Befehl macht folgendes:

Wenn Sie nur eine Update-Log-Datei benutzen, müssen Sie die Log-Dateien nur auf Platte zurückschreiben (flush) und dann die alten Update-Log-Datei-Dateien zu einer Datensicherungsdatei verschieben. Wenn Sie normales Loggen benutzen, können Sie etwas wie das Folgende tun:

shell> cd mysql-data-verzeichnis
shell> mv mysql.log mysql.old
shell> mysqladmin flush-logs

Und dann eine Datensicherung nehmen und `mysql.old' entfernen.

5.10 Replikation bei MySQL

Dieses Kapitel beschreibt die verschiedenen Replikationsfeatures in MySQL. Es dient als Referenz für die Optionen, die bei Replikation verfügbar sind. Sie erhalten eine Einführung in die Replikation und lernen, wie Sie sie implementieren. Am Ende des Kapitels werden einige häufige gestellte Fragen und die dazugehörigen Antworten aufgelistet sowie Beschreibungen der Probleme und wie man sie löst.

5.10.1 Einführung in die Replikation

Einweg-Replikation wird benutzt, um sowohl Stabilität als auch Geschwindigkeit zu steigern. Was Stabilität betrifft, haben Sie zwei Möglichkeiten und können zur Möglichkeit der Datensicherung zurückkehren, wenn Sie Probleme mit dem Master haben. Die Geschwindigkeitssteigerung wird dadurch erreicht, dass ein Teil der Anfragen, die nichts aktualisieren, an den Replikationsserver geschickt werden. Das funktioniert naturgemäß nur dann, wenn Anfragen, die nichts aktualisieren, überwiegen, aber das ist der Normalfall.

Ab Version 3.23.15 unterstützt MySQL intern Einweg-Replikation. Ein Server agiert als Master, der andere als Slave. Beachten Sie, dass ein Server beide Rolle - als Master und als Slave - in einem Paar spielen kann. Der Master hält eine Binär-Log-Datei der Aktualisierungen vor (see section 5.9.4 Die binäre Update-Log-Datei) sowie eine Index-Datei für Binär-Log-Dateien, um hinsichtlich der Log-Rotation auf dem Laufenden zu bleiben. Der Slave informiert den Master beim Verbinden darüber, wo er seit der letzten erfolgreich durchgeführten Aktualisierung aufgehört hat, schließt zu den Aktualisierungen auf, blockiert danach und wartet darauf, dass ihn der Master über neue Aktualisierungen informiert.

Beachten Sie, dass alle Aktualisierungen auf eine Datenbank, die repliziert wird, durch den Master durchgeführt werden sollten!

Ein weiterer Vorteil von Replikation ist, dass man permanente (live) Datensicherungen vom System erhält, wenn man die Datensicherung auf dem Slave durchführt statt auf dem Master. See section 5.4.1 Datenbank-Datensicherungen.

5.10.2 Replikationsimplementation

MySQL-Replikation basiert darauf, dass der Server alle Änderungen Ihrer Datenbank im Binär-Log verfolgt (Updates, Deletes usw.) (see section 5.9.4 Die binäre Update-Log-Datei) und der oder die Slave-Server die gespeicherten Anfragen aus der Binär-Log-Datei des Masters lesen, so dass der Slave dieselben Anfragen auf seine Kopie der Daten ausführen kann.

Es ist sehr wichtig sich klarzumachen, dass die Binär-Log-Datei schlicht eine Aufzeichnung ist, die ab einem festen Zeitpunkt an startet (ab dem Moment, wo Sie Binär-Loggen starten). Alle Slaves, die Sie aufsetzen, benötigen Kopien aller Daten vom Master, wie Sie zu dem Zeitpunkt existierten, als Binär-Loggen auf dem Master aktiviert wurde. Wenn Sie Ihre Slaves mit Daten starten, die nicht mit dem übereinstimmen, was auf dem Master war, als die Binär-Log-Datei gestartet wurde, funktionieren Ihre Slaves womöglich nicht richtig.

Eine zukünftige Version (4.0) von MySQL wird die Notwendigkeit beseitigen, (eventuell große) Schnappschüsse von Daten für neue Slaves vorzuhalten, die Sie über die Live-Datensicherungs-Funktionalität aufsetzen wollen, wobei kein Sperren (Locking) erforderlich ist. Zu dieser Zeit ist es jedoch notwendig, alle Schreibzugriffe entweder mit einer globalen Lese-Sperre oder durch das Herunterfahren des Masters zu blockieren, während man einen Schnappschuss anlegt.

Sobald ein Slave korrekt konfiguriert ist und läuft, verbindet er sich einfach mit dem Master und wartet darauf, dass Aktualisierung ausgeführt werden. Wenn der Master abgeschaltet wird oder der Slave die Verbindung zum Master verliert, versucht er alle master-connect-retry Sekunden, sich neu zu verbinden, bis er sich neu verbinden kann, und nimmt dann das Warten auf Aktualisierungen wieder auf.

Jeder Slave achtet darauf, wo er aufgehört hat. Der Master-Server weiß nicht, wie viele Slaves es gibt oder welche zu einem gegebenen Zeitpunkt auf aktuellem Stand sind.

Der nächste Abschnitt erläutert den Master-Slave-Einrichtungsprozess detaillierter.

5.10.3 Wie man Replikation aufsetzt

Unten findet sich eine kurze Beschreibung, wie Sie komplette Replikation auf Ihrem aktuellen MySQL-Server einrichten können. Es wird angenommen, dass Sie alle Ihre Datenbanken replizieren wollen und bislang Replikation noch nicht konfiguriert haben. Sie müssen Ihren Master-Server kurz herunter fahren, um die unten stehenden Schritte fertigzustellen.

  1. Stellen Sie sicher, dass Sie eine aktuelle Version von MySQL auf dem Master und dem Slave oder den Slaves haben. Benutzen Sie Version 3.23.29 oder höher. Vorherige Releases benutzten ein anderes Binär-Log-Format und hatten Bugs, die in neueren Releases behoben wurden. Bitte berichten Sie keine Bugs, bevor Sie bestätigen können, dass das Problem im neuesten Release beobachtet werden kann.
  2. Richten Sie einen speziellen Replikationsbenutzer auf dem Master mit der FILE-Berechtigung und Berechtigungen, sich von allen Slaves aus zu verbinden, ein. Wenn der Benutzer ausschließlich Replikation durchführt (was empfohlen wird), müssen Sie ihm keine zusätzlichen Berechtigungen geben. Erzeugen Sie zum Beispiel einen Benutzer namens repl, der auf Ihren Master von jedem Host aus zugreifen kann, mit folgendem Befehl:
    GRANT FILE ON *.* TO repl@"%" IDENTIFIED BY 'passwort';
    
  3. Fahren Sie den MySQL-Master herunter:
    mysqladmin -u root -ppasswort shutdown
    
  4. Machen Sie einen Schnappschuss aller Daten auf Ihrem Master-Server. Die einfachste Art, das (unter Unix) zu tun, ist, einfach tar zu benutzen, um ein Archiv Ihre gesamten Daten-Verzeichnisses zu erzeugen. Der genaue Speicherort Ihres Daten-Verzeichnisses hängt von Ihrer Installation ab.
    tar -cvf /tmp/mysql-snapshot.tar /pfad/zu/data-dir
    
    Windows-Benutzer können WinZip oder ähnliche Software benutzen, um ein Archiv des Daten-Verzeichnisses anzulegen.
  5. In der Datei my.cnf für den Master fügen Sie log-bin und server-id=eindeutige_nummer zum [mysqld]-Abschnitt und hinzu und starten Sie den Server neu. Es ist sehr wichtig, dass die ID auf dem Slave sich von der ID auf dem Master unterscheidet. Denken Sie sich server-id als etwas, dass einer IP-Adresse ähnlich ist - es identifiziert in der Gemeinschaft der Replikationspartner die Server-Instanz eindeutig.
    [mysqld]
    log-bin
    server-id=1
    
  6. Starten Sie den MySQL-Master neu.
  7. Fügen Sie auf dem Slave oder den Slaves folgendes zur Datei my.cnf hinzu:
    master-host=hostname_des_masters
    master-user=replikations_benutzername
    master-password=replikations_benutzerpasswort
    master-port=TCP/IP-Port_für_master>
    server-id=eine_eindeutige_nummer_zwischen_2_und_2^32-1
    
    Ersetzen Sie die Beispielwerte durch etwas, was für Ihr System stimmig ist. server-id muss für jeden Partner, der an Replikation teilnimmt, unterschiedlich sein. Wenn Sie keine server-id angeben, wird sie auf 1 gesetzt, falls Sie master-host nicht definiert haben, ansonsten wird sie auf 2 gesetzt. Beachten Sie für den Fall, dass sie server-id weglassen, dass der Master Verbindungen von allen Slaves verweigert und die Slaves verweigern werden, sich mit dem Master zu verbinden. Daher ist das Weglassen der server-id nur dann eine gute Idee, wenn Sie es nur für Datensicherungen mit einer Binär-Log-Datei verwenden.
  8. Kopieren Sie die Schnappschuss-Daten in Ihr Daten-Verzeichnis auf Ihrem Slave oder Ihren Slaves. Stellen Sie sicher, dass die Berechtigungen auf die Dateien und Verzeichnisse korrekt sind. Der Benutzer, unter dem MySQL läuft, muss in der Lage sein, sie zu lesen und zu schreiben, genau wie auf dem Master.
  9. Starten Sie den Slave oder die Slaves neu.

Nachdem Sie das Obige durchgeführt haben, sollten sich die Slaves mit dem Master verbinden können und alle Aktualisierungen mitbekommen, die nach der Aufnahme des Schnappschusses passieren.

Wenn Sie vergessen haben, die server-id für den Slave zu setzen, erhalten Sie folgenden Fehler in der Fehler-Log-Datei:

Warning: one should set server_id to a non-0 value if master_host ist set.
The server will not act as a slave.

Wenn Sie vergessen haben, selbiges für den Master zu machen, sind die Slaves nicht in der Lage, sich mit dem Master zu verbinden.

Wenn ein Slave aus irgend welchen Gründen nicht in der Lage ist zu replizieren, finden Sie Fehlermeldungen in der Fehler-Log-Datei auf dem Slave.

Sobald ein Slave repliziert, finden Sie eine Datei namens master.info im selben Verzeichnis, wo auch Ihre Fehler-Log-Datei liegt. Die master.info-Datei wird vom Slave benutzt, um auf dem Laufenden zu bleiben, wie viel der Binär-Log-Datei des Masters er bereits abgearbeitet hat. Sie sollten die Datei NICHT entfernen oder editieren, es sei denn, Sie wissen genau, was Sie tun. Selbst in diesem Fall sollten Sie vorzugsweise den CHANGE MASTER TO-Befehl benutzen.

5.10.4 Replikationsfeatures und bekannte Probleme

Unten steht eine Erläuterung dessen, was unterstützt wird und was nicht:

5.10.5 Replikationsoptionen in my.cnf

Wenn Sie Replikation benutzen, empfehlen wir, dass Sie MySQL-Version 3.23.30 oder höher benutzen. Ältere Versionen funktionieren, haben aber einige Bugs und fehlende Features.

Sowohl auf dem Master als auch auf dem Slave müssen Sie die server-id-Option benutzen. Diese setzt eine eindeutige Replikations-ID. Sie sollten einen eindeutigen Wert im Bereich zwischen 1 und 2^32-1 für jeden Master und Slave benutzen. Beispiel: server-id=3

In folgender Tabelle stehen die Optionen, die Sie für den MASTER benutzen können:

Option Beschreibung
log-bin=dateiname Schreibt in die binäre Update-Log-Datei am angegebenen Ort. Beachten Sie, dass, wenn Sie ihr einen Parameter mit einer Erweiterung angeben (zum Beispiel log-bin=/mysql/logs/replikation.log), Versionen bis zu 3.23.24 während der Replikation nicht richtig funktionieren, wen Sie FLUSH LOGS ausführen. Das Problem ist seit Version 3.23.25 behoben. Wenn Sie Log-Namen dieser Art benutzen, wird FLUSH LOGS auf dem binären Log ignoriert. Um das Log zu löschen, führen Sie FLUSH MASTER aus. Vergessen Sie dabei nicht, FLUSH SLAVE auf allen Slaves laufen zu lassen.Ab Version 3.23.26 sollten Sie RESET MASTER und RESET SLAVE benutzen.
log-bin-index=dateiname Weil der Benutzer FLUSH LOGS-Befehle ausführen könnte, muss man wissen, welches Log momentan aktiv ist und welche in welcher Reihenfolge durch Log-Rotation herausgenommen wurden. Diese Informationen sind in der Binär-Log-Index-Datei gespeichert. Der Vorgabewert ist `hostname`.index. Beispiel: log-bin-index=datenbank.index.
sql-bin-update-same Falls gesetzt, führt das Setzen von SQL_LOG_BIN auf einen Wert automatisch dazu, dass SQL_LOG_UPDATE auf denselben Wert gesetzt wird, und umgekehrt.
binlog-do-db=datenbank Weist den Master an, Aktualisierung in die Binär-Log-Datei zu loggen, wenn die aktuelle Datenbank 'datenbank' ist. Alle anderen Datenbanken werden ignoriert. Beachten Sie bei der Benutzung, dass Sie sicherstellen sollten, dass Sie Aktualisierungen nur in der aktuellen Datenbank ausführen. Beispiel: binlog-do-db=eine_datenbank.
binlog-ignore-db=datenbank Weist den Master an, das Aktualisierung der aktuellen Datenbank 'datenbank' nicht in der Binär-Log-Datei gespeichert werden sollen. ignoriert. Beachten Sie bei der Benutzung, dass Sie sicherstellen sollten, dass Sie Aktualisierungen nur in der aktuellen Datenbank ausführen. Beispiel: binlog-ignore-db=eine_datenbank

Folgende Tabelle enthält die Optionen, die Sie für SLAVE benutzen können:

Option Beschreibung
master-host=host Hostname des Masters oder IP-Adresse für Replikation. Falls nicht gesetzt, startet der Slave-Thread nicht. Beispiel: master-host=datenbank-master.meinefirma.de.
master-user=benutzername Der Benutzer, den der Slave-Thread für Authentifizierung benutzt, wenn er sich mit dem Master verbindet. Der Benutzer muss die FILE-Berechtigung besitzen. Wenn der Master-Benutzer nicht gesetzt ist, wird Benutzer test angenommen. Beispiel: master-user=steve.
master-password=passwort Das Passwort, das der Slave-Thread für Authentifizierung benutzt, wenn er sich mit dem Master verbindet. Wenn nicht gesetzt, wird ein leeres Passwort angenommen. Beispiel: master-password=hund.
master-port=portnummer Der Port, auf dem der Master auf Verbindungen wartet. Wenn nicht gesetzt, wird die kompilierte Einstellung von MYSQL_PORT angenommen. Wenn Sie nicht an den configure-Optionen gedreht haben, sollte das 3306 sein. Beispiel: master-port=3306.
master-connect-retry=sekunden Die Anzahl Sekunden, die der Slave-Thread schläft, bevor er wiederum versucht, sich mit dem Master zu verbinden, falls der Master herunter fuhr oder die Verbindung verloren ging. Vorgabewert ist 60. Beispiel: master-connect-retry=60.
master-ssl Schaltet SSL an. Beispiel: master-ssl.
master-ssl-key Der Name der SSL-Schlüsseldatei für den Master. Beispiel: master-ssl-key=SSL/master-key.pem.
master-ssl-cert Der Dateiname des SSL-Zertifikats für den Master. Beispiel: master-ssl-key=SSL/master-cert.pem.
master-info-file=dateiname Der Speicherort der Datei, die sich merkt, bis wohin der Master während des Replikationsprozesses verfolgt wurde. Vorgabewert ist master.info im data- Verzeichnis. Beispiel: master-info-file=master.info.
replicate-do-table=datenbank.tabelle Weist den Slave-Thread an, die Replikation auf die angegebene Tabelle zu beschränken. Um mehr als eine Tabelle anzugeben, benutzen Sie die Anweisung mehrfach, einmal für jede Tabelle. Das funktioniert auch bei Datenbank-übergreifenden Aktualisierungen, im Gegensatz zu replicate-do-db. Beispiel: replicate-do-table=eine_datenbank.eine_tabelle.
replicate-ignore-table=datenbank.tabelle Weist den Slave-Thread an, die angegebene Tabelle nicht zu replizieren. Um mehr als eine Tabelle anzugeben, die ignoriert werden soll, geben Sie die Anweisung mehrfach ein, einmal für jede Tabelle. Das funktioniert auch bei Datenbank-übergreifenden Aktualisierungen, im Gegensatz zu replicate-ignore-db. Beispiel: replicate-ignore-table=eine_datenbank.eine_tabelle.
replicate-wild-do-table=datenbank.tabelle Weist den Slave-Thread an, die Replikation auf Tabellen zu beschränken, die dem angegebenen Platzhalter-Muster entsprechen. Um mehr als ein Tabellenmuster anzugeben, das ignoriert werden soll, geben Sie die Anweisung mehrfach ein, einmal für jedes Tabellenmuster. Das funktioniert auch bei Datenbank-übergreifenden Aktualisierungen. Beispiel: replicate-wild-do-table=foo%.bar% repliziert nur Aktualisierungen auf Tabellen in allen Datenbanken, die mit 'foo' anfangen und deren Tabellennamen mit 'bar' beginnen.
replicate-wild-ignore-table=datenbank.tabelle Weist den Slave-Thread an, Tabellen nicht zu replizieren, die dem angegebenen Platzhalter-Muster entsprechen. Um mehr als ein Tabellenmuster anzugeben, das ignoriert werden soll, geben Sie die Anweisung mehrfach ein, einmal für jedes Tabellenmuster. Das funktioniert auch bei Datenbank-übergreifenden Aktualisierungen. Beispiel: replicate-wild-ignore-table=foo%.bar% aktualisiert keine Tabellen in Datenbanken, die mit 'foo' anfangen und deren Tabellennamen mit 'bar' beginnen.
replicate-ignore-db=datenbank Weist den Slave-Thread an, die angegebene Datenbank nicht zu replizieren. Um mehr als eine Datenbank anzugeben, die ignoriert werden soll, geben Sie die Anweisung mehrfach ein, einmal für jede Datenbank. Diese Option funktioniert nicht für Datenbank-übergreifende Aktualisierungen. Wenn Sie Datenbank-übergreifende Aktualisierungen brauchen, stellen Sie sicher, dass Sie Version 3.23.28 oder höher verwenden und benutzen Sie replicate-wild-ignore-table=datenbank.% Beispiel: replicate-ignore-db=eine_datenbank.
replicate-do-db=datenbank Weist den Slave-Thread an, die Replikation auf die angegebene Datenbank zu beschränken. Um mehr als eine Datenbank anzugeben, benutzen Sie die Anweisung mehrfach, einmal für jede Datenbank. Beachten Sie, dass das nicht funktioniert, wenn Sie Datenbank-übergreifende Anfragen wie UPDATE eine_datenbank.eine_tabelle SET foo='bar' ausführen, während Sie eine andere oder keine Datenbank ausgewählt haben. Wenn Sie Datenbank-übergreifende Aktualisierungen brauchen, stellen Sie sicher, dass Sie Version 3.23.28 oder höher verwenden und benutzen Sie replicate-wild-do-table=datenbank.%. Beispiel: replicate-do-db=eine_datenbank.
log-slave-updates Weist den Slave an, Aktualisierungen vom Slave-Thread in die binäre Log-Datei zu schreiben. Ist vorgabemäßig ausgeschaltet. Sie müssen diese Option anschalten, wenn Sie planen, die Slave in eine zirkuläre Kette zu hängen ('Daisy-Chain').
replicate-rewrite-db=von_name->zu_name Aktualisierungen auf eine Datenbank mit einem anderen Namen als dem Orginalnamen. Beispiel: replicate-rewrite-db=master_datenbank->slave_datenbank.
skip-slave-start Weist den Slave-Server an, den Slave nicht beim Hochfahren zu starten. Der Benutzer kann ihn später mit SLAVE START starten.
slave_read_timeout=# Anzahl von Sekunden, die der Slave auf weitere Daten vom Master wartet, bevor er abbricht.

5.10.6 SQL-Befehle in Bezug auf Replikation

Replikation kann über die SQL-Schnittstelle gesteuert werden. Hier eine Zusammenfassung der Befehle:

Befehl Beschreibung
SLAVE START Startet den Slave-Thread. (Slave)
SLAVE STOP Hält den Slave-Thread an. (Slave)
SET SQL_LOG_BIN=0 Schaltet das Loggen in die Update-Log-Datei aus, wenn der Benutzer die process-Berechtigung hat. Wird ansonsten ignoriert. (Master)
SET SQL_LOG_BIN=1 Schaltet das Loggen in die Update-Log-Datei wieder an, wenn der Benutzer die process-Berechtigung hat. Wird ansonsten ignoriert. (Master)
SET SQL_SLAVE_SKIP_COUNTER=n Die nächsten n Ereignisse vom Master ignorieren. Gilt nur, wenn der Slave-Thread nicht läuft, gibt ansonsten einen Fehler aus. Nützlich für den Ausgleich von Replikationsabweichungen.
RESET MASTER Löscht alle Binär-Log-Dateien, die in der Index-Datei aufgeführt sind, und setzt die BinärLog-Index-Datei auf leer zurück. In Versionen vor 3.23.26 versions heißt dieser Befehl FLUSH MASTER. (Master)
RESET SLAVE Führt dazu, dass der Slave seine Replikationsposition in den Master-Logs vergisst. In Versionen vor 3.23.26 versions heißt dieser Befehl FLUSH SLAVE. (Slave)
LOAD TABLE tabelle FROM MASTER Lädt eine Kopie der Tabelle vom Master auf den Slave. (Slave)
CHANGE MASTER TO master_def_list Ändert die Master-Parameters auf den Wert, der in master_def_list angegeben ist, und startet den Slave-Thread neu. master_def_list ist eine durch Kommas getrennte Liste master_def, wobei master_def eins der folgenden Elemente ist: MASTER_HOST, MASTER_USER, MASTER_PASSWORD, MASTER_PORT, MASTER_CONNECT_RETRY, MASTER_LOG_FILE oder MASTER_LOG_POS. Beispiel:

CHANGE MASTER TO
  MASTER_HOST='master2.meinefirma.com',
  MASTER_USER='replikation',
  MASTER_PASSWORD='gro33esgeheimnis',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='master2-bin.001',
  MASTER_LOG_POS=4;

Sie müssen nur die Werte angeben, die geändert werden sollen. Die Werte, die Sie auslassen, bleiben dieselben, ausser wenn Sie den Host oder den Port ändern. In diesem Fall nimmt der Slave an, dass der Master ein anderer ist, weil Sie sich zu einem anderen Host oder über einen anderen Port verbinden. Daher treffen die alten Werte von Log und Position nicht mehr zu und werden automatisch auf eine leere Zeichenkette bzw. auf 0 zurück gesetzt (dem Startwert). Beachten Sie, dass sich der Slave beim Neustart an seinen alten Master erinnert. Falls das nicht wünschenswert ist, sollten Sie die `master.info'-Datei löschen, bevor Sie neu starten. Der Slave liest dann seinen Master aus der Datei my.cnf oder von der Kommandozeile. (Slave)
SHOW MASTER STATUS Stellt Statusinformationen über die Binär-Log-Datei des Masters zur Verfügung. (Master)
SHOW SLAVE STATUS Stellt Statusinformationen über die wichtigsten Parameter des Slave-Threads zur Verfügung. (Slave)
SHOW MASTER LOGS Nur verfügbar ab Version 3.23.28. Listet die Binär-Log-Dateien auf dem Master auf. Sie sollten diesen Befehl vor PURGE MASTER LOGS TO benutzen, um herauszufinden, wie weit Sie gehen sollten.
PURGE MASTER LOGS TO 'logname' Verfügbar ab Version 3.23.28. Löscht alle Replikations-Logs, die in der Index-Log-Datei aufgeführt sind, die vor dem angegebenen Log liegen und entfernt Sie aus dem Log-Index, so dass die angegebene Log-Datei nunmehr die erste wird. Beispiel:
PURGE MASTER LOGS TO 'mysql-bin.010'
Dieser Befehl macht nichts und schlägt mit einer Fehlermeldung fehl, wenn Sie einen aktiven Slave haben, der momentan eine der Log-Dateien liest, die Sie zu löschen versuchen. Wenn Sie jedoch einen schlafenden Slave haben und gerade eine der Log-Dateien löschen, die dieser Slave lesen will, wird der Slave nicht in der Lage sein zu replizieren, sobald er wach wird. Der Befehl kann sicher verwendet werden, während Slaves replizieren - Sie brauchen diese also nicht anhalten. Zuerst müssen Sie alle Slaves mit SHOW SLAVE STATUS überprüfen, um festzustellen, an welcher Log-Datei sie gerade sind, dann eine Auflistung aller Log-Dateien auf dem Master mit SHOW MASTER LOGS machen, die früheste davon herausfinden, an der noch ein Slave arbeitet (wenn alle Slaves aktuell sind, ist das die letzte Log-Datei auf der Liste), dann alle Logs, die Sie löschen wollen, sichern (optional), und schließlich bis zum Ziel-Log löschen.

5.10.7 Replikation - Häufig gestellte Fragen

Frage: Warum sehe ich manchmal mehr als eine Binlog_Dump-Thread auf dem Master, nachdem ich den Slave neu gestartet habe?

Antwort: Binlog_Dump ist ein kontinuierlicher Prozess, der folgendermaßen vom Server gehandhabt wird:

Wenn der Slave-Thread also beim Slave anhält, bemerkt das der entsprechende Binlog_Dump-Thread auf dem Master solange nicht, bis zumindest eine Aktualisierung (oder ein Kill) auf den Master durchgeführt wird, was benötigt wird, um ihn von pThread_cond_wait() aufzuwecken. In der Zwischenzeit könnte der Slave bereits eine weitere Verbindung geöffnet haben, die in einem weiteren Binlog_Dump-Thread resultiert.

Das beschriebene Problem sollten in Versionen ab 3.23.26 nicht auftreten. In Version 3.23.26 kam server-id für jeden Replikationsserver hinzu, und nun werden alle alten Zombie-Threads auf dem Master gekillt, wenn ein neuer Replikations-Thread sich vom selben Slave aus verbindet.

Frage: Wie rotiere ich Replikations-Logs?

Antwort: In Version 3.23.28 sollten Sie den PURGE MASTER LOGS TO-Befehl benutzen, nachdem festgestellt wurde, welche Logs gelöscht werden können und nachdem sie optional gesichert wurden. In früheren Versionen ist der Prozess sehr viel anstrengender und kann nicht sicher durchgeführt werden, ohne alle Slaves anzuhalten, falls Sie planen, Log-Namen wiederholt zu verwenden. Sie müssen die Slave-Threads anhalten, die Binär-Log-Index-Datei editieren, alle alten Logs löschen, den Master neu starten, die Slave-Threads neu starten und dann die alten Log-Dateien entfernen.

Frage: Wie aktualisiere ich bei einer laufenden Replikationseinrichtung?

Antwort: Wenn Sie vor Version 3.23.26 aktualisieren, sollten Sie nur die Master-Tabellen sperren, warten, bis die Slaves auf aktuellem Stand sind, und dann FLUSH MASTER auf dem Master und FLUSH SLAVE auf dem Slave laufen lassen, um die Logs zurückzusetzen, und danach neue Versionen des Masters und des Slaves neu starten. Beachten Sie, dass der Slave für einige Zeit heruntergefahren bleiben kann - weil der Master alle Aktualisierung loggt, wird der Slave in der Lage sein, auf den aktuellen Stand zu kommen, sobald er hoch gefahren ist und sich verbinden kann.

Nach Version 3.23.26 wurde das Replikationsprotokoll für Änderungen gesperrt, daher können Sie Masters und Slaves im laufenden Betrieb auf eine neuere 3.23-Version aktualisieren, und Sie können unterschiedliche Versionen von MySQL auf Slave und Master laufen haben, solange beide neuer als Version 3.23.26 sind.

Frage: Welche Dinge sollte ich beachten, wenn ich Zweiweg-Replikation aufsetze?

Antwort: MySQL-Replikation unterstützt derzeit kein Sperr-Protokoll zwischen Master und Slave, um die Atomizität einer verteilten (Cross-Server-) Aktualisierung zu gewährleisten. Mit anderen Worten ist es für einen Client A möglich, eine Aktualisierung zu Co-Master 1 zu machen. In der Zwischenzeit, bevor er sich an Co-Master 2 wendet, könnte Client B eine Aktualisierung auf Co-Master 2 machen, die dazu führt, dass die Aktualisierung von Client A anders funktioniert als auf Master 1. Wenn daher die Aktualisierung von Client A zu Co-Master 2 durchdringt, produziert das Tabellen, die anders sein werden als die auf Co-Master 1, selbst nachdem alle Aktualisierungen von Co-Master 2 ebenfalls durchgeführt wurden. Daher sollten sie keine zwei Server in einer Zweiweg-Replikation verketten, es sei denn, Sie können sicher sein, dass Ihre Aktualisierungen immer in bestimmter Reihenfolge ablaufen, oder indem Sie irgendwie in Ihrem Client-Code Vorkehrungen gegen Aktualisierung treffen, die nicht in der richtigen Reihenfolge sind.

Sie müssen sich auch darüber im Klaren sein, dass Zweiweg-Replikation Ihre Performance nicht wesentlich verbessert, falls überhaupt, sofern Aktualisierungen betroffen sind. Beide Server müssen ungefähr dieselbe Menge Aktualisierungen durchführen, was auch ein Server hätte tun können. Der einzige Unterschied liegt darin, dass es sehr viel weniger Lock-Contention gibt, weil die Aktualisierungen, die von einem anderen Server stammen, in einem Slave-Thread serialisiert werden. Dennoch kann der erzielte Vorteil durch Netzwerk-Verzögerungen konterkariert werden.

Frage: Wie kann ich Replikation benutzen, um die Performance meines Systems zu verbessern?

Antwort: Sie sollten einen Server als Master aufsetzen und alle Schreibvorgänge zu ihm lenken, und so viele Slaves wie möglich einrichten und die Lesevorgänge zwischen Master und Slaves verteilen. Ausserdem können Sie die Slaves mit --skip-bdb, --low-priority-updates und --delay-key-write-for-all-tables starten, um für die Slaves Geschwindigkeitsverbesserungen zu erzielen. In diesem Fall benutzt der Slave nicht transaktionale MyISAM-Tabellen anstelle von BDB-Tabellen, um mehr Geschwindigkeit zu erhalten.

Frage: Was muss ich in meinem Client-Code tun, damit dieser Performance-verbessernde Replikation nutzt?

Antwort: Wenn der Teil Ihres Codes, der für den Datenbankzugriff zuständig ist, korrekt abstrahiert / modularisiert ist, sollte die Konvertierung zur replizierten Einrichtung sehr glatt und einfach verlaufen: Ändern Sie die Implementation Ihres Datenbankzugriffs so, dass von irgend einem Slave oder dem Master gelesen und immer zum Master geschrieben wird. Wenn Ihr Code nicht diese Abstraktionsebene besitzt, ist die Einrichtung eines Replikationssystems ein guter Grund, ihn zu säubern. Sie könnten damit beginnen, eine Wrapper-Bibliothek oder ein Wrapper-Modul mit folgenden Funktionen zu benutzen:

safe_ bedeutet, dass die Funktion sich um die Handhabung jeglicher Fehlerbedingungen kümmert.

Danach sollten Sie Ihren Client-Code so umwandeln, dass er die Wrapper-Bibliothek benutzt. Dieser Prozess kann anfangs etwas anstrengend und aufregend sein, wird sich aber auf lange Sicht lohnen. Alle Applikationen, die dem geschilderten Muster folgen, werden ebenfalls Nutzen aus der Master-/Slaves-Lösung ziehen. Der Code wird sich viel einfacher pflegen lassen und Optionen zur Problemlösung werden trivial sein. Sie brauchen einfach nur ein oder zwei Funktionen zu ändern, um zum Beispiel zu loggen, wie lang jede Anfrage dauerte, oder welche Anfrage unter Ihren Tausenden einen Fehler produzierte. Wenn Sie schon eine Menge Code geschrieben haben, wollen Sie den Umwandlungsprozess wahrscheinlich automatisieren. Hierfür können Sie zum Beispiel Monty's replace-Dienstprogramm benutzen, das der Standard-Distribution von MySQL beiliegt, oder Ihr eigenes Perl-Skript schreiben. Hoffentlich folgt Ihr Code irgend einem erkennbaren Muster - wenn nicht, ist es wahrscheinlich ohnehin besser, ihn neu zu schreiben, oder zumindest, ihn durchzugehen und manuell in ein Muster zu bringen.

Beachten Sie, dass Sie natürlich andere Namen für die Funktionen verwenden können. Wichtig ist, eine einheitliche Schnittstelle für Verbindungen zum Lesen, Verbindungen zum Schreiben, Durchführen von Lesevorgängen und Durchführung von Schreibvorgängen zu haben.

Frage: Wann und in welchem Umfang kann MySQL-Replikation die Performance meines Systems verbessern?

Antwort: MySQL-Replikation bringt die meisten Vorteile auf einem System mit häufigen Lesevorgängen und nicht so häufigen Schreibvorgängen. Theoretisch können Sie eine Einrichtung aus einem Master und vielen Slaves so skalieren, dass Sie solange Slaves hinzufügen, bis Sie entweder keine Netzwerk-Bandbreite mehr haben oder bis Ihre Aktualisierungslast so weit ansteigt, dass der Master sie nicht mehr handhaben kann.

Im festlegen zu können, wie viele Slaves sie haben können, bevor die zusätzlichen Vorteile aufgewogen werden, und um wieviel Sie die Performance Ihrer Site steigern können, müssen Sie Ihre Anfragenmuster kennen und empirisch (durch Benchmarks) festlegen, wie das Verhältnis zwischen dem Durchsatz von Lesevorgängen (pro Sekunde, oder max_reads) und Schreibvorgängen (max_writes) auf einem typischen Master und einem typischen Slave ist. Das unten stehende Beispiel zeigt Ihnen eine eher vereinfachte Berechnung, was Sie mit Replikation für ein imaginäres System erreichen können.

Nehmen wir an, Ihr Systemlast besteht aus 10% Schreibvorgängen und 90% Lesevorgängen, und Sie haben festgestellt, dass max_reads = 1200 - 2 * max_writes ist. Mit anderen Worten kann Ihr System 1.200 Lesevorgänge pro Sekunde ohne Schreibzugriffe ausführen, und der durchschnittliche Schreibvorgang ist zweimal so langsam wie der durchschnittliche Lesevorgang, und das Verhältnis ist linear. Nehmen wir ferner an, dass Ihr Master und Slave dieselbe Kapazität haben, und dass es N Slaves und 1 Master gibt. Dann gilt für jeden Server (Master oder Slave):

lesen = 1200 - 2 * schreiben (aus Benchmarks)

lesen = 9 * schreiben / (N + 1) (lesen aufgeteilt, aber schreiben geht an alle Server)

9 * schreiben / (N+1) + 2 * schreiben = 1200

schreiben = 1200/(2 + 9/(N+1)

Wenn also N = 0, was bedeutet, dass es keine Replikation gibt, kann Ihr System 1200 / 11, also etwa 109 Schreibvorgänge pro Sekunden handhaben (was heißt, dass Sie neunmal so viele Lesevorgänge haben, was der Natur Ihrer Applikation entspricht).

Wenn N = 1 ist, können Sie bis zu 184 Schreibvorgänge pro Sekunde haben.

Wenn N = 8 ist, können Sie bis zu 400 haben.

Wenn N = 17 ist, können Sie 480 haben.

Wenn schließlich N gegen unendlich geht (und Ihr Budget gegen negativ unendlich), können Sie sehr nahe an 600 Schreibvorgänge pro Sekunde kommen und damit den Systemdurchsatz um etwa den Faktor 5,5 erhöhen. Mit nur 8 Servern jedoch kommen Sie bereits auf eine Steigerung um fast den Faktor 4.

Beachten Sie, dass diese Berechnungen von unbegrenzter Netzwerk-Bandbreite ausgehen und verschiedene andere Faktoren vernachlässigen, die auf Ihrem System signifikant sein könnten. In vielen Fällen werden Sie nicht in der Lage sein, präzise vorauszusagen, was auf Ihrem System passieren wird, wenn Sie N Replikations-Slaves hinzufügen. Dennoch kann die Beantwortung folgender Fragen Ihnen helfen zu entscheiden, ob und wie viel (wenn überhaupt) Replikation bewirken kann, dass sich Ihre System-Performance verbessert:

Frage: Wie kann ich Replikation benutzen, um Redundanz / hohe Verfügbarkeit zur Verfügung zu stellen?

Antwort: Mit den momentan verfügbaren Features würden Sie einen Master und einen Slave (nicht mehrere Slaves) aufsetzen und ein Skript schreiben, das den Master beobachtet, um zu sehen, ob er hochgefahren ist, und Ihre Applikationen und die Slaves anweisen, den Master im Falle von Fehlschlägen zu ändern. Einige Vorschläge: set up a master und a slave (or several slaves) und write a Skript

Momentan arbeiten wir an der Integration eines Systems in MySQL, das automatisch den Master auswählt, aber bis es fertig ist, müssen Sie Ihre eigenen Beobachtungswerkzeuge schaffen.

5.10.8 Problemlösung bei Replikation

Wenn Sie den Anweisungen gefolgt sind und Ihre Replikationseinrichtung nicht funktioniert, beseitigen Sie zunächst die Möglichkeit von Benutzerfehlern, indem Sie folgendes prüfen:

Wenn Sie sicher sind, dass es keine Benutzerfehler gibt und die Replikation immer noch nicht funktioniert oder nicht stabil ist, ist es an der Zeit, einen Bug-Bericht auszuarbeiten. Um dem Bug auf die Spur zu kommen, brauchen wir soviel Informationen von Ihnen wie möglich. Bitte nehmen Sie sich etwas Zeit und schreiben Sie einen guten Bug-Bericht. Im Idealfall hätten wir gerne einen Test-Fall in dem Format, das Sie im mysql-test/t/rpl*-Verzeichnis des Source-Baums finden. Wenn Sie einen solchen Test-Fall schicken, können Sie in den meisten Fällen ein Patch innerhalb von ein oder zwei Tagen erwarten. Diese Zeitspanne hängt allerdings von einer Anzahl weiterer Faktoren ab.

Die zweitbeste Option ist ein einfaches Programm mit leicht konfigurierbaren Verbindungsargumenten für Master und Slave, das das Problem auf Ihrem System veranschaulicht. Sie können dies in Perl oder C schreiben, abhängig davon, welche Sprache Sie besser beherrschen.

Wenn Sie den Bug auf eine der beiden oben beschriebenen Weisen demonstrieren können, benutzen Sie mysqlbug, um einen Bug-Bericht vorzubereiten, und schicken Sie ihn an bugs@lists.mysql.com. Wenn Sie ein 'Phantom' haben - ein Problem, das auftritt, aber nicht einfach reproduziert werden kann - tun Sie folgendes:

Sobald Sie die Beweise des Phantomproblems gesammelt haben, versuchen Sie zuerst, es in einen separaten Test-Fall zu isolieren. Berichten Sie dann das Problem an bugs@lists.mysql.com, wobei Sie soviel Informationen wie möglich mitschicken.


Go to the first, previous, next, last section, table of contents.