Inhaltsverzeichnis
mysqld in Bezug auf SicherheitAccess denied-FehlerGRANT- und REVOKE-Syntaxmysqlcheck für Tabellenwartung und Wiederherstellung nach Abstürzen
mysqld akzeptiert folgende
Kommandozeilenoptionen:
--ansi
ANSI-SQL-Syntax anstelle von MySQL-Syntax benutzen. See Abschnitt 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 Abschnitt 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
Abschnitt 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 Abschnitt 5.6.1, „Der für Daten und Sortieren benutzte Zeichensatz“.
--default-table-type=type
Setzt den vorgabemäßigen Tabellentyp für Tabellen. See Kapitel 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
Abschnitt D.1.2, „Trace-Dateien erzeugen“.
--delay-key-write-for-all-tables
Schlüsselpuffer (Key Buffer) für jegliche
MyISAM-Tabellen nicht leeren (flush). See
Abschnitt 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 Abschnitt 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 Abschnitt 5.6.2, „Nicht englische Fehlermeldungen“.
-l, --log[=datei]
Loggt Verbindungen und Anfragen in datei. See Abschnitt 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
Abschnitt 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 Abschnitt 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
Abschnitt 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 Abschnitt D.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
Abschnitt 5.5.5.4, „SHOW VARIABLES“. Der Abschnitt über das
Tunen der Serverparameter enthält Informationen darüber,
wie man diese optimiert. See
Abschnitt 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
Abschnitt 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 Abschnitt 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 Abschnitt 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
Abschnitt 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 Abschnitt 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 Abschnitt 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 Abschnitt D.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 Abschnitt 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.
-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
Abschnitt A.2.9, „Kommunikationsfehler / Abgebrochene Verbindung“.
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
Anhang E, 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'.
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.sockshell>MYSQL_TCP_PORT=3307shell>export MYSQL_UNIX_PORT MYSQL_TCP_PORTshell>scripts/mysql_install_dbshell>bin/safe_mysqld &
Der Umgebungsvariablen-Appendix beinhaltet eine Liste anderer
Umgebungsvariablen, die Sie benutzen können, um
mysqld zu steuern. See
Anhang E, 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 Abschnitt 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 Abschnitt 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.
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 Abschnitt 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:
Starten Sie den Client mit --host 'hostname'
--port=port_nummer, um sich über TCP/IP zu
verbinden, oder mit [--host localhost]
--socket=datei, um sich über ein Unix-Socket zu
verbinden.
In Ihren C- oder Perl-Programmen können Sie die Port- oder Socket-Argumente angeben, wenn Sie sich mit dem MySQL-Server verbinden.
Wenn Sie das Perl-DBD::mysql-Modul
benutzen, können Sie die Optionen aus den
MySQL-Optionsdateien lesen. See
Abschnitt 5.1.2, „my.cnf-Optionsdateien“.
$dsn = "DBI:mysql:test;mysql_read_default_group=client;mysql_read_default_file=/usr/local/mysql/data/my.cnf" $dbh = DBI->connect($dsn, $user, $password);
Setzen Sie die MYSQL_UNIX_PORT- und
MYSQL_TCP_PORT-Umgebungsvariablen, so
dass sie auf den Unix-Socket und TCP/IP-Port zeigen, bevor
Sie Ihre Clients starten. Wenn Sie normalerweise eine
speziellen Socket oder Port benutzen, sollten Sie die
Befehle zum Setzen dieser Umgebungsvariablen in Ihrer
.login-Datei unterbringen. See
Anhang E, Umgebungsvariablen.
Legen Sie den vorgabemäßigen Socket und TCP/IP-Port in der
.my.cnf-Datei in Ihrem
Heimatverzeichnis fest. See Abschnitt 5.1.2, „my.cnf-Optionsdateien“.
mysqld in Bezug auf SicherheitAccess denied-FehlerMySQL hat ein fortgeschrittenes, aber nicht standardisiertes Sicherheits- bzw. Berechtigungssystem. Dieser Abschnitt beschreibt, wie es funktioniert.
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:
GEBEN SIE NIEMALS JEMANDEM AUSSER DEM MySQL-ROOT-BENUTZER
ZUGRIFF AUF DIE user-TABELLE IN DER
mysql-DATENBANK! Das verschlüsselte
Passwort ist das echte Passwort in MySQL. Wenn Sie das in
der the user-Tabelle aufgeführte
Passwort für einen gegebenen Benutzer kennen, können Sie
sich leicht als dieser Benutzer einloggen, wenn Sie Zugriff
auf den Host haben, der für dieses Benutzerkonto
aufgeführt ist.
Lernen Sie das MySQL-Zugriffsberechtigungssystem. Die
GRANT- und
REVOKE-Befehle werden benutzt, um den
Zugriff auf MySQL zu steuern. Gewähren Sie nicht mehr
Zugriffsrechte als notwendig. Gewähren Sie niemals
Zugriffsrechte für alle Hosts.
Checkliste:
Probieren Sie mysql -u root. Wenn es
Ihnen gelingt, sich erfolgreich mit dem Server zu
verbinden, ohne nach einem Passwort gefragt zu werden,
haben Sie ein Problem, denn jeder kann sich als
MySQL-root-Benutzer mit dem Server
verbinden und hat volle Berechtigungen! Lesen Sie in
diesem Fall noch einmal die
MySQL-Installationsanweisungen durch und achten Sie
insbesondere auf den Teil, der sich mit dem Setzen des
root-Passworts beschäftigt.
Benutzen Sie den Befehl SHOW GRANTS
und prüfen Sie nach, wer Zugriff auf was hat. Entfernen
Sie die Berechtigungen, die nicht notwendig sind, indem
Sie den REVOKE-Befehl benutzen.
Halten Sie keine Klartext-Passwörter in Ihrer Datenbank.
Wenn Ihr Computer kompromittiert wird, kann der Einbrecher
die gesamte Liste von Passwörtern nehmen und benutzen.
Benutzen Sie statt dessen MD5() oder eine
andere Einweg-Hash-Funktion.
Benutzen Sie keine Passwörter aus Lexika. Es gibt spezielle Programme, um diese zu knacken. Selbst Passwörter wie ``xfish98'' sind sehr schlecht. Viel besser ist ``duag98'', was dasselbe Wort ``fish'' enthält, aber um eine Taste nach links auf einer QUERTZ-Tastatur verschoben. Eine weitere Methode ist, etwas wie ``Mhall'' zu benutzen, was die ersten Buchstaben des Satzes ``Mary had a little lamb'' enthält. Das läßt sich leicht merken und eintippen, aber schwierig durch jemanden erraten, der es nicht kennt.
Investieren Sie in eine Firewall. Diese schützt sie vor mindestens 50% aller Exploits in jeglicher Software. Installieren Sie MySQL hinter einer Firewall oder in einer entmilitarisierten Zone (Demilitarized Zone, DMZ).
Checkliste:
Versuchen Sie, Ihre Ports vom Internet aus zu scannen,
indem Sie ein Werkzeug wie nmap
benutzen. MySQL benutzt vorgabemäßig Port 3306. Dieser
Port sollte von nicht vertrauenswürdigen Hosts aus
unerreichbar sein. Eine weitere einfache Methode, um zu
überprüfen, ob Ihr MySQL-Port offen ist oder nicht,
ist, den folgenden Befehl von einer entfernten Maschine
aus zu benutzen, wobei server_host
der Hostname Ihres MySQL-Servers ist:
shell> telnet server_host 3306
Wenn Sie eine Verbindung und einige sinnlose Zeichen
erhalten, ist der Port offen und sollte auf Ihrer
Firewall oder Ihrem Router geschlossen werden, sofern
Sie nicht einen wirklich guten Grund haben, ihn offen zu
halten. Wenn telnet einfach hängt
oder die Verbindung abgelehnt wird, ist alles in
Ordnung, der Port ist blockiert.
Trauen Sie keinen Daten, die von Benutzern eingegeben
werden. Sie können versuchen, Ihren Code auszutricksen,
indem Sie spezielle oder escapete Zeichenfolgen in
Web-Formulare, URLs oder sonstige Applikationen, die Sie
hergestellt haben, eingeben. Stellen Sie sicher, dass Ihre
Applikation sicher bleibt, wenn ein Benutzer etwas wie
``; DROP DATABASE mysql;'' eingibt. Das
ist ein extremes Beispiel, aber große Sicherheitslücken
und Datenverlust können eintreten, wenn ein Hacker
ähnliche Techniken benutzt und Sie nicht darauf vorbereitet
sind.
Denken Sie auch daran, numerische Daten zu überprüfen. Ein
häufiger Fehler besteht darin, nur Zeichenketten zu
schützen. Manchmal denken Leute, dass eine Datenbank, die
nur öffentlich zugängliche Daten enthält, nicht
geschützt werden muss. Das stimmt nicht. Auf solche
Datenbanken können zumindest Dienstverweigerungsangriffe
(Denial-of-Service-Attacken) durchgeführt werden. Die
einfachste Art, sich vor dieser Art von Angriffen zu
schützen, ist, Apostrophe um numerische Konstanten herum zu
benutzen: SELECT * FROM tabelle WHERE
ID='234' statt SELECT * FROM tabelle
WHERE ID=234. MySQL wandelt diese Zeichenkette
automatisch in eine Zahl um und entfernt alle
nicht-numerischen Zeichen aus ihr.
Checkliste:
Alle Web-Applikationen:
Versuchen Sie, ‘'’
und ‘"’ in alle Ihr
Web-Formulare einzugeben. Wenn Sie irgend welche
MySQL-Fehler erhalten, untersuchen Sie das Problem
unverzüglich!
Versuchen Sie, jedwede dynamischen URLs zu ändern,
indem Sie %22
(‘"’),
%23
(‘#’) und
%27
(‘'’) zu den URLs
hinzufügen.
Versuchen Sie, Datentypen in dynamischen URLs von numerischen zu Zeichentypen zu ändern, die Zeichen aus den vorherigen Beispielen enthalten. Ihre Applikation sollte gegen solche und ähnliche Angriffe sicher sein.
Versuchen Sie Buchstaben, Leerzeichen und Sonderzeichen anstelle von Zahlen in numerische Felder einzugeben. Ihre Applikation sollte diese entfernen, bevor sie sie MySQL übergibt, und Ihre Applikation sollte einen Fehler erzeugen. Es ist sehr gefährlich, nicht geprüfte Werte an MySQL zu übergeben!
Überprüfen Sie Datengrößen, bevor Sie sie an MySQL übergeben.
Überlegen Sie, ob es sinnvoll ist, dass sich Ihre Applikation mit einem anderen Benutzernamen mit der Datenbank verbindet als mit dem, den Sie für Verwaltungszwecke benutzen. Geben Sie Applikationen nicht mehr Zugriffsberechtigungen als sie brauchen.
Benutzer von PHP:
Sehen Sie sich die
addslashes()-Funktion an. Ab PHP
4.0.3 ist eine
mysql_escape_string()-Funktion
verfügbar, die auf der Funktion mit demselben Namen
in der MySQL-C-API basiert.
Benutzer der MySQL-C-API:
Sehen Sie sich den
mysql_escape_string()-API-Aufruf
an.
Benutzer von MySQL++:
Sehen Sie sich die escape- und
quote-Modifier für Query-Streams
an.
Benutzer der Perl-DBI:
Sehen Sie sich die
quote()-Methode an oder benutzen
Sie Platzhalter.
Benutzer von Java-JDBC:
Benutzen Sie ein
PreparedStatement-Objekt und
Platzhalter.
Übermitteln Sie keine Klartextdaten (unverschlüsselte Daten) über das Internet. Diese Daten sind für jeden zugänglich, der Zeit und Möglichkeit hat, sie abzuhören und sie für die eigenen Zwecke zu benutzen. Benutzen Sie statt dessen ein verschlüsseltes Protokoll wie SSL oder SSH. MySQL unterstützt ab Version 4.0.0 interne SSL-Verbindungen. SSH-Port-Forwarding kann benutzt werden, um einen verschlüsselten (und komprimierten) Kommunikationstunnel zu erzeugen.
Lernen Sie die Benutzung der tcpdump- und
strings-Utilities. In den meisten Fällen
können Sie mit einem Befehl wie dem folgenden feststellen,
ob MySQL-Datenströme verschlüsselt sind oder nicht:
shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
(Das funktioniert unter Linux und sollte mit kleineren Änderungen auf anderen Systemen funktionieren.) Achtung: Wenn Sie keine Daten sehen, heißt das nicht immer, dass sie verschlüsselt sind. Wenn Sie hohe Sicherheit benötigen, sollten Sie sich mit einem Sicherheitsexperten in Verbindung setzen.
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:
Benutzen Sie Passwörter für alle MySQL-Benutzer. Bedenken
Sie, dass sich jeder beliebige als andere Person einloggen
kann, und zwar so einfach wie mysql -u
anderer_benutzer db_name, wenn
anderer_benutzer kein Passwort hat. Es
ist ein normales Verhalten bei Client-Server-Applikationen,
dass der Client einen beliebigen Benutzernamen angeben kann.
Sie können das Passwort für alle Benutzer ändern, indem
Sie das mysql_install_db-Skript
editieren, bevor Sie es laufen lassen, oder nur das Passwort
für den MySQL-root-Benutzer, wie folgt:
shell>mysql -u root mysqlmysql>UPDATE user SET Password=PASSWORD('neues_passwort')WHERE user='root'; mysql>FLUSH PRIVILEGES;
Lassen Sie den MySQL-Daemon nicht als
Unix-root-Benutzer laufen. Das ist sehr
gefährlich, denn jeder Benutzer mit
FILE-Berechtigung ist dann in der Lage,
Dateien als root zu erzeugen (zum
Beispiel ~root/.bashrc). Um das zu
verhindern, weigert sich mysqld, als
root zu laufen, es sei denn, das wird
direkt durch die --user=root-Option
angegeben.
mysqld kann unter einem gewöhnlichen
Benutzer ohne besondere Rechte laufen. Sie können auch
einen neuen Unix-Benutzer mysql anlegen,
um alles noch sicherer zu machen. Wenn Sie
mysqld als ein anderer Unix-Benutzer
laufen lassen, müssen Sie nicht den
root-Benutzernamen in der
user-Tabelle ändern, denn
MySQL-Benutzernamen haben nichts mit den Unix-Benutzernamen
zu tun. Um mysqld als anderer
Unix-Benutzer zu starten, fügen Sie eine
user-Zeile hinzu, die den Benutzernamen
zur [mysqld]-Gruppe der
/etc/my.cnf-Optionsdatei oder der
my.cnf-Optionsdatei im
Daten-Verzeichnis des Servers hinzufügt. Beispiel:
[mysqld] user=mysql
Das bewirkt, dass der Server als der festgelegte Benutzer
gestartet wird, egal ob Sie ihn manuell oder mit
safe_mysqld oder
mysql.server starten. Weitere Details
finden Sie unter Abschnitt 5.3.3, „Wann Berechtigungsänderungen wirksam werden“.
Unterstützen Sie keine Symlinks auf Tabellen (das kann mit
der --skip-symlink-Option abgeschaltet
werden). Das ist insbesondere wichtig, wenn Sie
mysqld als Root laufen lassen, weil
jeder, der Schreibzugriff auf das mysqld-Daten-Verzeichnis
hat, dann jede Datei im System zerstören könnte! See
Abschnitt 6.6.1.2, „Benutzung symbolischer Links für Tabellen“.
Überprüfen Sie, dass der Unix-Benutzer, der
mysqld laufen läßt, der einzige
Benutzer mit Lese-/Schreibzugriffen auf die
Datenbankverzeichnisse ist.
Geben Sie nicht allen Benutzern das
process-Zugriffsrecht. Die
Ausgabe von mysqladmin processlist zeigt
den Text der aktuell ausgeführten Anfragen, so dass jeder,
der diesen Befehl ausführen darf, in der Lage wäre, eine
Anfrage eines anderen Benutzers wie UPDATE user SET
password=PASSWORD('not_secure') einzusehen.
mysqld reserviert eine zusätzliche
Verbindung für Benutzer, die das
process-Zugriffsrecht
haben, so dass sich ein
MySQL-root-Benutzer einloggen und Dinge
überprüfen kann, selbst wenn alle normalen Verbindungen in
Benutzung sind.
Geben Sie nicht allen Benutzern das
file-Zugriffsrecht. Jeder
Benutzer, der dieses Zugriffsrecht hat, kann irgendwo im
Dateisystem Dateien mit den Rechten des the
mysqld-Daemons schreiben! Um das etwas
sicherer zu machen, sind alle Dateien, die mit
SELECT ... INTO OUTFILE erzeugt werden,
für jeden lesbar und können keine existierenden Dateien
überschreiben.
Das file-Zugriffsrecht kann
auch benutzt werden, um jede Datei zu lesen, auf die der
Unix-Benutzer Zugriff hat, als der der Server läuft. Das
könnte zum Beispiel durch Benutzung von LOAD
DATA missbraucht werden, um
/etc/passwd in eine Tabelle zu laden,
die anschließend mit SELECT gelesen
wird.
Wenn Sie Ihrem DNS nicht trauen, sollten Sie IP-Nummern anstelle von Hostnamen in den Berechtigungstabellen verwenden. In jedem Fall sollten Sie sehr vorsichtig damit sein, Einträge in Berechtigungstabellen vorzunehmen, die Hostnamen mit Platzhaltern (Wildcards) verwenden!
Wenn Sie die Anzahl der Verbindungen für einen einzelnen
Benutzer beschränken wollen, können Sie das tun, indem Sie
die max_user_Verbindungen-Variable in
mysqld setzen.
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.
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.
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:
Phase 1: Der Server überprüft, ob Sie das Recht haben, sich verbinden zu können.
Phase 2: Angenommen, Sie haben das Recht, sich zu verbinden, dann überprüft der Server jede Anfrage, die Sie absetzen, um festzustellen, ob Sie ausreichende Rechte haben, um diese auszuführen. Wenn Sie zum Beispiel Zeilen aus einer Tabellen in einer Datenbank auswählen oder eine Tabelle in einer Datenbank löschen, stellt der Server sicher, dass Sie die select-Berechtigung für die Tabelle bzw. die drop-Berechtigung für die Datenbank haben.
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 Abschnitt 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:
Das user-Tabellenbereichsfeld legt fest,
ob eingehende Verbindungen zugelassen oder abgewiesen
werden. Bei zugelassenen Verbindungen zeigen Berechtigungen,
die in der user-Tabelle vergeben sind,
die globalen (Superuser-) Rechte des Benutzers an. Diese
Berechtigungen treffen auf
alle Datenbanken auf dem
Server zu.
Die db- und
host-Tabellen werden zusammen benutzt:
Die Geltungsbereichsfelder der
db-Tabelle legen fest, welche
Benutzer auf welche Datenbanken von welchen Hosts aus
zugreifen können. Die Berechtigungsfelder legen fest,
welche Operationen zugelassen sind.
Die host-Tabelle wird als Erweiterung
der db-Tabelle benutzt, wenn Sie
wollen, dass ein gegebener
db-Tabelleneintrag auf verschiedene
Hosts zutrifft. Wenn Sie zum Beispiel wollen, dass ein
Benutzer eine Datenbank von mehreren Hosts in Ihrem
Netzwerk aus benutzen kann, lassen Sie den
Host-Wert in der
db-Tabelle des Benutzers leer, und
füllen dann die host-Tabelle mit
einem Eintrag für jeden dieser Hosts. Dieser
Mechanismus ist ausführlicher in
Abschnitt 5.2.9, „Zugriffskontrolle, Phase 2: Anfrageüberprüfung“ beschrieben.
Die tables_priv- und
columns_priv-Tabellen sind der
db-Tabelle ähnlich, aber feinkörniger:
Sie beziehen sich auf Tabellen- und Spaltenebenen und nicht
auf Datenbankebene.
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
Abschnitt 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 Abschnitt 5.2.10, „Gründe für Access denied-Fehler“.
Hinweise zu Sicherheitsthemen finden Sie unter see
Abschnitt 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.
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
Abschnitt 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 Abschnitt 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:
Die grant-Berechtigung erlaubt Benutzern, Ihre Berechtigungen an andere Benutzer zu übertragen. Zwei Benutzer mit unterschiedlichen Berechtigungen und mit der grant-Berechtigung sind in der Lage, Ihre Berechtigungen zu kombinieren.
Die alter-Berechtigung kann benutzt werden, um das Berechtigungssystem zu unterlaufen, indem Tabellen umbenannt werden.
Die file-Berechtigung kann
missbraucht werden, um jede öffentlich lesbare Datei auf
dem Server in eine Datenbanktabelle einzulesen, auf deren
Inhalte dann mit SELECT zugegriffen
werden kann. Das beinhaltet die Inhalte aller Datenbanken,
die vom Server gehostet werden!
Die shutdown-Berechtigung kann missbraucht werden, um andere Benutzer komplett vom Server auszuschließen, indem der Server beendet wird.
Die process-Berechtigung kann benutzt werden, um den Klartext von momentan ablaufenden Anfragen einzusehen, inklusive Anfragen, die Passwörter setzen oder ändern.
Zugriffsrechte auf die mysql-Datenbank
können benutzt werden, um Passwörter zu ändern und auf
sonstige Berechtigungsinformationen zuzugreifen.
(Passwörter werden verschlüsselt gespeichert, daher kann
ein böswilliger Benutzer sie nicht einfach lesen und
anschließend die Klartext-Passwörter kennen.) Wenn man auf
die mysql.user-Passwort-Spalte zugreifen
kann, kann man das nutzen, um sich als beliebiger Benutzer
am MySQL-Server anzumelden. (Mit ausreichenden Rechten kann
derselbe Benutzer dann Passwörter durch eigene ersetzen.)
Es gibt einige Dinge, die Sie mit dem MySQL-Berechtigungssystem nicht tun können:
Sie können nicht ausdrücklich festlegen, dass ein bestimmter Benutzer keinen Zugriff haben soll. Das heißt, Sie können nicht explizit mit einem bestimmten Benutzer vergleichen und dann die Verbindung ablehnen.
Sie können nicht festlegen, dass ein Benutzer das Recht hat, Tabellen in einer Datenbank zu erzeugen oder zu löschen, aber nicht die Datenbank selbst zu erzeugen oder zu löschen.
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
Abschnitt 5.1.2, „my.cnf-Optionsdateien“.
mysql benutzt Vorgabewerte für
Verbindungsparameter, die auf der Kommandozeile nicht angegeben
sind:
Der vorgabemäßige Hostname ist
localhost.
Der vorgabemäßige Benutzername ist Ihr Unix-Loginname.
Es wird kein Passwort übergeben, wenn -p
fehlt.
Für einen Unix-Benutzer joe sind daher
folgende Befehle gleichbedeutend:
shell>mysql -h localhost -u joeshell>mysql -h localhostshell>mysql -u joeshell>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:
Sie können Verbindungsparameter im
[client]-Abschnitt der
.my.cnf-Konfigurationsdatei in Ihrem
Heimatverzeichnis festlegen. Der relevante Abschnitt der
Datei sieht etwa wie folgt aus:
[client] host=hostname user=benutzername password=ihr_passwort
Sie können Verbindungsparameter festlegen, indem Sie
Umgebungsvariablen benutzen. Der Host kann für
mysql festgelegt werden, indem
MYSQL_HOST benutzt wird. Der
MySQL-Benutzername kann mit USER
festgelegt werden (nur für Windows). Das Passwort kann mit
MYSQL_PWD festgelegt werden (aber das ist
unsicher, siehe nächster Abschnitt). See
Anhang E, Umgebungsvariablen.
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:
Dem Host, von dem Sie sich verbinden
Ihrem MySQL-Benutzernamen
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:
Ein Host-Wert kann ein Hostname oder eine
IP-Nummer sein, oder 'localhost', was die
lokale Maschine angibt.
Sie können die Platzhalterzeichen
‘%’ und
‘_’ im
Host-Feld benutzen.
Ein Host-Wert '%'
stimmt mit jedem Hostnamen überein.
Ein leerer Host-Wert bedeutet, dass die
Berechtigung zusammen mit dem Eintrag in der
host-Tabelle gilt, der mit dem
angegebenen Hostnamen übereinstimmt. Weitere Informationen
hierzu finden Sie im nächsten Kapitel.
Ab MySQL-Version 3.23 können Host-Werte
als IP-Nummern festgelegt werden, und Sie können eine
Netmask festlegen, die angibt, wie viele Adress-Bits für
die Netzwerknummer benutzt werden. Beispiel:
GRANT ALL PRIVILEGES on db.* to david@'192.58.197.0/255.255.255.0';
Das erlaubt jedem, sich von einer IP zu verbinden, bei der folgendes gilt:
benutzer_ip & netmask = host_ip.
Im obigen Beispiel können sich alle IP's im Intervall zwischen 192.58.197.0 bis 192.58.197.255 mit dem MySQL-Server verbinden.
Platzhalterzeichen sind im User-Feld
nicht erlaubt. Sie können aber einen leeren Wert angeben,
der mit jedem Namen übereinstimmt. Wenn der Eintrag in der
user-Tabelle, der mit einer
hereinkommenden Verbindung übereinstimmt, einen leeren
Benutzernamen hat, wird angenommen, dass der Benutzer der
anonyme Benutzer ist (der Benutzer ohne Namen), und nicht
der Name, den der Client tatsächlich angegeben hat. Das
bedeutet, dass ein leerer Benutzername für alle weiteren
Zugriffsüberprüfungen während der laufenden Verbindung
benutzt wird (also während Phase 2).
Das Password-Feld kann leer sein. Das
bedeutet nicht, dass jedes Passwort übereinstimmt, sondern
dass der Benutzer sich ohne Angabe eines Passworts verbinden
muss.
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.
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
Abschnitt 5.3.1, „GRANT- und REVOKE-Syntax“. (Hilfreich sind die Ausführungen unter
Abschnitt 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 Platzhalterzeichen ‘%’
und ‘_’ können in den
Host- und Db-Feldern
jeder Tabelle benutzt werden.
Ein '%'-Host-Wert in
der db-Tabelle bedeutet ``jeder Host.''
Ein leerer Host-Wert in der
db-Tabelle bedeutet ``sieh in der
host-Tabelle wegen weiterer Informationen
nach''.
Ein '%'- oder leerer
Host-Wert in der
host-Tabelle bedeutet ``jeder Host''.
Ein '%'- oder leerer
Db-Wert in einer der Tabellen bedeutet
``jede Datenbank''.
Ein leerer User-Wert in einer der
Tabellen entspricht dem anonymen Benutzer.
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 Platzhalterzeichen ‘%’
und ‘_’ können im
Host-Feld beider Tabellen benutzt werden.
Ein '%'- oder leerer
Host-Wert in jeder der beiden Tabellen
bedeutet ``jeder Host.''
Die Db-, Table_name-
und Column_name-Felder dürfen in beiden
Tabellen keine Platzhalter enthalten oder leer sein.
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:
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.
Wenn es keinen übereinstimmenden
db-Tabelleneintrag gibt und das
Host-Feld nicht leer ist, bestimmt dieser
Eintrag die Datenbank-spezifischen Berechtigungen des
Benutzers.
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.
Wenn Sie beim Verbindungsversuch zu einem MySQL-Server
Access denied-Fehler bekommen, gibt Ihnen die
folgende Liste ein paar Hinweise, das Problem zu beheben:
Haben Sie nach der Installation von MySQL das
mysql_install_db-Skript laufen lassen, um
die anfänglichen Berechtigungstabelleninhalte zu
konfigurieren? Wenn nicht, tun Sie das! See
Abschnitt 5.3.4, „Einrichtung der anfänglichen MySQL-Berechtigungen“. Testen Sie die
anfänglichen Berechtigungen, indem Sie folgenden Befehl
ausführen:
shell> mysql -u root test
Der Server sollte die Verbindung ohne Fehlermeldung
zulassen. Stellen Sie auch sicher, dass Sie eine Datei
user.MYD im MySQL-Datenbankverzeichnis
haben. Üblicherweise ist das
PFAD/var/mysql/user.MYD, wobei
PFAD der Pfadname zum
MySQL-Installationsverzeichnis ist.
Nach einer gerade durchgeführten Installation sollten Sie sich mit dem Server verbinden und Ihre Benutzer und deren Zugriffsberechtigungen einrichten:
shell> mysql -u root mysql
Der Server sollte die Verbindung zulassen, weil der
MySQL-root-Benutzer anfänglich kein
Passwort hat. Das ist ein Sicherheitsrisiko, daher sollten
Sie das root-Passwort einrichten,
während Sie Ihre anderen MySQL-Benutzer einrichten.
Wenn Sie versuchen, sich als root zu
verbinden, und folgenden Fehler erhalten:
Access denied for user: '@unknown' to database mysql
heißt das, dass Sie in der user-Tabelle
keinen Eintrag 'root' im
User-Spaltenwert haben und dass
mysqld den Hostnamen für Ihren Client
nicht auflösen kann. In diesem Fall müssen Sie den Server
mit der --skip-grant-tables-Option neu
starten und Ihrer /etc/hosts- oder
\windows\hosts-Datei einen Eintrag für
Ihren Host hinzufügen.
Wenn Sie einen Fehler wie folgt erhalten:
shell> mysqladmin -u root -pxxxx ver
Access denied for user: 'root@localhost' (Using password: YES)
bedeutet das, dass Sie ein falsches Passwort benutzen. See Abschnitt 5.3.7, „Passwörter einrichten“.
Wenn Sie das Root-Passwort vergessen haben, können Sie
mysqld mit
--skip-grant-tables neu starten, um das
Passwort zu ändern. Diese Option wird weiter hinten im
Handbuch ausführlicher beschrieben.
Wenn Sie den obigen Fehler erhalten, obwohl Sie kein
Passwort angegeben haben, bedeutet das, dass in einer der
my.ini-Dateien ein falsches Passwort
steht. See Abschnitt 5.1.2, „my.cnf-Optionsdateien“. Sie können die
Benutzung der Optionsdateien mit der
--no-defaults-Option wie folgt verhindern:
shell> mysqladmin --no-defaults -u root ver
Wenn Sie eine bestehende MySQL-Installation von einer
Version vor 3.22.11 auf Version 3.22.11 oder später
aktualisiert haben, haben Sie das
mysql_fix_privilege_tables-Skript
ausgeführt? Falls nicht, tun Sie das! Die Struktur der
Berechtigungstabellen hat sich ab MySQL-Version 3.22.11
geändert, als das GRANT-Statement mit
Funktion erfüllt wurde.
Falls es aussieht, als hätten sich Ihre Berechtigungen mitten in einer Sitzung geändert, kann es sein, dass ein Superuser sie geändert hat. Das Neuladen der Berechtigungstabellen betrifft neue Client-Verbindungen, aber auch bestehende Verbindungen, wie in Abschnitt 5.3.3, „Wann Berechtigungsänderungen wirksam werden“ beschrieben.
Wenn Sie es nicht schaffen, dass Ihr Passwort funktioniert,
denken Sie daran, dass Sie die
PASSWORD()-Funktion benutzen müssen,
wenn Sie das Passwort mit den INSERT-,
UPDATE- oder SET
PASSWORD-Statements setzen. Die
PASSWORD()-Funktion wird nicht benötigt,
wenn Sie das Passwort mit dem GRANT ... INDENTIFIED
BY-Statement oder dem mysqladmin
password-Befehl setzen. See
Abschnitt 5.3.7, „Passwörter einrichten“.
localhost ist ein Synonym für Ihren
lokalen Hostnamen und gleichzeitig der vorgabemäßige Host,
mit dem sich Clients versuchen zu verbinden, wenn Sie nicht
explizit einen Hostnamen angeben. Verbindungen zu
localhost funktionieren jedoch nicht,
wenn Sie auf einem System arbeiten, das MIT-pThreads benutzt
(localhost-Verbindungen werden über
Unix-Sockets hergestellt, die von MIT-pThreads nicht
unterstützt werden). Um auf solchen Systemen Probleme zu
vermeiden, sollten Sie die --host-Option zu
benutzen, um den Serverhost explizit anzugeben. Das stellt
eine TCP/IP-Verbindung zum mysqld-Server
her. In diesem Fall muss Ihr echter Hostname in den
user-Tabelleneinträgen auf dem
Server-Host stehen. (Das gilt sogar dann, wenn Sie ein
Client-Programm auf demselben Host fahren, wo der Server
läuft.)
Wenn Sie beim Versuch, sich mit mysql -u user_name
db_name mit einer Datenbank zu verbinden, einen
Access denied-Fehler erhalten, gibt es
eventuell ein Problem mit der
user-Tabelle. Das können Sie
überprüfen, indem Sie mysql -u root
mysql und folgendes SQL-Statement absetzen:
mysql> SELECT * FROM user;
Das Ergebnis sollte einen Eintrag enthalten, in dem die
Host- und User-Spalten
mit dem Hostnamen Ihres Computers und Ihrem
MySQL-Benutzernamen übereinstimmen.
Die Access denied-Fehlermeldung sagt
Ihnen, als wer Sie sich versuchen einzuloggen, den Host, von
dem aus Sie versuchen, sich zu verbinden, und ob Sie ein
Passwort benutzen oder nicht. Normalerweise sollten Sie in
der user-Tabelle einen Eintrag haben, der
exakt mit Ihrem Hostnamen und Ihrem Benutzernamen
übereinstimmt, die in der Fehlermeldung ausgegeben wurden.
Wenn Sie zum Beispiel eine Fehlermeldung erhalten, die
Using password: NO enthält, bedeutet
das, dass Sie versuchen sich einzuloggen, ohne ein Passwort
anzugeben.
Wenn Sie folgenden Fehler erhalten, wenn Sie sich von einem
anderen Host als dem, auf dem der MySQL-Server läuft, zu
verbinden, gibt es keine Zeile in der
user-Tabelle, die mit Ihrem Host
übereinstimmt:
Host ... is not allowed to connect to this MySQL server
Das können Sie mit dem Kommandozeilentool
mysql beheben (auf dem Serverhost!) und
eine Zeile zur user-,
db- oder host-Tabelle
hinzufügen, die eine Benutzername-/Hostname-Kombination
enthält, von wo aus Sie sich verbinden wollen; danach
führen Sie mysqladmin flush-privileges
aus. Wenn Sie nicht MySQL-Version 3.22 laufen lassen und die
IP-Nummer oder den Hostnamen der Maschine nicht kennen, von
der aus Sie sich verbinden, sollten Sie einen Eintrag mit
'%' als
Host-Spaltenwert in die
user-Tabelle einfügen und
mysqld mit der
--log-Option auf der Servermaschine neu
starten. Nach dem Verbinden von der Client-Maschine aus
zeigt die Information im MySQL-Log an, wie Sie sich wirklich
verbunden haben. (Ersetzen Sie danach '%'
im user-Tabelleneintrag durch den
tatsächlichen Hostnamen, der im Log steht. Ansonsten
erhalten Sie ein System, das unsicher ist.)
Ein weiterer Grund für diesen Fehler unter Linux kann sein, dass Sie eine Binärversion von MySQL benutzen, die mit einer anderen glibc-Version kompiliert wurde als die, die Sie benutzen. In diesem Fall sollten Sie entweder die glibc Ihres Betriebssystems aktualisieren oder die Quellversion von MySQL herunter laden und sie selbst kompilieren. Ein Quell-RPM läßt sich normalerweise sehr einfach kompilieren und installieren, daher stellt dies kein großes Problem dar.
Wenn Sie eine Fehlermeldung erhalten, in der der Hostname nicht angezeigt wird oder eine IP-Nummer ist, obwohl Sie sich mit einem Hostnamen versuchen zu verbinden:
shell> mysqladmin -u root -pxxxx -h ein-hostname ver
Access denied für user: 'root@' (Using password: YES)
bedeutet das, dass MySQL einen Fehler beim Auflösen der IP
zu einem Hostnamen erhielt. In diesem Fall können Sie
mysqladmin flush-hosts ausführen, um den
internen DNS-Cache zu flushen. See Abschnitt 6.5.5, „Wie MySQL DNS benutzt“.
Einige dauerhafte Lösungen sind:
Versuchen Sie herauszufinden, was mit Ihrem DNS-Server nicht funktioniert, und beheben Sie das Problem.
Geben Sie in den MySQL-Berechtigungstabellen IP-Nummern statt Hostnamen an.
Starten Sie mysqld mit
--skip-name-resolve.
Starten Sie mysqld mit
--skip-host-cache.
Verbinden Sie sich zu localhost wenn
Sie Server und Client auf derselben Maschine laufen
lassen.
Tragen Sie die Client-Maschinennamen in
/etc/hosts ein.
Wenn mysql -u root test funktioniert,
aber mysql -h your_hostname -u root test
zu Access denied führt, haben Sie
eventuell nicht den korrekten Namen Ihres Hosts in der
user-Tabelle. Ein häufiges Problem
hierbei ist, dass der Host-Wert im
user-Tabelleneintrag einen
unqualifizierten Hostnamen festlegt, die
Namensauflösungsroutinen Ihres Systems aber einen voll
qualifizierten Domänennamen zurückgeben (oder umgekehrt).
Wenn Sie zum Beispiel einen Eintrag mit dem Host
'tcx' in der
user-Tabelle haben, Ihr DNS MySQL aber
mitteilt, dass Ihr Hostname
'tcx.subnet.se' ist, funktioniert der
Eintrag nicht. Fügen Sie der
user-Tabelle einen Eintrag hinzu, der die
IP-Nummer Ihres Hosts als
Host-Spaltenwert enthält. (Alternativ
könnten Sie der user-Tabelle einen
Eintrag mit einem Host-Wert hinzufügen,
der einen Platzhalter enthält, zum Beispiel
'tcx.%'. Allerdings ist die Benutzung von
Hostnamensendungen mit ‘%’
unsicher und wird daher
nicht empfohlen!)
Wenn mysql -u benutzername test
funktioniert, aber mysql -u benutzername
andere_datenbank nicht, haben Sie wahrscheinlich
keinen Eintrag für andere_datenbank in
der db-Tabelle.
Wenn mysql -u benutzername datenbankname
funktioniert, wenn es auf der Servermaschine ausgeführt
wird, aber mysql -u hostname -u benutzername
datenbankname nicht, wenn es auf einer anderen
Clientmaschine ausgeführt wird, ist die Clientmaschine
wahrscheinlich nicht in der user-Tabelle
oder der db-Tabelle aufgeführt.
Wenn Sie gar nicht herausfinden können, warum Sie
Access denied erhalten, entfernen Sie aus
der user-Tabelle alle Einträge, die
Host-Werte haben, die Platzhalter
enthalten (Einträge, die ‘%’
oder ‘_’ enthalten). Ein sehr
häufiger Fehler besteht darin, einen neuen Eintrag mit
Host='%' und
User='irgendein_benutzer'
in der Annahme hinzuzufügen, dass einem das erlaubt,
localhost anzugeben, um sich von
derselben Maschine aus zu verbinden. Der Grund, warum das
nicht funktioniert, ist, dass die vorgabemäßigen
Berechtigungen einen Eintrag mit
Host='localhost' und
User='' enthalten.
Weil dieser Eintrag einen Host-Wert
'localhost' hat, der spezifischer ist als
'%', wird er vorrangig vor dem neuen
Eintrag benutzt, wenn man sich von
localhost verbindet! Das korrekte
Vorgehen ist, einen zweiten Eintrag mit
Host='localhost' und
User='irgendein_benutzer'
hinzuzufügen, oder den Eintrag mit
Host='localhost' und
User='' zu entfernen.
Wenn Sie den folgenden Fehler erhalten, gibt es eventuell
Probleme mit der db- oder der
host-Tabelle:
Access to database denied
Wenn der aus der db-Tabelle ausgewählte
Eintrag einen leeren Wert in der
Host-Spalte hat, stellen Sie sicher, dass
es einen oder mehrere korrespondierende Einträge in der
host-Tabelle gibt, die festlegen, auf
welche Hosts der db-Tabelleneintrag
zutrifft.
Wenn Sie bei der Benutzung der SQL-Befehle SELECT
... INTO OUTFILE oder LOAD DATA
INFILE einen Fehler erhalten, enthält Ihr Eintrag
in der user-Tabelle wahrscheinlich keine
angeschaltete
file-Berechtigung.
Denken Sie daran, dass Client-Programme Verbindungsparameter
benutzen, die in Konfigurationsdateien oder
Umgebungsvariablen festgelegt sind. See
Anhang E, Umgebungsvariablen. Wenn ein Client
anscheinend falsche vorgabemäßige Verbindungsparameter
sendet, wenn Sie diese nicht auf der Kommandozeile angeben,
überprüfen Sie Ihre Umgebung und die
.my.cnf-Datei in Ihrem
Heimatverzeichnis. Überprüfen Sie gegebenenfalls auch
systemweite MySQL-Konfigurationsdateien, obwohl es sehr viel
unwahrscheinlicher ist, dass Client-Verbindungsparameter in
diesen festgelegt werden. See
Abschnitt 5.1.2, „my.cnf-Optionsdateien“. Wenn Sie beim Laufenlassen
eines Clients ohne irgend welche Optionen Access
denied erhalten, stellen Sie sicher, dass Sie kein
altes Passwort in irgendeiner Optionsdatei angegeben haben!
See Abschnitt 5.1.2, „my.cnf-Optionsdateien“.
Wenn Sie in den Berechtigungstabellen direkte Änderungen
vornehmen (indem Sie ein INSERT- oder
UPDATE-Statement benutzen) und Ihre
Änderungen anscheinend ignoriert werden, denken Sie daran,
dass sie ein FLUSH PRIVILEGES-Statement
absetzen müssen oder einen mysqladmin
flush-privileges-Befehl ausführen, um den Server
zu veranlassen, die Berechtigungstabellen neu einzulesen.
Ansonsten haben Ihre Änderungen keine Auswirkung, bis der
Server das nächste Mal gestartet wird. Denken Sie auch
daran, wenn Sie ein root-Passwort mit
einem UPDATE-Befehl festgelegt haben,
dass Sie dieses solange nicht angeben müssen, bis Sie die
Berechtigungen flushen, weil der Server vorher nicht weiß,
dass Sie Ihr Passwort geändert haben!
Wenn Sie Zugriffsprobleme mit einem Perl-, PHP-, Python-
oder ODBC-Programm haben, versuchen Sie, sich mit
mysql -u benutzername datenbankname oder
mysql -u benutzername -pihr_passwort
datenbankname zu verbinden. Wenn es Ihnen gelingt,
sich mittels des mysql-Clients zu
verbinden, gibt es ein Problem mit Ihrem Programm und nicht
mit den Zugriffsberechtigungen. (Beachten Sie, dass zwischen
-p und dem Passwort kein Leerzeichen
steht; alternativ können Sie auch die
--password=ihr_passwort-Syntax benutzen, um
Ihr Passwort anzugeben. Wenn Sie die
-p-Option allein benutzen, wird MySQL
eine Eingabeaufforderung für das Passwort anzeigen.)
Zum Testen starten Sie den mysqld-Daemon
mit der --skip-grant-tables-Option.
Anschließend können Sie die MySQL-Berechtigungstabellen
ändern und das mysqlaccess-Skript
benutzen, um zu sehen, ob Ihre Änderungen den gewünschten
Effekt haben oder nicht. Wenn Sie mit Ihren Änderungen
zufrieden sind, führen Sie mysqladmin
flush-privileges aus, um mysqld
mitzuteilen, die neuen Berechtigungstabellen zu benutzen.
Beachten Sie: Das Neuladen
der Berechtigungstabellen überschreibt die
--skip-grant-tables-Option. Das erlaubt
Ihnen, den Server zu veranlassen, die Berechtigungstabellen
wieder zu benutzen, ohne ihn herunter und dann wieder herauf
fahren zu müssen.
Wenn alles andere fehlschlägt, starten Sie den
mysqld-Daemon mit einer Debugging-Option
(zum Beispiel --debug=d,general,query). Das
gibt Host- und Benutzerinformationen über
Verbindungsversuche aus sowie Informationen über jeden
abgesetzten Befehl. See
Abschnitt D.1.2, „Trace-Dateien erzeugen“.
Wenn Sie irgend welche anderen Probleme mit den
MySQL-Berechtigungstabellen haben und meinen, das Problem
der Mailing-Liste mitteilen zu müssen, stellen Sie immer
einen Auszug Ihrer MySQL-Berechtigungstabellen zur
Verfügung. Sie können einen Auszug der Tabellen mit dem
mysqldump mysql-Befehl erzeugen.
Berichten Sie Ihr Problem - wie immer - unter Benutzung des
mysqlbug-Skripts. See
Abschnitt 2.6.2.3, „Wie man Bugs oder Probleme berichtet“. In einigen Fällen müssen
Sie vielleicht mysqld mit
--skip-grant-tables neu starten, um
mysqldump benutzen zu können.
GRANT- und REVOKE-SyntaxGRANT 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 Abschnitt 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 Abschnitt 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
Abschnitt 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
Abschnitt 5.3.3, „Wann Berechtigungsänderungen wirksam werden“.
Die größten Unterschiede zwischen ANSI SQL und MySQL-Versionen
von GRANT sind:
In MySQL werden Berechtigungen für eine Benutzername-/Hostname-Kombination vergeben und nicht nur für einen Benutzernamen.
ANSI SQL hat keine globalen oder
Datenbankebene-Berechtigungen und unterstützt nicht alle
Berechtigungsarten, die MySQL unterstützt. MySQL
unterstützt nicht die ANSI-SQL-TRIGGER-,
EXECUTE- oder
UNDER-Berechtigungen.
ANSI-SQL-Berechtigungen werden auf hierarchische Art strukturiert. Wenn Sie einen Benutzer entfernen, werden alle Berechtigungen, die dieser Benutzer gewährt hat, widerrufen. In MySQL werden die gewährten Berechtigungen nicht automatisch widerrufen, sondern Sie müssen das selbst tun.
Wenn Sie in MySQL das INSERT-Recht nur
für Teile der Spalten einer Tabelle haben, können Sie
dennoch INSERT-Statements auf der Tabelle
ausführen. Die Spalten, für die Sie keine
INSERT-Berechtigung haben, werden auf
ihre Vorgabewerte gesetzt. ANSI SQL erfordert, dass Sie die
INSERT-Berechtigung auf alle Spalten
haben.
Wenn Sie eine Tabelle in ANSI SQL löschen, werden alle
Berechtigungen für die Tabelle widerrufen. Wenn Sie eine
Berechtigung in ANSI SQL widerrufen, werden alle
Berechtigungen, die auf dieser Berechtigung basierend
gewährt wurden, widerrufen. In MySQL können Berechtigungen
nur explizit mit REVOKE-Befehlen oder
durch die Manipulation der MySQL-Berechtigungstabellen
widerrufen werden.
----------- 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:
Ohne jegliche SSL-/X509-Optionen werden alle Arten verschlüsselter und unverschlüsselter Verbindungen zugelassen, wenn Benutzername und Passwort gültig sind.
Die REQUIRE SSL-Option erzwingt
SSL-verschlüsselte Verbindungen. Beachten Sie, dass dieses
Erfordernis übergangen werden kann, wenn es irgend welche
weiteren ACL-Datensätze gibt, die Verbindungen ohne SSL
zulassen.
Beispiel:
GRANT ALL PRIVILEGES ON test.* TO root@localhost IDENTIFIED BY "goodsecret" REQUIRE SSL
* REQUIRE X509 Wenn ein X509-Zertifikat
erforderlich ist, bedeutet das, dass der Client ein
gültiges Zertifikat haben muss, aber wir kümmern uns nicht
um das genaue Zertifikat, den Herausgeber (Issuer) oder den
Betreff (Subject). Die einzige Einschränkung ist, dass es
möglich sein sollte, seine Unterschrift (Signature) mit
einigen unserer CA-Zertifikate zu überprüfen.
Beispiel:
GRANT ALL PRIVILEGES ON test.* TO root@localhost IDENTIFIED BY "goodsecret" REQUIRE X509
REQUIRE ISSUER issuer macht Verbindungen
restriktiver: Jetzt muss der Client ein gültiges
X509-Zertifikat vorlegen, das von einem CA-Issuer
herausgegeben wurde. Die Benutzung von X509-Zertifikaten
impliziert immer Verschlüsselung, daher wird die Option
"SSL" nicht mehr benötigt.
Beispiel:
GRANT ALL PRIVILEGES ON test.* TO root@localhost IDENTIFIED BY "goodsecret" REQUIRE ISSUER "C=FI, ST=Some-State, L=Helsinki, O=MySQL Finnland AB, CN=Tonu Samuel/Email=tonu@mysql.com"
REQUIRE SUBJECT betreff erfordert, dass
der Client ein gültiges X509-Zertifikat mit dem Betreff
"betreff" darauf hat. Wenn der Client ein gültiges
Zertifikat hat, was aber einen anderen Betreff besitzt, wird
die Verbindung nicht zugelassen.
Beispiel:
GRANT ALL PRIVILEGES ON test.* TO root@localhost IDENTIFIED BY "goodsecret" REQUIRE SUBJECT "C=EE, ST=Some-State, L=Tallinn, O=MySQL demo client certificate, CN=Tonu Samuel/Email=tonu@mysql.com"
REQUIRE CIPHER cipher wird benötigt um
sicherzustellen, dass Chiffrierungen und Schlüssellängen
benutzt werden, die stark genug sind. SSL selbst kann
schwach sein, wenn alte Algorithmen mit kurzen
Verschlüsselungsschlüsseln benutzt werden. Wenn diese
Option benutzt wird, können wir exakte Chiffrierungen
anfordern, bevor die Verbindung erlaubt wird.
Beispiel:
GRANT ALL PRIVILEGES ON test.* TO root@localhost IDENTIFIED BY "goodsecret" REQUIRE CIPHER "EDH-RSA-DES-CBC3-SHA"
Es ist erlaubt, die Optionen in Kombination wie folgt zu benutzen:
GRANT ALL PRIVILEGES ON test.* TO root@localhost IDENTIFIED BY "goodsecret" REQUIRE SUBJECT "C=EE, ST=Some-State, L=Tallinn, O=MySQL demo client certificate, CN=Tonu Samuel/Email=tonu@mysql.com" AND ISSUER "C=FI, ST=Some-State, L=Helsinki, O=MySQL Finnland AB, CN=Tonu Samuel/Email=tonu@mysql.com" AND CIPHER "EDH-RSA-DES-CBC3-SHA"
Es ist aber nicht erlaubt, irgend eine der Optionen doppelt zu benutzen. Nur unterschiedliche Optionen dürfen gemischt werden.
-----------
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:
Benutzernamen, wie sie von MySQL für
Authentifizierungszwecke benutzt werden, haben nicht zu tun
mit Unix-Benutzernamen (Login-Namen) oder
Windows-Benutzernamen. Die meisten MySQL-Clients versuchen
sich zwar vorgabemäßig einzuloggen, indem sie den
aktuellen Unix-Benutzernamen als den MySQL-Benutzernamen
verwenden, aber das geschieht nur aus Gründen der
Bequemlichkeit. Client-Programme lassen zu, dass ein anderer
Name mit den -u- oder
--user-Optionen angegeben wird. Das
bedeutet, dass Sie eine Datenbank nicht auf irgend eine
Weise sicher machen können, wenn nicht alle
MySQL-Benutzernamen Passwörter haben. Jeder kann versuchen,
sich mit dem Server zu verbinden, indem er irgend einen
Namen angibt, und wird damit Erfolg haben, wenn er einen
Namen angibt, der kein Passwort hat.
MySQL-Benutzernamen können bis zu 16 Zeichen lang sein; Unix-Benutzernamen sind typischerweise auf 8 Zeichen begrenzt.
MySQL-Passwörter haben nichts mit Unix-Passwörtern zu tun. Es gibt keine notwendige Verbindungen zwischen dem Passwort, das Sie benutzen, um sich an einer Unix-Maschine anzumelden, und dem Passwort, das Sie benutzen, um auf eine Datenbank auf dieser Maschine zuzugreifen.
MySQL verschlüsselt Passwörter mit einem anderen
Algorithmus als dem, der während des Unix-Login-Prozesses
benutzt wird, siehe die Beschreibungen der
PASSWORD()- und
ENCRYPT()-Funktionen in
Abschnitt 7.3.5.2, „Verschiedene Funktionen“. Beachten Sie,
dass trotz der Tatsache, dass das Passwort 'zerhackt'
gespeichert wird, es ausreicht, Ihr 'zerhacktes' Passwort zu
kennen, um sich am MySQL-Server anmelden zu können!
MySQL-Benutzer und ihre Berechtigungen werden normalerweise mit
dem GRANT-Befehl erzeugt. See
Abschnitt 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
Abschnitt 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.
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:
Tabellen- und Spalten-Berechtigungsänderungen werden bei der nächsten Anfrage des Clients wirksam.
Datenbank-Berechtigungsänderungen werden beim nächsten
USE datenbank-Befehl wirksam.
Globale Berechtigungsänderungen und Passwortänderungen werden beim nächsten Mal wirksam, wenn sich der Client verbindet.
Nach der Installation von MySQL konfigurieren Sie die
anfänglichen Zugriffsberechtigungen, indem Sie
scripts/mysql_install_db laufen lassen. See
Abschnitt 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:
Der MySQL-root-Benutzer wird als
Superuser angelegt, der alles tun darf. Verbindungen müssen
vom lokalen Host aus gemacht werden.
HINWEIS: Das anfängliche
root-Passwort ist leer, daher kann sich
jeder als root ohne
Passwort verbinden und hat alle Berechtigungen.
Ein anonymer Benutzer wird erzeugt, der mit Datenbanken, die
den Namen 'test' haben oder mit
'test_' anfangen, alles tun darf.
Verbindungen müssen vom lokalen Host aus gemacht werden.
Das heißt, dass sich jeder lokale Benutzer ohne Passwort
verbinden kann und als anonymer Benutzer behandelt wird.
Andere Berechtigungen werden verweigert. Beispielsweise
können normale Benutzer nicht mysqladmin
shutdown oder mysqladmin
processlist benutzen.
HINWEIS: Die vorgabemäßigen Berechtigungen sind unter Windows anders. See Abschnitt 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 mysqlmysql>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 mysqlmysql>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.
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
Abschnitt 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.
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 mysqlmysql>GRANT ALL PRIVILEGES ON *.* TO monty@localhostIDENTIFIED 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 mysqlmysql>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 mysqlmysql>GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROPON bankkonto.* TO custom@localhost IDENTIFIED BY 'dumm'; mysql>GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROPON spesen.* TO custom@whitehouse.gov IDENTIFIED BY 'dumm'; mysql>GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROPON 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 mysqlmysql>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;
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:
Number of all queries per hour: All commands that could be run by a user.
Number of all updates per hour: Any command that changes any table or database.
Number of connections made per hour: New connections opened per hour.
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.
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
Abschnitt 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 mysqlmysql>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 Abschnitt 5.3.2, „MySQL-Benutzernamen und -Passwörter“.
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:
Geben Sie einem normalen Benutzer nie Zugriff auf die
mysql.user-Tabelle. Wenn jemand das
verschlüsselte Passwort für einen Benutzer kennt,
ermöglicht ihm das, sich als dieser Benutzer einzuloggen.
Die Passwörter sind nur 'zerhackt', so dass niemand das
echte Passwort sehen können sollte, das Sie benutzen (falls
Sie ein ähnliches Passwort für Ihre anderen Applikationen
benutzen sollten).
Sie können auf der Kommandozeile die
-pyour_pass- oder
--password=your_pass-Option benutzen. Das
ist bequem, aber unsicher, weil Ihr Passwort für
Systemzustandsprogramme (wie ps) sichtbar
wird, die möglicherweise von anderen Benutzer aufgerufen
werden, um Kommandozeilen anzuzeigen. (MySQL-Clients
überschreiben typischerweise die Kommandozeilenargumente
während der Initialisierungssequenz mit Nullen, dennoch
gibt es einen kurzen Zeitraum, während dessen der Wert
sichtbar ist.)
Sie können eine -p- oder
--password-Option (ohne
ihr_passwort-Wert) benutzen. In diesem
Fall erbittet das Client-Programm das Passwort vom Terminal:
shell> mysql -u benutzername -p
Enter password: ********
Die ‘*’-Zeichen stehen für
Ihr Passwort.
Es ist sicherer, Ihr Passwort auf diese Art einzugeben statt auf der Kommandozeile, weil es für andere Benutzer nicht sichtbar wird. Diese Methode ist jedoch nur für Programme geeignet, die interaktiv laufen. Wenn Sie einen Client von einem Skript aus aufrufen wollen, das nicht interaktiv läuft, gibt es keine Möglichkeit, das Passwort vom Terminal aus einzugeben. Auf solchen Systemen kann es sogar vorkommen, dass die erste Zeile Ihres Skripts gelesen und (fälschlicherweise) als Ihr Passwort interpretiert wird!
Sie können Ihr Passwort in einer Konfigurationsdatei
speichern. Beispielsweise können Sie Ihr Passwort im
[client]-Abschnitt der
.my.cnf-Datei in Ihrem
Heimatverzeichnis aufführen:
[client] password=ihr_passwort
Wenn Sie Ihr Passwort in .my.cnf
speichern, sollte die Datei nicht für die Gruppe (group)
lesbar oder schreibbar sein. Stellen Sie sicher, dass der
Zugriffsmodus der Datei 400 oder
600 ist.
Sie können Ihr Passwort in der
MYSQL_PWD-Umgebungsvariablen speichern,
aber diese Methode wird als extrem unsicher erachtet und
sollte nicht gewählt werden. Einige Versionen von
ps beinhalten eine Option, die Umgebung
laufender Prozesse anzeigen zu lassen; Ihr Passwort würde
dann für alle im Klartext lesbar sein, wenn Sie
MYSQL_PWD setzen. Selbst auf Systemen
ohne eine solche Version von ps ist es
nicht ratsam, anzunehmen, dass es keine andere Methode gibt,
Prozessumgebungen einzusehen. See
Anhang E, Umgebungsvariablen.
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.
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
Abschnitt 7.7.2, „LOCK TABLES/UNLOCK TABLES-Syntax“. See Abschnitt 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
Abschnitt 7.4.1, „SELECT-Syntax“. See Abschnitt 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
Abschnitt 5.8.5, „mysqldump, Tabellenstrukturen und -daten dumpen“. See Abschnitt 5.8.6, „mysqlhotcopy, MySQL-Datenbanken und Tabellen kopieren“.
Machen Sie eine komplette Sicherung Ihrer Datenbanken:
shell>mysqldump --tab=/pfad/zum/verzeichnis/ --opt --fulloder 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.
Halten Sie mysqld an, wenn er läuft, und
starten Sie ihn mit der
--log-update[=datei]-Option. See
Abschnitt 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
Abschnitt 5.9.3, „Die Update-Log-Datei“.):
Stellen Sie die originale
mysqldump-Datensicherung wieder her.
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 Abschnitt 5.10.1, „Einführung in die Replikation“.
Wenn Sie ein Veritas-Dateisystem benutzen, können Sie folgendes tun:
Führen Sie einen Client- (Perl ?) FLUSH TABLES mit
READ LOCK aus.
Forken Sie eine Shell oder führen Sie einen anderen Client
aus mount vxfs snapshot.
Führen Sie im ersten Client UNLOCK
TABLES aus.
Kopieren Sie die Dateien von snapshot
Unmounten Sie snapshot
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 Abschnitt 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.
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. |
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
Abschnitt 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:
Found row where the auto_increment column has the
value 0.
Das bedeutet, dass es in der Tabelle eine Zeile gibt, in der
die auto_increment-Index-Spalte den Wert
0 enthält. (Es ist möglich, eine Zeile zu erzeugen, in der
die auto_increment-Spalte 0 ist, indem man die Spalte
explizit mit einem UPDATE-Statement auf 0
setzt.)
Das ist für sich genommen kein Fehler, kann aber Probleme
verursachen, wenn Sie die Tabelle dumpen und dann
wiederherstellen, oder ein ALTER TABLE
auf die Tabelle machen. In diesen Fällen ändert sich der
Wert der auto_increment-Spalte gemäß den Regeln für
auto_increment-Spalten, was Probleme wie doppelte
Schlüsseleintragsfehler bringen könnte.
Um diese Warnmeldung loszuwerden, führen Sie einfach ein
UPDATE-Statement durch und setzen die
Spalte auf irgend einen anderen Wert als 0.
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 Abschnitt A.4.1, „Was zu tun ist, wenn MySQL andauernd abstürzt“. See
Abschnitt 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.
myisamchkmyisamchkmyisamchkmyisamchkmyisamchkmyisamchkmyisamchk für die Fehlerbeseitigung nach Abstürzen
Ab MySQL-Version 3.23.13 können Sie MyISAM-Tabellen mit dem
CHECK TABLE-Befehl überprüfen. See
Abschnitt 5.4.4, „CHECK TABLE-Syntax“. Mit dem REPAIR
TABLE-Befehl können Sie Tabellen reparieren. See
Abschnitt 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
Kapitel 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
Abschnitt 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).
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.
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:
Wenn Sie --safe-recover benutzen.
Wenn die temporären Dateien, die benötigt werden,
um die Schlüssel zu sortieren, mehr als zweimal so
Groß werden würden, als wenn die Schlüsseldatei
direkt erzeugt würde. Das ist oft dann der Fall,
wenn Sie große CHAR-,
VARCHAR- oder
TEXT-Schlüssel haben, weil das
Sortieren die gesamten Schlüssel während des
Sortierens speichern muss. Wenn Sie viel temporären
Platz haben und myisamchk zwingen
können, mittels Sortieren zu reparieren, können
Sie die --sort-recover-Option
benutzen.
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.
-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).
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.
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.
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:
Die doppelte Größe der Daten-Datei (die Originaldatei
und eine Kopie). Dieser Platz wird nicht benötigt, wenn
die Reparatur mit --quick durchgeführt
wird, weil in diesem Fall nur die Index-Datei neu erzeugt
wird. Der Platz wird auf derselben Festplatte benötigt,
wo die Original-Daten-Datei liegt!
Platz für die neue Index-Datei, die die alte ersetzt. Die alte Index-Datei wird beim Start beschnitten, daher kann man diesen Platz üblicherweise ignorieren. Der Platz wird auf derselben Platte benötigt, auf der die Original-Index-Datei liegt!
Wenn Sie --recover oder
--sort-recover benutzen (aber nicht, wenn
Sie --safe-recover benutzen), brauchen
Sie Platz für einen Sortierpuffer (Sort Buffer) für:
(größter_schlüssel + zeilen_zeiger_länge) *
anzahl_der_zeilen * 2. Sie können die Länge
der Schlüssel und die Zeilen-Zeiger-Länger mit
myisamchk -dv tabelle prüfen. Dieser
Platz wird auf der temporären Platte zugeordnet
(festgelegt durch TMPDIR oder
--tmpdir=#).
Wenn Sie während der Reparatur ein Problem mit dem
Plattenplatz bekommen, können Sie
--safe-recover anstelle von
--recover ausprobieren.
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 Abschnitt 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 Abschnitt 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.
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.
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
Abschnitt 5.4.5, „REPAIR TABLE-Syntax“.
Zu den Symptomen einer beschädigten Tabelle gehören Anfragen, die unerwartet abbrechen, und beobachtbare Fehler wie folgender:
tabelle.frm is locked against change
Can't find file tabelle.MYI (Errcode:
###)
Unexpected end of file
Record file is crashed
Got error ### from table handler
Um mehr Information über den Fehler zu erhalten, lassen
Sie perror ### laufen. Hier sind die
häufigsten Fehler, die auf ein Problem mit der Tabelle
hinweisen:
shell> perror 126 127 132 134 135 136 141 144 145
126 = Index-Datei ist beschädigt / falsches Dateiformat
127 = Daten-Datei ist beschädigt
132 = Alte Datenbank-Datei
134 = Datensatz wurde bereits gelöscht (oder Daten-Datei beschädigt)
135 = Kein Platz mehr in der Daten-Datei
136 = Kein Platz mehr in der Index-Datei
141 = Doppelter Eintrag für eindeutigen Schlüssel oder Beschränkung beim Schreiben oder Aktualisiern
144 = Tabelle ist beschädigt und die letzte Reparatur ist fehlgeschlagen
145 = Tabelle ist als beschädigt gekennzeichnet und sollte repariert werden
Beachten Sie, dass Fehler 135 (kein Platz mehr in der Daten-Datei) kein Fehler ist, der durch eine einfache Reparatur behoben werden kann. In diesem Fall müssen Sie folgendes durchführen:
ALTER TABLE tabelle MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;
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 Abschnitt 5.4.5, „REPAIR TABLE-Syntax“.
Der Handbuchabschnitt über Tabellenwartung beinhaltet die
Optionen für isamchk /
myisamchk. See
Abschnitt 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:
Machen Sie eine Datensicherung der Daten-Datei, bevor Sie fortfahren.
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.
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:
Verschieben Sie die Daten-Datei an einen sicheren Ort.
Benutzen Sie die Tabellen-Beschreibungsdatei, um eine neue (leere) Daten-Datei und Index-Dateien zu erzeugen:
shell>mysql datenbankmysql>SET AUTOCOMMIT=1;mysql>TRUNCATE TABLE tabelle;mysql>quit
Wenn Ihre SQL-Version kein TRUNCATE
TABLE hat, benutzen Sie statt dessen
DELETE FROM tabelle.
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:
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.
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.
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 Abschnitt 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
Abschnitt 5.4.6.1, „Aufrufsyntax von myisamchk“.
Ab MySQL-Version 3.23.13 können Sie MyISAM-Tabellen mit dem
CHECK TABLE-Befehl prüfen. See
Abschnitt 5.4.4, „CHECK TABLE-Syntax“. Sie können Tabellen mit dem
REPAIR TABLE-Befehl reparieren. See
Abschnitt 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
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 Abschnitt 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 Abschnitt 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 Abschnitt 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
Abschnitt 5.7.4, „myisampack, MySQL-Programm zum Erzeugen komprimierter Nur-Lese-Tabellen“, wo sich ein Beispiel solcher
Informationen und was sie bedeuten befindet.
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 Abschnitt 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:
Wenn die Tabelle gelöschte oder aufgeteilte Zeilen hat, wird sie repariert.
Wenn die Index-Seiten nicht sortiert sind, werden sie sortiert.
Wenn die Statistiken nicht aktuell sind (und eine Reparatur nicht durch das Sortieren des Indexes durchgeführt werden könnte), werden sie aktualisiert.
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!
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
Abschnitt 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.
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 Abschnitt 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
Abschnitt 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
Abschnitt 5.10.6, „SQL-Befehle in Bezug auf Replikation“.
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:
Bei SELECT-, ORDER BY-
und GROUP BY-Schleifen wird der Flag
geprüft, nachdem ein Block von Zeilen gelesen wurde. Wenn
der kill-Flag gesetzt ist, wird das Statement abgebrochen.
Bei ALTER TABLE wird der kill-Flag
geprüft, bevor jeder Block von Zeilen aus der
Original-Tabelle gelesen wird. Wenn der Flag gesetzt ist,
wird der Befehl abgebrochen und die temporäre Tabelle wird
gelöscht.
Bei UPDATE TABLE und DELETE
TABLE wird der kill-Flag geprüft, nachdem jeder
Block gelesen wurde sowie nach jeder aktualisierten oder
gelöschten Zeile. Wenn der Flag gesetzt ist, wird das
Statement abgebrochen. Beachten Sie, dass die Änderungen
nicht zurück gerollt (Rollback) werden, wenn Sie keine
Transaktionen benutzen!
GET_LOCK() wird mit
NULL abgebrochen.
Ein INSERT DELAYED-Thread flusht schnell
alle Zeilen, die er im Speicher hat, und stirbt.
Wenn der Thread im Tabellen-Lock-Handler ist (Status:
Locked), wird die Tabellen-Sperre schnell
abgebrochen.
Wenn der Thread bei einem write-Aufruf
auf freien Plattenplatz wartet, wird der Schreibvorgang mit
einer Meldung, dass die Platte voll ist, abgebrochen.
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.
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
Abschnitt 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 Abschnitt 7.5.3.1, „Stille Spaltentyp-Änderungen“.
Das DESCRIBE-Statement gibt ähnliche
Informationen wie SHOW COLUMNS aus. See
Abschnitt 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.
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 Kapitel 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.
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 Abschnitt A.2.9, „Kommunikationsfehler / Abgebrochene Verbindung“. |
Aborted_connects | Anzahl der fehlgeschlagenen Versuche, sich mit dem MySQL-Server zu verbinden. See Abschnitt 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 Abschnitt 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:
Wenn Opened_tables hoch ist, ist Ihre
table_cache-Variable wahrscheinlich zu
niedrig.
Wenn key_reads hoch ist, ist Ihr
key_cache wahrscheinlich zu klein. Die
Cache-Zugriffsrate kann mit key_reads /
key_read_requests berechnet werden.
Wenn Handler_read_rnd hoch ist, haben
Sie wahrscheinlich viele Anfragen, die MySQL zwingen,
ganze Tabellen zu scannen, oder Sie haben Joins, die
Schlüssel nicht richtig benutzen.
Wenn Threads_created hoch ist, sollten
Sie eventuell die
Thread_cache_size-Variable herauf
setzen.
Wenn Created_tmp_disk_tables hoch ist,
sollten Sie eventuell die
tmp_table_size-Variable herauf setzen,
damit temporäre Tabellen im Speicher erzeugt werden statt
auf der Platte.
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
Abschnitt 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
Abschnitt 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 Abschnitt 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.
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
Abschnitt 5.5.5, „SHOW-Syntax“.
Um noch mehr Geschwindigkeit beim Schreiben vieler Zeilen
auf einmal zu erhalten, benutzen Sie LOCK
TABLES. See Abschnitt 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 Abschnitt 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 Abschnitt 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
Abschnitt 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 Abschnitt 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
Abschnitt 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 Abschnitt 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
Abschnitt 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 Abschnitt 6.5.2, „Serverparameter tunen“.
SHOW LOGS zeigt Ihnen Statusinformationen
über bestehende Log-Dateien. Momentan werden nur
Informationen über Berkeley-DB-Log-Dateien angezeigt.
File zeigt den vollen Pfad zur
Log-Datei.
Type zeigt den Typ der Log-Datei
(BDB für Berkeley-DB-Log-Dateien).
Status zeigt den Status der Log-Datei
(FREE, wenn die Datei entfernt werden
kann, oder IN USE, wenn die Datei vom
Transaktions-Subsystem benötigt wird)
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 Abschnitt 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).
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 |
+----------------------------------------------------------------------+
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. Abschnitt 6.5.6, „SET-Syntax“.
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 Abschnitt 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.
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 ä.
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!
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:
Fügen Sie MEINSET am Ende der
sql/share/charsets/Index-Datei hinzu.
Geben Sie ihm eine eindeutige Nummer.
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:
Kommentare fangen mit einem '#'-Zeichen an und gehen bis zum Ende der Zeile.
Wörter werden durch beliebige Mengen von Leerraum getrennt.
Bei der Definition des Zeichensatzes muss jedes Wort eine Zahl im hexadezimalen Format sein.
Das ctype-Array nimmt bis zu 257
Wörter auf. Die to_lower-,
to_upper- und
sort_order-Arrays nehmen danach
jeweils bis zu 256 Wörter auf.
Fügen Sie den Zeichensatznamen den
CHARSETS_AVAILABLE- und
COMPILED_CHARSETS-Listen in
configure.in hinzu.
Rekonfigurieren, rekompilieren und testen Sie.
Bei einem komplexen Zeichensatz machen Sie folgendes:
Erzeugen Sie die Datei
strings/ctype-MEINSET.c in der
MySQL-Quelldistribution.
Fügen Sie MEINSET am Ende der
sql/share/charsets/Index-Datei hinzu.
Weisen Sie ihm eine eindeutige Nummer zu.
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
Abschnitt 5.6.4, „Die Zeichen-Definitions-Arrays“. Bei einem komplexen
Zeichensatz
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.
Danach sollten Sie einige der folgenden Funktionen erzeugen:
my_strncoll_MEINSET()
my_strcoll_MEINSET()
my_strxfrm_MEINSET()
my_like_range_MEINSET()
See Abschnitt 5.6.5, „Unterstützung für Zeichenketten-Vergleich“.
Fügen Sie den Zeichensatznamen den
CHARSETS_AVAILABLE- und
COMPILED_CHARSETS-Listen in
configure.in hinzu.
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>.
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
Abschnitt 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
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).
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.
Wenn Sie versuchen, einen Zeichensatz zu benutzen, der nicht in Ihre Binärdatei kompiliert ist, können Sie verschiedene Probleme bekommen:
Ihr Programm hat einen falschen Pfad zum Speicherort der
Zeichensätze. (Vorgabe ist
/usr/local/mysql/share/mysql/charsets).
Das kann durch die Benutzung der
--character-sets-dir-Option für das
fragliche Programm behoben werden.
Der Zeichensatz ist ein Multi-Byte-Zeichensatz, der nicht dynamisch geladen werden kann. Wenn das der Fall ist, müssen Sie das Programm mit Unterstützung für diesen Zeichensatz neu kompilieren.
Der Zeichensatz ist ein dynamischer Zeichensatz, aber Sie haben keine configure-Datei dafür. In diesem Fall müssen Sie die configure-Datei für den Zeichensatz aus einer neuen MySQL-Distribution installieren.
Ihre Index-Datei enthält nicht den
Namen für den Zeichensatz.
ERROR 1105: File '/usr/local/share/mysql/charsets/?.conf' not found (Errcode: 2)
In diesem Fall müssen Sie sich entweder eine neue
Index-Datei holen oder den Namen jedes
fehlenden Zeichensatzes von Hand eintragen.
Bei MyISAM-Tabellen können Sie den Zeichensatznamen und die
Anzahl für eine Tabelle mit myisamchk -dvv
tabelle prüfen.
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
Abschnitt 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
Anhang E, 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. Abschnitt 5.1.2, „my.cnf-Optionsdateien“.
Die unten stehende Liste beschreibt kurz die MySQL-Programme:
Dienstprogramm zur Beschreibung, Prüfung, Optimierung und
Reparatur von MySQL-Tabellen. Weil
myisamchk viele Funktionen hat, ist es in
einem eigenen Kapitel beschrieben. See
Kapitel 5, MySQL-Datenbankadministration.
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.
Ein Shell-Skript, das mSQL-Programme zu
MySQL konvertiert. Es deckt nicht alle Fälle ab, ist aber
hilfreich, um mit dem Konvertieren anzufangen.
Ein Skript, das die Zugriffsberechtigungen für eine Host-, Benutzer- und Datenbank-Kombination prüft.
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
Abschnitt 5.8.3, „mysqladmin, Verwaltung eines MySQL-Servers“.
Das MySQL-Bug-Bericht-Skript. Dieses Skript sollte immer benutzt werden, wenn Sie einen Bug-Bericht an die MySQL-Liste ausfüllen.
Der SQL-Daemon. Dieser sollte immer laufen.
Dumpt eine MySQL-Datenbank in eine Datei als SQL-Statements oder als Tabulator-separierte Textdateien. Verbesserte Freeware, ursprünglich von Igor Romanenko. See Abschnitt 5.8.5, „mysqldump, Tabellenstrukturen und -daten dumpen“.
Importiert Textdateien in die jeweiligen Tabellen mittels
LOAD DATA INFILE. See
Abschnitt 5.8.7, „mysqlimport, Daten aus Textdateien importieren“.
Zeigt Informationen über Datenbanken, Tabellen, Spalten und Indexe an.
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.
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 ...
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 Abschnitt 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
Abschnitt 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:
Server und Datenbanken liegen relativ zum Verzeichnis, aus
dem safe_mysqld aufgerufen wird.
safe_mysqld sucht unterhalb seines
Arbeitsverzeichnisses nach bin- und
data-Verzeichnissen (bei
Binärdistributionen) oder nach
libexec- und
var-Verzeichnissen (bei
Quelldistributionen). Diese Bedingung sollte zutreffen, wenn
Sie safe_mysqld aus Ihrem
MySQL-Installationsverzeichnis ausführen (zum Beispiel
/usr/local/mysql bei einer
Binärdistribution).
Wenn Server und Datenbanken nicht relativ zum
Arbeitsverzeichnis liegen, versucht
safe_mysqld, sie anhand absoluter
Pfadnamen zu finden. Typische Speicherort sind
/usr/local/libexec und
/usr/local/var. Die tatsächlichen
Speicherorte werden festgelegt, wenn die Distribution gebaut
wird, woher safe_mysqld kommt. Sie
sollten korrekt sein, wenn MySQL an einem Standardort
installiert wurde.
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_verzeichnisshell>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.
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:
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
--help
--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=...
--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=...
--version
Versionsnummer ausgeben und beenden.
Einige Anmerkungen zu mysqld_multi:
Stellen Sie sicher, dass der MySQL-Benutzer, der die
mysqld-Dienste anhält (indem er zum
Beispiel mysqladmin benutzt), dasselbe
Passwort und denselben Benutzernamen für alle
Daten-Verzeichnisse benutzt, auf die zugegriffen wird (zur
'mysql'-Datenbank). Stellen Sie ausserdem sicher, dass der
Benutzer die 'Shutdown_priv'-Berechtigung hat! Wenn Sie
viele Daten-Verzeichnisse und viele verschiedene
'mysql'-Datenbanken mit unterschiedlichen Passwörtern für
den MySQL-'root'-Benutzer haben, sollten Sie einen
allgemeinen 'multi_admin'-Benutzer anlegen, der dasselbe
Passwort benutzt (siehe unten). Hier ein Beispiel dafür:
shell> mysql -u root -S /tmp/mysql.sock -proot_password -e
"GRANT SHUTDOWN ON *.* TO multi_admin@localhost IDENTIFIED BY 'multipass'"
See Abschnitt 5.2.5, „Wie das Berechtigungssystem funktioniert“.
Das oben Angegebene müssen Sie für jeden laufenden
mysqld im Daten-Verzeichnis tun, das Sie
haben (ändern Sie einfach den Socket, -S=...).
pid-file ist sehr wichtig, wenn Sie
safe_mysqld benutzen, um
mysqld zu starten (zum Beispiel
--mysqld=safe_mysqld). Jeder mysqld
sollte seine eigene pid-file haben. Der
Vorteil der Benutzung von safe_mysqld
anstelle von mysqld direkt ist hierbei,
dass safe_mysqld jeden
mysqld-Prozess 'bewacht' und neu startet,
falls ein mysqld-Prozess wegen eines
Signals kill -9 fehlschlägt oder ähnliches (wenn
beispielsweise Speicherzugriffsfehler auftreten, was bei
MySQL natürlich nie passiert ;-). Beachten Sie bitte, dass
es für das safe_mysqld-Skript eventuell
erforderlich ist, es von einer bestimmten Stelle aus zu
starten. Das heißt, dass Sie eventuell in ein bestimmtes
Verzeichnis wechseln müssen, bevor Sie
mysqld_multi starten. Wenn Sie beim
Starten Probleme haben, sehen Sie bitte im
safe_mysqld-Skript nach. Überprüfen Sie
insbesondere folgende Zeilen:
-------------------------------------------------------------------------- MY_PWD=`pwd` Check if we are starting this relative (for the binary release) if test -d /data/mysql -a -f ./share/mysql/englisch/errmsg.sys -a -x ./bin/mysqld -------------------------------------------------------------------------- See Abschnitt 5.7.2, „safe_mysqld, der Wrapper um mysqld“.
Der obige Test soll erfolgreich verlaufen, ansonsten können Sie Probleme bekommen.
Vermeiden Sie Gefahren, die auftauchen, wenn Sie mehrere
mysqlds im selben Daten-Verzeichnis
starten. Benutzen Sie unterschiedlichen Daten-Verzeichnisse,
es sei denn, Sie wissen
GENAU, was Sie tun!
Die Socket-Datei und der TCP/IP-Port müssen für jeden
mysqld verschieden sein.
Die erste und die fünfte mysqld-Gruppe
wurden beim Beispiel absichtlich ausgelassen. Sie haben
eventuell 'Lücken' in der config-Datei. Das gibt Ihnen mehr
Flexibilität. Die Reihenfolge, in der die
mysqlds gestartet oder angehalten werden,
hängt von der Reihenfolge ab, in der sie in der
config-Datei erscheinen.
Wenn Sie auf eine bestimmte Gruppe verweisen wollen, wenn Sie GNR bei diesem Programm benutzen, nehmen Sie einfach die Nummer am Ende des Gruppennamens ( [mysqld# <== ).
Eventuell sollten Sie die Option '--user' für
mysqld benutzen, aber um das zu tun,
müssen Sie root sein, wenn Sie das
mysqld_multi-Skript starten. Wenn Sie die
Option in der config-Datei haben, macht das nichts; Sie
erhalten nur eine Warnmeldung, wenn Sie nicht der Superuser
sind und die mysqlds unter
IHREM UNIX-Account
gestartet werden. WICHTIG:
Stellen Sie sicher, dass die pid-file und
das Daten-Verzeichnis für
DENJENIGEN UNIX-Benutzer
lesbar und schreibbar sind (und ausführbar im letzteren
Fall), als der der spezifische
mysqld-Prozess gestartet wird. Benutzen
Sie hier NICHT den
UNIX-root-Account, es sei denn, Sie wissen
GENAU, was Sie tun!
SEHR WICHTIG: Stellen Sie
sicher, dass Sie die Bedeutung der Optionen verstehen, die
an die mysqlds durchgereicht werden und
WARUM Sie mehrere
verschiedene mysqld-Prozesse haben
wollen. Mehrere mysqlds in einem
Daten-Verzeichnis starten ergibt keine
zusätzliche Performance bei einem threaded
System!
See Abschnitt 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
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:
Nach dem Komprimieren ist die Tabelle nur-lesbar.
myisampack kann auch
BLOB- oder
TEXT-Spalten komprimieren. Das ältere
pack_isam konnte das nicht.
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 stationMyISAM 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.MYICompressing 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 stationMyISAM 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.
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 Abschnitt 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
Abschnitt 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 Abschnitt 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
Abschnitt 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 |
mysqlcheck für Tabellenwartung und Wiederherstellung nach Abstürzen
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
Abschnitt 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
Anhang E, 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. Abschnitt 5.1.2, „my.cnf-Optionsdateien“.
Die unten stehende Liste beschreibt kurz die MySQL-Programme:
Dienstprogramm zur Beschreibung, Prüfung, Optimierung und
Reparatur von MySQL-Tabellen. Weil
myisamchk viele Funktionen hat, ist es in
einem eigenen Kapitel beschrieben. See
Kapitel 5, MySQL-Datenbankadministration.
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.
Ein Shell-Skript, das mSQL-Programme zu
MySQL konvertiert. Es deckt nicht alle Fälle ab, ist aber
hilfreich, um mit dem Konvertieren anzufangen.
Ein Skript, das die Zugriffsberechtigungen für eine Host-, Benutzer- und Datenbank-Kombination prüft.
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
Abschnitt 5.8.3, „mysqladmin, Verwaltung eines MySQL-Servers“.
Das MySQL-Bug-Bericht-Skript. Dieses Skript sollte immer benutzt werden, wenn Sie einen Bug-Bericht an die MySQL-Liste ausfüllen.
Der SQL-Daemon. Dieser sollte immer laufen.
Dumpt eine MySQL-Datenbank in eine Datei als SQL-Statements oder als Tabulator-separierte Textdateien. Verbesserte Freeware, ursprünglich von Igor Romanenko. See Abschnitt 5.8.5, „mysqldump, Tabellenstrukturen und -daten dumpen“.
Importiert Textdateien in die jeweiligen Tabellen mittels
LOAD DATA INFILE. See
Abschnitt 5.8.7, „mysqlimport, Daten aus Textdateien importieren“.
Zeigt Informationen über Datenbanken, Tabellen, Spalten und Indexe an.
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.
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 ...
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 Abschnitt 6.5.6, „SET-Syntax“.
Die Auswirkung davon ist folgende:
UPDATE- oder
DELETE-Statements ohne
Schlüsselbeschränkung im WHERE-Teil
sind nicht zugelassen. Man kann jedoch ein
UPDATE/DELETE durch die Benutzung von
LIMIT erzwingen:
UPDATE tabelle SET not_key_column=# WHERE not_key_column=# LIMIT 1;
Alle großen Ergebnisse werden automatisch auf
#select_limit# Zeilen begrenzt.
SELECT's, die wahrscheinlich mehr als
#max_join_size Zeilenkombinationen
durchgehen müssen, werden abgebrochen.
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)
Zum Mitloggen benutzen Sie die
tee-Option. tee wird
mit der Option --tee=... oder interaktiv
auf der Kommandozeile mi dem Befehl tee
gestartet. Alle Daten, die auf dem Bildschirm erscheinen,
werden auch in die angegebene Datei geschrieben. Das kann
auch für Debug-Zwecke sehr hilfreich sein.
tee kann von der Kommandozeile aus mit
dem Befehl notee deaktiviert werden. Wenn
tee noch einmal eingegeben wird, wird
wiederum mit dem Loggen begonnen. Ohne Parameter wird die
vorherige Datei wiederum benutzt. Beachten Sie, dass
tee die Ergebnisse nach jedem Befehl in
die Datei zurückschreibt, direkt bevor die
Kommandozeilenaufforderung für den nächsten Befehl
erscheint.
Das Durchstöbern oder Durchsuchen der Ergebnisse im
interaktiven Modus in UNIX-less, -more oder einem ähnlichen
Programm ist jetzt möglich mit der Option
--pager[=...]. Ohne Argument aufgerufen
sieht der mysql-Client in der
Umgebungsvariablen PAGER nach und setzt
pager auf diesen Wert.
pager kann von der interaktiven
Kommandozeile mit dem Befehl pager
gestartet und mit nopager deaktiviert
werden. Optional nimmt der Befehl ein Argument entgegen und
setzt pager darauf.
pager kann ohne Argument aufgerufen
werden, aber das erfordert, dass die Option
--pager benutzt wurde, ansonsten gibt
pager in stdout aus.
pager funktioniert nur unter UNIX, denn
es benutzt die popen()-Funktion, die es unter Windows nicht
gibt. Unter Windows kann statt dessen die
tee-Option benutzt werden, wenngleich
diese in manchen Situationen nicht ganz so handlich ist wie
pager.
Ein paar Tipps zu pager: Sie können es
benutzen, um in eine Datei zu schreiben:
mysql> pager cat > /tmp/log.txt
Die Ergebnisse werden nur in eine Datei geschrieben. Sie
können auch Optionen an Programme übergeben, die Sie mit
pager zusammen benutzen wollen:
mysql> pager less -n -i -S
Beachten Sie hierbei die Option '-S'. Beim Durchstöbern der Ergebnisse werden Sie diese wahrscheinlich als sehr nützlich erachten. Probieren Sie dei Option mit horizontaler Ausgabe (Befehle enden mit '\g', oder ';') und mit vertikaler Ausgabe (Befehle enden mit '\G') aus. Manchmal ist ein sehr breites Ergebnis schwer am Bildschirm zu lesen. Mit der Option -S für less können Sie die Ergebnisse im interaktiven less von links nach rechts durchstöbern, wobei verhindert wird, dass Zeilen, die länger sind als Ihre Bildschirmbreite, in die nächste Zeile umgebrochen werden. Das kann ein Ergebnis sehr viel lesbarer gestalten. Sie können den Modus im interaktiven less an- und abschalten, wenn Sie '-S' benutzen. Siehe 'h' für weitere Hilfe zu less.
Zum Schluss (falls Sie das nicht schon aus den oben aufgeführten Beispielen heraus gefunden haben ;-) können Sie sehr komplexe Dinge tun, um die Ergebnisse zu handhaben. Folgendes würde die Ergebnisse beispielsweise an zwei verschiedene Dateien in zwei unterschiedlichen Verzeichnissen schicken, auf zwei unterschiedlichen Festplatten, die auf /dr1 und /dr2 gemountet sind, und dennoch die Ergebnisse über less am Bildschirm anzeigen:
mysql> pager cat | tee /dr1/tmp/res.txt | tee /dr2/tmp/res2.txt | less -n -i -S
Sie können die obigen Funktionen auch kombinieren, indem
Sie tee anschalten und
pager auf 'less' setzen. Dann können Sie
die Ergebnisse in 'less' durchstöbern und trotzdem wird
alles zugleich an eine Datei angehängt. Der Unterschied
zwischen UNIX tee, was mit
pager benutzt wird, und dem im
mysql-Client eingebauten
tee ist, dass das eingebaute
tee sogar dann funktioniert, wenn kein
UNIX tee verfügbar ist. Darüber hinaus
gibt das eingebaute tee alles, was
mitgeloggt wird, auch am Bildschirm aus, wohingegen das
UNIX tee in Verbindung mit
pager nicht so viel mitloggt. Letztlich
läßt sich das interaktive tee auch
handlicher aus- und einschalten, wenn Sie teilweise
mitloggen wollen, aber in der Lage sein, das Feature
zwischendurch auszuschalten.
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 Abschnitt 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.
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.
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 Abschnitt 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 Abschnitt 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 Abschnitt 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
mysqlhotcopy ist ein Perl-Skript, das
LOCK TABLES, FLUSH TABLES
und cp oder scp benutzt,
um schnell eine Datensicherung einer Datenbank anzulegen. Es
stellt die schnellste Möglichkeit dar, eine Sicherung einer
Datenbank oder einzelner Tabellen durchzuführen, läuft aber
nur auf derselben Maschine, auf der sich die
Datenbankverzeichnisse befinden.
mysqlhotcopy datenbank [/pfad/zu/neuem_verzeichnis] mysqlhotcopy datenbank_1 ... datenbank_n /pfad/zu/neuem_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).
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
Abschnitt 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 Abschnitt 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 Abschnitt 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 | +------+---------------+
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 Abschnitt 5.5.5, „SHOW-Syntax“.
mysqlshow wird wie folgt aufgerufen:
shell> mysqlshow [optionen] [datenbank [tabelle [spalte]]]
Wenn keine Datenbank angegeben wird, werden alle passenden Datenbanken gezeigt.
Wenn keine Tabelle angegeben wird, werden alle passenden Tabellen in der Datenbank gezeigt.
Wenn keine Spalte angegeben wird, werden alle passenden Spalten und Spaltentypen in der Tabelle gezeigt.
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.
perror wird benutzt, um Fehlermeldungen
auszugeben. perror wird wie folgt aufgerufen:
shell>perror [optionen] [ERRORCODE [ERRORCODE...]]For example: shell>perror 64 79Error 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.
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 Abschnitt 5.8, „Clientseitige Skripte und Hilfsprogramme von MySQL“.
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 Abschnitt 5.5.3, „FLUSH-Syntax“.
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 Abschnitt D.1.4, „Einen Stack-Trace benutzen“.
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.
HINWEIS: Die Update-Log-Datei wird durch die binäre Log-Datei ersetzt. See Abschnitt 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.
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 Abschnitt 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.
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
Abschnitt 5.1.1, „mysqld-Kommandozeilenoptionen“.
MySQL hat viele Log-Dateien, die es leicht machen festzustellen,
was vor sich geht. See Abschnitt 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 Abschnitt 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 standardmäßiges Loggen (--log) oder
Loggen langsamer Anfragen
(--log-slow-queries) benutzt wird, wird die
Log-Datei geschlossen und wieder geöffnet
(mysql.log und
`hostname`-slow.log als Vorgabe).
Wenn Update-Logging (--log-update) benutzt
wird, wird die Update-Log-Datei geschlossen und eine neue
Log-Datei mit einer höheren Log-Zahl geöffnet.
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-verzeichnisshell>mv mysql.log mysql.oldshell>mysqladmin flush-logs
Und dann eine Datensicherung nehmen und
mysql.old entfernen.
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.
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 Abschnitt 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 Abschnitt 5.4.1, „Datenbank-Datensicherungen“.
MySQL-Replikation basiert darauf, dass der Server alle Änderungen Ihrer Datenbank im Binär-Log verfolgt (Updates, Deletes usw.) (see Abschnitt 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.
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.
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.
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';
Fahren Sie den MySQL-Master herunter:
mysqladmin -u root -ppasswort shutdown
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.
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
Starten Sie den MySQL-Master neu.
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.
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.
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.
Unten steht eine Erläuterung dessen, was unterstützt wird und was nicht:
Replikation läuft korrekt mit
AUTO_INCREMENT-,
LAST_INSERT_ID- und
TIMESTAMP-Werten.
RAND() bei Updates repliziert nicht
korrekt. Benutzen Sie
RAND(ein_nicht_zufalls_ausdruck), wenn
Sie Updates mit RAND() replizieren. Sie
können zum Beispiel UNIX_TIMESTAMP() als
Argument für RAND() benutzen.
Sie müssen auf Master und Slave denselben Zeichensatz
(--default-character-set) benutzen. Wenn
nicht, erhalten Sie eventuell Fehler wegen doppelter
Schlüsseleinträge (duplicate key) auf dem Slave, weil ein
Schlüssel, der auf dem Master als eindeutig betrachtet
wird, das in einem anderen Zeichensatz eventuell nicht ist.
LOAD DATA INFILE wird korrekt gehandhabt,
solange die Datei zur Zeit der Update-Ausführung noch auf
dem Master-Server liegt. LOAD LOCAL DATA
INFILE wird übersprungen.
Aktualisierungsanfragen, die Benutzer-Variablen benutzen, sind (noch) nicht replikationssicher.
FLUSH-Befehle werden nicht in der
Binär-Log-Datei gespeichert und werden deswegen nicht auf
den Slaves repliziert. Das stellt normalerweise kein Problem
dar, weil FLUSH nichts ändert. In Bezug
auf die MySQL-Berechtigungstabellen
heißt das jedoch, dass Sie bei direkten Änderungen in
diesen Tabellen ohne Benutzung des
GRANT-Statements und der anschließenden
Replikation der
MySQL-Berechtigungs-Datenbank auf den
Slaves FLUSH PRIVILEGES ausführen
müssen, damit die neuen Berechtigungen wirksam werden.
Temporäre Tabellen werden ab Version 3.23.29 korrekt
repliziert, ausgenommen im Fall, dass Sie den Slave-Server
schließen (nicht nur den Slave-Thread), Sie noch einige
temporäre Tabellen offen haben und diese bei nachfolgenden
Aktualisierungen benutzt werden. Um mit diesem Problem
fertig zu werden, schließen Sie den Slave mit
SLAVE STOP und prüfen dann die
Slave_open_temp_tables-Variable, um zu
sehen, ob Sie 0 ist. Dann führen Sie mysqladmin
shutdown aus. Wenn die Variable nicht 0 ist,
starten Sie den Slave-Thread neu mit SLAVE
START und probieren es noch einmal. Zukünftig (ab
Version 4.0) wird es eine sauberere Lösung geben. In
früheren Versionen wurden temporäre Tabellen nicht korrekt
repliziert. Wir empfehlen, dass Sie entweder auf eine neuere
Version aktualisieren oder vor allen Anfragen mit
temporären Tabellen SET SQL_LOG_BIN=0
auf alle Clients ausführen.
MySQL unterstütz nur einen Master und viele Slaves. In Version 4.x wird ein Abstimmungsalgorithmus eingebaut, der automatisch den Master umschaltet, wenn etwas mit dem aktuellen Master schief geht. Ausserdem werden wir 'Agenten'-Prozesse einführen, die bei der Lastverteilung helfen, indem sie SELECT-Anfragen an verschiedene Slaves senden.
Ab Version 3.23.26 ist es sicher, Server in einer
zirkulären Master-Slave-Beziehung mit angeschaltetem
log-slave-updates zu verbinden. Beachten
Sie jedoch, dass bei dieser Art von Einrichtung viele
Anfrage nicht richtig funktionieren, es sei denn, Ihr
Client-Code ist so geschrieben, dass er sich um mögliche
Probleme kümmert, die durch Aktualisierungen auftreten
können, die in unterschiedlicher Reihenfolge auf
verschiedenen Servern laufen.
Das bedeutet, dass Sie eine Einrichtung wie die folgende machen können:
A -> B -> C -> A
Diese Einrichtung funktioniert nur dann, wenn Sie ausschließlich Aktualisierungen ausführen, die nicht zwischen den Tabellen zu Konflikten führen. Mit anderen Worten, wenn Sie Daten in A und C einfügen, sollten Sie nie eine Zeile in A einfügen, die zu einem Konflikt mit einem Schlüsselwert bei einem Zeilen-Einfügevorgang in C führt. Ebenfalls sollte Sie nie dieselben Zeilen auf zwei Servern einfügen, wenn die Reihenfolge, in der die Aktualisierungen durchgeführt werden, eine Rolle spielt.
Beachten Sie, dass sich das Log-Format in Version 3.23.26 geändert hat, so das Slaves vor Version 3.23.26 diese nicht lesen können.
Wenn die Anfrage auf dem Slave zu einem Fehler führt,
beendet sich der Slave-Thread und in der
.err-Datei erscheint eine Meldung. Sie
sollten sich dann manuell mit dem Slave verbinden, die
Ursache des Fehlers beheben (zum Beispiel nicht existierende
Tabellen) und dann den SQL-Befehl SLAVE
START laufen lassen (verfügbar ab Version
3.23.16). In Version 3.23.15 müssen Sie den Server neu
starten.
Wenn die Verbindung zum Master verloren geht, versucht der
Slave unmittelbar, sich neu zu verbinden, und wenn das
fehlschlägt, alle master-connect-retry
Sekunden (Vorgabe 60 Sekunden). Deswegen ist es sicher, den
Master herunter zu fahren und dann nach einer Weile wieder
hochzufahren. Der Slave ist auch in der Lage, mit
Netzwerk-Verbindungsausfällen umzugehen.
Den Slave (sauber) herunterzufahren ist ebenfalls sicher, weil er sich merkt, wo er aufgehört hat. Unsauberes Herunterfahren kann zu Problemen führen, insbesondere dann, wenn der Platten-Cache nicht synchronisiert wurde, als das System starb. Die Fehlertoleranz Ihres Systems wird stark verbessert, wenn Sie ein gutes UPS haben.
Wenn der Master auf einem Port auf Anfragen wartet, der
nicht Standard ist, müssen Sie diesen mit dem
master-port-Parameter in
my.cnf angeben.
In Version 3.23.15 werden alle Tabellen und Datenbanken
repliziert. Ab Version 3.23.16 können Sie die Replikation
mit der replicate-do-db-Anweisung in
my.cnf auf einen Satz von Datenbanken
beschränken oder einen Satz von Datenbanken mit
replicate-ignore-db ausschließen.
Beachten Sie, dass es bis Version 3.23.23 einen Bug gab, so
dass mit LOAD DATA INFILE nicht sauber
umgegangen wurde, wenn Sie diesen Befehl in einer Datenbank
ausführten, die von der Replikation ausgeschlossen war.
Ab Version 3.23.16 schaltet SET SQL_LOG_BIN =
0 Replikations-(Binär)-Loggen auf dem Master aus
und SET SQL_LOG_BIN = 1 schaltet es
wieder an. Sie benötigen die process-Berechtigung, um das
auszuführen.
Ab Version 3.23.19, you can clean up stale Replikation
leftovers when something goes wrong und you want a clean
start mit FLUSH MASTER und FLUSH
SLAVE-Befehle. In Version 3.23.26 we have renamed
them to RESET MASTER und RESET
SLAVE respectively to clarify what they do. The
old FLUSH variants still work, though,
for Kompatibilität.
Ab Version 3.23.21, you can use LOAD TABLE FROM
MASTER for network backup und to set up
Replikation initially. We have recently received a Anzahl
von bug reports concerning it that we are investigating, so
we recommend that you use it only in testing until we make
it mehr stable.
Ab Version 3.23.23, you can change masters und adjust log
position mit CHANGE MASTER TO.
Ab Version 3.23.23, you tell the master that updates in
certain Datenbanken should not be logged to the
Binär-Log-Datei mit binlog-ignore-db.
Ab Version 3.23.26 können Sie
replicate-rewrite-db benutzen, um den
Slave anzuweisen, Aktualisierungen einer Datenbank auf dem
Master auf eine mit einem anderen Namen auf dem Slave
anzuwenden.
Ab Version 3.23.28 können Sie PURGE MASTER LOGS TO
'log-name' benutzen, um alte Log-Dateien
loszuwerden, während der Slave läuft.
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. |
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. |
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:
Zu den Aktualisierungen aufschließen.
Sobald keine Aktualisierungen mehr übrig sind, in den
Zustand pThread_cond_wait() gehen, durch
den er entweder durch eine Aktualisierung oder einen Kill
erweckt werden kann.
Beim Aufwachen den Grund dafür prüfen. Wenn er nicht
sterben soll, mit der
Binlog_dump-Schleife weitermachen.
Wenn ein schwerer Fehler auftritt, wenn zum Beispiel ein toter Client entdeckt wird, die Schleife beenden.
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_writer_connect()
safe_reader_connect()
safe_reader_query()
safe_writer_query()
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:
Was ist das Lese-/Schreibverhältnis auf Ihrem System?
Wieviel zusätzliche Schreiblast kann ein Server handhaben, wenn Sie die Leselast verringern?
Für wie viele Slave haben Sie Bandbreite auf Ihrem Netzwerk?
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
Um einem Slave mitzuteilen, den Master zu ändern, benutzen
Sie den CHANGE MASTER TO-Befehl.
Eine gute Möglichkeit, Ihre Applikationen darüber
informiert zu halten, wo der Master ist, ist ein dynamischer
DNS-Eintrag für den Master. Bei
bind können Sie
nsupdate benutzen, um Ihr DNS dynamisch
zu aktualisieren.
Sie sollten Ihre Slaves mit der
log-bin-Option und ohne
log-slave-updates laufen lassen. Auf
diese Art wird der Slave bereit sein, ein Master zu werden,
sobald Sie STOP SLAVE eingeben,
RESET MASTER und CHANGE MASTER
TO auf den anderen Slaves. Das wird auch dabei
helfen, fehlgelaufene Aktualisierungen zu entdecken, die auf
Grund von Fehlkonfiguration des Slaves passieren (im
Idealfall sollten Sie die Zugriffsrechte so konfigurieren,
dass kein Client einen Slave aktualisieren kann, ausser der
Slave-Thread), in Kombination mit den Bugs in Ihren
Client-Programmen (die den Slave nie direkt aktualisieren
sollten).
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.
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:
Loggt der Master in die Binär-Log-Datei? Prüfen Sie das
mit SHOW MASTER STATUS. Wenn das der Fall
ist, ist die Position nicht 0. Wenn
nicht, überprüfen Sie, ob Sie dem Master die
log-bin-Option angegeben und die
server-id gesetzt haben.
Läuft der Slave? Überprüfen Sie das mit SHOW
SLAVE STATUS. Die Antwort steht in der
Slave_running-Spalte. Wenn nicht,
überprüfen Sie die Slave-Optionen und überprüfen Sie die
Fehler-Log-Datei auf Meldungen.
Wenn der Slave läuft, hat er eine Verbindung mit dem Master
hergestellt? Führen Sie SHOW PROCESSLIST
aus, finden Sie den Thread mit dem System
user-Wert in der User-Spalte
und none in der
Host-Spalte und überprüfen Sie die
State-Spalte. Wenn dort steht
connecting to master, überprüfen Sie
die Berechtigungen für den Replikations-Benutzer auf dem
Master, den Master-Hostnamen, Ihre DNS-Einrichtung, ob der
Master tatsächlich läuft, ob er durch den Slave erreichbar
ist, und wenn all das in Ordnung zu sein scheint, lesen Sie
die Fehler-Log-Dateien.
Wenn der Slave lief, aber dann anhielt, schauen Sie in die Ausgabe von SHOW SLAVE STATUS und überprüfen Sie die Fehler-Log-Dateien. Das passiert üblicherweise, wenn eine Anfrage, die auf dem Master funktionierte, auf dem Slave fehlschlägt. Das sollte nie vorkommen, wenn Sie einen korrekten Schnappschuss des Masters aufgenommen haben und die Daten nie auf dem Slave ausserhalb des Slave-Threads verändern. Wenn das doch auftritt, ist es ein Bug und sollte berichtet werden.
Wenn eine Anfrage, die auf dem Master funktionierte, nicht auf dem Slave läuft, und eine komplette Datenbank-Synchronisation (das richtige, was man tun sollte) nicht ratsam erscheint, versuchen Sie folgendes:
Überprüfen Sie zunächst, ob irgend ein 'streunender'
Datensatz im Weg ist. Finden Sie heraus, wie das
geschehen konnte, dann löschen Sie ihn und lassen
SLAVE START laufen.
Wenn das Obige nicht funktioniert oder nicht zutrifft, versuchen Sie herauszufinden, ob es sicher ist, die Aktualisierung manuell durchzuführen (falls notwendig) und ignorieren Sie dann die nächste Anfrage vom Master.
Wenn Sie sich entschieden haben, dass Sie die nächste
Anfrage überspringen können, führen Sie SET
SQL_SLAVE_SKIP_COUNTER=1; SLAVE START; aus, um
eine Anfrage zu überspringen, die kein auto_increment
oder last_insert_id benutzt, ansonsten SET
SQL_SLAVE_SKIP_COUNTER=2; SLAVE START;. Der
Grund, warum auto_increment- / last_insert_id-Anfragen
anders sind, liegt darin, dass für Sie zwei Ereignisse
in der Binär-Log-Datei des Masters verzeichnet sind.
Wenn Sie sicher sind, dass der Slave perfekt mit dem Master synchronisiert gestartet ist, und dass niemand die fraglichen Tabellen ausserhalb des Slave-Threads aktualisiert hat, berichten Sie den Bug, damit wir die oben beschriebenen Tricks nicht noch einmal machen müssen.
Stellen Sie sicher, dass es sich nicht um alten Bug handelt, indem Sie auf die aktuellste Version aktualisieren.
Wenn alles Weitere fehlschlägt, lesen Sie die
Fehler-Log-Dateien. Wenn diese Groß sind, führen Sie ein
grep -i slave /pfad/zu/your-log.err auf
dem Slave durch. Es gibt kein allgemeines Muster, nach dem
man auf dem Master suchen könnte, weil die einzigen Fehler,
die dieser mitschreibt, allgemeine Systemfehler sind - falls
möglich, wird er Fehler an die Slaves senden, wenn etwas
schief ging.
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:
Stellen Sie sicher, dass kein Benutzerfehler im Spiel ist. Beispielsweise könnte der Slave ausserhalb des Slave-Threads aktualisiert werden - dann sind die Daten nicht synchronisiert und Sie haben womöglich einen Fehler wegen doppelter Schlüsseleinträge bei Aktualisierungen, wobei der Slave-Thread dann anhält und darauf wartet, dass Sie die Tabellen manuell in Ordnung und in Synchronisation bringen.
Lassen Sie den Slave mit
log-slave-updates und
log-bin laufen - das behält eine
Log-Datei aller Aktualisierungen auf dem Slave bei.
Sichern Sie alle Beweise, bevor Sie die Replikation zurück setzen. Wenn wir keine oder nur schemenhafte Informationen haben, brauchen wir eine Weile, um dem Problem auf den Grund zu gehen. Die Beweise, die Sie für uns sammeln sollten, sind:
Alle Binär-Log-Dateien auf dem Master.
Alle Binär-Log-Dateien auf dem Slave.
Die Ausgabe von SHOW MASTER STATUS
auf dem Master zu der Zeit, als Sie das Problem
entdeckten.
Die Ausgabe von SHOW SLAVE STATUS auf
dem Master zu der Zeit, als Sie das Problem entdeckten.
Fehler-Log-Dateien auf Master und Slave.
Benutzen Sie mysqlbinlog, um die
Binär-Log-Dateien zu untersuchen. Folgendes sollte
hilfreich sein, um eine Anfrage zu finden, die Probleme
verursacht, zum Beispiel:
mysqlbinlog -j pos_from_slave_status /pfad/zu/log_from_slave_status | head
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.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.