mysqld
akzeptiert folgende Kommandozeilenoptionen:
--ansi
-b, --basedir=path
--big-tables
--bind-address=IP
--character-sets-dir=path
--chroot=path
mysqld
-Daemon beim Start. Empfohlene
Sicherheitsmaßnahme. Wird allerdings LOAD DATA INFILE
und
SELECT ... INTO OUTFILE
etwas einschränken.
--core-file
mysqld
stirbt. Auf manchen Systemen
müssen Sie zusätzliche --core-file-size
für safe_mysqld
angeben. See section 5.7.2 safe_mysqld, der Wrapper um mysqld.
-h, --datadir=path
--default-character-set=charset
--default-table-type=type
--debug[...]=
--with-debug
konfiguriert ist, können Sie diese
Option benutzen, um eine Trace-Datei darüber zu erhalten, was mysqld
tut. See section E.1.2 Trace-Dateien erzeugen.
--delay-key-write-for-all-tables
MyISAM
-Tabellen nicht
leeren (flush).
See section 6.5.2 Serverparameter tunen.
--enable-locking
-T, --exit-info
--flush
-?, --help
--init-file=file
-L, --language=...
-l, --log[=datei]
--log-isam[=datei]
--log-slow-queries[=datei]
long_query_time
Sekunden für die
Ausführung benötigt haben, in datei. See section 5.9.5 Die Anfragen-Log-Datei für langsame Anfragen.
--log-update[=datei]
datei.#
, wobei #
eine eindeutige Zahl ist,
falls nicht vorgegeben.
See section 5.9.3 Die Update-Log-Datei.
--log-long-format
--log-slow-queries
benutzen, werden Anfragen, die keine Indexe
benutzen, in die Langsame-Anfragen-Log-Datei geloggt.
--low-priority-updates
INSERT
/DELETE
/UPDATE
), haben geringere Priorität als
Selects. Das kann auch mit {INSERT | REPLACE | UPDATE | DELETE}
LOW_PRIORITY ...
durchgeführt werden, um lediglich die Priorität einer
einzelnen Anfrage zu verringern, oder mit SET OPTION
SQL_LOW_PRIORITY_UPDATES=1
, um die Priorität in einem Thread zu ändern.
See section 6.3.2 Themen, die Tabellensperren betreffen.
--memlock
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
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. |
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
safe_mysqld
benutzt wird.
-P, --port=...
-o, --old-protocol
--one-thread
-O, --set-variable var=option
--help
listet Variablen auf.
Sie finden eine komplette Beschreibung aller Variablen im SHOW
VARIABLES
-Abschnitt dieses Handbuchs. See section 5.5.5.4 SHOW VARIABLES
. Der Abschnitt
über das Tunen der Serverparameter enthält Informationen darüber, wie man
diese optimiert. See section 6.5.2 Serverparameter tunen.
--safe-mode
--skip-delay-key-write
voraus.
--safe-show-database
--safe-user-create
INSERT
-Zugriffsrecht
auf die mysql.user
-Tabelle oder irgend welche Spalten dieser Tabelle
hat.
--skip-concurrent-insert
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
delay_key_write
-Option für alle Tabellen ignorieren.
See section 6.5.2 Serverparameter tunen.
--skip-grant-tables
mysqladmin
flush-privileges
oder mysqladmin reload
ausführen.)
--skip-host-cache
--skip-locking
isamchk
oder myisamchk
auszuführen, müssen Sie den Server herunter fahren. See section 2.2.2 Wie stabil ist MySQL?.
Beachten Sie, dass Sie in MySQL-Version 3.23 REPAIR
und CHECK
benutzen können, um MyISAM
-Tabellen zu reparieren / zu prüfen.
--skip-name-resolve
Host
-Spaltenwerte in den
Berechtigungstabellen müssen IP-Nummern oder localhost
sein.
See section 6.5.5 Wie MySQL DNS benutzt.
--skip-networking
mysqld
muss über Unix-Sockets erfolgen. Diese Option wird
ausdrücklich empfohlen für Systeme, auf denen nur lokale Anfragen
(Requests) erlaubt sind. See section 6.5.5 Wie MySQL DNS benutzt.
--skip-new
--skip-delay-key-write
voraus. Setzt ausserdem den vorgabemäßigen
Tabellentyp auf ISAM
. See section 8.3 ISAM-Tabellen.
--skip-symlink
--skip-safemalloc
--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
--skip-stack-trace
mysqld
unter einem Debugger laufen lassen. See section E.1 Einen MySQL-Server debuggen.
--skip-thread-priority
--socket=pfad
/tmp/mysql.sock
für
lokale Verbindungen benutzt wird.
--sql-mode=option[,option[,option...]]
REAL_AS_FLOAT
,
PIPES_AS_CONCAT
, ANSI_QUOTES
, IGNORE_SPACE
,
SERIALIZE
und ONLY_FULL_GROUP_BY
sein. Sie kann auch leer
sein (""
), wenn Sie dies zurücksetzen wollen.
Alle oben angegebenen Optionen festlegen ist dasselbe wie --ansi benutzen.
Mit dieser Option kann man nur benötigte SQL-Modi anschalten.
See section 2.7.2 MySQL im ANSI-Modus laufen lassen.
transaction-isolation= { READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE }
SET TRANSACTION
-Syntax.
-t, --tmpdir=pfad
/tmp
-Verzeichnis auf einer Partition liegt, die zu klein ist, um
temporäre Tabellen zu speichern.
-u, --user=benutzername
mysqld
-Daemon unter dem Benutzer benutzername
laufen
lassen. Diese Option ist zwingend notwendig, wenn mysqld
als
Root gestartet wird.
-V, --version
-W, --warnings
Aborted connection...
in die .err
-Datei
ausgeben. See section 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 section F Umgebungsvariablen.
Folgende Programme unterstützen Optionsdateien: mysql
,
mysqladmin
, mysqld
, mysqldump
, mysqlimport
,
mysql.server
, myisamchk
und myisampack
.
Sie können Optionsdateien benutzen, um jede beliebig lange Option
festzulegen, die ein Programm unterstützt! Starten Sie das Programm mit
--help
, um eine Liste der verfügbaren Optionen zu erhalten.
Eine Optionsdatei kann Zeilen der folgenden Formate enthalten:
#Kommentar
[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
--option
auf der Kommandozeile.
option=value
--option=value
auf der Kommandozeile.
set-variable = variable=value
--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.sock shell> MYSQL_TCP_PORT=3307 shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT shell> scripts/mysql_install_db shell> bin/safe_mysqld &
Der Umgebungsvariablen-Appendix beinhaltet eine Liste anderer
Umgebungsvariablen, die Sie benutzen können, um mysqld
zu steuern.
See section F Umgebungsvariablen.
Der oben gezeigte Weg ist die 'schnelle und schmutzige' Lösung, die man üblicherweise zum Testen benutzt. Das nette daran ist, dass alle Verbindungen, die Sie in obiger Shell aufbauen, automatisch an den neuen laufenden Server weiter geleitet werden!
Wenn Sie dasselbe dauerhafter durchführen wollen, sollten Sie für jeden Server eine Optionsdatei erzeugen. See section 5.1.2 my.cnf-Optionsdateien. In Ihrem Startskript, das beim Hochfahren ausgeführt wird (mysql.server?) sollten Sie für beide Server folgendes festlegen:
safe_mysqld --default-file=pfad-zur-optionsdatei
Zumindest folgende Optionen sollten für jeden Server unterschiedlich sein:
port=#
socket=pfad
pid-file=pfad
Folgende Optionen sollten unterschiedlich sein, wenn sie benutzt werden:
log=pfad
log-bin=pfad
log-update=pfad
log-isam=pfad
bdb-logdir=pfad
Wenn Sie mehr Performance erreichen wollen, können Sie auch folgendes unterschiedlich festlegen:
tmpdir=pfad
bdb-tmpdir=pfad
See section 5.1.1 mysqld-Kommandozeilenoptionen.
Wenn Sie binäre MySQL-Versionen installieren (.tar-Dateien) und sie mit
./bin/safe_mysqld
starten, müssen Sie in den meisten Fällen
lediglich die socket
- und port
-Argumente in
safe_mysqld
hinzufügen / ändern.
Unter bestimmten Umständen wollen Sie vielleicht mehrere Server auf derselben Maschine laufen lassen. Beispielsweise wollen Sie ein neues MySQL-Release testen, Ihre bestehende Produktionseinrichtung aber unangetastet lassen. Oder Sie sind ein Internet-Service-Provider, der unabhängige MySQL-Installationen für verschiedene Kunden hat.
Wenn Sie mehrere Server laufen lassen wollen, ist es am einfachsten, die Server mit unterschiedlichen TCP/IP-Ports und Socket-Dateien laufen zu lassen, damit sie nicht beide auf demselben TCP/IP-Port oder derselben Socket-Datei auf Verbindungen warten. See section 5.7.3 mysqld_multi, Programm zur Verwaltung mehrerer MySQL-Server.
Nehmen wir einen existierenden Server an, der auf die existierende
Port-Nummer und Socket-Datei konfiguriert ist. Sie konfigurieren einen
neuen Server mit einem configure
-Befehl, etwa wie folgt:
shell> ./configure --with-tcp-port=port_nummer \ --with-unix-socket-path=datei \ --prefix=/usr/local/mysql-3.22.9
Hier müssen port_nummer
und datei
anders als die
vorgabemäßigen Werte sein. Der --prefix
-Wert sollte ein
Installationsverzeichnis festlegen, das anders ist als dasjenige, unter dem
die existierende MySQL-Installation liegt.
Sie können den Socket, der vom aktuell laufenden MySQL-Server benutzt wird, mit folgendem Befehl feststellen:
shell> mysqladmin -h hostname --port=port_nummer variables
Wenn Sie ``localhost
'' als Hostnamen festlegen, benutzt
mysqladmin
Unix-Sockets anstelle von TCP/IP.
Wenn Sie einen MySQL-Server auf dem Port laufen haben, den Sie benutzt haben, bekommen Sie eine Liste der wichtigsten konfigurierbaren Variablen in MySQL, inklusive des Socketnamens.
Sie müssen keinen neuen MySQL-Server kompilieren, nur um ihn mit einem
anderen Port und Socket zu starten. Sie können Port und Socket zur Laufzeit
als Optionen von safe_mysqld
festlegen:
shell> /pfad/zu/safe_mysqld --socket=datei --port=port_nummer
mysqld_multi
kann ebenfalls safe_mysqld
(oder mysqld
)
als Argument nehmen und die Optionen von einer Konfigurationsdatei an
safe_mysqld
und weiter an mysqld
durchreichen.
Wenn Sie den neuen Server mit demselben Datenbankverzeichnis laufen lassen
und Loggen angeschaltet haben, sollten Sie auch den Namen der Logdateien
für safe_mysqld
mit --log
, --log-update
oder
--log-slow-queries
festlegen. Ansonsten versuchen beide Server, in
dieselbe Logdatei zu schreiben.
ACHTUNG: Normalerweise sollten Sie nie zulassen, dass zwei Server Daten in derselben Datenbank aktualisieren! Wenn Ihr Betriebssystem kein fehlerfreies System-Sperren (System Locking) unterstützt, führt das zu unliebsamen Überraschungen!
Wenn Sie für den zweiten Server ein anderes Datenbankverzeichnis benutzen
wollen, können Sie das mit der --datadir=path
-Option für
safe_mysqld
angeben.
HINWEIS: Mehrere MySQL-Server (mysqld
) auf verschiedenen
Maschinen laufen lassen, die auf ein gemeinsames Datenverzeichnis über
NFS
zugreifen, ist generell eine SCHLECHTE IDEE! Das
Problem liegt darin, dass NFS
zum Flaschenhals in Punkto
Geschwindigkeit wird, denn es ist nicht für solche Zwecke gedacht. Und
letztlich müssten Sie immer noch eine Lösung dafür finden, dass sich zwei
oder mehr mysqlds
nicht in die Quere kommen. Momentan gibt es keine
Plattform, die mit 100%-iger Zuverlässigkeit Datei-Sperren (File Locking,
gewöhnlich mit dem lockd
-Daemon) in jeder Situation durchführt.
Dennoch stellt NFS
ein weiteres mögliches Risiko dar, denn es macht
es dem lockd
-Daemon noch schwieriger, Datei-Sperren zu handhaben.
Machen Sie es sich also leicht und vergessen Sie diese Idee! Die
funktionierende Lösung ist, einen Computer mit einem Betriebssystem
einzusetzen, dass Threads effizient handhabt und mehrere Prozessoren hat.
Wenn Sie sich mit einem MySQL-Server verbinden wollen, der mit einem anderen Port läuft als mit dem, der in Ihren Client kompiliert ist, können Sie folgende Methoden benutzen:
--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.
DBD::mysql
-Modul benutzen, können Sie die Optionen
aus den MySQL-Optionsdateien lesen. See section 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);
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 section F Umgebungsvariablen.
MySQL 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:
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.
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:
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.
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.
MD5()
oder eine
andere Einweg-Hash-Funktion.
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 3306Wenn 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.
; 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:
%22
(`"'), %23
(`#') und %27
(`'') zu den URLs
hinzufügen.
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.
mysql_escape_string()
-API-Aufruf an.
escape
- und quote
-Modifier für
Query-Streams an.
quote()
-Methode an oder benutzen Sie
Platzhalter.
PreparedStatement
-Objekt und Platzhalter.
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:
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 mysql mysql> UPDATE user SET Password=PASSWORD('neues_passwort') WHERE user='root'; mysql> FLUSH PRIVILEGES;
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=mysqlDas 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 section 5.3.3 Wann Berechtigungsänderungen wirksam werden.
--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 section 6.6.1.2 Benutzung symbolischer Links für Tabellen.
mysqld
laufen läßt, der
einzige Benutzer mit Lese-/Schreibzugriffen auf die Datenbankverzeichnisse
ist.
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.
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.
max_user_Verbindungen
-Variable in mysqld
setzen.
mysqld
in Bezug auf Sicherheit
Folgende mysqld
-Optionen berühren Sicherheitsaspekte:
--safe-show-database
SHOW DATABASES
nur die Datenbanken zurück,
für die der Benutzer irgend welche Rechte hat.
--safe-user-create
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
mysqladmin flush-privileges
oder
mysqladmin reload
ausführen.)
--skip-name-resolve
Host
-Spaltenwerte in den
Berechtigungstabellen müssen IP-Nummern oder localhost
sein.
--skip-networking
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
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:
Der Server benutzt die user
-, db
- und host
-Tabellen in
der mysql
-Datenbank in beiden Phasen der Zugriffskontrolle. Die
Felder in diesen Berechtigungstabellen sind unten dargestellt:
Tabellenname | user | db | host
|
Geltungsbereichs-Felder | Host | Host | Host
|
User | Db | Db
| |
Password | User | ||
Berechtigungs-Felder | Select_priv | Select_priv | Select_priv
|
Insert_priv | Insert_priv | Insert_priv
| |
Update_priv | Update_priv | Update_priv
| |
Delete_priv | Delete_priv | Delete_priv
| |
Index_priv | Index_priv | Index_priv
| |
Alter_priv | Alter_priv | Alter_priv
| |
Create_priv | Create_priv | Create_priv
| |
Drop_priv | Drop_priv | Drop_priv
| |
Grant_priv | Grant_priv | Grant_priv
| |
References_priv | |||
Reload_priv | |||
Shutdown_priv | |||
Process_priv | |||
File_priv |
In der zweiten Phase der Zugriffskontrolle (Anfrage-Verifikation), zieht
der Server gegebenenfalls zusätzlich die tables_priv
- und
columns_priv
-Tabellen heran, falls Ihre Anfrage Tabellen betrifft.
Die Felder in diesen Tabellen sind unten dargestellt:
Tabellenname | tables_priv | columns_priv
|
Geltungsbereichs-Felder | Host | Host
|
Db | Db
| |
User | User
| |
Table_name | Table_name
| |
Column_name
| ||
Berechtigungs-Felder | Table_priv | Column_priv
|
Column_priv | ||
Sonstige Felder | Timestamp | Timestamp
|
Grantor |
Jede Berechtigungstabelle enthält Geltungsbereichsfelder und Berechtigungsfelder.
Geltungsbereichsfelder legen den Geltungsbereich jedes Eintrags in den
Tabellen fest, das heißt, der Kontext, für den der Eintrag gilt. So würde
zum Beispiel ein user
-Tabelleneintrag mit Host
- und
User
-Werten von 'thomas.loc.gov'
und 'bob'
benutzt
werden, um Verbindungen zum Server zu authentifizieren, die von bob
vom Host thomas.loc.gov
gemacht werden. In ähnlicher Weise bewirkt
ein db
-Tabelleneintrag in die Felder Host
, User
und
Db
mit 'thomas.loc.gov'
, 'bob'
und 'reports'
,
dass diese benutzt werden, wenn sich bob
vom Host
thomas.loc.gov
verbindet und auf die reports
-Datenbank zugreift.
Die tables_priv
- und columns_priv
-Tabellen enthalten
Geltungsbereichsfelder, die Tabellen oder Tabellen-Spalten-Kombinationen
angeben, auf die sich der jeweilige Eintrag bezieht.
Für Zwecke der Zugriffsprüfung sind Vergleiche von Host
-Werten
unabhängig von der verwendeten Groß-/Kleinschreibung. User
,
Password
, Db
und Table_name
-Werte sind abhängig von
der verwendeten Groß-/Kleinschreibung. Column_name
-Werte sind ab
MySQL-Version 3.22.12 unabhängig von der verwendeten
Groß-/Kleinschreibung.
Berechtigungsfelder zeigen die Berechtigungen an, die durch den Tabelleneintrag gewährt werden, das heißt, welche Operationen durchgeführt werden können. Der Server kombiniert die Informationen in den verschiedenen Berechtigungstabellen, um daraus eine komplette Beschreibung der Berechtigungen des Benutzers zu formulieren. Die Regeln, nach denen hierbei vorgegangen wird, sind in section 5.2.9 Zugriffskontrolle, Phase 2: Anfrageüberprüfung beschrieben.
Geltungsbereichsfelder sind Zeichenketten, die wie unten dargestellt deklariert werden. Der Vorgabewert für jedes Feld ist die leere Zeichenkette:
Feldname | Typ | |
Host | CHAR(60)
| |
User | CHAR(16)
| |
Password | CHAR(16)
| |
Db | CHAR(64) | (CHAR(60) für
die tables_priv - und columns_priv -Tabellen)
|
Table_name | CHAR(60)
| |
Column_name | CHAR(60)
|
In den user
-, db
- und host
-Tabellen werden alle Felder
als ENUM('N','Y')
deklariert. Jedes Feld kann einen Wert von
'N'
oder 'Y'
haben. Der Vorgabewert ist 'N'
.
In den tables_priv
- und columns_priv
-Tabellen werden Felder
als SET
-Felder deklariert:
Tabellenname | Feldname | Mögliche Set-Elemente |
tables_priv | Table_priv | 'Select', 'Insert',
'Update', 'Delete', 'Create', 'Drop', 'Grant', 'Referenzs', 'Index', 'Alter'
|
tables_priv | Column_priv | 'Select', 'Insert',
'Update', 'References'
|
columns_priv | Column_priv | 'Select', 'Insert',
'Update', 'References'
|
Kurz gesagt benutzt der Server die Berechtigungstabellen wie folgt:
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.
db
- und host
-Tabellen werden zusammen benutzt:
db
-Tabelle legen fest, welche
Benutzer auf welche Datenbanken von welchen Hosts aus zugreifen können. Die
Berechtigungsfelder legen fest, welche Operationen zugelassen sind.
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
section 5.2.9 Zugriffskontrolle, Phase 2: Anfrageüberprüfung beschrieben.
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 section 5.3.3 Wann Berechtigungsänderungen wirksam werden geschildert.
Wenn Sie die Inhalte der Berechtigungstabellen ändern, sollten Sie
sicherstellen, dass Ihre Änderungen Berechtigungen einführen, die Sie so
haben wollen. Hilfe bei der Diagnose von Problemen finden Sie unter
section 5.2.10 Gründe für Access denied
-Fehler. Hinweise zu Sicherheitsthemen finden Sie unter
see section 5.2.2 Wie Sie MySQL gegen Cracker sicher machen.
Ein nützliches Diagnosetool ist das mysqlaccess
-Skript, das Yves
Carlier für die MySQL-Distribution bereit gestellt hat. Rufen Sie
mysqlaccess
mit der --help
-Option auf, um herauszufinden, wie
es funktioniert. Beachten Sie, dass mysqlaccess
den Zugriff nur
anhand der user
-, db
- und host
-Tabellen überprüft. Es
überprüft keine Tabellen- oder Spaltenebenen-Berechtigungen.
Informationen über Benutzerberechtigungen sind in den user
-,
db
-, host
-, tables_priv
- und
columns_priv
-Tabellen in der mysql
-Datenbank gespeichert (das
heißt in der Datenbank, die mysql
heißt). Der MySQL-Server liest
die Inhalte dieser Tabellen, wenn er startet, und in den Fällen, die unter
section 5.3.3 Wann Berechtigungsänderungen wirksam werden geschildert sind.
Die Namen, die in diesem Handbuch benutzt werden, um auf die Berechtigungen zu verweisen, die MySQL zur Verfügung stellt, sind unten dargestellt, zusammen mit den Tabellenspaltennamen, die jeder Berechtigung in the Berechtigungstabellen zugeordnet sind, und dem Kontext, auf den die Berechtigung zutrifft.
Berechtigung | Spalte | Kontext |
select | Select_priv | Tabellen |
insert | Insert_priv | Tabellen |
update | Update_priv | Tabellen |
delete | Delete_priv | Tabellen |
index | Index_priv | Tabellen |
alter | Alter_priv | Tabellen |
create | Create_priv | Datenbanken, Tabellen oder Indexe |
drop | Drop_priv | Datenbanken oder Tabellen |
grant | Grant_priv | Datenbanken oder Tabellen |
References | References_priv | Datenbanken oder Tabellen |
reload | Reload_priv | Serververwaltung |
shutdown | Shutdown_priv | Serververwaltung |
process | Process_priv | Serververwaltung |
file | File_priv | Dateizugriff auf den Server |
Die select-, insert-, update- und delete-Berechtigungen erlauben Ihnen, Operationen auf Zeilen in existierenden Tabellen in einer Datenbank durchzuführen.
SELECT
-Statements erfordern die select-Berechtigung nur
dann, wenn tatsächlich Zeilen aus einer Tabelle abgerufen werden. Sie
können bestimmte SELECT
-Statements selbst ohne Berechtigung
durchführen, um auf jede der Datenbanken auf dem Server zuzugreifen.
Beispielsweise könnten Sie den mysql
-Client als einfachen
Taschenrechner benutzen:
mysql> SELECT 1+1; mysql> SELECT PI()*2;
Die index-Berechtigung erlaubt Ihnen, Indexe zu erzeugen oder zu entfernen.
Die alter-Berechtigung erlaubt Ihnen, ALTER TABLE
zu
benutzen.
Die create- und drop-Berechtigungen erlauben Ihnen, neue Datenbanken und Tabellen zu erzeugen oder bestehende Datenbanken und Tabellen zu entfernen.
Denken Sie daran, dass ein Benutzer, dem Sie die drop-Berechtigung
für die mysql
-Datenbank gewähren, in der Lage ist, die Datenbank zu
löschen, in der die MySQL-Zugriffsberechtigungen gespeichert sind!
Die grant-Berechtigung erlaubt Ihnen, die Berechtigungen, die Sie selbst besitzen, an andere Benutzer zu vergeben.
Die file-Berechtigung erlaubt Ihnen, Dateien auf dem Server zu
lesen und zu schreiben, wenn Sie die LOAD DATA INFILE
- und
SELECT ... INTO OUTFILE
-Statements benutzen. Jeder Benutzer, dem
diese Berechtigung gewährt wurde, kann jedwede Datei lesen oder schreiben,
die der MySQL-Server lesen oder schreiben darf.
Die restlichen Berechtigungen werden für Verwaltungsoperationen benutzt,
die mit dem mysqladmin
-Programm durchgeführt werden. Die unten
stehende Tabelle zeigt, welche mysqladmin
-Befehle mit jeder
Verwaltungsberechtigung ausgeführt werden können:
Berechtigung | Befehle, die dem Berechtigten erlaubt sind |
reload | reload , refresh ,
flush-privileges , flush-hosts , flush-logs und
flush-tables
|
shutdown | shutdown
|
process | processlist , kill
|
Der reload
-Befehl weist den Server an, die Berechtigungstabellen neu
einzulesen. Der refresh
-Befehl schreibt alle Tabellen auf Platte
(flush) und öffnet und schließt die Log-Dateien. flush-privileges
ist ein Synonym für reload
. Die anderen flush-*
-Befehle
führen Funktionen aus, die refresh
ähnlich sind, aber im Umfang
beschränkter und daher in einigen Fällen zu bevorzugen. Wenn Sie zum
Beispiel nur die Log-Dateien flushen wollen, ist flush-logs
refresh
vorzuziehen.
Der shutdown
-Befehl fährt den Server herunter.
Der processlist
-Befehl zeigt Informationen über die Threads an, die
im Server ausgeführt werden. Der kill
-Befehl killt Server-Threads.
Ihre eigenen Threads können Sie jederzeit anzeigen oder killen, aber Sie
brauchen die process-Berechtigung, um Threads anzuzeigen oder zu
killen, die von anderen Benutzern initiiert wurden. See section 5.5.4 KILL
-Syntax.
Es ist generell eine gute Idee, Berechtigungen nur den Nutzern zu gewähren, die diese tatsächlich brauchen, aber speziell bei folgenden Berechtigungen sollten Sie besondere Vorsicht walten lassen:
SELECT
zugegriffen werden kann. Das beinhaltet die
Inhalte aller Datenbanken, die vom Server gehostet werden!
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:
MySQL-Client-Programme erfordern im Allgemeinen, dass Sie
Verbindungsparameter festlegen, wenn Sie sich mit einem MySQL-Server
verbinden wollen: Der Host, mit dem Sie sich verbinden wollen, Ihr
Benutzername und Ihr Passwort. Beispielsweise kann der mysql
-Client
wie folgt gestartet werden (optionale Argumente sind in `[' und
`]' eingeschlossen):
shell> mysql [-h hostname] [-u benutzername] [-pihr_passwort]
Alternative Formen der -h
-, -u
- und -p
-Optionen sind
--host=hostname
, --user=benutzername
und
--password=ihr_passwort
. Beachten Sie, dass zwischen -p
oder
--password=
und dem folgenden Passwort kein Leerzeichen
steht!
ACHTUNG: Ein Passwort auf der Kommandozeile anzugeben ist nicht
sicher! Jeder Benutzer auf Ihrem System kann dann Ihr Passwort
herausfinden, indem er einen Befehl wie ps auxww
eingibt.
See section 5.1.2 my.cnf-Optionsdateien.
mysql
benutzt Vorgabewerte für Verbindungsparameter, die auf der
Kommandozeile nicht angegeben sind:
localhost
.
-p
fehlt.
Für einen Unix-Benutzer joe
sind daher folgende Befehle
gleichbedeutend:
shell> mysql -h localhost -u joe shell> mysql -h localhost shell> mysql -u joe shell> mysql
Andere MySQL-Clients verhalten sich ähnlich.
Auf Unix-Systemen können Sie andere Vorgabewerte festlegen, die benutzt werden, wenn Sie eine Verbindung aufmachen, so dass Sie diese nicht jedes Mal auf der Kommandozeile eingeben müssen, wenn Sie ein Client-Programm aufrufen. Das kann auf verschiedene Weise gemacht werden:
[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_passwortSee section 5.1.2 my.cnf-Optionsdateien.
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 section F 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:
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:
Host
-Wert kann ein Hostname oder eine IP-Nummer sein, oder
'localhost'
, was die lokale Maschine angibt.
Host
-Feld
benutzen.
Host
-Wert '%'
stimmt mit jedem Hostnamen überein.
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.
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.
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).
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 section 5.3.1 GRANT
- und REVOKE
-Syntax. (Hilfreich
sind die Ausführungen unter section 5.2.5 Wie das Berechtigungssystem funktioniert, wo die Felder aufgelistet
sind, die sich in jeder der Berechtigungstabellen finden.)
Die user
-Tabelle gewährt Berechtigungen, die Ihnen auf globaler
Ebene zugeordnet sind und die unabhängig von der gerade aktuellen Datenbank
zutreffen. Wenn beispielsweise die user
-Tabelle Ihnen die
delete-Berechtigung gewährt, können Sie Zeilen aus jeder Datenbank
auf dem Server-Host löschen! Mit anderen Worten: Berechtigungen in der
user
-Tabelle sind Superuser-Berechtigungen. Es ist klug,
Berechtigungen in der user
-Tabelle nur Superusern wie Server- oder
Datenbankverwaltern zu gewähren. Bei anderen Benutzern sollten Sie
Berechtigungen in der user
-Tabelle auf 'N'
gesetzt lassen und
Berechtigungen nur auf Datenbank-Ebene gewähren, indem Sie die db
-
und host
-Tabellen benutzen.
Die db
- und host
-Tabellen gewähren Datenbank-spezifische
Berechtigungen. Werte in den Geltungsbereichs-Feldern können wie folgt
festgelegt werden:
Host
- und
Db
-Feldern jeder Tabelle benutzt werden.
'%'
-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''.
'%'
- oder leerer Host
-Wert in der host
-Tabelle
bedeutet ``jeder Host''.
'%'
- oder leerer Db
-Wert in einer der Tabellen bedeutet
``jede Datenbank''.
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:
Host
-Feld
beider Tabellen benutzt werden.
'%'
- oder leerer Host
-Wert in jeder der beiden Tabellen bedeutet ``jeder Host.''
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:
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.
db
-Tabelleneintrag gibt und das
Host
-Feld nicht leer ist, bestimmt dieser Eintrag die
Datenbank-spezifischen Berechtigungen des Benutzers.
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.
Access denied
-Fehler
Wenn Sie beim Verbindungsversuch zu einem MySQL-Server Access
denied
-Fehler bekommen, gibt Ihnen die folgende Liste ein paar Hinweise,
das Problem zu beheben:
mysql_install_db
-Skript laufen lassen, um die anfänglichen
Berechtigungstabelleninhalte zu konfigurieren? Wenn nicht, tun Sie das!
See section 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 testDer 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.
shell> mysql -u root mysqlDer 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 mysqlheiß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.
shell> mysqladmin -u root -pxxxx ver Access denied for user: 'root@localhost' (Using password: YES)bedeutet das, dass Sie ein falsches Passwort benutzen. See section 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 section 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
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.
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 section 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.)
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.
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.
user
-Tabelle, die mit Ihrem Host übereinstimmt:
Host ... is not allowed to connect to this MySQL serverDas 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.
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 section 6.5.5 Wie MySQL DNS benutzt.
Einige dauerhafte Lösungen sind:
mysqld
mit --skip-name-resolve
.
mysqld
mit --skip-host-cache
.
localhost
wenn Sie Server und Client auf
derselben Maschine laufen lassen.
/etc/hosts
ein.
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!)
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.
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.
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.
db
- oder der host
-Tabelle:
Access to database deniedWenn 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.
Access denied
erhalten, stellen
Sie sicher, dass Sie kein altes Passwort in irgendeiner Optionsdatei
angegeben haben! See section 5.1.2 my.cnf-Optionsdateien.
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!
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.)
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.
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 section E.1.2 Trace-Dateien erzeugen.
mysqldump
mysql
-Befehl erzeugen. Berichten Sie Ihr Problem - wie immer - unter
Benutzung des mysqlbug
-Skripts. See section 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:
mysql.user
-Tabelle
gespeichert.
mysql.db
- und
mysql.host
-Tabellen gespeichert.
mysql.tables_priv
-Tabelle
gespeichert.
mysql.columns_priv
-Tabelle gespeichert.
Wenn Sie ein GRANT
für einen Benutzer angeben, den es nicht gibt,
wird dieser Benutzer erzeugt. Beispiele, wie GRANT
funktioniert,
finden Sie unter section 5.3.5 Neue MySQL-Benutzer hinzufügen.
Bei GRANT
und REVOKE
-Statements kann berechtigung_art
wie folgt angegeben werden:
ALL PRIVILEGES FILE RELOAD ALTER INDEX SELECT CREATE INSERT SHUTDOWN DELETE PROCESS UPDATE DROP REFERENCES USAGE
ALL
ist ein Synonym für ALL PRIVILEGES
. REFERENCES
ist
noch nicht implementiert. USAGE
ist momentan ein Synonym für ``keine
Berechtigungen''. Es kann benutzt werden, um einen Benutzer zu erzeugen,
der keine Berechtigungen hat.
Um einem Benutzer die grant-Berechtigung zu entziehen, benutzen
Sie einen berechtigung_art
-Wert GRANT OPTION
:
REVOKE GRANT OPTION ON ... FROM ...;
Die einzigen berechtigung_art
-Werte, die Sie für eine Tabelle
festlegen können, sind SELECT
, INSERT
, UPDATE
,
DELETE
, CREATE
, DROP
, GRANT
, INDEX
und
ALTER
.
Die einzigen berechtigung_art
-Werte, die Sie für eine Spalte
festlegen können (im Falle, dass Sie eine spalten_liste
-Klausel
benutzen), sind SELECT
, INSERT
und UPDATE
.
Sie können globale Berechtigungen setzen, indem Sie die ON
*.*
-Syntax benutzen. Datenbank-Berechtigungen setzen Sie mit der ON
datenbank.*
-Syntax. Wenn Sie ON *
setzen und eine aktuelle
Datenbank ausgewählt haben, setzen Sie die Berechtigungen für diese
Datenbank. (ACHTUNG: Wenn Sie ON *
festlegen und
keine aktuelle Datenbank ausgewählt haben, betrifft das die globalen
Berechtigungen!)
Um die Rechtegewährung für Benutzer von uneindeutigen Hosts aus zu
ermöglichen, unterstützt MySQL den benutzername
-Wert in der Form
benutzer@host
. Wenn Sie eine user
-Zeichenkette festlegen
wollen, die Sonderzeichen enthält (wie `-'), oder eine
host
-Zeichenkette, die Sonderzeichen oder Platzhalterzeichen enthält
(wie `%'), können Sie Benutzernamen oder Hostnamen in
Anführungszeichen setzen (beispielsweise 'test-benutzer'@'test-hostname'
).
Sie können im Hostnamen Platzhalter angeben. benutzer@"%.loc.gov"
zum Beispiel trifft auf benutzer
für jeden Host in der Domäne
loc.gov
zu. benutzer@"144.155.166.%"
trifft auf
benutzer
für jeden Host im 144.155.166
-Class-C-Subnetz zu.
Die einfache Form benutzer
ist ein Synonym für
benutzer@"%"
. ACHTUNG: Wenn Sie anonymen Benutzern
erlauben, sich mit dem MySQL-Server zu verbinden (was vorgabemäßig der
Fall ist), sollten Sie auch alle lokalen Benutzer als
benutzer@localhost
hinzufügen, weil ansonsten der Eintrag für den
anonymen Benutzer für den lokalen Host in der mysql.user
-Tabelle
benutzt wird, wenn der Benutzer versucht, sich von der lokalen Maschine in
den MySQL-Server einzuloggen! Anonyme Benutzer werden definiert, indem
Einträge mit User=''
in die mysql.user
-Tabelle eingefügt
werden. Das können Sie mit folgender Anfrage überprüfen:
mysql> SELECT Host,User FROM mysql.user WHERE User='';
Momentan unterstützt GRANT
nur Host-, Datenbank-, Tabellen- und
Spaltennamen mit maximal 60 Zeichen. Ein Benutzername kann bis zu 16
Zeichen lang sein.
Die Berechtigungen für eine Tabelle oder Spalte werden durch ein logisches
ODER der Berechtigungen auf jeder der vier Berechtigungsebenen zusammen
gesetzt. Wenn die mysql.user
-Tabelle beispielsweise festlegt, dass
ein Benutzer eine globalen select-Berechtigung hat, kann diese
nicht durch Einträge auf Datenbank-, Tabellen- oder Spaltenebene widerrufen
werden.
Die Berechtigungen für eine Spalte können wie folgt berechnet werden:
Globale Berechtigungen ODER (Datenbank-Berechtigungen UND Host-Berechtigungen) ODER Tabellen-Berechtigungen ODER Spalten-Berechtigungen
In den meisten Fällen können Sie einem Benutzer Rechte auf lediglich einer der Berechtigungsebenen gewähren, wodurch das Leben nicht so kompliziert ist wie oben dargestellt. Die Details der Prozedur zur Überprüfung der Berechtigungen sind in section 5.2 Allgemeine Sicherheitsthemen und das MySQL-Zugriffsberechtigungssystem dargestellt.
Wenn Sie Berechtigungen für eine Benutzer-/Hostname-Kombination gewähren,
die in der mysql.user
-Tabelle nicht existiert, wird ein Eintrag
hinzugefügt und verbleibt dort, bis der mit einem DELETE
-Befehl
gelöscht wird. Mit anderen Worten: GRANT
kann eventuell
user
-Tabelleneinträge erzeugen, aber REVOKE
entfernt diese
nicht, sondern Sie müssen das explizit mit DELETE
machen.
Ab MySQL-Version 3.22.12 wird, wenn ein neuer Benutzer erzeugt wird oder
wenn Sie globale Grant-Berechtigungen haben, das Passwort des Benutzers
durch die IDENTIFIED BY
-Klausel festgelegt, wenn eine angegeben
wird. Wenn der Benutzer bereits ein Passwort hat, wird es durch das neue
ersetzt.
ACHTUNG: Wenn Sie einen neuen Benutzer anlegen, aber keine
IDENTIFIED BY
-Klausel angeben, hat der neue Benutzer kein Passwort.
Das ist unsicher.
Passwörter können auch mit dem SET PASSWORD
-Befehl gesetzt werden.
See section 6.5.6 SET
-Syntax.
Wenn Sie Berechtigungen für eine Datenbank gewähren, wird ein Eintrag in
der mysql.db
-Tabellen erzeugt, falls notwendig. Wenn alle
Berechtigungen für die Datenbank mit REVOKE
widerrufen wurden, wird
dieser Eintrag gelöscht.
Wenn ein Benutzer überhaupt keine Berechtigungen auf eine Tabelle hat, wird
die Tabelle nicht angezeigt, wenn der Benutzer nach einer Liste von
Tabellen anfragt (zum Beispiel mit einem SHOW TABLES
-Statement).
Die mit GRANT OPTION
-Klausel gibt dem Benutzer die Möglichkeit,
anderen Benutzern jegliche der Berechtigungen zu vergeben, die der Benutzer
auf der angegebenen Berechtigungsebene hat. Sie sollten vorsichtig damit
sein, wem Sie die grant-Berechtigung geben, denn zwei Benutzer mit
unterschiedlichen Berechtigungen können in der Lage sein, Ihre
Berechtigungen zu addieren!
Sie können einem Benutzer keine Berechtigung gewähren, die Sie selbst nicht haben; die grant-Berechtigung erlaubt Ihnen nur, die Berechtigungen zu vergeben, die Sie selbst besitzen.
Wenn Sie einem Benutzer die grant-Berechtigung auf einer
bestimmten Berechtigungsebene geben, denken Sie daran, dass der Benutzer
jegliche Berechtigungen, die der Benutzer schon besitzt (oder die ihm in
Zukunft gewährt werden!), auf dieser Ebene auch an andere Benutzer gewährt
werden können. Nehmen Sie an, Sie gewähren einem Benutzer die
insert-Berechtigung auf eine Datenbank. Wenn Sie danach die
select-Berechtigung auf die Datenbank mit WITH GRANT OPTION
gewähren, kann der Benutzer nicht nur die select-Berechtigung
weiter geben, sondern auch insert. Wenn Sie dem Benutzer danach
die update-Berechtigung auf die Datenbank gewähren, kann der
Benutzer insgesamt insert, select und update
weiter geben.
Sie sollten einem normalen Benutzer keine alter-Berechtigung gewähren. Wenn Sie das tun, kann der Benutzer versuchen, das Berechtigungssystem zu unterlaufen, indem er Tabellen umbenennt!
Beachten Sie: Wenn Sie Tabellen- oder Spalten-Berechtigungen auch nur für einen Benutzer gewähren, untersucht der Server Tabellen- und Spalten-Berechtigungen für alle Benutzer. Dadurch wird MySQL etwas langsamer.
Wenn mysqld
startet, werden alle Berechtigungen in den Speicher
eingelesen. Datenbank-, Tabellen- und Spalten-Berechtigungen werden sofort
wirksam. Berechtigungen auf Benutzerebene werden wirksam, wenn sich der
Benutzer das nächste Mal verbindet. Änderungen in den
Berechtigungstabellen, die Sie mit GRANT
oder REVOKE
durchführen, werden vom Server sofort bemerkt. Wenn Sie
Berechtigungstabellen manuell ändern (mit INSERT
, UPDATE
usw.), müssen Sie ein FLUSH PRIVILEGES
-Statement ausführen oder
mysqladmin flush-privileges
laufen lassen, um den Server zu
veranlassen, die Berechtigungstabellen neu zu laden.
See section 5.3.3 Wann Berechtigungsänderungen wirksam werden.
Die größten Unterschiede zwischen ANSI SQL und MySQL-Versionen von
GRANT
sind:
TRIGGER
-, EXECUTE
- oder
UNDER
-Berechtigungen.
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.
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:
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:
-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.
PASSWORD()
- und ENCRYPT()
-Funktionen in
section 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 section 5.3.1 GRANT
- und REVOKE
-Syntax.
Wenn Sie sich an einem MySQL-Server mit einem Kommandozeilen-Client
anmelden, sollten Sie das Passwort mit --password=ihr-passwort
eingeben. See section 5.2.7 Verbinden mit dem MySQL-Server.
mysql --user=monty --password=rate_mal datenbankname
Wenn Sie möchten, dass der Client eine Eingabeaufforderung für das Passwort
präsentiert, sollten Sie --password
ohne Argument benutzen.
mysql --user=monty --password datenbankname
Oder in der kurzen Form:
mysql -u monty -p datenbankname
Beachten Sie, dass in den letzten Beispielen 'datenbankname' NICHT das Passwort ist.
Wenn Sie die -p
-Option zur Eingabe des Passworts benutzen wollen,
tun Sie das wie folgt:
mysql -u monty -prate_mal datenbankname
Auf einigen Systemen kürzt die Bibliothek, die MySQL benutzt, um die Eingabeaufforderung für das Passwort auszugeben, das Passwort auf 8 Zeichen. Intern hat MySQL keine Beschränkung hinsichtlich der Länge des Passworts.
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:
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 section 3.3.1 Schnellinstallation, Überblick.
Das mysql_install_db
-Skript startet den mysqld
-Server und
initialisiert dann die Berechtigungstabellen, so dass diese folgenden Satz
an Berechtigungen enthalten:
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.
'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.
mysqladmin shutdown
oder mysqladmin
processlist
benutzen.
HINWEIS: Die vorgabemäßigen Berechtigungen sind unter Windows anders. See section 3.6.2.3 MySQL auf Windows laufen lassen.
Weil Ihre Installation anfangs weit offen ist, sollten Sie als eins der
ersten Dinge ein Passwort für den MySQL-root
-Benutzer anlegen. Das
können Sie wie folgt tun (beachten Sie, dass das Passwort mit der
PASSWORD()
-Funktion angegeben wird):
shell> mysql -u root mysql mysql> UPDATE user SET Password=PASSWORD('neues_passwort') WHERE user='root'; mysql> FLUSH PRIVILEGES;
Ab MySQL-Version 3.22 können Sie das SET PASSWORD
-Statement
benutzen:
shell> mysql -u root mysql mysql> SET PASSWORD FOR root=PASSWORD('neues_passwort');
Eine weitere Möglichkeit, das Passwort zu setzen, besteht in der Benutzung
des mysqladmin
-Befehls:
shell> mysqladmin -u root password neues_passwort
Nur Benutzer mit Schreib-/Aktualisierungszugriff auf die
mysql
-Datenbank können das Passwort für andere Benutzer ändern. Alle
normalen Benutzer (nicht anonyme Benutzer) können nur ihr eigenes Passwort
ändern, entweder mit einem der obigen Befehle oder mit SET
PASSWORD=PASSWORD('neues_passwort')
.
Denken Sie daran, wenn Sie das Passwort in der user
-Tabelle direkt
mit der ersten Methode ändern, dass Sie den Server anweisen müssen, die
Berechtigungstabellen neu einzulesen (mit FLUSH PRIVILEGES
), weil
die Änderungen ansonsten nicht wahrgenommen werden.
Sobald das root
-Passwort gesetzt wurde, müssen Sie in der Folge
immer das Passwort angeben, wenn Sie sich als root
mit dem Server
verbinden.
Eventuell wollen Sie das root
-Passwort leer lassen, damit Sie es für
die weitere Konfiguration oder für Tests nicht angeben müssen. Stellen Sie
jedoch sicher, dass Sie es setzen, bevor Sie Ihre Installation für irgend
welche Produktionsaufgaben benutzen.
Sehen Sie im scripts/mysql_install_db
-Skript nach, wie es die
vorgabemäßigen Berechtigungen installiert. Sie können das als Grundlage
für das Hinzufügen weiterer Benutzer nehmen.
Wenn Sie wollen, dass die anfänglichen Berechtigungen anders sind als die
gerade beschriebenen, können Sie mysql_install_db
abändern, bevor
Sie es benutzen.
Um die Berechtigungstabellen komplett neu zu erzeugen, entfernen Sie alle
`.frm'-, `.MYI'- und `.MYD'-Dateien im Verzeichnis, das die
mysql
-Datenbank enthält. (Das ist das Verzeichnis namens
`mysql' unter dem Datenbank-Verzeichnis, was aufgelistet wird, wenn
Sie mysqld --help
laufen lassen.) Lassen Sie dann das
mysql_install_db
-Skript laufen, eventuell nachdem Sie es editiert
haben, um die Berechtigungen zu enthalten, die Sie haben wollen.
HINWEIS: Bei MySQL-Versionen vor Version 3.22.10 sollten Sie die
`.frm'-Dateien NICHT löschen. Wenn Sie das versehentlich doch tun,
müssen Sie sie aus Ihrer MySQL-Distribution zurück kopieren, bevor Sie
mysql_install_db
laufen lassen.
Sie können Benutzer auf zwei Arten hinzufügen: Indem Sie
GRANT
-Statements verwenden oder indem Sie die
MySQL-Berechtigungstabellen direkt verändern. Die bevorzugte Methode ist,
GRANT
-Statements zu benutzen, denn sie sind präziser und weniger
fehleranfällig. See section 5.3.1 GRANT
- und REVOKE
-Syntax.
Ausserdem gibt es eine Menge von Dritten beigesteuerte Programme wie
phpmyadmin
, die benutzt werden können, um Benutzer zu erzeugen und
zu verwalten. See section B Beigesteuerte Programme.
Die unten stehenden Beispiele zeigen, wie man den mysql
-Client
benutzt, um neue Benutzer zu erzeugen. Die Beispiele setzen voraus, dass
Berechtigungen mit den Vorgabewerten eingerichtet wurden, die im vorherigen
Abschnitt beschrieben wurden. Um also Änderungen machen zu können, müssen
Sie sich von derselben Maschine aus verbinden, wo mysqld
läuft, und
Sie müssen sich als MySQL-root
-Benutzer verbinden, und der
root
-Benutzer muss die insert-Berechtigung für die
mysql
-Datenbank und die reload-Verwaltungsberechtigung
haben. Wenn Sie bereits das root
-Benutzerpasswort geändert haben,
müssen Sie es für die unten stehenden mysql
-Befehle eingeben.
Sie fügen neue Benutzer mit GRANT
-Statements hinzu:
shell> mysql --user=root mysql mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY 'ein_passwort' WITH GRANT OPTION; mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%" IDENTIFIED BY 'ein_passwort' WITH GRANT OPTION; mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost; mysql> GRANT USAGE ON *.* TO dummy@localhost;
Diese GRANT
-Statements richten drei neue Benutzer ein:
monty
'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
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
'N'
gesetzt -
diese USAGE
-Berechtigung erlaubt Ihnen, einen Benutzer ohne
Berechtigungen anzulegen. Es wird angenommen, dass Sie später
Datenbank-spezifische Berechtigungen gewähren.
Sie können dieselben Benutzerzugriffsinformationen direkt mittels
INSERT
-Statements eingeben und dann den Server anweisen, die
Berechtigungstabellen neu zu laden:
shell> mysql --user=root mysql mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('ein_passwort'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO user VALUES('%','monty',PASSWORD('ein_passwort'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO user SET Host='localhost',User='admin', Reload_priv='Y', Process_priv='Y'; mysql> INSERT INTO user (Host,User,Password) VALUES('localhost','dummy',''); mysql> FLUSH PRIVILEGES;
Abhängig von Ihrer MySQL-Version müssen Sie oben eventuell eine andere
Anzahl von 'Y'
-Werten eingeben (Versionen vor Version 3.22.11 hatten
weniger Berechtigungsspalten). Beim admin
-Benutzer wird die besser
lesbare INSERT
-Syntax benutzt, die ab Version 3.22.11 verfügbar ist.
Beachten Sie, dass Sie für die Einrichtung eines Superusers lediglich einen
user
-Tabelleneintrag mit Berechtigungsfeldern einrichten müssen, die
auf 'Y'
gesetzt sind. Es sind keine db
- oder
host
-Tabelleneinträge nötig.
The Berechtigungsspalten in der user
-Tabelle wurden im letzten
INSERT
-Statement nicht explizit gesetzt (für den Benutzer
dummy
), daher erhalten diese Spalten ihren Vorgabewert von
'N'
. Das ist dasselbe, was GRANT USAGE
macht.
Das folgende Beispiel fügt einen Benutzer custom
hinzu, der sich von
localhost
, server.domain
und whitehouse.gov
aus
verbinden kann. Er will auf die bankkonto
-Datenbank nur von
localhost
aus zugreifen, auf die spesen
-Datenbank nur von
whitehouse.gov
aus und auf die kunde
-Datenbank von allen drei
Hosts aus. Er will von allen drei Hosts aus das Passwort dumm
benutzen.
Um die Berechtigungen dieses Benutzers mit GRANT
-Statements
einzurichten, geben Sie folgende Befehle ein:
shell> mysql --user=root mysql mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankkonto.* TO custom@localhost IDENTIFIED BY 'dumm'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON spesen.* TO custom@whitehouse.gov IDENTIFIED BY 'dumm'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON kunde.* TO custom@'%' IDENTIFIED BY 'dumm';
Der Grund, warum wir Grant-Statements für den Benutzer 'custom' eingeben, ist, dass wir dem Benutzer Zugriff auf MySQL sowohl von der lokalen Maschine mit Unix-Sockets als auch von der entfernten Maschine 'whitehouse.gov' über TCP/IP geben wollen.
Um die Benutzerberechtigungen durch direkte Änderungen an den
Berechtigungstabellen einzugeben, geben Sie folgende Befehle ein (beachten
Sie das FLUSH PRIVILEGES
am Ende):
shell> mysql --user=root mysql mysql> INSERT INTO user (Host,User,Password) VALUES('localhost','custom',PASSWORD('dumm')); mysql> INSERT INTO user (Host,User,Password) VALUES('server.domain','custom',PASSWORD('dumm')); mysql> INSERT INTO user (Host,User,Password) VALUES('whitehouse.gov','custom',PASSWORD('dumm')); mysql> INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES ('localhost','bankkonto','custom','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES ('whitehouse.gov','spesen','custom','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES('%','kunde','custom','Y','Y','Y','Y','Y','Y'); mysql> FLUSH PRIVILEGES;
Die ersten drei INSERT
-Statements fügen user
-Tabelleneinträge
hinzu, die dem Benutzer custom
erlauben, sich von den verschiedenen
Hosts aus mit dem gegebenen Passwort zu verbinden, gewähren ihm aber keine
Berechtigungen (alle Berechtigungen werden auf den Vorgabewert 'N'
gesetzt). Die nächsten drei INSERT
-Statements fügen
db
-Tabelleneinträge hinzu, die custom
Berechtigungen für die
bankkonto
-, spesen
- und kunde
-Datenbanken gewähren,
aber nur, wenn auf sie von den korrekten Hosts aus zugegriffen wird. Wie
immer, wenn die Berechtigungstabellen direkt verändert werden, muss dem
Server gesagt werden, dass er sie neu laden muss (mit FLUSH
PRIVILEGES
), damit die Berechtigungsänderungen wirksam werden.
Wenn Sie einem bestimmten Benutzer Zugriff von irgendeiner Maschine in
einer gegebenen Domäne geben wollen, können Sie ein GRANT
-Statement
wie das folgende absetzen:
mysql> GRANT ... ON *.* TO benutzername@"%.domaene.de" IDENTIFIED BY 'passwort';
Um dasselbe durch direkte Änderung der Berechtigungstabellen einzugeben, machen Sie folgendes:
mysql> INSERT INTO user VALUES ('%.domaene.de', 'benutzername', PASSWORD('passwort'),...); mysql> FLUSH PRIVILEGES;
Sie können auch xmysqladmin
, mysql_webadmin
und sogar
xmysql
benutzen, um die Werte in den Berechtigungstabellen
einzufügen, zu ändern und zu aktualisieren. Sie finden diese Werkzeuge unter
Contrib-Verzeichnis der
MySQL-Website.
Starting from MySQL 4.0.2 one can limit certain resources per user.
So far, the only available method of limiting user usage of MySQL
server resources has been setting the max_user_connections
startup variable to a non-zero value. But this method is strictly
global and does not allow for management of individual users, which
could be of paricular interest to Internet Service Providers.
Therefore, management of three resources is introduced on the individual user level:
A user in the aforementioned context is a single entry in the
user
table, which is uniquely identified by its user
and host
columns.
All users are by default not limited in using the above resources,
unless the limits are granted to them. These limits can be granted
only via global GRANT (*.*)
, using this syntax:
GRANT ... WITH MAX_QUERIES_PER_HOUR = N1 MAX_UPDATES_PER_HOUR = N2 MAX_CONNECTIONS_PER_HOUR = N3;
One can specify any combination of the above resources. N1, N2 and N3 are integers and stands for count / hour.
If user reaches any of the above limits withing one hour, his connection will be terminated or refused and the appropriate error message shall be issued.
Current usage values for a particular user can be flushed (set to zero)
by issuing a GRANT
statement with any of the above clauses,
including a GRANT
statement with the current values.
Also, current values for all users will be flushed if privileges are
reloaded (in the server or using mysqladmin reload
)
or if the FLUSH USER_RESOURCES
command is issued.
The feature is enabled as soon as a single user is granted with any
of the limiting GRANT
clauses.
As a prerequisite for enabling this feature, the user
table in
the mysql
database must contain the additional columns, as
defined in the table creation scripts mysql_install_db
and
mysql_install_db.sh
in `scripts' subdirectory.
In den meisten Fällen sollten Sie GRANT
benutzen, um Ihre Benutzer /
Passwörter einzurichten, daher trifft das folgende nur für fortgeschrittene
Benutzer zu. See section 5.3.1 GRANT
- und REVOKE
-Syntax.
Die Beispiele in den vorherigen Abschnitten erläutern ein wichtiges
Prinzip: Wenn Sie ein nicht leeres Passwort mit INSERT
- oder
UPDATE
-Statements setzen, müssen Sie die PASSWORD()
-Funktion
benutzen, um es zu verschlüsseln. Das liegt daran, dass die
user
-Tabelle Passwörter in verschlüsselter Form speichert, nicht als
Klartext. Wenn Sie diese Tatsache vergessen, ist es möglich, dass sie
Passwörter wie folgt setzen:
shell> mysql -u root mysql mysql> INSERT INTO user (Host,User,Password) VALUES('%','heinzholger','keks'); mysql> FLUSH PRIVILEGES;
Das Ergebnis ist, dass der Klartextwert 'keks'
als Passwort in
der user
-Tabelle gespeichert ist. Wenn der Benutzer heinzholger
versucht, sich mittels dieses Passworts mit dem Server zu verbinden,
verschlüsselt der mysql
-Client es mit PASSWORD()
, erzeugt
damit einen Authentifikationsvektor, der auf dem verschlüsselten
Passwort und einer Zufallszahl basiert, die er vom Server erhält, und
schickt das Ergebnis zum Server. Der Server benutzt den
password
-Wert in der user
-Tabelle (den nicht
verschlüsselten Wert 'keks'
), um dieselben Berechnungen
durchzuführen, und vergleicht die Ergebnisse. Der Vergleich schlägt fehl
und der Server verweigert die Verbindung:
shell> mysql -u heinzholger -pkeks test Access denied
Passwörter müssen verschlüsselt sein, wenn sie in die user
-Tabelle
eingefügt werden, daher hätte das INSERT
-Statement also wie folgt
formuliert sein müssen:
mysql> INSERT INTO user (Host,User,Password) VALUES('%','heinzholger',PASSWORD('keks'));
Sie müssen die PASSWORD()
-Funktion auch benutzen, wenn Sie SET
PASSWORD
-Statements gebrauchen:
mysql> SET PASSWORD FOR heinzholger@"%" = PASSWORD('keks');
Wenn Sie Passwörter mit dem GRANT ... IDENTIFIED BY
-Statement oder
dem mysqladmin password
-Befehl setzen, wird die
PASSWORD()
-Funktion nicht benötigt. Beide sorgen dafür, dass das
Passwort verschlüsselt wird, daher würden Sie ein Passwort 'keks'
wie folgt setzen:
mysql> GRANT USAGE ON *.* TO heinzholger@"%" IDENTIFIED BY 'keks';
oder
shell> mysqladmin -u heinzholger password keks
NOTE: PASSWORD()
verschlüsselt Passwörter nicht auf
dieselbe Art, wie das bei Unix-Passwörtern der Fall ist. Wenn daher Ihr
Unix-Passwort und Ihr MySQL-Passwort identisch sind, sollten Sie daraus
nicht schließen, dass PASSWORD()
denselben Verschlüsselungswert
ergibt wie der, der in der Unix-Passwortdatei gespeichert ist.
See section 5.3.2 MySQL-Benutzernamen und -Passwörter.
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:
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).
-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.)
-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!
[client]
-Abschnitt der
`.my.cnf'-Datei in Ihrem Heimatverzeichnis aufführen:
[client] password=ihr_passwortWenn 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.
See section 5.1.2 my.cnf-Optionsdateien.
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 section F 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 section 7.7.2 LOCK TABLES/UNLOCK TABLES
-Syntax.
See section 5.5.3 FLUSH
-Syntax.
Sie brauchen lediglich eine Lesesperre (Read Lock); das erlaubt anderen
Threads, die Tabellen weiterhin abzufragen, während Sie eine Kopie der
Dateien im Datenbank-Verzeichnis machen. FLUSH TABLE
wird benötigt,
um sicherzustellen, dass alle aktiven Indexseiten auf Platte zurück
geschrieben werden, bevor Sie die Datensicherung beginnen.
Wenn Sie eine Tabellensicherung auf SQL-Ebene machen wollen, können Sie
SELECT INTO OUTFILE
oder BACKUP TABLE
benutzen.
See section 7.4.1 SELECT
-Syntax. See section 5.4.2 BACKUP TABLE
-Syntax.
Eine weitere Möglichkeit, eine Datenbank zu sichern, stellt die Benutzung
des mysqldump
-Programms oder des mysqlhotcopy-Skript
s dar.
See section 5.8.5 mysqldump, Tabellenstrukturen und -daten dumpen. See section 5.8.6 mysqlhotcopy, MySQL-Datenbanken und Tabellen kopieren.
shell> mysqldump --tab=/pfad/zum/verzeichnis/ --opt --full or shell> mysqlhotcopy Datenbank /pfad/zum/verzeichnis/Sie können auch einfach alle Tabellendateien (`*.frm'-, `*.MYD'- und `*.MYI'-Dateien) kopieren, solange der Server nicht gerade etwas aktualisiert. Das Skript
mysqlhotcopy
benutzt diese Methode.
mysqld
an, wenn er läuft, und starten Sie ihn mit der
--log-update[=datei]
-Option. See section 5.9.3 Die Update-Log-Datei. Die
Update-Log-Datei(en) gibt Ihnen die Information, die Sie dafür benötigen,
um Änderungen an der Datenbank zu replizieren, die ab dem Zeitpunkt
durchgeführt wurden, als Sie mysqldump
ausführten.
Wenn Sie etwas wiederherstellen müssen, versuchen Sie zunächst, Ihre
Tabellen mit REPAIR TABLE
oder myisamchk -r
wieder
herzustellen. Das sollte in 99,9% aller Fälle funktionieren. Wenn
myisamchk
fehlschlägt, probieren Sie folgende Prozedur (das
funktioniert nur, wenn Sie MySQL mit --log-update
gestartet haben.
See section 5.9.3 Die Update-Log-Datei.):
mysqldump
-Datensicherung wieder her.
shell> mysqlbinlog hostname-bin.[0-9]* | mysqlWenn Sie das Update-Log benutzen, können Sie folgendes machen:
shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
ls
wird benutzt, um alle Update-Log-Dateien in der richtigen
Reihenfolge zu erhalten.
Mit SELECT * INTO OUTFILE 'datei' FROM tabelle
können Sie auch
selektive Datensicherungen herstellen und diese wieder herstellen mit
LOAD DATA INFILE 'datei' REPLACE ...
. Um Duplikate zu vermeiden,
benötigen Sie einen Primärschlüssel (PRIMARY KEY
) oder einen
eindeutigen Schlüssel (UNIQUE
) in der Tabelle. Das Schlüsselwort
REPLACE
führt dazu, dass alte Datensätze durch neue ersetzt werden,
wenn ein neuer Datensatz einen alten auf einem eindeutigen Schlüsselwert
duplizieren würde.
Wenn Sie bei der Datensicherung auf Ihrem System Performance-Probleme bekommen, können Sie diese lösen, indem Sie Replikation einrichten und die Datensicherungen auf dem Slave statt auf dem Master durchführen. See section 5.10.1 Einführung in die Replikation.
Wenn Sie ein Veritas-Dateisystem benutzen, können Sie folgendes tun:
FLUSH TABLES mit READ LOCK
aus.
mount
vxfs snapshot
.
UNLOCK TABLES
aus.
BACKUP TABLE
-SyntaxBACKUP TABLE tabelle[,tabelle...] TO '/pfad/zum/backup/verzeichnis'
Machen Sie eine Kopie aller Tabellendateien ins Datensicherungsverzeichnis,
was die Mindestanforderung für die Wiederherstellung darstellt. Momentan
funktioniert das nur bei MyISAM
-Tabellen. Bei MyISAM
-Tabellen
kopiert man .frm
- (Definition) und .MYD
- (Daten) Dateien. Die
Indexdatei kann aus diesen beiden aufgebaut werden.
Bevor Sie diesen Befehl ausführen, sehen Sie bitte unter section 5.4.1 Datenbank-Datensicherungen nach.
Während der Datensicherung gilt eine Lesesperre (Read Lock) für jede
Tabelle, eine nach der anderen, während sie gesichert werden. Wenn Sie
mehrere Tabellen als Schnappschuss sichern wollen, müssen Sie zuerst ein
LOCK TABLES
ausführen, das eine Lesesperre für jede Tabelle in der
zu sichernden Gruppe enthält.
Der Befehl gibt eine Tabelle mit folgenden Spalten zurück:
Spalte | Wert |
Table | Tabellenname |
Op | Immer ``backup'' |
Msg_type | status , error , info oder warning .
|
Msg_text | Die Meldung. |
Beachten Sie, dass BACKUP TABLE
erst ab MySQL 3.23.25 verfügbar ist.
RESTORE TABLE
-SyntaxRESTORE 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
-SyntaxCHECK TABLE tabelle[,tabelle...] [option [option...]] option = QUICK | FAST | MEDIUM | EXTENDED | CHANGED
CHECK TABLE
funktioniert nur bei MyISAM
-Tabellen. Bei
MyISAM
-Tabellen ist es dasselbe, wie myisamchk -m tabelle
über die Tabelle laufen zu lassen.
Wenn Sie keine Option angeben, wird MEDIUM
benutzt.
Prüft die Tabelle(n) auf Fehler. Bei MyISAM
-Tabellen werden die
Schlüssel-Statistiken aktualisiert. Der Befehl gibt eine Tabelle mit
folgenden Spalten zurück:
Spalte | Wert |
Table | Tabellenname |
Op | Immer ``check''. |
Msg_type | status , error , info oder warning .
|
Msg_text | Die Meldung. |
Beachten Sie, dass Sie viele Zeilen an Information für jede geprüfte
Tabelle erhalten. Die letzte Zeile enthält den Msg_type status
und
sollte normalerweise OK
sein. Wenn Sie nicht OK
erhalten, oder Not
checked
, sollten Sie im Normalfall eine Reparatur der Tabelle durchführen.
See section 5.4.6 Benutzung von myisamchk
für Tabellenwartung und Absturzreparatur. Not checked
bedeutet, dass bei der Tabelle
der angegebene TYPE
MySQL mitgeteilt hat, dass es keinerlei
Notwendigkeit gab, die Tabelle zu prüfen.
Die unterschiedlichen Prüfoptionen stehen für folgendes:
Option | Bedeutung |
QUICK | Keine Zeilen nach falschen Verknüpfungen (Links) durchsehen (scannen). |
FAST | Nur Tabellen prüfen, die nicht ordnungsgemäß geschlossen wurden. |
CHANGED | Nur Tabellen prüfen, die seit der letzten Prüfung geändert wurden oder die nicht ordnungsgemäß geschlossen wurden. |
MEDIUM | Zeilen durchsehen (scannen), um zu bestätigen, dass gelöschte Verknüpfungen (Links) in Ordnung sind. Diese Option berechnet auch eine Schlüssel-Prüfsumme für die Zeilen und bestätigt diese mit einer berechneten Prüfsumme für die Schlüssel. |
EXTENDED | Schlägt komplett alle Schlüssel für jede Zeile nach (Lookup). Hierdurch wird sichergestellt, dass die Tabelle 100% konsistent ist, aber das benötigt lange Zeit! |
Bei MyISAM
-Tabellen dynamischer Größe führt eine Prüfung immer
eine MEDIUM
-Prüfung durch. Bei Zeilen statischer Länge wird das
Durchsehen (Scan) der Zeilen durch QUICK
und FAST
übersprungen, weil solche Zeilen sehr selten beschädigt sind.
Sie können Prüfoptionen wie folgt kombinieren:
CHECK TABLE test_tabelle FAST QUICK;
Das würde nur eine QUICK-Prüfung der Tabelle durchführen, wenn diese nicht ordnungsgemäß geschlossen worden wäre.
HINWEIS: In einigen Fällen kann CHECK TABLE
zu einer
Änderung der Tabelle führen! Das geschieht, wenn die Tabelle als
'beschädigt' oder 'nicht ordnungsgemäß geschlossen' gekennzeichnet ist,
aber CHECK TABLE
keine Probleme in der Tabelle gefunden hat. In
diesem Fall kennzeichnet CHECK TABLE
die Tabelle als in Ordnung.
Wenn eine Tabelle beschädigt ist, liegt das Problem höchst wahrscheinlich in den Indexen und nicht im Daten-Teil. Alle oben genannten Prüfoptionen prüfen die Indexe gründlich und sollten daher die meisten Fehler finden.
Wenn Sie lediglich eine Tabelle prüfen wollen, von der Sie annehmen, dass
sie in Ordnung ist, sollten Sie keine Prüfoptionen oder die
QUICK
-Option angeben. Letztere sollte benutzt werden, wenn Sie es
eilig haben und das sehr geringe Risiko auf sich nehmen können, dass
QUICK
keinen Fehler in der Daten-Datei findet. (In den meisten Fällen
sollte MySQL bei normalem Gebrauch jeden Fehler in der Daten-Datei finden.
Wenn das geschieht, wird die Tabelle als 'beschädigt' gekennzeichnet, was
bedeutet, dass die Tabelle solange nicht benutzt werden kann, bis sie
repariert ist.)
FAST
und CHANGED
sind in erster Linie für die Benutzung durch
ein Skript vorgesehen (zum Beispiel für die Ausführung durch cron), wenn
Sie Ihre Tabellen von Zeit zu Zeit prüfen wollen. Für die meisten
Anwendungsfälle sollte man FAST
vor CHANGED
bevorzugen. (Der
einzige Fall, wo das nicht so ist, ist, wenn Sie vermuten, einen Bug im
MyISAM
-Code gefunden zu haben.)
EXTENDED
ist nur für den Fall vorgesehen, dass Sie eine normale
Prüfung haben durchlaufen lassen, aber immer noch seltsame Fehler von einer
Tabelle erhalten, wenn MySQL versucht, eine Zeile zu aktualisieren oder
eine Zeile über einen Schlüssel zu finden (das ist sehr unwahrscheinlich,
wenn eine normale Prüfung durchgelaufen ist!).
Es wurde berichtet, dass bei der Tabellenprüfung einige Dinge nicht automatisch korrigiert werden können:
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
-SyntaxREPAIR TABLE tabelle[,tabelle...] [QUICK] [EXTENDED]
REPAIR TABLE
funktioniert nur bei MyISAM
-Tabellen und ist
dasselbe, wie myisamchk -r tabelle
auf die Tabelle auszuführen.
Normalerweise sollten sie diesen Befehl nie ausführen müssen, aber wenn ein
Unglück passiert, ist es sehr wahrscheinlich, dass Sie alle Daten einer
MyISAM-Tabelle mit REPAIR TABLE
retten können. Wenn Ihre Tabellen
häufig beschädigt werden, sollten Sie versuchen, den Grund hierfür
herauszufinden! See section A.4.1 Was zu tun ist, wenn MySQL andauernd abstürzt. See section 8.1.3 MyISAM-Tabellenprobleme.
REPAIR TABLE
repariert eine möglicherweise beschädigte Tabelle. Der
Befehl gibt eine Tabelle mit folgenden Spalten zurück:
Spalte | Wert |
Table | Tabellenname |
Op | Immer ``repair'' |
Msg_type | status , error , info oder warning .
|
Msg_text | Die Meldung. |
Beachten Sie, dass Sie viele Zeilen an Informationen für jede reparierte
Tabelle erhalten. Die letzte Zeile enthält den Msg_type status
und
sollte normalerweise OK
sein. Wenn Sie nicht OK
erhalten,
sollten Sie versuchen, die Tabelle mit myisamchk -o
zu reparieren,
weil REPAIR TABLE
noch nicht alle Optionen von myisamchk
enthält. In naher Zukunft werden wir das flexibler gestalten.
Wenn QUICK
angegeben wird, versucht MySQL lediglich ein
REPAIR
des Indexbaums.
Wenn Sie EXTENDED
benutzen, erzeugt MySQL den Index Zeile für Zeile,
anstatt einen Index auf einmal durch Sortieren zu erzeugen. Das kann bei
Schlüsseln fester Länge besser sein, wenn Sie lange char()
-Schlüssel
haben, die sich gut komprimieren lassen.
myisamchk
für Tabellenwartung und Absturzreparatur
Ab MySQL-Version 3.23.13 können Sie MyISAM-Tabellen mit dem CHECK
TABLE
-Befehl überprüfen. See section 5.4.4 CHECK TABLE
-Syntax. Mit dem REPAIR
TABLE
-Befehl können Sie Tabellen reparieren. See section 5.4.5 REPAIR TABLE
-Syntax.
Um MyISAM-Tabellen (.MYI
und .MYD
) zu überprüfen und / oder
zu reparieren, sollten sie das myisamchk
-Dienstprogramm benutzen. Um
ISAM-Tabellen (.ISM
und .ISD
) zu überprüfen und / oder zu
reparieren, sollten Sie das isamchk
-Dienstprogramm benutzen.
See section 8 MySQL-Tabellentypen.
Der folgende Text behandelt myisamchk
, trifft aber voll umfänglich
auch auf das alte isamchk
zu.
Sie können das myisamchk
-Dienstprogramm benutzen, um Informationen über
Ihre Datenbanktabellen zu erhalten, sie zu prüfen und zu reparieren, oder
um sie zu optimieren. Die folgenden Abschnitte beschreiben, wie man
myisamchk
aufruft (inklusive einer Beschreibung seiner Optionen),
wie man einen Wartungsplan für Tabellen erstellt und wie die
unterschiedlichen Funktionen von myisamchk
benutzt werden.
In den meisten Fällen können Sie auch den Befehl OPTIMIZE TABLES
benutzen, um Tabellen zu optimieren und zu reparieren, aber dieser ist
nicht so schnell und (in Fall wirklich schwerer Fehler) nicht so
zuverlässig wie myisamchk
.
Auf der anderen Seite ist OPTIMIZE TABLE
leichter zu benutzen, und
Sie brauchen sich nicht um das Flushen von Tabellen zu kümmern.
See section 5.5.1 OPTIMIZE TABLE
-Syntax.
Obwohl das Reparieren bei myisamchk
recht sicher ist, ist es immer
eine gute Idee, eine Datensicherung zu machen, bevor eine Reparatur
durchgeführt wird (oder etwas Sonstiges, das viele Änderungen an einer
Tabelle durchführt).
myisamchk
myisamchk
wird wie folgt aufgerufen:
shell> myisamchk [optionen] tabelle
optionen
legt fest, was myisamchk
tun soll. Die Optionen sind
unten beschrieben. (Sie erhalten eine Liste der Optionen, wenn Sie
myisamchk --help
eingeben.) Ohne Optionen aufgerufen prüft
myisamchk
einfach nur Ihre Tabelle. Um mehr Informationen zu
erhalten oder myisamchk
anzuweisen, korrigierende Aktionen
durchzuführen, geben Sie Optionen wie unten und in den folgenden
Abschnitten beschrieben an.
tabelle
ist die Datenbanktabelle, die Sie prüfen oder reparieren
wollen. Wenn Sie myisamchk
anderswo als im Datenbank-Verzeichnis
ausführen, müssen Sie den Pfad zur Datei angeben, denn myisamchk
weiß nicht, wo Ihre Datenbank liegt. In der Tat kümmert sich
myisamchk
nicht darum, ob die Dateien, die es bearbeiten soll, in
einem Datenbank-Verzeichnis liegen oder nicht; sie können diese Dateien
daher an eine andere Stelle kopieren und die Wiederherstellungsoperationen
dort durchführen.
Sie können in der myisamchk
-Befehlszeile mehrere Tabellen angeben,
wenn Sie wollen. Sie können auch einen Namen als Indexdateinamen angeben
(mit dem Suffix `.MYI'), was Ihnen gestattet, alle Tabellen in einem
Verzeichnis anzugeben, indem Sie das Muster `*.MYI' benutzen. Wenn Sie
zum Beispiel in einem Datenbank-Verzeichnis sind, können Sie alle Tabellen
im Verzeichnis wie folgt prüfen:
shell> myisamchk *.MYI
Wenn Sie nicht im Datenbank-Verzeichnis sind, können Sie alle dortigen Tabellen prüfen, indem Sie den Pfad zum Verzeichnis angeben:
shell> myisamchk /pfad/zum/datenbank_verzeichnis/*.MYI
Sie können sogar alle Tabellen in allen Datenbanken prüfen, indem Sie einen Platzhalter im Pfad zum MySQL-Daten-Verzeichnis angeben:
shell> myisamchk /pfad/zum/datadir/*/*.MYI
Um schnell alle Tabellen zu prüfen, wird folgender Befehl empfohlen:
myisamchk --silent --fast /pfad/zum/datadir/*/*.MYI isamchk --silent /pfad/zum/datadir/*/*.ISM
Wenn Sie alle Tabellen prüfen und alle Tabellen reparieren wollen, die beschädigt sind, können Sie folgende Kommandozeile eingeben:
myisamchk --silent --force --fast --update-state -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /pfad/zum/datadir/*/*.MYI isamchk --silent --force -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /pfad/zum/datadir/*/*.ISM
Hierbei wird angenommen, dass Sie mehr als 64 MB Arbeitsspeicher frei haben.
Wenn Sie einen Fehler wie den folgenden erhalten:
myisamchk: warning: 1 clients is using oder hasn't closed the table properly
Bedeutet das, dass Sie versuchen, eine Tabelle zu überprüfen, die durch ein
anderes Programm aktualisiert wurde (wie dem mysqld
-Server), das die
Datei noch nicht geschlossen hat oder das abgestürzt ist, ohne die Datei
ordnungsgemäß zu schließen.
Wenn mysqld
läuft, müssen Sie ein Sync/Schließen aller Tabellen mit
FLUSH TABLES
erzwingen und sicherstellen, dass niemand die Tabellen
benutzt, während Sie myisamchk
laufen lassen. In MySQL-Version 3.23
ist die einfachste Möglichkeit, dieses Problem zu vermeiden, die Benutzung
von CHECK TABLE
anstelle von myisamchk
.
myisamchk
myisamchk
unterstützt folgende Optionen:
-# oder --debug=debug_optionen
debug_optionen
ist häufig
'd:t:o,dateiname'
.
-? oder --help
-O var=option, --set-variable var=option
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:
--safe-recover
benutzen.
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.
-s oder --silent
-s
doppelt benutzen (-ss
), um myisamchk
sehr
schweigsam zu machen.
-v oder --verbose
-d
und -e
benutzt werden. Benutzen Sie -v
mehrfach (-vv
, -vvv
), um noch ausführlichere Meldungen
auszugeben!
-V oder --version
myisamchk
ausgeben und beenden.
-w or, --wait
mysqld
auf der Tabelle mit --skip-locking
laufen lassen, kann
die Tabelle nur mit einem weiteren myisamchk
-Befehl gesperrt werden.
myisamchk
-c oder --check
myisamchk
keine sonstigen Optionen angeben, die dies
überschreiben.
-e oder --extend-check
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
-C oder --check-only-changed
-f oder --force
myisamchk
mit -r
(repair) auf die Tabelle neu starten, wenn
myisamchk
in der Tabelle irgend welche Fehler findet.
-i oder --information
-m oder --medium-check
-U oder --update-state
--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
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
).
myisamchk
Folgende Optionen werden benutzt, wenn Sie myisamchk
mit -r
oder -o
starten:
-D # oder --data-file-length=#
-e oder --extend-check
-f oder --force
tabelle.TMD
) werden überschrieben, anstatt
abzubrechen.
-k # oder keys-used=#
#
-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
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
-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
-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
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=...
--set-character-set=name
-t oder --tmpdir=path
myisamchk
hierfür die Umgebungsvariable TMPDIR
.
-q oder --quick
-q
angeben, um myisamchk
zu zwingen, die
Original-Daten-Datei zu ändern, falls doppelte Schlüssel auftreten.
-u oder --unpack
myisamchk
Weitere Aktionen, die myisamchk
ausführen kann, neben der Prüfung
und Reparatur von Tabellen:
-a oder --analyze
myisamchk --describe --verbose tabelle'
oder Benutzung von
SHOW KEYS
in MySQL.
-d oder --description
-A oder --set-auto-increment[=value]
-S oder --sort-index
-R oder --sort-records=#
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.
myisamchk
Die Speicherzuordnung ist wichtig, wenn Sie myisamchk
laufen lassen.
myisamchk
benutzt nicht mehr Speicher, als Sie mir der
-O
-Option festlegen. Wenn Sie myisamchk
für sehr große
Dateien benutzen wollen, sollten Sie zuerst entscheiden, wieviel Speicher
Sie benutzen wollen. Die Vorgabe liegt bei nur etwa 3 MB, um Dinge zu
reparieren. Indem größere Werte benutzt werden, können Sie
myisamchk
dazu bringen, schneller zu arbeiten. Wenn Sie
beispielsweise 32 MB Arbeitsspeicher haben, könnten Sie Optionen wie die
folgende benutzen (zusätzlich zu weiteren Optionen, die Sie eventuell
angeben):
shell> myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ...
-O sort=16M
sollte für die meisten Fälle ausreichen.
Denken Sie daran, dass myisamchk
temporäre Dateien in TMPDIR
benutzt. Wenn TMPDIR
auf ein Speicher-Dateisystem zeigt, können
Kein-Speicher-Fehler schnell auftreten. Wenn das passiert, setzen Sie
TMPDIR
so, dass es auf ein Verzeichnis mit mehr Speicherplatz zeigt
und starten Sie myisamchk
erneut.
Beim Reparieren benötigt myisamchk
große Mengen von
Festplattenspeicher:
--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!
--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.
myisamchk
für die Fehlerbeseitigung nach Abstürzen
Wenn Sie mysqld
mit --skip-locking
laufen lassen (was auf
einigen Systemen wie Linux die Vorgabe ist), können Sie myisamchk
nicht zuverlässig dafür benutzen, eine Tabelle zu prüfen, wenn
mysqld
diese Tabelle benutzt. Wenn Sie sicher sein können, dass
niemand auf die Tabellen mit mysqld
zugreift, während Sie
myisamchk
laufen lassen, müssen Sie nur ein mysqladmin
flush-tables
durchführen, bevor Sie anfangen, die Tabellen zu prüfen. Wenn
Sie das nicht garantieren können, müssen Sie mysqld
herunter fahren,
während Sie die Tabellen prüfen. Wenn Sie myisamchk
laufen lassen,
währen mysqld
die Tabellen aktualisiert, erhalten Sie möglicherweise
die Meldung, dass eine Tabelle beschädigt ist, selbst wenn sie es nicht
ist.
Wenn Sie --skip-locking
nicht benutzen, können Sie jederzeit
myisamchk
benutzen, um Tabellen zu prüfen. Während Sie das tun,
warten alle Clients, die versuchen, die Tabelle zu aktualisieren, bis
myisamchk
fertig ist, bevor sie weiter machen.
Wenn Sie myisamchk
benutzen, um Tabellen zu reparieren oder zu
optimieren, MÜSSEN Sie stets sicherstellen, dass der
mysqld
-Server die Tabelle nicht benutzt (das trifft auch zu, wenn
Sie --skip-locking
benutzen). Wenn Sie mysqld
nicht herunter
fahren, sollten Sie zumindest mysqladmin flush-tables
ausführen,
bevor Sie myisamchk
benutzen.
Dieses Kapitel beschreibt, wie man MySQL-Datenbanken auf Datenbeschädigung prüft und damit umgeht. Wenn Ihre Tabellen häufig beschädigt sind, wollten Sie versuchen, den Grund hierfür herauszufinden! See section A.4.1 Was zu tun ist, wenn MySQL andauernd abstürzt.
Der Abschnitt über MyISAM
-Tabellen enthält Gründe, warum eine
Tabelle beschädigt sein könnte. See section 8.1.3 MyISAM-Tabellenprobleme.
Wenn Sie eine Wiederherstellung nach einem Absturz durchführen, ist es
wichtig zu wissen, das jede Tabelle tabelle
in einer Datenbank mit
drei Dateien im Datenbank-Verzeichnis korrespondiert:
Datei | Zweck |
`tabelle.frm' | Tabellendefinitionsdatei (form) |
`tabelle.MYD' | Daten-Datei (data) |
`tabelle.MYI' | Index-Datei (index) |
Jeder der drei Dateitypen kann auf verschiedene Weisen beschädigt werden. Probleme treten aber zumeist bei Daten-Dateien und Index-Dateien auf.
myisamchk
funktioniert so, dass Zeile für Zeile eine Kopie der
`.MYD'-(data)-Datei gemacht wird. Es beendet die Reparaturphase damit,
dass die alte `.MYD'-Datei entfernt wird und die neue Datei mit dem
Orginal-Dateinamen benannt wird. Wenn Sie --quick
benutzen, erzeugt
myisamchk
keine temporäre `.MYD'-Datei, sondern nimmt statt
dessen an, dass die `.MYD'-Datei korrekt ist, und erzeugt nur eine
neue Index-Datei, ohne die `.MYD'-Datei zu berühren. Das ist sicher,
weil myisamchk
automatisch feststellt, wenn die `.MYD'-Datei
beschädigt ist, und die Reparatur in diesem Fall abbricht. Sie können
myisamchk
auch mit zwei --quick
-Optionen aufrufen. In diesem
Fall bricht myisamchk
bei einigen Fehlern (wie doppelten
Schlüsseleinträgen) nicht ab, sondern versucht statt dessen, diese
aufzulösen, indem die `.MYD'-Datei verändert wird. Normalerweise ist
die Benutzung von zwei --quick
-Optionen nur sinnvoll, wenn Sie zu
wenig frei Plattenplatz haben, um eine normale Reparatur durchzuführen. In
diesem Fall sollten Sie zumindest eine Datensicherung machen, bevor Sie
myisamchk
laufen lassen.
Um eine MyISAM-Tabelle zu prüfen, benutzen Sie folgende Befehle:
myisamchk tabelle
myisamchk
normalerweise
ohne Optionen oder entweder mit der -s
- oder --silent
-Option
laufen lassen.
myisamchk -m tabelle
myisamchk -e tabelle
-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
-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 section 5.4.5 REPAIR TABLE
-Syntax.
Zu den Symptomen einer beschädigten Tabelle gehören Anfragen, die unerwartet abbrechen, und beobachtbare Fehler wie folgender:
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 werdenBeachten 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 section 5.4.5 REPAIR TABLE
-Syntax.
Der Handbuchabschnitt über Tabellenwartung beinhaltet die Optionen für
isamchk
/ myisamchk
. See section 5.4.6 Benutzung von myisamchk
für Tabellenwartung und Absturzreparatur.
Der folgende Abschnitt ist für Fälle, in denen die obigen Befehle
fehlschlagen, oder wenn Sie die erweiterten Features benutzen wollen, die
isamchk
/ myisamchk
zur Verfügung stellt.
Wenn Sie eine Tabelle von der Kommandozeile aus reparieren wollen, müssen
Sie zuerst den mysqld
-Server herunter fahren. Beachten Sie bei
mysqladmin shutdown
auf einen entfernten Server, dass der
mysqld
-Server noch für eine Weile aktiv bleibt, nachdem
mysqladmin
beendet ist, bis alle Anfragen beendet und alle Schlüssel
auf Platte zurück geschrieben (flush) wurden.
Phase 1: Prüfen Ihrer Tabellen
Lassen Sie myisamchk *.MYI
laufen, oder myisamchk -e *.MYI
,
wenn Sie mehr Zeit haben. Benutzen Sie die -s
-(silent)-Option, um
unnötige Informationen zu unterdrücken.
Wenn der mysqld
-Server herunter gefahren ist, sollten Sie die
--update
-Option benutzen, um myisamchk
zu veranlassen, die
Tabelle als 'geprüft' zu kennzeichnen.
Sie müssen nur die Tabellen reparieren, bei denen myisamchk
bekannt
gibt, dass sie Fehler enthalten. Gehen Sie bei solchen Tabellen zu Phase 2
über.
Wenn Sie beim Prüfen merkwürdige Fehler erhalten (wie out of
memory
-Fehler), oder wenn myisamchk
abstürzt, gehen Sie zu Phase
3.
Phase 2: Einfache, sichere Reparatur
HINWEIS: Wenn Sie wollen, dass die Reparatur sehr viel schneller abläuft,
sollten Sie allen isamchk/myisamchk
-Befehlen folgendes hinzufügen:
-O sort_buffer=# -O key_buffer=#
(wobei # etwa 1/4 des verfügbaren
Arbeitsspeichers ist).
Probieren Sie zuerst myisamchk -r -q tabelle
(-r -q
bedeutet
``quick recovery mode'' - schnelles Wiederherstellen). Dies versucht, die
Index-Datei zu reparieren, ohne die Daten-Datei zu berühren. Wenn die
Daten-Datei alles enthält, was sie sollte, und die Löschverknüpfungen auf
die korrekten Stellen in der Daten-Datei zeigen, sollte das funktionieren
und die Tabelle ist repariert. Machen Sie dann mit der Reparatur der
nächsten Tabelle weiter. Ansonsten führen Sie folgende Prozedur durch:
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.
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:
shell> mysql datenbank mysql> SET AUTOCOMMIT=1; mysql> TRUNCATE TABLE tabelle; mysql> quitWenn Ihre SQL-Version kein
TRUNCATE TABLE
hat, benutzen Sie statt
dessen DELETE FROM tabelle
.
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:
myisamchk -r
anfangen.
Um fragmentierte Datensätze zu vereinigen und verschwendeten Speicherplatz
zu beseitigen, der sich durch Löschen und Aktualisieren von Datensätzen
ergibt, lassen Sie myisamchk
im Wiederherstellungsmodus laufen:
shell> myisamchk -r tabelle
Auf dieselbe Weise können Sie eine Tabelle optimieren, indem Sie das
SQL-Statement OPTIMIZE TABLE
benutzen. OPTIMIZE TABLE
führt
eine Reparatur der Tabelle und eine Analyse der Schlüssel durch und
sortiert den Indexbaum, um schnelleres Nachschlagen der Schlüssel (Key
Lookup) zu ermöglichen. Ausserdem schaltet es die Möglichkeit ungewollter
Interaktionen zwischen einem Dienstprogramm und dem Server aus, weil der Server
bei der Benutzung von OPTIMIZE TABLE
die ganze Arbeit verrichtet.
See section 5.5.1 OPTIMIZE TABLE
-Syntax.
myisamchk
hat eine Anzahl weiterer Optionen, die Sie für die
Verbesserung der Performance einer Tabelle benutzen können:
-S, --sort-index
-R index_nummer, --sort-records=index_nummer
-a, --analyze
Eine detaillierte Beschreibung der Optionen steht unter
See section 5.4.6.1 Aufrufsyntax von myisamchk
.
Ab MySQL-Version 3.23.13 können Sie MyISAM-Tabellen mit dem CHECK
TABLE
-Befehl prüfen. See section 5.4.4 CHECK TABLE
-Syntax. Sie können Tabellen mit dem
REPAIR TABLE
-Befehl reparieren. See section 5.4.5 REPAIR TABLE
-Syntax.
Es ist eine gute Idee, Tabellenüberprüfungen auf regelmäßiger Basis
durchzuführen statt darauf zu warten, dass Probleme auftreten. Für
Wartungszwecke benutzen Sie myisamchk -s
, um Tabellen zu überprüfen.
Die -s
-Option (Kurzform für --silent
) veranlasst
myisamchk
, im schweigsamen Modus zu laufen, wobei Meldungen nur
ausgegeben werden, wenn Fehler auftreten.
Ebenfalls eine gute Idee ist es, Tabellen zu überprüfen, wenn der Server
hoch fährt. Wenn beispielsweise die Maschine mitten während einer
Aktualisierung (Update) neu gebootet hat, müssen Sie üblicherweise alle
Tabellen prüfen, die betroffen sein könnten. (Das ist ein Fall von
``erwarteter Tabellenbeschädigung''.) Sie können safe_mysqld
einen
Test hinzufügen, der myisamchk
laufen läßt, um alle Tabellen zu
überprüfen, die innerhalb der letzten 24 Stunden geändert wurden, wenn nach
einem Reboot eine alte `.pid'-(process ID)-Datei übrig blieb. (Die
`.pid'-Datei wird von mysqld
erzeugt, wenn er hoch fährt, und
entfernt, wenn er normal beendet wird. Die Anwesenheit einer
`.pid'-Datei beim Systemstart zeigt an, dass mysqld
regelwidrig
abgebrochen wurde.)
Eine noch bessere Testmethode besteht darin, jede Tabelle zu prüfen, deren Zeit der letzten Änderung neuer ist als die der `.pid'-Datei.
Ausserdem sollten Sie Ihre Tabellen regelmäßig während der normalen
Systemtätigkeit prüfen. Bei MySQL AB lassen wir einen cron
-Job
laufen, um alle wichtigen Tabellen einmal pro Woche zu prüfen, indem wir
folgende Zeile in der `crontab'-Datei benutzen:
35 0 * * 0 /pfad/zu/myisamchk --fast --silent /pfad/zu/datadir/*/*.MYI
Das gibt Informationen über beschädigte Tabellen aus, so dass wir diese prüfen und reparieren können, falls notwendig.
Da wir mittlerweile seit einigen Jahren keinerlei unerwartet beschädigte Tabellen hatten (Tabellen, die aus anderen Gründen als Hardware-Schäden beschädigt wurden), reicht uns einmal pro Woche völlig aus.
Wir empfehlen, dass Sie jede Nacht myisamchk -s
auf alle Tabellen
ausführen, die während der letzten 24 Stunden aktualisiert wurden, bis Sie
MySQL so sehr vertrauen, wie wir selbst das mittlerweile tun.
Normalerweise brauchen Sie MySQL-Tabellen nicht so sehr warten. Wenn Sie
Tabellen mit Zeilen dynamischer Länge ändern (Tabellen mit
VARCHAR
-, BLOB
- oder TEXT
-Spalten) oder Tabellen mit
vielen gelöschten Zeilen haben, werden Sie diese von Zeit zu Zeit (einmal
im Monat?) defragmentieren wollen bzw. freien Speicherplatz schaffen.
Das können Sie mit OPTIMIZE TABLE
auf die in Frage kommenden
Tabellen tun, oder, wenn Sie den mysqld
-Server für eine Weile
herunter fahren können:
isamchk -r --silent --sort-index -O sort_buffer_size=16M */*.ISM myisamchk -r --silent --sort-index -O sort_buffer_size=16M */*.MYI
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
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
myisamchk
tut, zu erzeugen,
fügen Sie -v
als Option hinzu, damit es im geschwätzigen Modus
läuft.
myisamchk -eis tabelle
myisamchk -eiv tabelle
-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
Isam-version
Creation time
Recover time
Data records
Deleted blocks
Datafile: Parts
Data records
.
Deleted data
Datafile pointer
Keyfile pointer
Max datafile length
.MYD
-Datei) der Tabelle werden kann, in
Bytes.
Max keyfile length
.MYI
-Datei) der Tabelle werden kann, in
Bytes.
Recordlength
Record format
Fixed length
.
Andere mögliche Werte sind Compressed
und Packed
.
Table description
Key
Start
Len
Index
unique
oder multip.
(multiple). Zeigt an, ob ein Wert einmal
oder mehrfach in diesem Index vorkommen darf.
Type
packed
, stripped
oder empty
.
Root
Blocksize
Rec/key
myisamchk -a
. Wenn dies überhaupt nicht aktualisiert
wurde, wird ein Wert von 30 angenommen.
Keyblocks used
myisamchk
reorganisiert wurden, sind diese Werte sehr hoch (sehr nahe am
theoretischen Maximum).
Packed
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
Records
M.recordlength
Packed
Packed
-Wert zeigt an, welcher Prozentsatz dadurch gespart wurde.
Recordspace used
Empty space
Blocks/Record
myisamchk
reorganisieren.
See section 5.4.6.10 Tabellenoptimierung.
Recordblocks
Deleteblocks
Recorddata
Deleted data
Lost space
Linkdata
Linkdata
ist die Summe des Speicherplatzes, der von diesen Zeigern benutzt wird.
Wenn eine Tabelle mit myisampack
komprimiert wurde, gibt
myisamchk -d
zusätzliche Informationen über jede Tabellenspalte aus,
siehe section 5.7.4 myisampack, MySQL-Programm zum Erzeugen komprimierter Nur-Lese-Tabellen, wo sich ein Beispiel solcher
Informationen und was sie bedeuten befindet.
OPTIMIZE TABLE
-SyntaxOPTIMIZE TABLE tabelle[,tabelle]...
OPTIMIZE TABLE
sollte benutzt werden, wenn Sie große Teile der
Tabelle gelöscht haben oder bei Tabellen mit Zeilen variabler Länge viele
Änderungen durchgeführt haben (Tabellen, die VARCHAR
-, BLOB
-
oder TEXT
-Spalten enthalten). Gelöschte Datensätze werden in einer
verknüpften Liste vorgehalten, und nachfolgenden INSERT
-Operationen
benutzen die Positionen alter Datensätze. Sie können OPTIMIZE TABLE
benutzen, um unbenutzten Platz freizugeben und die Daten-Datei zu
defragmentieren.
Momentan funktioniert OPTIMIZE TABLE
nur auf MyISAM- und
BDB
-Tabellen. Bei BDB
-Tabellen ist OPTIMIZE TABLE
momentan auf ANALYZE TABLE
gemappt. See section 5.5.2 ANALYZE TABLE
-Syntax.
Sie können OPTIMIZE TABLE
auf andere Tabellentypen zum Laufen
bringen, indem Sie mysqld
mit --skip-new
oder
--safe-mode
starten, aber in diesem Fall wird OPTIMIZE TABLE
lediglich auf ALTER TABLE
gemappt.
OPTIMIZE TABLE
funktioniert wie folgt:
OPTIMIZE TABLE
für MyISAM
-Tabellen ist äquivalent zum
Laufenlassen von myisamchk --quick --check-changed-tables
--sort-index --analyze
auf die Tabelle.
Beachten Sie, dass die Tabelle während der Zeit, in der OPTIMIZE TABLE
läuft, gesperrt ist!
ANALYZE TABLE
-SyntaxANALYZE TABLE tabelle[,tabelle...]
Analysiert und speichert die Schlüsselverteilung der Tabelle. Während der
Analyse ist die Tabelle mit einer Lesesperre gesperrt. Das funktioniert auf
MyISAM
und BDB
-Tabellen.
Das ist äquivalent zum Laufenlassen von myisamchk -a
auf die
Tabelle.
MySQL benutzt die gespeicherte Schlüsselverteilung, um zu entscheiden, in welcher Reihenfolge Tabellen verknüpft werden sollen, wenn man eine Verknüpfung (Join) auf irgend etwas anderes als eine Konstante macht.
Der Befehl gibt eine Tabelle mit folgenden Spalten zurück:
Spalte | Wert |
Table | Tabellenname. |
Op | Immer ``analyze''. |
Msg_type | status , error , info oder warning .
|
Msg_text | Die Meldung. |
Sie können die gespeicherte Schlüsselverteilung mit dem SHOW
INDEX
-Befehl überprüfen. See section 5.5.5.1 Informationen über Datenbank, Tabellen, Spalten und Indexe abrufen.
Wenn die Tabelle seit dem letzten ANALYZE TABLE
-Befehl nicht
geändert wurde, wird sie nicht noch einmal analysiert.
FLUSH
-SyntaxFLUSH flush_option [,flush_option]
Wenn Sie einige der internen Caches, die MySQL benutzt, löschen wollen,
benutzen Sie den FLUSH
-Befehl. Um FLUSH
ausführen zu können,
müssen Sie die RELOAD-Berechtigung haben.
flush_option
kann eine der folgenden sein:
HOSTS | Leert die Host-Cache-Tabellen. Sie sollten die
Host-Tabellen flushen, wenn einige Ihrer Hosts die IP-Nummer ändern oder
wenn Sie die Fehlermeldung Host ... is blocked erhalten. Wenn mehr
als max_connect_errors Fehler in einer Zeile für einen gegebenen
Host während der Verbindung zum MySQL-Server vorkommen, nimmt MySQL an,
dass etwas nicht stimmt und blockiert den Host von weiteren
Verbindungsversuchen. Wenn die Host-Tabellen geflusht werden, gestattet das
dem Host, einen erneuten Verbindungsversuch zu machen.
See section A.2.4 Host '...' is blocked -Fehler. Sie können mysqld mit -O
max_connection_errors=999999999 starten, um diese Fehlermeldung zu
vermeiden.
|
LOGS | Schließt alle Log-Dateien und öffnet sie danach
wieder. Wenn Sie die Update-Log-Datei oder eine binäre Log-Datei ohne
Erweiterung angegeben haben, wird die Erweiterungsnummer der Log-Datei um
eins relativ zur vorherigen Datei hoch gezählt. Wenn Sie eine Erweiterung
im Dateinamen benutzt haben, schließt MySQL die Update-Log-Datei und
öffnet sie danach wieder. See section 5.9.3 Die Update-Log-Datei. Das ist dasselbe, wie
dem mysqld -Server das SIGHUP -Signal senden.
|
PRIVILEGES | Lädt die Berechtigungen aus den
Berechtigungstabellen der mysql -Datenbank neu.
|
TABLES | Schließt alle offenen Tabellen und erzwingt, dass alle Tabellen in Benutzung geschlossen werden. |
[TABLE | TABLES] tabelle [,tabelle...] | Flusht nur die angegebenen Tabellen. |
TABLES WITH READ LOCK | Schließt alle offenen Tabellen und
sperrt alle Tabellen aller Datenbanken mit einer Lesesperre, bis man
UNLOCK TABLES ausführt. Das ist eine sehr bequeme Möglichkeit,
Datensicherungen zu erzeugen, wenn Sie ein Dateisystem wie Veritas haben,
das Schnappschüsse aufnehmen kann.
|
STATUS | Setzt alle Status-Variablen auf null zurück. Das sollte man nur benutzen, wenn man eine Anfrage debuggt. |
Jeden der oben genannten Befehle können Sie auch mit dem
mysqladmin
-Dienstprogramm ausführen, indem Sie flush-hosts
,
flush-logs
, reload
oder flush-tables
-Befehle
eingeben.
Sehen Sie sich auch den RESET
-Befehl an, der bei der Replikation
benutzt wird. See section 5.10.6 SQL-Befehle in Bezug auf Replikation.
KILL
-SyntaxKILL 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:
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.
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.
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.
INSERT DELAYED
-Thread flusht schnell alle Zeilen, die er im
Speicher hat, und stirbt.
Locked
), wird
die Tabellen-Sperre schnell abgebrochen.
write
-Aufruf auf freien Plattenplatz
wartet, wird der Schreibvorgang mit einer Meldung, dass die Platte voll
ist, abgebrochen.
SHOW
-SyntaxSHOW 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 section 6.4.6 Wie MySQL Tabellen öffnet und schließt. Das Comment
-Feld
zeigt an, wie oft die Tabelle gecachet (cached
) und in Benutzung
(in_use
) ist.
SHOW COLUMNS
listet die Spalten in einer gegebenen Tabelle auf. Wenn
Sie die FULL
-Option angeben, erhalten Sie auch die Berechtigungen,
die Sie für jede Spalte besitzen. Wenn die Spaltentypen von dem abweichen,
was Sie erwarten, nämlich, was Sie im CREATE TABLE
-Statement
angegeben haben, beachten Sie, dass MySQL manchmal Spaltentypen ändert.
See section 7.5.3.1 Stille Spaltentyp-Änderungen.
Das DESCRIBE
-Statement gibt ähnliche Informationen wie SHOW
COLUMNS
aus. See section 7.6.2 DESCRIBE
-Syntax (Informationen über Spalten erhalten).
SHOW FIELDS
ist ein Synonym für SHOW COLUMNS
. SHOW
KEYS
ist ein Synonym für SHOW INDEX
. Sie können die Spalten oder
Indexe einer Tabelle auch mit mysqlshow Datenbanktabelle
oder
mysqlshow -k Datenbanktabelle
anzeigen.
SHOW INDEX
gibt die Index-Informationen in einem Format aus, das dem
SQLStatistics
-Aufruf in ODBC stark ähnelt. Folgende Spalten werden
zurückgegeben:
Spalte | Bedeutung |
Table | Name der Tabelle. |
Non_unique | 0, wenn der Index keine Duplikate enthalten darf. |
Key_name | Name des Indexes. |
Seq_in_index | Spaltensequenznummer im Index, zählt ab 1. |
Column_name | Spaltenname. |
Collation | Wie die Spalte im Index sortiert ist.
In MySQL können diese Werte `A' (Ascending - aufsteigend)
oder NULL (Not sorted - unsortiert) sein.
|
Cardinality | Anzahl der eindeutigen Werte im Index.
Dieser Wert wird durch Laufenlassen von isamchk -a aktualisiert.
|
Sub_part | Anzahl der indizierten Zeichen, wenn die Spalte nur teilweise indiziert ist.
NULL , wenn der gesamte Schlüssel indiziert ist.
|
Comment | Verschiedene Anmerkungen. Momentan teilt es nur mit, ob der Index FULLTEXT ist oder nicht. |
Beachten Sie: Weil Cardinality
basierend auf statistischen Werten
gezählt wird, die als Ganzzahlen gespeichert sind, ist es nicht
notwendigerweise bei kleinen Tabellen korrekt.
SHOW TABLE STATUS
SHOW TABLE STATUS [FROM datenbank] [LIKE platzhalter]
SHOW TABLE STATUS
(neu in Version 3.23) funktioniert wie SHOW
STATUS
, zeigt aber viele weitere Informationen über jede Tabelle. Diese
Liste erhalten Sie auch mit dem mysqlshow --status datenbank
-Befehl.
Folgende Spalten werden zurückgegeben:
Spalte | Bedeutung |
Name | Name der Tabelle. |
Type | Typ der Tabelle. See section 8 MySQL-Tabellentypen. |
Row_format | Das Zeilenspeicherformat (fest, dynamisch oder komprimiert). |
Rows | Anzahl der Zeilen. |
Avg_row_length | Durchschnittliche Zeilenlänge. |
Data_length | Länge der Daten-Datei. |
Max_data_length | Maximale Länge der Daten-Datei. |
Index_length | Länge der Index-Datei. |
Data_free | Anzahl der zugewiesenen (allocated), aber nicht benutzten Bytes. |
Auto_increment | Nächster autoincrement-Wert. |
Create_time | Wann die Tabelle erzeugt wurde. |
Update_time | Wann die Daten-Datei das letzte Mal aktualisiert wurde. |
Check_time | Wann die Tabelle das letzte Mal geprüft wurde. |
Create_options | Zusätzliche Optionen, die beim CREATE TABLE benutzt wurden.
|
Comment | Der Kommentar, der beim Erzeugen der Tabelle angegeben wurde (oder einige Informationen, warum MySQL nicht auf die Tabelleninformationen zugreifen konnte). |
Bei InnoDB
-Tabellen wird im Tabellenkommentar der freie Platz im
Tablespace ausgegeben.
SHOW STATUS
SHOW STATUS
zeigt Server-Status-Informationen an (wie
mysqladmin extended-status
). Die Ausgabe ähnelt der unten stehenden,
obwohl Format und Anzahl der Zeilen wahrscheinlich abweichen:
+--------------------------+------------+ | Variable_name | Value | +--------------------------+------------+ | Aborted_clients | 0 | | Aborted_connects | 0 | | Bytes_received | 155372598 | | Bytes_sent | 1176560426 | | Connections | 30023 | | Created_tmp_disk_tables | 0 | | Created_tmp_tables | 8340 | | Created_tmp_files | 60 | | Delayed_insert_Threads | 0 | | Delayed_writes | 0 | | Delayed_errors | 0 | | Flush_commands | 1 | | Handler_delete | 462604 | | Handler_read_first | 105881 | | Handler_read_key | 27820558 | | Handler_read_next | 390681754 | | Handler_read_prev | 6022500 | | Handler_read_rnd | 30546748 | | Handler_read_rnd_next | 246216530 | | Handler_update | 16945404 | | Handler_write | 60356676 | | Key_blocks_used | 14955 | | Key_read_requests | 96854827 | | Key_reads | 162040 | | Key_write_requests | 7589728 | | Key_writes | 3813196 | | Max_used_connections | 0 | | Not_flushed_key_blocks | 0 | | Not_flushed_delayed_rows | 0 | | Open_tables | 1 | | Open_files | 2 | | Open_streams | 0 | | Opened_tables | 44600 | | Questions | 2026873 | | Select_full_join | 0 | | Select_full_range_join | 0 | | Select_range | 99646 | | Select_range_check | 0 | | Select_scan | 30802 | | Slave_running | OFF | | Slave_open_temp_tables | 0 | | Slow_launch_threads | 0 | | Slow_queries | 0 | | Sort_merge_passes | 30 | | Sort_range | 500 | | Sort_rows | 30296250 | | Sort_scan | 4650 | | Table_locks_immediate | 1920382 | | Table_locks_waited | 0 | | Threads_cached | 0 | | Threads_created | 30022 | | Threads_connected | 1 | | Threads_running | 1 | | Uptime | 80380 | +--------------------------+------------+
The status variables listed höher have the following Bedeutung:
Variable | Bedeutung |
Aborted_clients | Anzahl der Verbindungen, die abgebrochen wurden, weil der Client starb, ohne die Verbindung ordnungsgemäß zu schließen. See section A.2.9 Kommunikationsfehler / Abgebrochene Verbindung. |
Aborted_connects | Anzahl der fehlgeschlagenen Versuche, sich mit dem MySQL-Server zu verbinden. See section A.2.9 Kommunikationsfehler / Abgebrochene Verbindung. |
Bytes_received | Anzahl der Bytes, die von allen Clients empfangen wurden. |
Bytes_sent | Anzahl der Bytes, die an alle Clients gesendet wurden. |
Connections | Anzahl der Verbindungsversuche zum MySQL-Server. |
Created_tmp_disk_tables | Anzahl der (implizit) auf der Platte erzeugten temporären Tabellen bei der Ausführung von Statements. |
Created_tmp_tables | Anzahl der (implizit) im Arbeitsspeicher erzeugten temporären Tabellen bei der Ausführung von Statements. |
Created_tmp_files | Wie viele temporäre Dateien
mysqld erzeugt hat.
|
Delayed_insert_Threads | Anzahl der verzögerten Insert-Handler-Threads in Benutzung. |
Delayed_writes | Anzahl der Zeilen, die mit INSERT
DELAYED geschrieben wurden.
|
Delayed_errors | Anzahl der Zeilen, die mit INSERT
DELAYED geschrieben wurden, und bei denen irgend ein Fehler auftrat
(wahrscheinlich duplicate key ).
|
Flush_commands | Anzahl der ausgeführten FLUSH -Befehle.
|
Handler_delete | Wie oft eine Zeile aus einer Tabelle gelöscht wurde. |
Handler_read_first | Wie oft der erste Eintrag aus einem
Index gelesen wurde. Wenn dieser Wert hoch ist, legt das nahe, dass der
Server viele komplette Index-Scans macht (zum Beispiel SELECT spalte1
FROM foo , unter der Annahme, dass spalte1 indiziert ist).
|
Handler_read_key | Anzahl der Anfragen, eine Zeile basierend auf einem Schlüssel zu lesen. Wenn dieser Wert hoch ist, ist das ein gutes Indiz dafür, dass Ihre Anfragen und Tabellen korrekt indiziert sind. |
Handler_read_next | Anzahl der Anfragen, die nächste Zeile in der Reihenfolge des Schlüssels zu lesen. Dieser Wert wird herauf gezählt, wenn Sie eine Index-Spalte mit einer Bereichsbeschränkung (Limit) abfragen. Er wird ebenfalls herauf gezählt, wenn Sie einen Index-Scan durchführen. |
Handler_read_rnd | Anzahl der Anfragen, eine Zeile basierend auf einer festen Position zu lesen. Dieser Wert wird hoch sein, wenn Sie viele Anfragen ausführen, die erfordern, dass das Ergebnis sortiert wird. |
Handler_read_rnd_next | Anzahl der Anfragen, die nächste Zeile in der Daten-Datei zu lesen. Dieser Wert wird hoch sein, wenn Sie viele Tabellen-Scans durchführen. Im Allgemeinen weist das darauf hin, dass Ihre Tabellen nicht korrekt indiziert sind, oder dass Ihre Anfragen nicht so geschrieben sind, dass Sie Vorteile aus den Indexen ziehen, die Sie haben. |
Handler_update | Anzahl der Anfragen, eine Zeile in einer Tabelle zu aktualisieren. |
Handler_write | Anzahl der Anfragen, eine Zeile in eine Tabelle einzufügen. |
Key_blocks_used | Die Anzahl der benutzten Blocks im Schlüssel-Cache. |
Key_read_requests | Die Anzahl der Anfragen, einen Schlüssel-Block aus dem Cache zu lesen. |
Key_reads | Die Anzahl physikalischer Lesezugriffen eines Schlüssel-Blocks von der Platte. |
Key_write_requests | Die Anzahl der Anfragen, einen Schlüssel-Block in den Cache zu schreiben. |
Key_writes | Die Anzahl physikalischer Schreibvorgänge eines Schlüssel-Blocks auf Platte. |
Max_used_connections | Die höchste Anzahl von Verbindungen, die gleichzeitig in Benutzung sind. |
Not_flushed_key_blocks | Schlüssel-Blöcke im Schlüssel-Cache, die verändert wurden, aber noch nicht auf die Platte zurück geschrieben (flush). |
Not_flushed_delayed_rows | Anzahl der Zeilen, die in
INSERT DELAY -Warteschleifen darauf warten, geschrieben zu werden.
|
Open_tables | Anzahl der offenen Tabellen. |
Open_files | Anzahl der offenen Dateien. |
Open_streams | Anzahl der offenen Streams (hauptsächlich zum Loggen benutzt). |
Opened_tables | Anzahl der Tabellen, die geöffnet wurden. |
Select_full_join | Anzahl der Joins ohne Schlüssel (sollte 0 sein). |
Select_full_range_join | Anzahl der Joins, bei denen eine Bereichssuche auf die Referenztabelle statt fand. |
Select_range | Anzahl der Joins, bei denen Bereiche auf die erste Tabelle benutzt wurden. (Es ist normalerweise unkritisch, wenn dieser Wert hoch ist.) |
Select_scan | Anzahl der Joins, bei denen die erste Tabelle gescannt wurde. |
Select_range_check | Anzahl der Joins ohne Schlüssel, bei denen nach jeder Zeile auf Schlüsselbenutzung geprüft wurde (sollte 0 sein). |
Questions | Anzahl der Anfragen, die zum Server geschickt wurden. |
Slave_open_temp_tables | Anzahl der temporären Tabellen, die momentan vom Slave-Thread geöffnet sind. |
Slow_launch_threads | Anzahl der Threads, die länger als
slow_launch_time brauchten, um sich zu verbinden.
|
Slow_queries | Anzahl der Anfragen, die länger als
long_query_time benötigten. See section 5.9.5 Die Anfragen-Log-Datei für langsame Anfragen.
|
Sort_merge_passes | Anzahl der Verschmelzungen (Merge), die
von einem Sortiervorgang benötigt wurden. Wenn dieser Wert hoch ist,
sollten Sie in Betracht ziehen, sort_buffer herauf zu setzen.
|
Sort_range | Anzahl der Sortiervorgänge, die mit Bereichen durchgeführt wurden. |
Sort_rows | Anzahl der sortierten Zeilen. |
Sort_scan | Anzahl der Sortiervorgänge, die durchgeführt wurden, indem die Tabelle gescannt wurde. |
Table_locks_immediate | Wie oft eine Tabellensperre sofort erlangt wurde. Verfügbar nach Version 3.23.33. |
Table_locks_waited | Wie oft eine Tabellensperre nicht sofort erlangt werden konnte und gewartet werden musst. Wenn dieser Wert hoch ist und Sie Performance-Probleme haben, sollten Sie zunächst Ihre Anfragen optimieren und dann entweder Ihre Tabelle(n) zerteilen oder Replikation benutzen. Verfügbar nach Version 3.23.33. |
Threads_cached | Anzahl der Threads im Thread-Cache. |
Threads_connected | Anzahl der momentan offenen Verbindungen. |
Threads_created | Anzahl der Threads, die zur Handhabung von Verbindungen erzeugt wurden. |
Threads_running | Anzahl der Threads, die nicht schlafen. |
Uptime | Seit wie vielen Sekunden der Server hoch gefahren ist. |
Einige Anmerkungen zum oben Aufgeführten:
Opened_tables
hoch ist, ist Ihre table_cache
-Variable
wahrscheinlich zu niedrig.
key_reads
hoch ist, ist Ihr key_cache
wahrscheinlich zu
klein. Die Cache-Zugriffsrate kann mit key_reads
/
key_read_requests
berechnet werden.
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.
Threads_created
hoch ist, sollten Sie eventuell die
Thread_cache_size
-Variable herauf setzen.
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
SHOW VARIABLES [LIKE platzhalter]
SHOW VARIABLES
zeigt die Werte einiger MySQL-Systemvariablen. Sie
erhalten diese List auch mit dem mysqladmin variables
-Befehl. Wenn
die Vorgabewerte unpassend sind, können Sie die meisten dieser Variablen
mit Kommandozeilenoptionen setzen, wenn Sie mysqld
hoch fahren.
See section 5.1.1 mysqld-Kommandozeilenoptionen.
Die Ausgabe ähnelt der unten stehenden, obwohl Format und Anzahl der Zeilen wahrscheinlich abweichen:
+-------------------------+---------------------------+ | Variable_name | Value | +-------------------------+---------------------------+ | ansi_mode | OFF | | back_log | 50 | | basedir | /my/monty/ | | bdb_cache_size | 16777216 | | bdb_log_buffer_size | 32768 | | bdb_home | /my/monty/data/ | | bdb_max_lock | 10000 | | bdb_logdir | | | bdb_shared_data | OFF | | bdb_tmpdir | /tmp/ | | binlog_cache_size | 32768 | | concurrent_insert | ON | | connect_timeout | 5 | | datadir | /my/monty/data/ | | delay_key_write | ON | | delayed_insert_limit | 100 | | delayed_insert_timeout | 300 | | delayed_queue_size | 1000 | | flush | OFF | | flush_time | 0 | | have_bdb | YES | | have_innodb | YES | | have_raid | YES | | have_openssl | NO | | init_file | | | interactive_timeout | 28800 | | join_buffer_size | 131072 | | key_buffer_size | 16776192 | | language | /my/monty/share/english/ | | large_files_support | ON | | log | OFF | | log_update | OFF | | log_bin | OFF | | log_slave_updates | OFF | | long_query_time | 10 | | low_priority_updates | OFF | | lower_case_table_names | 0 | | max_allowed_packet | 1048576 | | max_binlog_cache_size | 4294967295 | | max_connections | 100 | | max_connect_errors | 10 | | max_delayed_threads | 20 | | max_heap_table_size | 16777216 | | max_join_size | 4294967295 | | max_sort_length | 1024 | | max_tmp_tables | 32 | | max_write_lock_count | 4294967295 | | myisam_recover_options | DEFAULT | | myisam_sort_buffer_size | 8388608 | | net_buffer_length | 16384 | | net_read_timeout | 30 | | net_retry_count | 10 | | net_write_timeout | 60 | | open_files_limit | 0 | | pid_file | /my/monty/data/donna.pid | | port | 3306 | | protocol_version | 10 | | record_buffer | 131072 | | query_buffer_size | 0 | | safe_show_database | OFF | | server_id | 0 | | skip_locking | ON | | skip_networking | OFF | | skip_show_database | OFF | | slow_launch_time | 2 | | socket | /tmp/mysql.sock | | sort_buffer | 2097116 | | table_cache | 64 | | table_type | MYISAM | | Thread_cache_size | 4 | | Thread_stack | 65536 | | tmp_table_size | 1048576 | | tmpdir | /tmp/ | | version | 3.23.29a-gamma-debug | | wait_timeout | 28800 | +-------------------------+---------------------------+
Jede Option ist unten beschrieben. Die Werte für Puffergrößen, Längen und
Stack-Größen sind in Bytes angegeben. Sie können Wert mit den Suffixen
`K' oder `M' angeben, um Kilobytes oder Megabytes zu
kennzeichnen. 16M
zum Beispiel bedeutet 16 Megabytes. Bei den
Suffixen spielt Groß-/Kleinschreibung keine Rolle, 16M
und
16m
sind äquivalent:
ansi_mode
.
ON
, wenn mysqld
mit --ansi
gestartet wurde.
See section 2.7.2 MySQL im ANSI-Modus laufen lassen.
back_log
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
--basedir
-Option.
bdb_cache_size
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
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
--bdb-home
-Option.
bdb_max_lock
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
--bdb-logdir
-Option.
bdb_shared_data
ON
, wenn Sie --bdb-shared-data
benutzen.
bdb_tmpdir
--bdb-tmpdir
-Option.
binlog_cache_size
. Die Größe des Caches, in dem
BEGIN/COMMIT/ROLLBACK
-Syntax.
character_set
character_sets
concurrent_inserts
ON
(Vorgabe), läßt MySQL INSERT
auf
MyISAM
-Tabellen zu, auf die zur gleichen Zeit SELECT
-Anfragen
laufen. Sie können diese Option ausschalten, indem Sie mysqld
mit
--safe
oder --skip-new
starten.
connect_timeout
mysqld
-Server auf ein
Verbindungspaket wartet, bevor er mit Bad handshake
antwortet.
datadir
--datadir
-Option.
delay_key_write
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
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
INSERT DELAYED
-Thread auf INSERT
-Statements
warten soll, bevor abgebrochen wird.
delayed_queue_size
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
ON
, wenn Sie MySQL mit der --flush
-Option gestartet
haben.
flush_time
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
YES
, wenn mysqld
Berkeley-DB-Tabellen unterstützt. Ist
DISABLED
, wenn --skip-bdb
benutzt wird.
have_innodb
YES
, wenn mysqld
InnoDB-Tabellen unterstützt. Ist
DISABLED
, wenn --skip-innodb
benutzt wird.
have_raid
YES
, wenn mysqld
die RAID
-Option unterstützt.
have_openssl
YES
, wenn mysqld
SSL (Verschlüsselung) auf dem
Client-/Server-Protokoll unterstützt.
init_file
--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
CLIENT_INTERACTIVE
-Option für
mysql_real_connect()
benutzt. Siehe auch wait_timeout
.
join_buffer_size
key_buffer_size
key_buffer_size
ist die Größe des Puffers, der für Index-Blöcke
benutzt wird.
Setzen Sie diesen Wert herauf, um eine bessere Index-Handhabung zu erzielen
(für alle Lesevorgänge und für mehrfache Schreibvorgänge), so weit, wie Sie
es sich leisten können; 64 MB auf einer 256-MB-Maschine, auf der
hauptsächlich MySQL läuft, ist ein gebräuchlicher Wert. Wenn Sie diesen
Wert allerdings zu hoch setzen (mehr als 50% Ihres gesamten
Arbeitsspeichers), kann es sein, dass Ihr System anfängt auszulagern
(Paging), was SEHR langsam werden kann. Denken Sie daran, dass Sie Platzt
für den Dateisystem-Cache des Betriebssystems lassen müssen, weil MySQL
Daten-Lesen nicht cachet.
Sie können die Performance des Schlüsselpuffers mit show status
überprüfen und sich die Variablen Key_read_requests
,
Key_reads
, Key_write_requests
und Key_writes
ansehen.
Das Verhältnis Key_reads/Key_read_request
sollte normalerweise <
0,01 sein. Key_write/Key_write_requests
ist üblicherweise nahe 1,
wenn Sie hauptsächlich Aktualisieren (Update) und Löschen (Delete)
ausführen, kann aber sehr viel kleiner werden, wenn Sie tendenziell
Aktualisierungen ausführen, die viele Zeilen gleichzeitig betreffen, oder
wenn Sie delay_key_write
benutzen. See section 5.5.5 SHOW
-Syntax.
Um noch mehr Geschwindigkeit beim Schreiben vieler Zeilen auf einmal zu
erhalten, benutzen Sie LOCK TABLES
. See section 7.7.2 LOCK TABLES/UNLOCK TABLES
-Syntax.
language
large_file_support
mysqld
mit Optionen für die Unterstützung großer Dateien
kompiliert wurde.
locked_in_memory
mysqld
mit --memlock
in den Speicher gesperrt wurde.
log
log_update
log_bin
log_slave_updates
long_query_time
Slow_queries
-Zähler hoch gezählt. Wenn Sie --log-slow-queries
benutzen, wird die Anfrage in die Slow-Query-Logdatei geschrieben.
See section 5.9.5 Die Anfragen-Log-Datei für langsame Anfragen.
lower_case_table_names
max_allowed_packet
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
max_binlog_size
max_connections
mysqld
benötigt. Siehe weiter unten, Bemerkungen zu Beschränkungen
bei Datei-Deskriptoren. See section A.2.5 Too many connections
-Fehler.
max_connect_errors
FLUSH HOSTS
-Befehl aufheben.
max_delayed_Threads
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
max_join_size
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
BLOB
- oder
TEXT
-Werten benutzt werden (nur die ersten max_sort_length
Bytes jedes Werts werden benutzt, der Rest wird ignoriert).
max_user_connections
max_tmp_tables
max_write_lock_count
myisam_recover_options
--myisam-recover
-Option.
myisam_sort_buffer_size
REPAIR
oder ausführt oder Indexe mit CREATE INDEX
oder
ALTER TABLE
erzeugt.
myisam_max_extra_sort_file_size
.
myisam_max_sort_file_size
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
max_allowed_packet
Bytes.)
net_read_timeout
write_timeout
definiert. Siehe auch slave_read_timeout
.
net_retry_count
FreeBSD
recht hoch sein, weil interne
Unterbrechnungsanforderungen (Interrupts) an alle Threads gesendet werden.
net_write_timeout
open_files_limit
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
--pid-file
-Option.
port
--port
-Option.
protocol_version
record_buffer
record_rnd_buffer
record_buffer
gesetzt.
query_buffer_size
safe_show_databases
skip_show_databases
.
server_id
--server-id
-Option.
skip_locking
OFF
, wenn mysqld
externes Sperren benutzt.
skip_networking
ON
, wenn nur lokale (Socket-) Verbindungen zugelassen sind.
skip_show_databases
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
slow_launch_time
Slow_launch_threads
-Zähler herauf gezählt.
socket
sort_buffer
ORDER BY
- oder GROUP BY
-Operationen zu erhalten.
See section A.4.4 Wohin MySQL temporäre Dateien speichert.
table_cache
mysqld
benötigt. Sie können prüfen, ob Sie den Tabellen-Cache
vergrößern müssen, indem Sie die Opened_tables
-Variable prüfen.
See section 5.5.5 SHOW
-Syntax. Wenn diese Variable sehr Groß ist und Sie FLUSH TABLES
nicht oft brauchen (was lediglich alle Tabellen zwingt, geschlossen und
wieder geöffnet zu werden), sollten Sie den Wert dieser Variablen herauf
setzen.
Wegen weiterer Informationen zum Tabellen-Cache sehen Sie unter
section 6.4.6 Wie MySQL Tabellen öffnet und schließt nach.
table_type
thread_cache_size
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
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
crash-me
-Test festgestellt werden, hängen von diesem Wert ab. Der
Vorgabewert ist Groß genug für normale Operationen.
See section 6.1.4 Die MySQL-Benchmark-Suite.
timezone
tmp_table_size
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
version
wait_timeout
interactive_timeout
.
Der Handbuchabschnitt, der das Tunen von MySQL beschreibt, enthält einige Informationen darüber, wie die oben aufgeführten Variablen getunt werden. See section 6.5.2 Serverparameter tunen.
SHOW LOGS
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
SHOW PROCESSLIST
zeigt, welche Threads laufen. Diese Information
erhalten Sie auch mit dem mysqladmin processlist
-Befehl. Wenn Sie
die process-Berechtigung haben, können Sie alle Threads sehen.
Ansonsten sehen Sie nur Ihre eigenen Threads. See section 5.5.4 KILL
-Syntax.
Wenn Sie die FULL
-Option nicht benutzen, werden nur die ersten 100
Zeichen jeder Anfrage gezeigt.
Dieser Befehl ist sehr nützlich, wenn Sie die 'too many
connections'-Fehlermeldung erhalten und herausfinden wollen, was vor sich
geht. MySQL reserviert eine zusätzliche Verbindung für einen Client mit der
Process_priv
-Berechtigung, um sicherzustellen, dass Sie sich
jederzeit einloggen und das System prüfen können (unter der Annahme, dass
Sie diese Berechtigung nicht allen Ihren Benutzern geben).
SHOW GRANTS
SHOW GRANTS FOR benutzer
listet die Grant
-Befehle auf, die
abgesetzt werden müssen, um die Berechtigungen für einen Benutzer zu
duplizieren. Beispiel:
mysql> SHOW GRANTS FOR root@localhost; +----------------------------------------------------------------------+ | Grants for root@localhost | +----------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION | +----------------------------------------------------------------------+
SHOW CREATE TABLE
Zeigt ein CREATE TABLE
-Statement an, das die angegebene Tabelle
erzeugt:
mysql> show create table tabelle\G *************************** 1. row *************************** Table: tabelle Create Table: CREATE TABLE tabelle ( id int(11) default NULL auto_increment, s char(60) default NULL, PRIMARY KEY (id) ) TYPE=MyISAM
SHOW CREATE TABLE
setzt Tabellen- und Spaltennamen gemäß der
SQL_QUOTE_SHOW_CREATE
-Option in Anführungszeichen.
section 6.5.6 SET
-Syntax.
Vorgabemäßig benutzt MySQL den ISO-8859-1-(Latin1)-Zeichensatz, wobei nach schwedischer / finnischer Reihenfolge sortiert wird. Dieser Zeichensatz ist für die USA und Westeuropa geeignet.
Alle standardmäßigen MySQL-Binärdistributionen werden mit
--with-extra-charsets=complex
kompiliert. Das fügt allen
Standard-Programmen Code hinzu, damit diese latin1
und alle
Multi-Byte-Zeichensätze in der Binärdatei handhaben können. Andere
Zeichensätze werden bei Bedarf aus einer Zeichensatz-Definitionsdatei
geladen.
Der Zeichensatz legt fest, welche Zeichen in Namen erlaubt sind und wie
Dinge durch die ORDER BY
- und GROUP BY
-Klauseln des
SELECT
-Statements sortiert werden.
Sie können den Zeichensatz mit der --default-character-set
-Option
ändern, wenn Sie den Server starten. Die verfügbaren Zeichensätze hängen
von den --with-charset=charset
- und --with-extra-charset=
list-of-charset | complex | all
-Optionen für configure
ab und den
Zeichensatz-Konfigurationsdateien, die in `SHAREDIR/charsets/Index'
aufgeführt sind. See section 3.3.3 Typische configure
-Optionen.
Wenn Sie den Zeichensatz ändern, wenn Sie MySQL laufen lassen (was
eventuell auch die Sortierreihenfolge ändert), müssen Sie myisamchk
-r -q
über alle Tabellen laufen lassen. Ansonsten sind Ihre Indexe
eventuell nicht richtig sortiert.
Wenn sich ein Client mit dem MySQL-Server verbindet, schickt der Server den vorgabemäßigen Zeichensatz, der in Benutzung ist, an den Client. Der Client schaltet für diese Verbindung auf den Gebrauch dieses Zeichensatzes um.
Man sollte bei einer SQL-Anfrage mysql_real_escape_string()
benutzen, wenn man Zeichenketten escapet. mysql_real_escape_string()
ist identisch mit der alten mysql_escape_string()
-Funktion, ausser
dass es die MySQL-Connection-Handle als ersten Parameter nimmt.
Wenn der Client mit anderen Pfaden kompiliert wird, als wo der Server installiert ist, und der Benutzer, der MySQL konfigurierte, nicht alle Zeichensätze in die MySQL-Binärdatei eingeschlossen hat, muss man für den Client festlegen, wo dieser die zusätzlichen Zeichensätze finden kann, die er benötigt, falls der Server mit einem anderen Zeichensatz läuft als der Client.
Das kann man in einer MySQL-Optionsdatei festlegen:
[client] character-sets-dir=/usr/local/mysql/share/mysql/charsets
Wobei der Pfad auf das Verzeichnis zeigt, in dem sich die dynamischen MySQL-Zeichensätze befinden.
Man kann den Client zwingen, einen bestimmten Zeichensatz zu benutzen, indem man angibt:
[client] default-character-set=character-set-name
Aber normalerweise wird das nie benötigt.
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:
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.
CHARSETS_AVAILABLE
- und
COMPILED_CHARSETS
-Listen in configure.in
hinzu.
Bei einem komplexen Zeichensatz machen Sie folgendes:
ctype_MEINSET
, to_lower_MEINSET
usw. haben müssen.
Das entspricht den Arrays im einfachen Zeichensatz.
See section 5.6.4 Die Zeichen-Definitions-Arrays. Bei einem komplexen Zeichensatz
/* * 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.
my_strncoll_MEINSET()
my_strcoll_MEINSET()
my_strxfrm_MEINSET()
my_like_range_MEINSET()
CHARSETS_AVAILABLE
- und
COMPILED_CHARSETS
-Listen in configure.in
hinzu.
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 section 5.6.5 Unterstützung für Zeichenketten-Vergleich.
ctype[]
ist ein Array von Bit-Werten, mit einem Element pro Zeichen.
(Beachten Sie, dass to_lower[]
, to_upper[]
und
sort_order[]
durch den Buchstabenwert indiziert werden, aber
ctype[]
durch den Buchstabenwert + 1. Das ist aus Gründen der
Abwärtskompatibilität notwendig, um EOF (Dateiende) handhaben zu können.)
Sie finden folgenden Bitmasken-Definitionen in `m_ctype.h':
#define _U 01 /* Großschreibung */ #define _L 02 /* Kleinschreibung */ #define _N 04 /* Numerisch (Ziffer) */ #define _S 010 /* Leerzeichen */ #define _P 020 /* Punkt */ #define _C 040 /* Steuerungszeichen (Control) */ #define _B 0100 /* leer */ #define _X 0200 /* heXadezimale Ziffer */
Der ctype[]
-Eintrag für jeden Buchstaben sollte die
Vereinigungsmenge der betreffenden Bitmasken-Werte sein, die den Buchstaben
beschreiben. 'A'
beispielsweise ist Buchstabe in Großschreibung
(_U
) und gleichzeitig eine hexadezimale Ziffer (_X
), daher
sollte ctype['A'+1]
folgenden Wert erhalten:
_U + _X = 01 + 0200 = 0201
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:
--character-sets-dir
-Option für das fragliche
Programm behoben werden.
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 section 5.2.7 Verbinden mit dem MySQL-Server.
Der `mysql'-Client benutzt die Datei, die in der
MYSQL_HISTFILE
-Umgebungsvariablen angegeben ist, um die
Kommandozeilen-History zu speichern. Der Vorgabewert für die History-Datei
ist `$HOME/.mysql_history', wobei $HOME
der Wert der
HOME
-Umgebungsvariablen ist. See section F Umgebungsvariablen.
Alle MySQL-Programme nehmen viele unterschiedliche Optionen auf. Jedes
MySQL-Programm bietet jedoch eine --help
-Option, die Sie benutzen
können, um eine vollständige Beschreibung der unterschiedlichen
Programmoptionen zu erhalten. Probieren Sie zum Beispiel mysql
--help
aus.
Sie können Vorgabeoptionen für alle Standard-Client-Programme mit einer Optionsdatei überschreiben. section 5.1.2 my.cnf-Optionsdateien.
Die unten stehende Liste beschreibt kurz die MySQL-Programme:
myisamchk
myisamchk
viele Funktionen hat, ist es in einem
eigenen Kapitel beschrieben. See section 5 MySQL-Datenbankadministration.
make_binary_distribution
Support.mysql.com
geschickt
werden, damit andere MySQL-Benutzer es benutzen können.
msql2mysql
mSQL
-Programme zu MySQL konvertiert. Es deckt
nicht alle Fälle ab, ist aber hilfreich, um mit dem Konvertieren
anzufangen.
mysqlaccess
mysqladmin
mysqladmin
kann auch benutzt werden, um Versionsnummer sowie Status-
und Prozess-Informationen vom Server zu erhalten.
See section 5.8.3 mysqladmin, Verwaltung eines MySQL-Servers.
mysqlbug
mysqld
mysqldump
mysqlimport
LOAD DATA
INFILE
. See section 5.8.7 mysqlimport, Daten aus Textdateien importieren.
mysqlshow
mysql_install_db
replace
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 section 5.1.2 my.cnf-Optionsdateien.
Beachten Sie, dass alle Optionen auf der Kommandozeile für
safe_mysqld
an mysqld
durchgereicht werden. Wenn Sie in
safe_mysqld
irgend welche Optionen benutzen wollen, die
mysqld
nicht unterstützt, müssen Sie diese in der Optionsdatei
angeben.
Die meisten Optionen für safe_mysqld
sind dieselben wie die Optionen
für mysqld
. See section 5.1.1 mysqld-Kommandozeilenoptionen.
safe_mysqld
unterstützt folgende Optionen:
--basedir=pfad
--core-file-size=#
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
mysqld
--log=pfad
--mysqld=mysqld-version
mysqld
-Version im ledir
-Verzeichnis, die Sie starten
wollen.
--mysqld-version=version
--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=#
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=#
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:
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).
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_verzeichnis shell> bin/safe_mysqld &
Wenn safe_mysqld
fehlschlägt, selbst wenn es aus dem
MySQL-Installationsverzeichnis aufgerufen wurde, können Sie es so ändern,
dass es den Pfad zu mysqld
und die Pfadnamen-Optionen benutzt, die
auf Ihrem System korrekt sind. Beachten Sie, dass bei zukünftigen
Aktualisierungen von MySQL Ihre veränderte Version von safe_mysqld
überschrieben wird. Daher sollten Sie eine Kopie Ihrer editierten Version
machen, damit Sie diese neu installieren können.
mysqld_multi
ist für die Verwaltung mehrerer mysqld
-Prozesse
gedacht, die auf unterschiedlichen UNIX-Sockets und TCP/IP-Ports laufen.
Das Programm sucht nach Gruppe(n), die [mysqld#] benannt sind, in my.cnf
(oder der angegebenen --config-file=...), wobei # jede positive Zahl ab 1
sein kann. Diese Gruppen sollten dieselben sein wie die übliche
[mysqld]
-Gruppe (zum Beispiel Optionen für mysqld, siehe
ausführliche Informationen im Handbuch über diese Gruppe), aber mit
denjenigen Port-, Socket- usw. Optionen, die für jeden separaten
mysqld
-Prozess gewünscht sind. Die Zahl im Gruppennamen hat eine
andere Funktion: Sie kann benutzt werden, um bestimmte mysqld
-Server
zu starten, anzuhalten, oder Berichte über sie mit diesem Programm
auszugeben. Unten stehen weitere Informationen zur Benutzung und zu den
Optionen.
Benutzung: mysqld_multi [OPTIONS] {start|stop|report} [GNR,GNR,GNR...] oder mysqld_multi [OPTIONS] {start|stop|report} [GNR-GNR,GNR,GNR-GNR,...]
Die GNR oben bedeutet die Gruppennummer. Sie können jede GNR starten, anhalten oder Berichtsinformationen über sie ausgeben, oder über mehrere von ihnen zugleich. (Siehe --example) Die GNRs in der Liste können mit Komma getrennt oder mit Bindestrich kombiniert werden, wobei letzteres heißt, dass alle GNRs zwischen GNR1-GNR2 betroffen sind. Ohne GNR-Argument werden alle gefundenen Gruppen entweder gestartet, angehalten, oder es werden Berichtsinformationen über sie ausgegeben. Beachten Sie, dass Sie in der GNR-Liste keinen Leerraum haben dürfen. Alles nach Leerraum wird ignoriert.
mysqld_multi
unterstützt folgende Optionen:
--config-file=...
[mysqld_multi]
), sondern nur die Gruppen
[mysqld#]. Ohne diese Option wird alles aus der normalen my.cnfDatei heraus
gesucht.
--example
--help
--log=...
--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
--password=...
mysqladmin
.
--tcp-ip
--user=...
mysqladmin
.
--version
Einige Anmerkungen zu mysqld_multi
:
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 section 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 section 5.7.2 safe_mysqld, der Wrapper um mysqld.Der obige Test soll erfolgreich verlaufen, ansonsten können Sie Probleme bekommen.
mysqlds
im
selben Daten-Verzeichnis starten. Benutzen Sie unterschiedlichen
Daten-Verzeichnisse, es sei denn, Sie wissen GENAU, was Sie tun!
mysqld
verschieden sein.
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.
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!
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 section 5.1.4 Viele MySQL-Server auf derselben Maschine laufen lassen.
Hier ist ein Beispiel einer config-Datei für mysqld_multi
.
# Diese Datei sollte wahrscheinlich in Ihrem Heimatverzeichnis liegen (~/.my.cnf) oder in /etc/my.cnf # Version 2.1 von Jani Tolonen [mysqld_multi] mysqld = /usr/local/bin/safe_mysqld mysqladmin = /usr/local/bin/mysqladmin user = multi_admin password = multipass [mysqld2] socket = /tmp/mysql.sock2 port = 3307 pid-file = /usr/local/mysql/var2/hostname.pid2 datadir = /usr/local/mysql/var2 language = /usr/local/share/mysql/english user = john [mysqld3] socket = /tmp/mysql.sock3 port = 3308 pid-file = /usr/local/mysql/var3/hostname.pid3 datadir = /usr/local/mysql/var3 language = /usr/local/share/mysql/swedish user = monty [mysqld4] socket = /tmp/mysql.sock4 port = 3309 pid-file = /usr/local/mysql/var4/hostname.pid4 datadir = /usr/local/mysql/var4 language = /usr/local/share/mysql/estonian user = tonu [mysqld6] socket = /tmp/mysql.sock6 port = 3311 pid-file = /usr/local/mysql/var6/hostname.pid6 datadir = /usr/local/mysql/var6 language = /usr/local/share/mysql/japanese user = jani
See section 5.1.2 my.cnf-Optionsdateien.
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:
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
tabelle.OLD
her.
-#, --debug=debug_options
debug_options
-Zeichenkette ist häufig
'd:t:o,filename'
.
-f, --force
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
-j große_tabelle, --join=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=#
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
-t, --test
-T dir_name, --tmp_dir=dir_name
-v, --verbose
-V, --version
-w, --wait
mysqld
-Server mit der --skip-locking
-Option aufgerufen
wurde, ist es keine gute Idee, myisampack
aufzurufen, wenn die
Tabelle während des Komprimierungsprozesses möglicherweise aktualisiert
wird.
Die unten stehende Befehlssequenz zeigt eine typische Tabellen-Komprimierungssitzung:
shell> ls -l station.* -rw-rw-r-- 1 monty my 994128 Apr 17 19:00 station.MYD -rw-rw-r-- 1 monty my 53248 Apr 17 19:00 station.MYI -rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm shell> myisamchk -dvv station MyISAM file: station Isam-version: 2 Creation time: 1996-03-13 10:08:58 Recover time: 1997-02-02 3:06:43 Data records: 1192 Deleted blocks: 0 Datafile: Parts: 1192 Deleted data: 0 Datafile pointer (bytes): 2 Keyfile pointer (bytes): 2 Max datafile length: 54657023 Max keyfile length: 33554431 Recordlength: 834 Record format: Fixed length table description: Key Start Len Index Type Root Blocksize Rec/key 1 2 4 unique unsigned long 1024 1024 1 2 32 30 multip. text 10240 1024 1 Field Start Length Type 1 1 1 2 2 4 3 6 4 4 10 1 5 11 20 6 31 1 7 32 30 8 62 35 9 97 35 10 132 35 11 167 4 12 171 16 13 187 35 14 222 4 15 226 16 16 242 20 17 262 20 18 282 20 19 302 30 20 332 4 21 336 4 22 340 1 23 341 8 24 349 8 25 357 8 26 365 2 27 367 2 28 369 4 29 373 4 30 377 1 31 378 2 32 380 8 33 388 4 34 392 4 35 396 4 36 400 4 37 404 1 38 405 4 39 409 4 40 413 4 41 417 4 42 421 4 43 425 4 44 429 20 45 449 30 46 479 1 47 480 1 48 481 79 49 560 79 50 639 79 51 718 79 52 797 8 53 805 1 54 806 1 55 807 20 56 827 4 57 831 4 shell> myisampack station.MYI Compressing station.MYI: (1192 records) - Calculating statistics normal: 20 empty-space: 16 empty-zero: 12 empty-fill: 11 pre-space: 0 end-space: 12 table-lookups: 5 zero: 7 Original trees: 57 After join: 17 - Compressing file 87.14% shell> ls -l station.* -rw-rw-r-- 1 monty my 127874 Apr 17 19:00 station.MYD -rw-rw-r-- 1 monty my 55296 Apr 17 19:04 station.MYI -rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm shell> myisamchk -dvv station MyISAM file: station Isam-version: 2 Creation time: 1996-03-13 10:08:58 Recover time: 1997-04-17 19:04:26 Data records: 1192 Deleted blocks: 0 Datafile: Parts: 1192 Deleted data: 0 Datafilepointer (bytes): 3 Keyfile pointer (bytes): 1 Max datafile length: 16777215 Max keyfile length: 131071 Recordlength: 834 Record format: Compressed table description: Key Start Len Index Type Root Blocksize Rec/key 1 2 4 unique unsigned long 10240 1024 1 2 32 30 multip. text 54272 1024 1 Field Start Length Type Huff tree Bits 1 1 1 constant 1 0 2 2 4 zerofill(1) 2 9 3 6 4 no zeros, zerofill(1) 2 9 4 10 1 3 9 5 11 20 table-lookup 4 0 6 31 1 3 9 7 32 30 no endspace, not_always 5 9 8 62 35 no endspace, not_always, no empty 6 9 9 97 35 no empty 7 9 10 132 35 no endspace, not_always, no empty 6 9 11 167 4 zerofill(1) 2 9 12 171 16 no endspace, not_always, no empty 5 9 13 187 35 no endspace, not_always, no empty 6 9 14 222 4 zerofill(1) 2 9 15 226 16 no endspace, not_always, no empty 5 9 16 242 20 no endspace, not_always 8 9 17 262 20 no endspace, no empty 8 9 18 282 20 no endspace, no empty 5 9 19 302 30 no endspace, no empty 6 9 20 332 4 always zero 2 9 21 336 4 always zero 2 9 22 340 1 3 9 23 341 8 table-lookup 9 0 24 349 8 table-lookup 10 0 25 357 8 always zero 2 9 26 365 2 2 9 27 367 2 no zeros, zerofill(1) 2 9 28 369 4 no zeros, zerofill(1) 2 9 29 373 4 table-lookup 11 0 30 377 1 3 9 31 378 2 no zeros, zerofill(1) 2 9 32 380 8 no zeros 2 9 33 388 4 always zero 2 9 34 392 4 table-lookup 12 0 35 396 4 no zeros, zerofill(1) 13 9 36 400 4 no zeros, zerofill(1) 2 9 37 404 1 2 9 38 405 4 no zeros 2 9 39 409 4 always zero 2 9 40 413 4 no zeros 2 9 41 417 4 always zero 2 9 42 421 4 no zeros 2 9 43 425 4 always zero 2 9 44 429 20 no empty 3 9 45 449 30 no empty 3 9 46 479 1 14 4 47 480 1 14 4 48 481 79 no endspace, no empty 15 9 49 560 79 no empty 2 9 50 639 79 no empty 2 9 51 718 79 no endspace 16 9 52 797 8 no empty 2 9 53 805 1 17 1 54 806 1 3 9 55 807 20 no empty 3 9 56 827 4 no zeros, zerofill(2) 2 9 57 831 4 no zeros, zerofill(1) 2 9
Die Informationen, die myisampack
ausgibt, sind unten beschrieben:
normal
empty-space
empty-zero
empty-fill
INTEGER
-Spalte kann zum Beispiel auf MEDIUMINT
geändert
werden).
pre-space
end-space
table-lookup
ENUM
umgewandelt werden, bevor die Huffman-Kompression durchgeführt
wird.
zero
Original trees
After join
Nachdem eine Tabelle komprimiert wurde, gibt myisamchk -dvv
zusätzliche Informationen über jedes Feld aus:
Type
constant
no endspace
no endspace, not_always
no endspace, no empty
table-lookup
ENUM
umgewandelt.
zerofill(n)
n
Bytes im Wert sind immer 0 und wurden nicht
gespeichert.
no zeros
always zero
Huff tree
Bits
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 section 3.1.2 Installation von MySQL unter Windows.
Beachten Sie, dass, weil InnoDB und Berkeley-DB nicht für alle Plattformen
verfügbar sind, einige der Max
-Binärdateien eventuell noch
Unterstützung für diese beiden Typen haben. Sie können überprüfen, welche
Tabellentypen unterstützt werden, indem Sie die folgende Anfrage ausführen:
mysql> show variables like "have_%"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | have_bdb | YES | | have_innodb | NO | | have_isam | YES | | have_raid | NO | | have_openssl | NO | +---------------+-------+
Die Bedeutung dieser Werte ist:
Wert | Bedeutung. |
YES | Die Option ist aktiviert und benutzbar. |
NO | MySQL ist nicht mit Unterstützung für diese Option kompiliert. |
DISABLED | Die xxxx-Option ist deaktiviert, weil mysqld mit --skip-xxxx gestartet wurde oder weil mysqld nicht mit allen notwendigen Optionen gestartet wurde, um die Option zu aktivieren. In diesem Fall sollte die hostname.err -Datei den Grund dafür enthalten, warum die Option deaktiviert wurde.
|
HINWEIS: Um InnoDB-Tabellen erzeugen zu können, MÜSSEN
Sie Ihre Startoptionen editieren und zumindest die
innodb_data_file_path
-Option eingeben. See section 8.5.2 Mit InnoDB anfangen - Optionen.
Um bessere Performance für BDB-Tabellen zu erzielen, sollten Sie auch für diese einige Konfigurationsoptionen angeben. See section 8.6.3 BDB-Startoptionen.
safe_mysqld
versucht automatisch, eine mysqld
-Binärdatei mit
dem -max
-Präfix zu starten. Das macht es sehr einfach, eine andere
mysqld
-Binärdatei in einer bestehenden Installation auszutesten.
Lassen Sie einfach configure
mit den Optionen, die Sie wollen,
laufen, und installieren Sie dann die neue mysqld
-Binärdatei als
mysqld-max
im selben Verzeichnis, wo Ihre alte
mysqld
-Binärdatei liegt. See section 5.7.2 safe_mysqld, der Wrapper um mysqld.
Der mysqld-max
-RPM benutzt das oben erwähnte
safe_mysqld
-Feature. Er installiert nur die ausführbare Datei
mysqld-max
und safe_mysqld
benutzt diese automatisch, wenn
safe_mysqld
neu gestartet wird.
Folgende Tabelle zeigt, welche Tabellentypen unsere Standard-MySQL-Max-Binärdateien beinhalten:
System | BDB | InnoDB |
AIX 4.3 | NEIN | JA |
HP-UX 11.0 | NEIN | JA |
Linux-Alpha | NEIN | JA |
Linux-Intel | JA | JA |
Linux-Ia64 | NEIN | JA |
Solaris-intel | NEIN | JA |
Solaris-sparc | JA | JA |
Caldera (SCO) OSR5 | JA | JA |
UnixWare | JA | JA |
Windows/NT | JA | JA |
Alle MySQL-Clients, die mittels der mysqlclient
-Bibliothek mit dem
Server kommunizieren, benutzen folgende Umgebungsvariablen:
Name | Beschreibung |
MYSQL_UNIX_PORT | Der vorgabemäßige Socket, benutzt für Verbindungen zu localhost
|
MYSQL_TCP_PORT | Der vorgabemäßige TCP/IP-Port |
MYSQL_PWD | Das vorgabemäßige Passwort |
MYSQL_DEBUG | Debug-Trace-Optionen beim Debuggen |
TMPDIR | Das Verzeichnis, in dem temporäre Tabellen / Dateien erzeugt werden |
Die Benutzung von MYSQL_PWD
ist unsicher.
See section 5.2.7 Verbinden mit dem MySQL-Server.
Der `mysql'-Client benutzt die Datei in der MYSQL_HISTFILE
-
Umgebungsvariablen genannte Datei, um die Kommandozeilen-History zu
speichern. Der Vorgabewert für die History-Datei ist
`$HOME/.mysql_history', wobei $HOME
der Wert der
HOME
-Umgebungsvariablen ist. See section F Umgebungsvariablen.
Alle MySQL-Programme haben viele verschiedene Optionen. Jedes
MySQL-Programm stellt jedoch ein --help
-Option zur Verfügung, die
Sie benutzen können, um eine vollständige Beschreibung der verschiedenen
Optionen des Programms zu erhalten. Probieren Sie zum Beispiel mysql
--help
aus.
Sie können die vorgabemäßigen Optionen für alle Standard-Client-Programme mit einer Optionsdatei überschreiben. section 5.1.2 my.cnf-Optionsdateien.
Die unten stehende Liste beschreibt kurz die MySQL-Programme:
myisamchk
myisamchk
viele Funktionen hat, ist es in einem
eigenen Kapitel beschrieben. See section 5 MySQL-Datenbankadministration.
make_binary_distribution
Support.mysql.com
geschickt
werden, damit andere MySQL-Benutzer es benutzen können.
msql2mysql
mSQL
-Programme zu MySQL konvertiert. Es deckt
nicht alle Fälle ab, ist aber hilfreich, um mit dem Konvertieren
anzufangen.
mysqlaccess
mysqladmin
mysqladmin
kann auch benutzt werden, um Versionsnummer sowie Status-
und Prozess-Informationen vom Server zu erhalten.
See section 5.8.3 mysqladmin, Verwaltung eines MySQL-Servers.
mysqlbug
mysqld
mysqldump
mysqlimport
LOAD DATA
INFILE
. See section 5.8.7 mysqlimport, Daten aus Textdateien importieren.
mysqlshow
mysql_install_db
replace
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
-A, --no-auto-rehash
-B, --batch
--character-sets-dir=...
-C, --compress
-#, --debug[=...]
-D, --database=...
my.cnf
-Datei.
--default-character-set=...
-e, --execute=...
-E, --vertical
\G
beenden.
-f, --force
-g, --no-named-commands
-G, --enable-named-commands
-i, --ignore-space
-h, --host=...
-H, --html
-L, --skip-line-numbers
--no-pager
--no-tee
-n, --unbuffered
-N, --skip-column-names
-O, --set-variable var=option
--help
listet Variablen auf.
-o, --one-database
--pager[=...]
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[=...]
-p
benutzen,
darf zwischen der Option und dem Passwort kein Leerzeichen stehen.
-P --port=...
-q, --quick
-r, --raw
--batch
.
-s, --silent
-S --socket=...
-t --table
-T, --debug-info
--tee=...
-u, --user=#
-U, --safe-updates[=#], --i-am-a-dummy[=#]
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
-V, --version
-w, --wait
Mit -O
oder --set-variable
können Sie auch die folgenden
Variablen setzen:
Variablenname | Vorgabe | Beschreibung |
connect_timeout | 0 | Anzahl von Sekunden, bevor die Verbindung wegen Zeitüberschreitung abgebrochen wird |
max_allowed_packet | 16777216 | Maximale Paketlänge, die zum Server gesendet bzw. von diesem empfangen wird |
net_buffer_length | 16384 | Puffer für TCP/IP- und Socket-Kommunikation |
select_limit | 1000 | Automatisches Limit für SELECT bei Benutzung von --i-am-a-dummy |
max_join_size | 1000000 | Automatisches Limit für Zeilen in einem Join bei Benutzung von --i-am-a-dummy. |
Wenn Sie 'help' auf der Kommandozeile eingeben, gibt mysql
die
Befehle aus, die es unterstützt:
mysql> help MySQL-Befehle: help (\h) Diesen Text anzeigen. ? (\h) Synonym für `help'. clear (\c) Lösch-Befehl. connect (\r) Erneut mit dem Server verbinden. Optionale Argumente sind db und host. edit (\e) Befehl mit $EDITOR editieren. ego (\G) Befehl an den MySQL-Server schicken, Ergebnis vertikal anzeigen. exit (\q) mysql beenden. Dasselbe wie quit. go (\g) Befehl an den MySQL-Server schicken. nopager (\n) Pager deaktivieren, nach stdout ausgeben. notee (\t) Nicht in die Ausgabedatei (Outfile) schreiben. pager (\P) PAGER [auf_pager] setzen. Anfrageergebnisse über PAGER ausgeben. print (\p) Aktuellen Befehl ausgeben. quit (\q) mysql beenden. rehash (\#) Vervollständigungs-Hash neu aufbauen. source (\.) Eine SQLsSkriptdatei ausführen. Benötigt einen Dateinamen als Argument. status (\s) Statusinformationen vom Server abrufen. tee (\T) Ausgabedatei [auf_outfile] setzen. Alles an die angegebene Ausgabedatei anhängen. use (\u) Eine andere Datenbankbenutzung. Benötigt Datenbanknamen als Argument.
Bei diesen Befehlen funktioniert PAGER nur unter UNIX.
Der status
-Befehl gibt Ihnen einige Informationen über die
Verbindung und den Server, den Sie benutzen. Wenn der Server im
--safe-updates
-Modus läuft, gibt status
auch die Werte der
mysql
-Variablen aus, die Ihre Anfragen beeinflussen.
Eine nützliche Startoption für Anfänger (eingeführt in MySQL-Version
3.23.11) ist --safe-updates
(oder --i-am-a-dummy
für
Benutzer, die irgendwann ein DELETE FROM tabelle
eingeben, aber
vergessen, die WHERE
-Klausel) zu benutzen. Wenn Sie diese Option
benutzen, schickt mysql
beim Öffnen der Verbindung folgenden Befehl
an den MySQL-Server:
SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=#select_limit#, SQL_MAX_JOIN_SIZE=#max_join_size#"
Wobei #select_limit#
und #max_join_size#
Variablen sind, die
auf der mysql
-Kommandozeile gesetzt werden können.
See section 6.5.6 SET
-Syntax.
Die Auswirkung davon ist folgende:
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;
#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)
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.
--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
.
pager
: Sie können es benutzen, um in eine Datei zu
schreiben:
mysql> pager cat > /tmp/log.txtDie 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 -SBeachten 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.
mysql> pager cat | tee /dr1/tmp/res.txt | tee /dr2/tmp/res2.txt | less -n -i -S
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
drop datenbank
extended-status
flush-hosts
flush-logs
flush-tables
flush-privileges
kill id,id,...
password
ping
processlist
reload
refresh
shutdown
slave-start
slave-stop
status
variables
version
Alle Befehle können auf ihr eindeutiges Präfix abgekürzt werden. Beispiel:
shell> mysqladmin proc stat +----+-------+-----------+----+-------------+------+-------+------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------+-----------+----+-------------+------+-------+------+ | 6 | monty | localhost | | Processlist | 0 | | | +----+-------+-----------+----+-------------+------+-------+------+ Uptime: 10077 Threads: 1 Questions: 9 Slow queries: 0 Opens: 6 Flush tables: 1 Open tables: 2 Memory in use: 1092K Max memory used: 1116K
Das Ergebnis des mysqladmin status
-Befehls hat folgende Spalten:
Uptime | Anzahl von Sekunden, seit der MySQL-Server hoch gefahren ist. |
Threads | Anzahl aktiver Threads (Clients). |
Questions | Anzahl von Questions von Clients, seit mysqld gestartet wurde.
|
Slow queries | Anfragen, die länger als long_query_time Sekunden benötigten. See section 5.9.5 Die Anfragen-Log-Datei für langsame Anfragen.
|
Opens | Wie viele Tabellen mysqld geöffnet hat.
|
Flush Tables | Anzahl von flush ... -, refresh - und reload -Befehlen.
|
Open Tables | Anzahl der Tabellen, die gerade geöffnet sind. |
Memory in use | Arbeitsspeicher, der direkt vom mysqld -Code beansprucht wird (nur verfügbar, wenn MySQL mit --with-debug=full kompiliert wurde).
|
Max memory used | Maximaler Arbeitsspeicher, der direkt vom mysqld -Code beansprucht wird (nur verfügbar, wenn MySQL mit --with-debug=full kompiliert wurde).
|
Wenn Sie mysqladmin shutdown
auf einem Socket ausführen (mit anderen
Worten, auf dem Computer, wo mysqld
läuft), wartet
mysqladmin
, bis MySQL die pid-file
entfernt hat, um
sicherzustellen, dass der mysqld
-Server korrekt angehalten wurde.
mysqlcheck
für Tabellenwartung und Wiederherstellung nach Abstürzen
Ab MySQL-Version 3.23.38 können Sie ein neues Prüf- und Reparatur-Werkzeug
für MyISAM
-Tabellen einsetzen. Der Unterschied zu myisamchk
ist, dass mysqlcheck
benutzt werden kann, wenn der
mysqld
-Server läuft, wohingegen myisamchk
nur benutzt werden
sollte, wenn er nicht läuft. Der Vorteil ist, dass Sie den Server zum
Prüfen oder zur Reparatur Ihrer Tabellen nicht mehr herunter fahren müssen.
mysqlcheck
benutzt die MySQL-Server-Befehle CHECK
,
REPAIR
, ANALYZE
und OPTIMIZE
auf eine für den Benutzer
bequeme Weise.
Es gibt drei alternative Möglichkeiten, mysqlcheck
aufzurufen:
shell> mysqlcheck [OPTIONS] datenbank [tabellen] shell> mysqlcheck [OPTIONS] --databases datenbank1 [datenbank2 datenbank3...] shell> mysqlcheck [OPTIONS] --all-databases
Daher kann es hinsichtlich der Auswahl von Datenbanken und Tabellen ähnlich
wie mysqldump
benutzt werden.
mysqlcheck
besitzt im Vergleich zu den anderen Clients ein
besonderes Feature: Das vorgabemäßige Verhalten, Tabellen mit -c zu
prüfen, kann geändert werden, indem die Binärdatei umbenannt wird. Wenn Sie
nur ein Werkzeug haben wollen, das vorgabemäßig Tabellen repariert,
kopieren Sie eine mysqlcheck
mit einem neuen Namen auf Ihre
Festplatte, nämlich mysqlrepair
, oder legen alternativ einen
symbolischen Link auf mysqlrepair
und benennen den Link
mysqlrepair
. Wenn Sie jetzt mysqlrepair
aufrufen, repariert
es vorgabemäßig Tabellen.
Folgende Namen können Sie benutzen, um das vorgabemäßige Verhalten von
mysqlcheck
zu verändern:
mysqlrepair: Vorgabe-Option: -r (reparieren) mysqlanalyze: Vorgabe-Option: -a (analysieren) mysqloptimize: Vorgabe-Option: -o (optimieren)
Die verfügbaren Optionen für mysqlcheck
sind hier aufgelistet. Bitte
prüfen Sie mit mysqlcheck --help
, welche davon Ihre Version
unterstützt.
-A, --all-databases
-1, --all-in-1
-a, --analyze
--auto-repair
-#, --debug=...
--character-sets-dir=...
-c, --check
-C, --check-only-changed
--compress
-?, --help
-B, --databases
--default-character-set=...
-F, --fast
-f, --force
-e, --extended
-h, --host=...
-m, --medium-check
-o, --optimize
-p, --password[=...]
-P, --port=...
-q, --quick
-r, --repair
-s, --silent
-S, --socket=...
--tables
-u, --user=#
-v, --verbose
-V, --version
Dienstprogramm, um eine Datenbank oder eine Sammlung von Datenbanken zu sichern oder um Daten auf einen anderen SQL-Server zu übertragen (nicht notwendigerweise ein MySQL-Server). Der Dump enthält SQL-Statements, um Datenbanken und Tabellen zu erzeugen und / oder Tabellen mit Daten zu füllen.
Wenn Sie eine Datensicherung auf dem Server machen, sollten Sie in Betracht
ziehen, statt dessen mysqlhotcopy
zu benutzen. See section 5.8.6 mysqlhotcopy, MySQL-Datenbanken und Tabellen kopieren.
shell> mysqldump [OPTIONS] datenbank [tabellen] OR mysqldump [OPTIONS] --databases [OPTIONS] datenbank1 [datenbank2 datenbank3...] OR mysqldump [OPTIONS] --all-databases [OPTIONS]
Wenn Sie keine Tabellen angeben oder --databases
bzw.
--all-databases
benutzen, wird die gesamte Datenbank (bzw. werden
alle Datenbanken) gedumpt.
Sie erhalten eine Auflistung der Optionen, die Ihre Version von
mysqldump
unterstützt, indem Sie mysqldump --help
eingeben.
Wenn Sie mysqldump
ohne --quick
oder --opt
ausführen,
beachten Sie, dass mysqldump
die gesamte Ergebnismenge in den
Arbeitsspeicher lädt, bevor das Ergebnis gedumpt wird. Das kann zu
Problemen führen, wenn Sie eine große Datenbank dumpen.
Wenn Sie eine neue Version des mysqldump
-Programms benutzen und
einen Dump erzeugen, der in einen sehr alten MySQL-Server eingelesen werden
soll, sollten Sie die --opt
- und -e
-Optionen nicht benutzen.
mysqldump
unterstützt folgende Optionen:
--add-locks
LOCK TABLES
vor und UNLOCK TABLE
nach jedem
Tabellen-Dump durch (um schnelleres Einfügen in MySQL zu erreichen).
--add-drop-table
drop table
vor jedem create
-Statement hinzufügen.
-A, --all-databases
--databases
mit allen
Datenbanken ausgewählt.
-a, --all
create
benutzen.
--allow-keywords
-c, --complete-insert
insert
-Statements benutzen (mit Spaltennamen).
-C, --compress
-B, --databases
USE datenbank;
eingefügt.
--delayed
INSERT DELAYED
-Befehl einfügen.
-e, --extended-insert
INSERT
-Syntax benutzen. (Ergibt kompaktere und
schnellere inserts-Statements.)
-#, --debug[=option_string]
--help
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--lines-terminated-by=...
-T
-Option benutzt und haben
dieselbe Bedeutung wie die entsprechenden Klauseln für LOAD DATA
INFILE
. See section 7.4.9 LOAD DATA INFILE
-Syntax.
-F, --flush-logs
-f, --force,
-h, --host=..
localhost
.
-l, --lock-tables.
READ LOCAL
gesperrt, um gleichzeitiges Einfügen zu
erlauben (bei MyISAM
-Tabellen).
-n, --no-create-db
-t, --no-create-info
CREATE
TABLE
-Statement).
-d, --no-data
--opt
--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]
mysqldump
eine
Eingabeaufforderung für Ihr Passwort.
-P port_num, --port=port_num
localhost
benutzt, für den Unix-Sockets benutzt werden.)
-q, --quick
mysql_use_result()
.
-r, --result-file=...
-S /pfad/zu/socket, --socket=/pfad/zu/socket
localhost
benutzt werden
soll (was der vorgabemäßige Host ist).
--tables
-T, --tab=pfad-zu-einem-verzeichnis
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
-O var=option, --set-variable var=option
-v, --verbose
-V, --version
-w, --where='wo-bedingung'
"--where=user='jimf'" "-wuserid>1" "-wuserid<1"
-O net_buffer_length=#, where # < 16M
--extended-insert
oder --opt
), erzeugt mysqldump
Zeilen bis zur Länge von net_buffer_length
. Wenn Sie diesen Wert
herauf setzen, müssen Sie sicherstellen, dass die
max_allowed_packet
-Variable im MySQL-Server größer als
net_buffer_length
ist.
Der häufigste Gebrauch von mysqldump
dient wahrscheinlich der
Herstellung einer Datensicherung ganzer Datenbanken. See section 5.4.1 Datenbank-Datensicherungen.
mysqldump --opt datenbank > datensicherung.sql
Diese können Sie zurück in MySQL einlesen mit:
mysql datenbank < datensicherung.sql
oder
mysql -e "source /pfad-zur-datensicherung/datensicherung.sql" datenbank
Ausserdem ist es sehr nützlich, um einen anderen MySQL-Server mit Informationen aus einer Datenbank zu füllen:
mysqldump --opt datenbank | mysql --host=entfernter-host -C datenbank
Es ist möglich, mehrere Datenbanken mit einem Befehl zu dumpen:
mysqldump --databases datenbank1 [datenbank2 datenbank3...] > meine_datenbanken.sql
Wenn Sie alle Datenbanken dumpen wollen, benutzen Sie:
mysqldump --all-databases > alle_datenbanken.sql
mysqlhotcopy
ist a perl Skript that uses LOCK TABLES
,
FLUSH TABLES
und cp
oder scp
to quickly make a backup
of a Datenbank. It's the fastest way to make a backup of the Datenbank,
of single Tabellen but it can only be run on the same machine where the
Datenbankverzeichnisse are.
mysqlhotcopy datenbank [/pfad/zu/new_Verzeichnis] mysqlhotcopy datenbank_1 ... datenbank_n /pfad/zu/new_Verzeichnis mysqlhotcopy datenbank./regex/
mysqlhotcopy
unterstützt folgende Optionen:
-?, --help
-u, --user=#
-p, --password=#
-P, --port=#
-S, --socket=#
--allowold
--keepold
--noindices
myisamchk -rq.
neu aufgebaut werden.
--method=#
cp
oder scp
).
-q, --quiet
--debug
-n, --dryrun
--regexp=#
--suffix=#
--checkpoint=#
--flushlog
--tmpdir=#
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 section 7.4.9 LOAD DATA INFILE
-Syntax.
mysqlimport
wird wie folgt aufgerufen:
shell> mysqlimport [optionen] datenbank textdatei1 [textdatei2....]
Bei jeder Textdatei, die auf der Kommandozeile angegeben wird, entfernt
mysqlimport
jegliche Erweiterungen vom Dateinamen und benutzt das
Ergebnis, um festzulegen, in welche Tabelle der Dateiinhalt importiert
werden soll. Dateien namens `patient.txt', `patient.text' und
`patient' beispielsweise würden alle in eine Tabelle namens
patient
importiert werden.
mysqlimport
unterstützt folgende Optionen:
-c, --columns=...
LOAD DATA INFILE
-Befehl zu erzeugen, der an MySQL durchgereicht
wird. See section 7.4.9 LOAD DATA INFILE
-Syntax.
-C, --compress
-#, --debug[=option_string]
-d, --delete
--fields-terminated-by=...
--fields-enclosed-by=...
--fields-optionally-enclosed-by=...
--fields-escaped-by=...
--lines-terminated-by=...
LOAD DATA INFILE
. See section 7.4.9 LOAD DATA INFILE
-Syntax.
-f, --force
--force
wird mysqlimport
beendet, wenn die Tabelle nicht
existiert.
--help
-h host_name, --host=host_name
localhost
.
-i, --ignore
--replace
-Option.
-l, --lock-tables
-L, --local
localhost
verbinden (was der vorgabemäßige Host ist).
-pihr_passwort, --password[=ihr_passwort]
mysqlimport
eine Eingabeaufforderung für Ihr Passwort.
-P port_num, --port=port_num
localhost
benutzt, für den Unix-Sockets benutzt werden.)
-r, --replace
--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
-S /pfad/zu/socket, --socket=/pfad/zu/socket
localhost
benutzt werden
soll (der der vorgabemäßige Host ist).
-u benutzername, --user=benutzername
-v, --verbose
-V, --version
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 section 5.5.5 SHOW
-Syntax.
mysqlshow
wird wie folgt aufgerufen:
shell> mysqlshow [optionen] [datenbank [tabelle [spalte]]]
Beachten Sie, dass Sie in neueren MySQL-Versionen nur die Datenbanken, Tabellen und Spalten sehen können, für die Sie irgend welche Berechtigungen haben.
Wenn das letzte Argument einen Shell- oder SQL-Platzhalter enthält
(*
, ?
, %
oder _
), wird nur das gezeigt, was dem
Platzhalter entspricht. Das kann zu Verwirrung führen, wenn Sie Spalten
einer Tabelle anzeigen, die einen Unterstrich (_
) enthalten, weil
Ihnen mysqlshow
in diesem Fall nur die Tabellennamen zeigt, die dem
Muster entsprechen. Das kann leicht durch Hinzufügen eines zusätzlichen
%
am Ende der Kommandozeile (als separates Argument) behoben werden.
perror
wird benutzt, um Fehlermeldungen auszugeben. perror
wird wie folgt aufgerufen:
shell> perror [optionen] [ERRORCODE [ERRORCODE...]] For example: shell> perror 64 79 Error code 64: Machine ist not on the network Error code 79: Can not access a needed shared library
perror
wird benutzt, um eine Beschreibung für einen
Systemfehler-Code anzuzeigen, oder einen Fehler-Code des
MyISAM/ISAM-Tabellen-Handlers. Die Fehlermeldungen sind hauptsächlich
abhängig vom Betriebssystem.
Der mysql
-Client wird typischerweise interaktiv benutzt, wie folgt:
shell> mysql datenbank
Es ist jedoch möglich, Ihre SQL-Befehle in eine Datei zu schreiben und
mysql
anzuweisen, ihre Eingaben aus dieser Datei zu lesen. Um das zu
tun, erzeugen Sie eine Textdatei `textdatei', die die Befehle enthält,
die Sie ausführen wollen. Dann rufen Sie mysql
wie gezeigt auf:
shell> mysql datenbank < textdatei
Sie können Ihre Textdatei auch mit einem USE datenbank
-Statement
beginnen lassen. In diesem Fall ist es nicht notwendig, den Datenbanknamen
auf der Kommandozeile anzugeben:
shell> mysql < textdatei
See section 5.8 Clientseitige Skripte und Hilfsprogramme von MySQL.
MySQL hat mehrere unterschiedliche Log-Dateien, die Ihnen helfen können
herauszufinden, was innerhalb mysqld
vor sich geht:
Die Fehler-Log-Datei | Probleme, die beim Start, beim Laufenlassen oder beim Anhalten von mysqld auftreten.
|
Die ISAM-Log-Datei | Loggt alle Änderungen in ISAM-Tabellen mit. Wird nur benutzt, um den ISAM-Code zu debuggen. |
Die Anfragen-Log-Datei | Hergestellte Verbindungen und ausgeführte Anfragen. |
Die Update-Log-Datei | Veraltet: Speichert Statements, die Daten verändern. |
Die Binär-Log-Datei | Speichert alle Statements, die etwas ändern. Wird auch für Replikation benutzt. |
Die Slow-Log-Datei | Speichert alle Anfragen, die länger als long_query_time zur Ausführung benötigten oder keine Indexe benutzten.
|
Alle Log-Dateien liegen im mysqld
Daten-Verzeichnis. Sie können
mysqld
zwingen, die Log-Dateien neu zu öffnen (oder in manchen
Fällen auf eine neue Log-Datei umzuschalten), indem Sie FLUSH LOGS
ausführen. See section 5.5.3 FLUSH
-Syntax.
mysqld
schreibt alle Fehler nach stderr, die das
safe_mysqld
-Skript in eine Datei namens 'hostname'.err
umleitet. (Unter Windows schreibt mysqld
direkt in die Datei
`\mysql\data\mysql.err'.)
Diese enthält Informationen, wann mysqld
gestartet und angehalten
wurde und zusätzlich jeden kritischen Fehler, der während der Laufzeit
passierte. Wenn mysqld
unerwartet stirbt und safe_mysqld
ihn
neu starten muss, schreibt safe_mysqld
eine restarted
mysqld
-Zeile in diese Datei. Diese Log-Datei enthält auch Warnungen, wenn
mysqld
eine Tabelle bemerkt, die automatisch geprüft oder repariert
werden muss.
Auf manchen Betriebssystemen enthält die Fehler-Log-Datei einen
Stack-Trace, wo mysqld
starb. Dieser kann benutzt werden, um
herauszufinden, wo mysqld
starb. See section E.1.4 Einen Stack-Trace benutzen.
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 section 5.9.4 Die binäre Update-Log-Datei. Mit dieser können Sie alles machen, was Sie mit der Update-Log-Datei machen können.
Wenn er mit der --log-update[=datei]
-Option gestartet wird, schreibt
mysqld
eine Log-Datei, die alle SQL-Befehle enthält, die Daten
aktualisieren. Wenn kein Dateiname angegeben wird, ist die Vorgabe der Name
der Host-Maschine. Wenn ein Dateiname angegeben wird, der aber keine
Pfadangabe enthält, wird die Datei ins Daten-Verzeichnis geschrieben. Wenn
`datei' keine Erweiterung hat, erzeugt mysqld
eine Log-Datei,
die er wie folgt benennt: `datei.###', wobei ###
eine Zahl ist,
die jedes Mal hochgezählt wird, wenn Sie mysqladmin refresh
oder
mysqladmin flush-logs
oder das FLUSH LOGS
-Statement
ausführen, oder wenn Sie den Server neu starten.
HINWEIS: Damit das dargestellte Schema funktioniert, sollten Sie NICHT eigene Dateien mit demselben Dateinamen wie die Update-Log-Datei plus Erweiterungen, die als die hochgezählte Zahl betrachtet werden könnten, im Verzeichnis anlegen, das von der Update-Log-Datei benutzt wird!
Wenn Sie die --log
oder -l
-Optionen benutzen, schreibt
mysqld
eine allgemeine Log-Datei mit dem Dateinamen
`hostname.log'. Neustarts und Refresh-Operationen führen dann nicht
dazu, dass eine neue Log-Datei erzeugt wird (obwohl diese geschlossen und
wieder geöffnet wird). In diesem Fall können Sie sie (unter Unix) wie folgt
kopieren:
mv hostname.log hostname-old.log mysqladmin flush-logs cp hostname-old.log ins-datensicherungs-verzeichnis rm hostname-old.log
Das Mitloggen mittels der Update-Log-Datei ist clever, weil es nur
Statements loggt, die tatsächlich Daten aktualisieren. Wenn ein
UPDATE
oder ein DELETE
mit einem WHERE
keine passenden
Zeilen findet, wird nichts in die Log-Datei geschrieben. Es werden sogar
UPDATE
-Statements übersprungen, die eine Spalte auf einen Wert
setzen, die sie bereits hat.
Das Schreiben in die Update-Log-Datei wird unmittelbar durchgeführt, nachdem eine Anfrage fertig ist, aber bevor irgend welche Sperren aufgehoben sind oder irgendein Commit durchgeführt wurde. Das stellt sicher, dass die Log-Datei stets in der Reihenfolge der Ausführung mitschreibt.
Wenn Sie eine Datenbank von Update-Log-Datei-Dateien aktualisieren wollen, könnten Sie folgendes tun (angenommen, Ihre Update-Log-Dateien haben Namen der Form `datei.###'):
shell> ls -1 -t -r datei.[0-9]* | xargs cat | mysql
ls
wird benutzt, um alle Log-Dateien in der richtigen Reihenfolge zu
erhalten.
Das ist nützlich, wenn Sie Datensicherungsdateien nach einem Absturz zurückspielen müssen und die Aktualisierungen neu ausführen wollen, die zwischen der Zeit der Datensicherung und dem Absturz lagen.
In Zukunft wird die Binär-Log-Datei die Update-Log-Datei ersetzen, daher empfehlen wir, dass Sie so bald wie möglich zu diesem Log-Format wechseln!
Die Binär-Log-Datei enthält alle Informationen, die im Update-Log verfügbar sind, in einem effizienteren Format. Sie enthält ausserdem Informationen darüber, wie lange jede Anfrage brauchte, die die Datenbank aktualisierte.
Die Binär-Log-Datei wird auch benutzt, wenn Sie einen Slave von einem Master replizieren. See section 5.10 Replikation bei MySQL.
Mit der --log-bin[=datei]
-Option gestartet, schreibt mysqld
eine Log-Datei, die alle SQL-Befehle enthält, die Daten aktualisieren. Wenn
kein Dateiname angegeben wird, ist die Vorgabe der Name der Host-Machine,
gefolgt von -bin
. Wenn der Dateiname angegeben wird, aber keine
Pfadangabe enthält, wird die Datei ins Daten-Verzeichnis geschrieben.
Sie können folgende Optionen für mysqld
benutzen, um zu
beeinflussen, was in die Binär-Log-Datei geschrieben wird:
binlog-do-db=datenbank |
Weist den Master an, Aktualisierungen für die angegebene Datenbank zu
loggen und alle anderen, nicht explizit erwähnten, auszuschließen.
(Beispiel: binlog-do-db=eine_datenbank )
|
binlog-ignore-db=datenbank |
Weist den Master an, Aktualisierungen für die angegebene Datenbank nicht in
die Binär-Log-Datei zu loggen (Beispiel:
binlog-ignore-db=eine_datenbank ).
|
mysqld
hängt dem Binär-Log-Datei-Dateinamen eine Erweiterung an, die
eine Zahl ist, die jedes Mal heraufgezählt wird, wenn Sie mysqladmin
refresh
, mysqladmin flush-logs
oder ein FLUSH LOGS
-Statement
ausführen oder den Server neu starten.
Damit Sie feststellen können, welche verschiedenen Binär-Log-Datei-Dateien
benutzt wurden, erzeugt mysqld
auch eine Binär-Log-Index-Datei, die
die Namen aller benutzten Binär-Log-Datei-Dateien enthält. Vorgabemäßig
hat diese denselben Namen wie die Binär-Log-Datei, mit der Erweiterung
'.index'
. Sie können den Namen der Binär-Log-Index-Datei mit der
--log-bin-index=[filename]
-Option ändern.
Wenn Sie Replikation benutzen, sollten Sie keine alten Binär-Log-Dateien
löschen, bis Sie sicher sind, dass kein Slave sie jemals wieder benötigen
wird. Eine Art, das zu tun, ist, einmal pro Tag mysqladmin
flush-logs
auszuführen, und danach alle Logs zu entfernen, die älter als 3
Tage sind.
Sie können die Binär-Log-Datei mit dem mysqlbinlog
-Befehl
untersuchen. Beispielsweise können Sie einen MySQL-Server wie folgt aus der
Binär-Log-Datei aktualisieren:
mysqlbinlog log-file | mysql -h server_name
Sie können auch das mysqlbinlog
-Programm benutzen, um die
Binär-Log-Datei direkt von einem entfernten MySQL-Server zu lesen!
mysqlbinlog --help
gibt Ihnen weitere Informationen zur Benutzung
dieses Programms.
Wenn Sie BEGIN [WORK]
oder SET AUTOCOMMIT=0
verwenden, müssen
Sie die MySQL-Binär-Log-Datei für Datensicherungen anstelle der alten
Update-Log-Datei benutzen.
Das Loggen in die Binär-Log-Datei wird unmittelbar nach jeder Anfrage geschrieben, aber bevor irgend welche Sperren aufgehoben wurden oder irgend ein Commit durchgeführt wurde. Das stellt sicher, dass die Log-Datei in der Reihenfolge der Ausführung mitschreibt.
Alle Aktualisierungen (UPDATE
, DELETE
oder INSERT
),
die eine transaktionale Tabelle (like BDB-Tabellen) ändern, werden bis zu
einem COMMIT
gecachet. Jegliche Aktualisierungen auf eine nicht
transaktionale Tabelle werden sofort in der Binär-Log-Datei gespeichert.
Jedem Thread wird beim Start ein Puffer der Größe binlog_cache_size
für die Pufferung von Anfragen zugewiesen. Wenn eine Anfrage größer als
dieser ist, öffnet der Thread eine temporäre Datei, um den größeren Cache
zu handhaben. Die temporäre Datei wird gelöscht, wenn der Thread beendet
wird.
max_binlog_cache_size
kann dazu benutzt werden, um die gesamte
benutzte Größe zu begrenzen, und um eine Anfrage aus mehreren
Transaktionen zu cachen.
Wenn Sie die Update- oder Binär-Log-Datei benutzen, funktionieren
gleichzeitige Einfügeoperationen nicht im Zusammenhang mit CREATE ...
INSERT
und INSERT ... SELECT
. Damit stellen Sie sicher, dass Sie
eine exakte Kopie Ihrer Tabellen wieder herstellen können, indem Sie die
Log-Datei auf eine Datensicherung anwenden.
Mit der --log-slow-queries[=datei]
-Option gestartet schreibt
mysqld
eine Log-Datei, die alle SQL-Befehle enthält, die länger als
long_query_time
zur Ausführung brauchten. Die Zeit, um die
anfänglichen Tabellensperren zu erhalten, wird nicht zur Ausführungszeit
hinzugezählt.
Anfragen-Log-Datei für langsame Anfragen wird geschrieben, nachdem jede Anfrage ausgeführt wurde und nachdem alle Sperren aufgehoben wurden. Das kann von der Reihenfolge abweichen, in der die Statements ausgeführt wurden.
Wenn kein Dateiname angegeben wird, ist die Vorgabe der Name der
Host-Maschine mit dem Suffix -slow.log
. Wenn ein Dateiname angegeben
wird, der aber keine Pfadangabe enthält, wird die Datei ins Daten-Verzeichnis geschrieben.
Die Anfragen-Log-Datei für langsame Anfragen kann benutzt werden, um
Anfragen zu finden, die für die Ausführung lange Zeit benötigen und daher
Kandidaten für Optimierungen sind, was bei einer großen Log-Datei
allerdings eine schwierige Aufgabe werden kann. Sie können die
Anfragen-Log-Datei für langsame Anfragen durch den
mysqldumpslow
-Befehl durchschleifen (pipen), um eine Zusammenfassung
der Anfragen zu erhalten, die in der Log-Datei erscheinen.
Wenn Sie --log-long-format
benutzen, erscheinen auch Anfragen, die
keine Indexe benutzen. See section 5.1.1 mysqld-Kommandozeilenoptionen.
MySQL hat viele Log-Dateien, die es leicht machen festzustellen, was vor
sich geht. See section 5.9 Die MySQL-Log-Dateien. Von Zeit zu Zeit jedoch muss man hinter
MySQL
saubermachen, damit die Log-Dateien nicht zu viel
Festplattenplatz in Anspruch nehmen.
Wenn Sie MySQL mit Log-Dateien benutzen, werden Sie von Zeit zu Zeit alte Log-Dateien entfernen wollen und MySQL mitteilen, in neue Dateien zu loggen. See section 5.4.1 Datenbank-Datensicherungen.
Bei einer Linux-(RedHat
)-Installation können Sie hierfür das
mysql-log-rotate
-Skript benutzen. Wenn Sie MySQL von einer
RPM-Distribution installiert haben, sollte das Skript automatisch
installiert worden sein. Beachten Sie, dass Sie damit vorsichtig umgehen
sollten, wenn Sie die Log-Datei für Replikation benutzen!
Auf anderen Systemen müssen Sie selbst ein kurzes Skript installieren, dass
Sie von cron
starten können, um Log-Dateien zu handhaben.
Sie können MySQL zwingen, mit neuen Log-Dateien zu starten, indem Sie
mysqladmin flush-logs
oder den SQL-Befehl FLUSH LOGS
benutzen. Wenn Sie MySQL-Version 3.21 benutzen, müssen Sie mysqladmin
refresh
benutzen.
Der obige Befehl macht folgendes:
--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).
--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-verzeichnis shell> mv mysql.log mysql.old shell> 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 section 5.9.4 Die binäre Update-Log-Datei) sowie eine Index-Datei für Binär-Log-Dateien, um hinsichtlich der Log-Rotation auf dem Laufenden zu bleiben. Der Slave informiert den Master beim Verbinden darüber, wo er seit der letzten erfolgreich durchgeführten Aktualisierung aufgehört hat, schließt zu den Aktualisierungen auf, blockiert danach und wartet darauf, dass ihn der Master über neue Aktualisierungen informiert.
Beachten Sie, dass alle Aktualisierungen auf eine Datenbank, die repliziert wird, durch den Master durchgeführt werden sollten!
Ein weiterer Vorteil von Replikation ist, dass man permanente (live) Datensicherungen vom System erhält, wenn man die Datensicherung auf dem Slave durchführt statt auf dem Master. See section 5.4.1 Datenbank-Datensicherungen.
MySQL-Replikation basiert darauf, dass der Server alle Änderungen Ihrer Datenbank im Binär-Log verfolgt (Updates, Deletes usw.) (see section 5.9.4 Die binäre Update-Log-Datei) und der oder die Slave-Server die gespeicherten Anfragen aus der Binär-Log-Datei des Masters lesen, so dass der Slave dieselben Anfragen auf seine Kopie der Daten ausführen kann.
Es ist sehr wichtig sich klarzumachen, dass die Binär-Log-Datei schlicht eine Aufzeichnung ist, die ab einem festen Zeitpunkt an startet (ab dem Moment, wo Sie Binär-Loggen starten). Alle Slaves, die Sie aufsetzen, benötigen Kopien aller Daten vom Master, wie Sie zu dem Zeitpunkt existierten, als Binär-Loggen auf dem Master aktiviert wurde. Wenn Sie Ihre Slaves mit Daten starten, die nicht mit dem übereinstimmen, was auf dem Master war, als die Binär-Log-Datei gestartet wurde, funktionieren Ihre Slaves womöglich nicht richtig.
Eine zukünftige Version (4.0) von MySQL wird die Notwendigkeit beseitigen, (eventuell große) Schnappschüsse von Daten für neue Slaves vorzuhalten, die Sie über die Live-Datensicherungs-Funktionalität aufsetzen wollen, wobei kein Sperren (Locking) erforderlich ist. Zu dieser Zeit ist es jedoch notwendig, alle Schreibzugriffe entweder mit einer globalen Lese-Sperre oder durch das Herunterfahren des Masters zu blockieren, während man einen Schnappschuss anlegt.
Sobald ein Slave korrekt konfiguriert ist und läuft, verbindet er sich
einfach mit dem Master und wartet darauf, dass Aktualisierung ausgeführt
werden. Wenn der Master abgeschaltet wird oder der Slave die Verbindung zum
Master verliert, versucht er alle master-connect-retry
Sekunden,
sich neu zu verbinden, bis er sich neu verbinden kann, und nimmt dann das
Warten auf Aktualisierungen wieder auf.
Jeder Slave achtet darauf, wo er aufgehört hat. Der Master-Server weiß nicht, wie viele Slaves es gibt oder welche zu einem gegebenen Zeitpunkt auf aktuellem Stand sind.
Der nächste Abschnitt erläutert den Master-Slave-Einrichtungsprozess detaillierter.
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.
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';
mysqladmin -u root -ppasswort shutdown
tar -cvf /tmp/mysql-snapshot.tar /pfad/zu/data-dirWindows-Benutzer können WinZip oder ähnliche Software benutzen, um ein Archiv des Daten-Verzeichnisses anzulegen.
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
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-1Ersetzen 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.
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:
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.
--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.
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.
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.
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 -> ADiese 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.
.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.
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.
master-port
-Parameter in my.cnf
angeben.
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.
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.
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.
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.
CHANGE MASTER TO
.
binlog-ignore-db
.
replicate-rewrite-db
benutzen, um den
Slave anzuweisen, Aktualisierungen einer Datenbank auf dem Master auf eine
mit einem anderen Namen auf dem Slave anzuwenden.
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:
pThread_cond_wait()
gehen, durch den er entweder durch eine
Aktualisierung oder einen Kill erweckt werden kann.
Binlog_dump
-Schleife weitermachen.
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:
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
CHANGE MASTER TO
-Befehl.
nsupdate
benutzen, um Ihr DNS dynamisch zu
aktualisieren.
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:
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.
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.
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.
SLAVE START
laufen.
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.
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:
log-slave-updates
und log-bin
laufen
- das behält eine Log-Datei aller Aktualisierungen auf dem Slave bei.
SHOW MASTER STATUS
auf dem Master zu der Zeit, als
Sie das Problem entdeckten.
SHOW SLAVE STATUS
auf dem Master zu der Zeit, als
Sie das Problem entdeckten.
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.
Go to the first, previous, next, last section, table of contents.