
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 D.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 D.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 E Umgebungsvariablen.
Folgende Programme unterstützen Optionsdateien: mysql,
mysqladmin, mysqld, mysqldump, mysqlimport,
mysql.server, myisamchk und myisampack.
Sie können Optionsdateien benutzen, um jede beliebig lange Option
festzulegen, die ein Programm unterstützt! Starten Sie das Programm mit
--help, um eine Liste der verfügbaren Optionen zu erhalten.
Eine Optionsdatei kann Zeilen der folgenden Formate enthalten:
#Kommentar
[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 E Umgebungsvariablen.
Der oben gezeigte Weg ist die 'schnelle und schmutzige' Lösung, die man üblicherweise zum Testen benutzt. Das nette daran ist, dass alle Verbindungen, die Sie in obiger Shell aufbauen, automatisch an den neuen laufenden Server weiter geleitet werden!
Wenn Sie dasselbe dauerhafter durchführen wollen, sollten Sie für jeden Server eine Optionsdatei erzeugen. See 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 E 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 E Umgebungsvariablen.
Wenn Sie versuchen, sich mit einem MySQL-Server zu verbinden, akzeptiert der Server die Verbindung oder weist sie zurück, abhängig von Ihrer Identität und davon, ob Sie diese mit dem korrekten Passwort verifizieren können. Falls nicht, lehnt der Server den Zugriff vollständig ab. Ansonsten akzeptiert der Server die Verbindung, geht dann in Phase 2 und wartet auf Anfragen.
Ihre Identität basiert auf zwei Informationsbestandteilen:
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-