Locale Page...  Global  |  Germany  |  UK  |  USA
Your privat CyberGadget - Die besten Resourcen für Web-Designer, Web-Master und Web-Developer!
Quick Search
Werbung
Partner & Freunde
Developersdex
Tutorial Guide
Original Referenzhandbuch für MySQL Datenbanksysteme
Go to the first, previous, next, last section, table of contents.


5 MySQL-Datenbankadministration

5.1 MySQL konfigurieren

5.1.1 mysqld-Kommandozeilenoptionen

mysqld akzeptiert folgende Kommandozeilenoptionen:

--ansi
ANSI-SQL-Syntax anstelle von MySQL-Syntax benutzen. See section 2.7.2 MySQL im ANSI-Modus laufen lassen.
-b, --basedir=path
Pfad zum Installationsverzeichnis. Gewöhnlich werden alle Pfade relativ zu diesem aufgelöst.
--big-tables
große Ergebnismengen zulassen, indem alle temporären Mengen in eine Datei gesichert werden. Das löst die meisten 'table full'-Fehler, verlangsamt aber in den Fällen Anfragen, in denen Tabellen im Speicher ausreichen würden. Ab Version 3.23.2 ist MySQL in der Lage, das automatisch zu lösen, indem für kleine temporäre Tabellen der Arbeitsspeicher benutzt wird und auf Festplatten-Tabellen umgeschaltet wird, wenn das nötig ist.
--bind-address=IP
IP-Adresse zum Anbinden (bind).
--character-sets-dir=path
Verzeichnis, wo Zeichensätze sind. See section 5.6.1 Der für Daten und Sortieren benutzte Zeichensatz.
--chroot=path
Chroot den mysqld-Daemon beim Start. Empfohlene Sicherheitsmaßnahme. Wird allerdings LOAD DATA INFILE und SELECT ... INTO OUTFILE etwas einschränken.
--core-file
Schreibt eine Core-Datei, wenn mysqld stirbt. Auf manchen Systemen müssen Sie zusätzliche --core-file-size für safe_mysqld angeben. See section 5.7.2 safe_mysqld, der Wrapper um mysqld.
-h, --datadir=path
Pfad zum Datenbank-Wurzelverzeichnis.
--default-character-set=charset
Setzt den vorgabemäßigen Zeichensatz. See section 5.6.1 Der für Daten und Sortieren benutzte Zeichensatz.
--default-table-type=type
Setzt den vorgabemäßigen Tabellentyp für Tabellen. See section 8 MySQL-Tabellentypen.
--debug[...]=
Wenn MySQL mit --with-debug konfiguriert ist, können Sie diese Option benutzen, um eine Trace-Datei darüber zu erhalten, was mysqld tut. See section D.1.2 Trace-Dateien erzeugen.
--delay-key-write-for-all-tables
Schlüsselpuffer (Key Buffer) für jegliche MyISAM-Tabellen nicht leeren (flush). See section 6.5.2 Serverparameter tunen.
--enable-locking
System-Sperren einschalten. Beachten Sie, dass Sie bei der Benutzung dieser Option auf Systemen, die kein voll funktionsfähiges lockd() besitzen (wie Linux), mysqld leicht zum Deadlock bringen können.
-T, --exit-info
Eine Bit-Maske verschiedener Flags, mit denen man den mysqld-Server debuggen kann. Man sollte diese Option nicht benutzen, wenn man nicht ganz genau weiß, was sie tut!
--flush
Alle Änderungen nach jedem SQL-Befehl auf Platte zurückschreiben (flush). Normalerweise schreibt MySQL alle Änderungen nach jedem SQL-Befehl auf Platte und läßt das Betriebssystem sich um das Synchronisieren auf Platte kümmern. See section A.4.1 Was zu tun ist, wenn MySQL andauernd abstürzt.
-?, --help
Kurze Hilfe ausgeben und beenden.
--init-file=file
Beim Start SQL-Befehle aus dieser Datei lesen.
-L, --language=...
Client-Fehlermeldungen in der angegebenen Sprache. Kann als voller Pfad angegeben werden. See section 5.6.2 Nicht englische Fehlermeldungen.
-l, --log[=datei]
Loggt Verbindungen und Anfragen in datei. See section 5.9.2 Die allgemeine Anfragen-Log-Datei.
--log-isam[=datei]
Loggt alle ISAM- / MyISAM-Änderungen in datei (wird nur benutzt, um ISAM / MyISAM zu debuggen).
--log-slow-queries[=datei]
Loggt alle Anfragen, die länger als long_query_time Sekunden für die Ausführung benötigt haben, in datei. See section 5.9.5 Die Anfragen-Log-Datei für langsame Anfragen.
--log-update[=datei]
Loggt Updates in datei.#, wobei # eine eindeutige Zahl ist, falls nicht vorgegeben. See section 5.9.3 Die Update-Log-Datei.
--log-long-format
Loggt einige zusätzliche Informationen ins Update-Log. Wenn Sie --log-slow-queries benutzen, werden Anfragen, die keine Indexe benutzen, in die Langsame-Anfragen-Log-Datei geloggt.
--low-priority-updates
Operationen, die Tabellen ändern (INSERT/DELETE/UPDATE), haben geringere Priorität als Selects. Das kann auch mit {INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ... durchgeführt werden, um lediglich die Priorität einer einzelnen Anfrage zu verringern, oder mit SET OPTION SQL_LOW_PRIORITY_UPDATES=1, um die Priorität in einem Thread zu ändern. See section 6.3.2 Themen, die Tabellensperren betreffen.
--memlock
Sperrt den mysqld-Prozess in den Arbeitsspeicher. Das funktioniert nur, wenn Ihr System den mlockall()-Systemaufruf versteht (wie Solaris). Das kann helfen, wenn Sie Probleme damit haben, dass Ihr Betriebssystem mysqld veranlasst, auf Platte zu swappen.
--myisam-recover [=option[,option...]]], wobei option eine
Kombination von DEFAULT, BACKUP, FORCE oder QUICK ist. Sie können sie auch explizit auf "" setzen, wenn Sie diese Option ausschalten wollen. Wenn die Option benutzt wird, überprüft mysqld beim Öffnen, ob die Tabelle als zerstört markiert ist oder ob die Tabelle nicht ordnungsgemäß geschlossen wurde. (Die letzte Option funktioniert nur, wenn Sie mysqld mit --skip-locking laufen lassen). Wenn das der Fall ist, läßt mysqld eine Überprüfung der Tabelle laufen. Wenn die Tabelle beschädigt war, versucht mysqld, sie zu reparieren. Folgende Optionen beeinflussen, wie repair funktioniert.
DEFAULT Dasselbe, als würde man für --myisam-recover keine Option angeben.
BACKUP Wenn die Tabelle während der Wiederherstellung geändert wurde, eine Datensicherung der `tabelle.MYD'-Datendatei als `tabelle-datetime.BAK' speichern.
FORCE Eine Wiederherstellung selbst dann laufen lassen, wenn man mehr als eine Zeile aus der .MYD-Datei verlieren wird.
QUICK Die Zeilen der Tabelle nicht überprüfen, wenn es keine gelöschten Blocks gibt.
Bevor eine Tabelle automatisch repariert wird, fügt MySQL darüber eine Bemerkung in das Fehler-Log. Wenn Sie in der Lage sein wollen, die meisten Sachen ohne Benutzer-Intervention zu beheben, sollten Sie die Optionen BACKUP,FORCE benutzen. Das erzwingt ein Reparieren einer Tabelle, selbst wenn dabei einige Zeilen gelöscht würden, erhält aber die alte Datendatei als Datensicherung, so dass Sie später herausfinden können, was passiert ist.
--pid-file=pfad
Pfad zur pid-Datei, die von safe_mysqld benutzt wird.
-P, --port=...
Port-Nummer, um auf TCP/IP-Verbindungen zu warten (listen).
-o, --old-protocol
Das 3.20-Protokoll für Kompatibilität mit einigen sehr alten Clients benutzen.
--one-thread
Nur einen Thread benutzen (zum Debuggen unter Linux). See section D.1 Einen MySQL-Server debuggen.
-O, --set-variable var=option
Weist einer Variablen einen Wert zu. --help listet Variablen auf. Sie finden eine komplette Beschreibung aller Variablen im SHOW VARIABLES-Abschnitt dieses Handbuchs. See section 5.5.5.4 SHOW VARIABLES. Der Abschnitt über das Tunen der Serverparameter enthält Informationen darüber, wie man diese optimiert. See section 6.5.2 Serverparameter tunen.
--safe-mode
Einige Optimierungsschritte überspringen. Setzt --skip-delay-key-write voraus.
--safe-show-database
Keine Datenbanken anzeigen, für die der Benutzer keine Zugriffsrechte hat.
--safe-user-create
Wenn das angeschaltet ist, kann ein Benutzer keine neuen Benutzer mit dem GRANT-Befehl anlegen, wenn der Benutzer kein INSERT-Zugriffsrecht auf die mysql.user-Tabelle oder irgend welche Spalten dieser Tabelle hat.
--skip-concurrent-insert
Die Fähigkeit abschalten, gleichzeitig auf MyISAM-Tabellen auszuwählen (select) und einzufügen (insert). (Sollte nur benutzt werden, wenn Sie der Meinung sind, ein Bug in diesem Feature gefunden zu haben.)
--skip-delay-key-write
Die delay_key_write-Option für alle Tabellen ignorieren. See section 6.5.2 Serverparameter tunen.
--skip-grant-tables
Diese Option veranlasst den Server, das Zugriffsrechte-System überhaupt nicht zu benutzen. Das gibt jedem vollen Zugriff auf alle Datenbanken! (Einen laufenden Server können Sie anweisen, die Berechtigungstabellen erneut zu verwenden, indem Sie mysqladmin flush-privileges oder mysqladmin reload ausführen.)
--skip-host-cache
Nie den Host-Name-Cache für schnellere Name-IP-Auflösung benutzen, sondern statt dessen bei jeder Verbindung beim DNS-Server anfragen. See section 6.5.5 Wie MySQL DNS benutzt.
--skip-locking
System-Sperren nicht benutzen. Um isamchk oder myisamchk auszuführen, müssen Sie den Server herunter fahren. See section 2.2.2 Wie stabil ist MySQL?. Beachten Sie, dass Sie in MySQL-Version 3.23 REPAIR und CHECK benutzen können, um MyISAM-Tabellen zu reparieren / zu prüfen.
--skip-name-resolve
Hostnamen werden nicht aufgelöst. Alle Host-Spaltenwerte in den Berechtigungstabellen müssen IP-Nummern oder localhost sein. See section 6.5.5 Wie MySQL DNS benutzt.
--skip-networking
Auf überhaupt keine TCP/IP-Verbindungen warten (listen). Jede Interaktion mit mysqld muss über Unix-Sockets erfolgen. Diese Option wird ausdrücklich empfohlen für Systeme, auf denen nur lokale Anfragen (Requests) erlaubt sind. See section 6.5.5 Wie MySQL DNS benutzt.
--skip-new
Keine neuen, möglicherweise falschen Routinen benutzen. Setzt --skip-delay-key-write voraus. Setzt ausserdem den vorgabemäßigen Tabellentyp auf ISAM. See section 8.3 ISAM-Tabellen.
--skip-symlink
Keine Dateien löschen oder umbenennen, auf die eine mit Symlink verknüpfte Datei im Daten-Verzeichnis zeigt.
--skip-safemalloc
Wenn MySQL mit --with-debug=full konfiguriert wird, überprüfen alle Programme den Arbeitsspeicher auf Überlauf, bei jeder Speicher-Allokation und -Freigabe. Da dieses Prüfen sehr langsam ist, können Sie es vermeiden, wenn Sie keine Arbeitsspeicherprüfung benötigten, indem Sie diese Option benutzen.
--skip-show-database
Keine 'SHOW DATABASE'-Befehle zulassen, wenn der Benutzer keine process-Berechtigung hat.
--skip-stack-trace
Keine Stack-Traces schreiben. Diese Option ist nützlich, wenn Sie mysqld unter einem Debugger laufen lassen. See section D.1 Einen MySQL-Server debuggen.
--skip-thread-priority
Benutzung von Thread-Prioritäten abschalten, um schnellere Antwortzeiten zu erzielen.
--socket=pfad
Socket-Datei, die anstelle des vorgabemäßigen /tmp/mysql.sock für lokale Verbindungen benutzt wird.
--sql-mode=option[,option[,option...]]
Option kann jede beliebige Kombination von REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, SERIALIZE und ONLY_FULL_GROUP_BY sein. Sie kann auch leer sein (""), wenn Sie dies zurücksetzen wollen. Alle oben angegebenen Optionen festlegen ist dasselbe wie --ansi benutzen. Mit dieser Option kann man nur benötigte SQL-Modi anschalten. See section 2.7.2 MySQL im ANSI-Modus laufen lassen.
transaction-isolation= { READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE }
Setzt das vorgabemäßige Transaktions-Isolations-Level. See section 7.7.3 SET TRANSACTION-Syntax.
-t, --tmpdir=pfad
Pfad für temporäre Dateien. Es kann nützlich sein, wenn Ihr vorgabemäßiges /tmp-Verzeichnis auf einer Partition liegt, die zu klein ist, um temporäre Tabellen zu speichern.
-u, --user=benutzername
Den mysqld-Daemon unter dem Benutzer benutzername laufen lassen. Diese Option ist zwingend notwendig, wenn mysqld als Root gestartet wird.
-V, --version
Versionsinformationen ausgeben und beenden.
-W, --warnings
Warnmeldungen wie Aborted connection... in die .err-Datei ausgeben. See section A.2.9 Kommunikationsfehler / Abgebrochene Verbindung.

5.1.2 my.cnf-Optionsdateien

Seit Version 3.22 kann MySQL vorgabemäßige Startoptionen für den Server und für Clients aus Optionsdateien lesen.

MySQL liest Vorgabeoptionen aus folgenden Dateien unter Unix:

Dateiname Zweck
/etc/my.cnf Globale Optionen
DATADIR/my.cnf Server-spezifische Optionen
defaults-extra-file Die Datei, die mit --defaults-extra-file=# festgelegt wird
~/.my.cnf Benutzerspezifische Optionen

DATADIR ist das MySQL-Daten-Verzeichnis (typischerweise `/usr/local/mysql/data' bei einer Binärinstallation oder `/usr/local/var' bei einer Quellinstallation). Beachten Sie, dass das das Verzeichnis ist, das zur Konfigurationszeit festgelegt wurde, nicht das, das mit --datadir festgelegt wird, wenn mysqld startet! (--datadir hat keinen Einfluss darauf, wo der Server nach Optionsdateien sucht, denn er sucht nach ihnen, bevor er irgend welche Kommandozeilenargumente verarbeitet.)

MySQL liest Vorgabeoptionen aus folgenden Dateien unter Windows:

Dateiname Zweck
Windows-System-Verzeichnis\my.ini Globale Optionen
C:\my.cnf Globale Optionen
C:\mysql\data\my.cnf Server-spezifische Optionen

Beachten Sie, dass Sie unter Windows alle Pfade mit / statt mit \ angeben sollten. Wenn Sie \ benutzen, müssen Sie das doppelt (\\) tun, weil \ in MySQL das Fluchtzeichen (Escape-Character) ist.

MySQL versucht, Optionsdateien in der oben angegebenen Reihenfolge zu lesen. Wenn es mehrere Optionsdateien gibt, erlangt eine Option, die in einer Datei festgelegt wird, die später gelesen wird, Vorrang über dieselbe Option, die in einer sonstigen Optionsdatei festgelegt wurde. Optionen, die auf der Kommandozeile festgelegt werden, erlangen Vorrang vor Optionen in jeglichen Optionsdateien. Einige Optionen können durch Umgebungsvariablen festgelegt werden. Optionen, die auf der Kommandozeile oder in Optionsdateien festgelegt werden, haben Vorrang vor Werten in Umgebungsvariablen. See section E Umgebungsvariablen. Folgende Programme unterstützen Optionsdateien: mysql, mysqladmin, mysqld, mysqldump, mysqlimport, mysql.server, myisamchk und myisampack.

Sie können Optionsdateien benutzen, um jede beliebig lange Option festzulegen, die ein Programm unterstützt! Starten Sie das Programm mit --help, um eine Liste der verfügbaren Optionen zu erhalten.

Eine Optionsdatei kann Zeilen der folgenden Formate enthalten:

#Kommentar
Kommentarzeilen fangen mit `#' oder `;' an. Leere Zeilen werden ignoriert.
[group]
group ist der Name des Programms oder der Gruppe, für das oder die Sie Optionen setzen wollen. Nach einer Gruppen-Zeile beziehen sich alle option- oder set-variable-Zeilen auf die benannte Gruppe, bis zum Ende der Optionsdatei oder bis eine andere Gruppe angegeben wird.
option
Das ist äquivalent zu --option auf der Kommandozeile.
option=value
Das ist äquivalent zu --option=value auf der Kommandozeile.
set-variable = variable=value
Das ist äquivalent zu --set-variable variable=value auf der Kommandozeile. Diese Syntax muss verwendet werden, um eine mysqld-Variable zu setzen.

Die client-Gruppe gestattet Ihnen, Optionen anzugeben, die sich auf alle MySQL-Clients (nicht auf mysqld) beziehen. Diese Gruppe eignet sich bestens dafür, das Passwort festzulegen, das Sie benutzen, um sich mit dem Server zu verbinden. (Stellen Sie jedoch sicher, dass die Optionsdatei nur für Sie les- und schreibbar ist.)

Beachten Sie, dass bei Optionen und Werten alle führenden Leerzeichen und solche am Zeilenende automatisch entfernt werden. Sie können in der Zeichenkette für den Wert die Escape-Sequenzen `\b', `\t', `\n', `\r', `\\' und `\s' benutzen (`\s' ist das Leerzeichen).

Hier ist eine typische globale Optionsdatei:

[client]
port=3306
socket=/tmp/mysql.sock

[mysqld]
port=3306
socket=/tmp/mysql.sock
set-variable = key_buffer_size=16M
set-variable = max_allowed_packet=1M

[mysqldump]
quick

Hier ist eine typische Benutzer-Optionsdatei:

[client]
# Folgendes Passwort wird an alle Standard-MySQL-Clients geschickt:
password=mein_password

[mysql]
no-auto-rehash
set-variable = connect_timeout=2

[mysqlhotcopy]
interactive-timeout

Wenn Sie eine Quelldistribution haben, finden Sie Beispielkonfigurationen in den Dateien mit Namen `my-xxxx.cnf' im `Support-files'-Verzeichnis. Wenn Sie eine Binärdistribution haben, suchen Sie im `DIR/support-files'-Verzeichnis, wobei DIR der Pfadname zum MySQL-Installationsverzeichnis ist (typischerweise `/usr/local/mysql'). Aktuell finden Sie dort beispielhafte Konfigurationsdateien für kleine, mittlere, große und sehr große Systeme. Sie können `my-xxxx.cnf' in Ihr Heimatverzeichnis kopieren, um damit zu experimentieren (benennen Sie die Kopie in `.my.cnf' um).

Alle MySQL-Clients, die Optionsdateien unterstützen, unterstützen folgende Optionen:

--no-defaults Keine Optionsdateien einlesen.
--print-defaults Den Programmnamen und alle Optionen, die das Programm erhalten wird, ausgeben.
--defaults-file=voller-pfad-zur-vorgabe-datei Nur die angegebene Konfigurationsdatei benutzen.
--defaults-extra-file=voller-pfad-zur-vorgabe-datei Diese Konfigurationsdatei nach der globalen Konfigurationsdatei einlesen, aber vor der Benutzer-Konfigurationsdatei.

Beachten Sie, dass die oben aufgeführten Optionen auf der Kommandozeile zuerst angegeben werden müssen, damit sie funktionieren! --print-defaults kann jedoch direkt nach den --defaults-xxx-file-Befehlen angegeben werden.

Hinweis für Entwickler: Optionsdatei-Handhabung ist schlicht dadurch implementiert, dass alle übereinstimmenden Optionen verarbeitet werden (das heißt, Optionen in der entsprechenden Gruppe), vor jeglichen Kommandozeilen-Argumenten. Das funktioniert sehr gut bei Programmen, die die letzte Instanz einer Option benutzen, die mehrfach festgelegt wurde. Wenn Sie ein altes Programm benutzen, das mehrfach festgelegte Optionen auf diese Art handhabt, aber keine Optionsdateien liest, müssen Sie nur zwei Zeilen hinzufügen, um diese Fähigkeit hinzuzufügen. Sehen Sie im Quellcode irgend eines Standard-MySQL-Clients nach, wie das gemacht wird.

In Shellskripts können Sie den `my_print_defaults'-Befehl benutzen, um die Konfigurationsdateien zu parsen:


shell> my_print_defaults client mysql
--port=3306
--socket=/tmp/mysql.sock
--no-auto-rehash

Die Ausgabe enthält alle Optionen für die Gruppen 'client' und 'mysql'.

5.1.3 Viele Server auf derselben Maschine installieren

In einigen Fällen brauchen Sie vielleicht viele verschiedene mysqld-Daemons (Server), die auf derselben Maschine laufen. Beispielsweise wollen Sie eine neue MySQL-Version zum Testen benutzen, während gleichzeitig eine alte Version für die Produktion läuft, oder Sie wollen verschiedenen Benutzern Zugriff auf verschiedene mysqld-Server geben, die sie selbst verwalten.

Eine Möglichkeit, einen neuen Server laufen zu lassen, besteht darin, ihn mit einem anderen Socket und einem anderen Port wie folgt zu starten:

shell> MYSQL_UNIX_PORT=/tmp/mysqld-neu.sock
shell> MYSQL_TCP_PORT=3307
shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
shell> scripts/mysql_install_db
shell> bin/safe_mysqld &

Der Umgebungsvariablen-Appendix beinhaltet eine Liste anderer Umgebungsvariablen, die Sie benutzen können, um mysqld zu steuern. See section 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.

5.1.4 Viele MySQL-Server auf derselben Maschine laufen lassen

Unter bestimmten Umständen wollen Sie vielleicht mehrere Server auf derselben Maschine laufen lassen. Beispielsweise wollen Sie ein neues MySQL-Release testen, Ihre bestehende Produktionseinrichtung aber unangetastet lassen. Oder Sie sind ein Internet-Service-Provider, der unabhängige MySQL-Installationen für verschiedene Kunden hat.

Wenn Sie mehrere Server laufen lassen wollen, ist es am einfachsten, die Server mit unterschiedlichen TCP/IP-Ports und Socket-Dateien laufen zu lassen, damit sie nicht beide auf demselben TCP/IP-Port oder derselben Socket-Datei auf Verbindungen warten. See section 5.7.3 mysqld_multi, Programm zur Verwaltung mehrerer MySQL-Server.

Nehmen wir einen existierenden Server an, der auf die existierende Port-Nummer und Socket-Datei konfiguriert ist. Sie konfigurieren einen neuen Server mit einem configure-Befehl, etwa wie folgt:

shell> ./configure  --with-tcp-port=port_nummer \
             --with-unix-socket-path=datei \
             --prefix=/usr/local/mysql-3.22.9

Hier müssen port_nummer und datei anders als die vorgabemäßigen Werte sein. Der --prefix-Wert sollte ein Installationsverzeichnis festlegen, das anders ist als dasjenige, unter dem die existierende MySQL-Installation liegt.

Sie können den Socket, der vom aktuell laufenden MySQL-Server benutzt wird, mit folgendem Befehl feststellen:

shell> mysqladmin -h hostname --port=port_nummer variables

Wenn Sie ``localhost'' als Hostnamen festlegen, benutzt mysqladmin Unix-Sockets anstelle von TCP/IP.

Wenn Sie einen MySQL-Server auf dem Port laufen haben, den Sie benutzt haben, bekommen Sie eine Liste der wichtigsten konfigurierbaren Variablen in MySQL, inklusive des Socketnamens.

Sie müssen keinen neuen MySQL-Server kompilieren, nur um ihn mit einem anderen Port und Socket zu starten. Sie können Port und Socket zur Laufzeit als Optionen von safe_mysqld festlegen:

shell> /pfad/zu/safe_mysqld --socket=datei --port=port_nummer

mysqld_multi kann ebenfalls safe_mysqld (oder mysqld) als Argument nehmen und die Optionen von einer Konfigurationsdatei an safe_mysqld und weiter an mysqld durchreichen.

Wenn Sie den neuen Server mit demselben Datenbankverzeichnis laufen lassen und Loggen angeschaltet haben, sollten Sie auch den Namen der Logdateien für safe_mysqld mit --log, --log-update oder --log-slow-queries festlegen. Ansonsten versuchen beide Server, in dieselbe Logdatei zu schreiben.

ACHTUNG: Normalerweise sollten Sie nie zulassen, dass zwei Server Daten in derselben Datenbank aktualisieren! Wenn Ihr Betriebssystem kein fehlerfreies System-Sperren (System Locking) unterstützt, führt das zu unliebsamen Überraschungen!

Wenn Sie für den zweiten Server ein anderes Datenbankverzeichnis benutzen wollen, können Sie das mit der --datadir=path-Option für safe_mysqld angeben.

HINWEIS: Mehrere MySQL-Server (mysqld) auf verschiedenen Maschinen laufen lassen, die auf ein gemeinsames Datenverzeichnis über NFS zugreifen, ist generell eine SCHLECHTE IDEE! Das Problem liegt darin, dass NFS zum Flaschenhals in Punkto Geschwindigkeit wird, denn es ist nicht für solche Zwecke gedacht. Und letztlich müssten Sie immer noch eine Lösung dafür finden, dass sich zwei oder mehr mysqlds nicht in die Quere kommen. Momentan gibt es keine Plattform, die mit 100%-iger Zuverlässigkeit Datei-Sperren (File Locking, gewöhnlich mit dem lockd-Daemon) in jeder Situation durchführt. Dennoch stellt NFS ein weiteres mögliches Risiko dar, denn es macht es dem lockd-Daemon noch schwieriger, Datei-Sperren zu handhaben. Machen Sie es sich also leicht und vergessen Sie diese Idee! Die funktionierende Lösung ist, einen Computer mit einem Betriebssystem einzusetzen, dass Threads effizient handhabt und mehrere Prozessoren hat.

Wenn Sie sich mit einem MySQL-Server verbinden wollen, der mit einem anderen Port läuft als mit dem, der in Ihren Client kompiliert ist, können Sie folgende Methoden benutzen:

  • Starten Sie den Client mit --host 'hostname' --port=port_nummer, um sich über TCP/IP zu verbinden, oder mit [--host localhost] --socket=datei, um sich über ein Unix-Socket zu verbinden.
  • In Ihren C- oder Perl-Programmen können Sie die Port- oder Socket-Argumente angeben, wenn Sie sich mit dem MySQL-Server verbinden.
  • Wenn Sie das Perl-DBD::mysql-Modul benutzen, können Sie die Optionen aus den MySQL-Optionsdateien lesen. See 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);
    
  • Setzen Sie die MYSQL_UNIX_PORT- und MYSQL_TCP_PORT-Umgebungsvariablen, so dass sie auf den Unix-Socket und TCP/IP-Port zeigen, bevor Sie Ihre Clients starten. Wenn Sie normalerweise eine speziellen Socket oder Port benutzen, sollten Sie die Befehle zum Setzen dieser Umgebungsvariablen in Ihrer `.login'-Datei unterbringen. See section E Umgebungsvariablen.
  • Legen Sie den vorgabemäßigen Socket und TCP/IP-Port in der `.my.cnf'-Datei in Ihrem Heimatverzeichnis fest. See section 5.1.2 my.cnf-Optionsdateien.

5.2 Allgemeine Sicherheitsthemen und das MySQL-Zugriffsberechtigungssystem

MySQL hat ein fortgeschrittenes, aber nicht standardisiertes Sicherheits- bzw. Berechtigungssystem. Dieser Abschnitt beschreibt, wie es funktioniert.

5.2.1 Allgemeine Sicherheitsrichtlinien

Jeder, der MySQL auf einem Computer benutzt, der mit dem Internet verbunden ist, sollte diesen Abschnitt lesen, um die gebräuchlichsten Sicherheitsfehler zu vermeiden.

Wenn wir über Sicherheit sprechen, unterstreichen wir die Notwendigkeit, den gesamten Server-Host (und nicht nur den MySQL-Server) gegen alle Arten möglicher Angriffe abzusichern: Lauschangriffe, Änderungen (Altering), Playback und Dienstverweigerung (Denial of Service). Dieser Abschnitt deckt nicht alle Aspekte von Verfügbarkeit und Fehlertoleranz ab.

MySQL benutzt ein Sicherheitssystem, das auf Zugriffssteuerungslisten (Access Control Lists, ACLs) für alle Verbindungen, Anfragen und sonstige Operationen basiert, die ein Benutzer durchführen kann. Zusätzlich gibt es einige Unterstützung für SSL-verschlüsselte Verbindungen zwischen MySQL-Clients und -Servern. Viele der hier geschilderten Konzepte sind überhaupt nicht spezifisch für MySQL, sondern beziehen sich auf fast alle Applikationen.

Wenn Sie MySQL laufen lassen, sollten Sie möglichst immer folgende Richtlinien beachten:

  • GEBEN SIE NIEMALS JEMANDEM AUSSER DEM MySQL-ROOT-BENUTZER ZUGRIFF AUF DIE user-TABELLE IN DER mysql-DATENBANK! Das verschlüsselte Passwort ist das echte Passwort in MySQL. Wenn Sie das in der the user-Tabelle aufgeführte Passwort für einen gegebenen Benutzer kennen, können Sie sich leicht als dieser Benutzer einloggen, wenn Sie Zugriff auf den Host haben, der für dieses Benutzerkonto aufgeführt ist.
  • Lernen Sie das MySQL-Zugriffsberechtigungssystem. Die GRANT- und REVOKE-Befehle werden benutzt, um den Zugriff auf MySQL zu steuern. Gewähren Sie nicht mehr Zugriffsrechte als notwendig. Gewähren Sie niemals Zugriffsrechte für alle Hosts. Checkliste:
    • Probieren Sie mysql -u root. Wenn es Ihnen gelingt, sich erfolgreich mit dem Server zu verbinden, ohne nach einem Passwort gefragt zu werden, haben Sie ein Problem, denn jeder kann sich als MySQL-root-Benutzer mit dem Server verbinden und hat volle Berechtigungen! Lesen Sie in diesem Fall noch einmal die MySQL-Installationsanweisungen durch und achten Sie insbesondere auf den Teil, der sich mit dem Setzen des root-Passworts beschäftigt.
    • Benutzen Sie den Befehl SHOW GRANTS und prüfen Sie nach, wer Zugriff auf was hat. Entfernen Sie die Berechtigungen, die nicht notwendig sind, indem Sie den REVOKE-Befehl benutzen.
  • Halten Sie keine Klartext-Passwörter in Ihrer Datenbank. Wenn Ihr Computer kompromittiert wird, kann der Einbrecher die gesamte Liste von Passwörtern nehmen und benutzen. Benutzen Sie statt dessen MD5() oder eine andere Einweg-Hash-Funktion.
  • Benutzen Sie keine Passwörter aus Lexika. Es gibt spezielle Programme, um diese zu knacken. Selbst Passwörter wie ``xfish98'' sind sehr schlecht. Viel besser ist ``duag98'', was dasselbe Wort ``fish'' enthält, aber um eine Taste nach links auf einer QUERTZ-Tastatur verschoben. Eine weitere Methode ist, etwas wie ``Mhall'' zu benutzen, was die ersten Buchstaben des Satzes ``Mary had a little lamb'' enthält. Das läßt sich leicht merken und eintippen, aber schwierig durch jemanden erraten, der es nicht kennt.
  • Investieren Sie in eine Firewall. Diese schützt sie vor mindestens 50% aller Exploits in jeglicher Software. Installieren Sie MySQL hinter einer Firewall oder in einer entmilitarisierten Zone (Demilitarized Zone, DMZ). Checkliste:
    • Versuchen Sie, Ihre Ports vom Internet aus zu scannen, indem Sie ein Werkzeug wie nmap benutzen. MySQL benutzt vorgabemäßig Port 3306. Dieser Port sollte von nicht vertrauenswürdigen Hosts aus unerreichbar sein. Eine weitere einfache Methode, um zu überprüfen, ob Ihr MySQL-Port offen ist oder nicht, ist, den folgenden Befehl von einer entfernten Maschine aus zu benutzen, wobei server_host der Hostname Ihres MySQL-Servers ist:
      shell> telnet server_host 3306
      
      Wenn Sie eine Verbindung und einige sinnlose Zeichen erhalten, ist der Port offen und sollte auf Ihrer Firewall oder Ihrem Router geschlossen werden, sofern Sie nicht einen wirklich guten Grund haben, ihn offen zu halten. Wenn telnet einfach hängt oder die Verbindung abgelehnt wird, ist alles in Ordnung, der Port ist blockiert.
  • Trauen Sie keinen Daten, die von Benutzern eingegeben werden. Sie können versuchen, Ihren Code auszutricksen, indem Sie spezielle oder escapete Zeichenfolgen in Web-Formulare, URLs oder sonstige Applikationen, die Sie hergestellt haben, eingeben. Stellen Sie sicher, dass Ihre Applikation sicher bleibt, wenn ein Benutzer etwas wie ``; DROP DATABASE mysql;'' eingibt. Das ist ein extremes Beispiel, aber große Sicherheitslücken und Datenverlust können eintreten, wenn ein Hacker ähnliche Techniken benutzt und Sie nicht darauf vorbereitet sind. Denken Sie auch daran, numerische Daten zu überprüfen. Ein häufiger Fehler besteht darin, nur Zeichenketten zu schützen. Manchmal denken Leute, dass eine Datenbank, die nur öffentlich zugängliche Daten enthält, nicht geschützt werden muss. Das stimmt nicht. Auf solche Datenbanken können zumindest Dienstverweigerungsangriffe (Denial-of-Service-Attacken) durchgeführt werden. Die einfachste Art, sich vor dieser Art von Angriffen zu schützen, ist, Apostrophe um numerische Konstanten herum zu benutzen: SELECT * FROM tabelle WHERE ID='234' statt SELECT * FROM tabelle WHERE ID=234. MySQL wandelt diese Zeichenkette automatisch in eine Zahl um und entfernt alle nicht-numerischen Zeichen aus ihr. Checkliste:
    • Alle Web-Applikationen:
      • Versuchen Sie, `'' und `"' in alle Ihr Web-Formulare einzugeben. Wenn Sie irgend welche MySQL-Fehler erhalten, untersuchen Sie das Problem unverzüglich!
      • Versuchen Sie, jedwede dynamischen URLs zu ändern, indem Sie %22 (`"'), %23 (`#') und %27 (`'') zu den URLs hinzufügen.
      • Versuchen Sie, Datentypen in dynamischen URLs von numerischen zu Zeichentypen zu ändern, die Zeichen aus den vorherigen Beispielen enthalten. Ihre Applikation sollte gegen solche und ähnliche Angriffe sicher sein.
      • Versuchen Sie Buchstaben, Leerzeichen und Sonderzeichen anstelle von Zahlen in numerische Felder einzugeben. Ihre Applikation sollte diese entfernen, bevor sie sie MySQL übergibt, und Ihre Applikation sollte einen Fehler erzeugen. Es ist sehr gefährlich, nicht geprüfte Werte an MySQL zu übergeben!
      • Überprüfen Sie Datengrößen, bevor Sie sie an MySQL übergeben.
      • Überlegen Sie, ob es sinnvoll ist, dass sich Ihre Applikation mit einem anderen Benutzernamen mit der Datenbank verbindet als mit dem, den Sie für Verwaltungszwecke benutzen. Geben Sie Applikationen nicht mehr Zugriffsberechtigungen als sie brauchen.
    • Benutzer von PHP:
      • Sehen Sie sich die addslashes()-Funktion an. Ab PHP 4.0.3 ist eine mysql_escape_string()-Funktion verfügbar, die auf der Funktion mit demselben Namen in der MySQL-C-API basiert.
    • Benutzer der MySQL-C-API:
      • Sehen Sie sich den mysql_escape_string()-API-Aufruf an.
    • Benutzer von MySQL++:
      • Sehen Sie sich die escape- und quote-Modifier für Query-Streams an.
    • Benutzer der Perl-DBI:
      • Sehen Sie sich die quote()-Methode an oder benutzen Sie Platzhalter.
    • Benutzer von Java-JDBC:
      • Benutzen Sie ein PreparedStatement-Objekt und Platzhalter.
  • Übermitteln Sie keine Klartextdaten (unverschlüsselte Daten) über das Internet. Diese Daten sind für jeden zugänglich, der Zeit und Möglichkeit hat, sie abzuhören und sie für die eigenen Zwecke zu benutzen. Benutzen Sie statt dessen ein verschlüsseltes Protokoll wie SSL oder SSH. MySQL unterstützt ab Version 4.0.0 interne SSL-Verbindungen. SSH-Port-Forwarding kann benutzt werden, um einen verschlüsselten (und komprimierten) Kommunikationstunnel zu erzeugen.
  • Lernen Sie die Benutzung der tcpdump- und strings-Utilities. In den meisten Fällen können Sie mit einem Befehl wie dem folgenden feststellen, ob MySQL-Datenströme verschlüsselt sind oder nicht:
    shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
    
    (Das funktioniert unter Linux und sollte mit kleineren Änderungen auf anderen Systemen funktionieren.) Achtung: Wenn Sie keine Daten sehen, heißt das nicht immer, dass sie verschlüsselt sind. Wenn Sie hohe Sicherheit benötigen, sollten Sie sich mit einem Sicherheitsexperten in Verbindung setzen.

5.2.2 Wie Sie MySQL gegen Cracker sicher machen

Wenn Sie sich mit einem MySQL-Server verbinden, sollten Sie normalerweise ein Passwort benutzen. Das Passwort wird nicht als Klartext über die Verbindung übermittelt. Allerdings ist der Verschlüsselungsalgorithmus nicht sehr stark, so dass ein cleverer Angreifer mit einiger Mühe das Passwort knacken kann, wenn er in der Lage ist, den Verkehr zwischen Client und Server abzuhören. Wenn die Verbindung zwischen Client und Server über ein nicht vertrauenswürdiges Netzwerk geht, sollten Sie einen SSH-Tunnel benutzen, um die Kommunikation zu verschlüsseln.

Jede sonstige Information wird als Klartext übermittelt, die von jedem gelesen werden kann, der in der Lage ist, die Verbindung abzuhören. Wenn Sie das beunruhigt, können Sie das komprimierte Protokoll benutzen (ab MySQL-Version 3.22), um so etwas zu erschweren. Um die Dinge noch sicherer zu machen, sollten Sie ssh benutzen. Sie finden einen Open-Source- ssh-Client auf http://www.openssh.org und einen kommerziellen ssh-Client auf http://www.ssh.com. Mit diesen erhalten Sie eine verschlüsselte TCP/IP-Verbindung zwischen einem MySQL-Server und einem MySQL-Client.

Um ein MySQL-System sicher zu machen, sollten Sie auf jeden Fall folgende Vorschläge in Betracht ziehen:

  • Benutzen Sie Passwörter für alle MySQL-Benutzer. Bedenken Sie, dass sich jeder beliebige als andere Person einloggen kann, und zwar so einfach wie mysql -u anderer_benutzer db_name, wenn anderer_benutzer kein Passwort hat. Es ist ein normales Verhalten bei Client-Server-Applikationen, dass der Client einen beliebigen Benutzernamen angeben kann. Sie können das Passwort für alle Benutzer ändern, indem Sie das mysql_install_db-Skript editieren, bevor Sie es laufen lassen, oder nur das Passwort für den MySQL-root-Benutzer, wie folgt:
    shell> mysql -u root mysql
    mysql> UPDATE user SET Password=PASSWORD('neues_passwort')
               WHERE user='root';
    mysql> FLUSH PRIVILEGES;
    
  • Lassen Sie den MySQL-Daemon nicht als Unix-root-Benutzer laufen. Das ist sehr gefährlich, denn jeder Benutzer mit FILE-Berechtigung ist dann in der Lage, Dateien als root zu erzeugen (zum Beispiel ~root/.bashrc). Um das zu verhindern, weigert sich mysqld, als root zu laufen, es sei denn, das wird direkt durch die --user=root-Option angegeben. mysqld kann unter einem gewöhnlichen Benutzer ohne besondere Rechte laufen. Sie können auch einen neuen Unix-Benutzer mysql anlegen, um alles noch sicherer zu machen. Wenn Sie mysqld als ein anderer Unix-Benutzer laufen lassen, müssen Sie nicht den root-Benutzernamen in der user-Tabelle ändern, denn MySQL-Benutzernamen haben nichts mit den Unix-Benutzernamen zu tun. Um mysqld als anderer Unix-Benutzer zu starten, fügen Sie eine user-Zeile hinzu, die den Benutzernamen zur [mysqld]-Gruppe der `/etc/my.cnf'-Optionsdatei oder der `my.cnf'-Optionsdatei im Daten-Verzeichnis des Servers hinzufügt. Beispiel:
    [mysqld]
    user=mysql
    
    Das bewirkt, dass der Server als der festgelegte Benutzer gestartet wird, egal ob Sie ihn manuell oder mit safe_mysqld oder mysql.server starten. Weitere Details finden Sie unter section 5.3.3 Wann Berechtigungsänderungen wirksam werden.
  • Unterstützen Sie keine Symlinks auf Tabellen (das kann mit der --skip-symlink-Option abgeschaltet werden). Das ist insbesondere wichtig, wenn Sie mysqld als Root laufen lassen, weil jeder, der Schreibzugriff auf das mysqld-Daten-Verzeichnis hat, dann jede Datei im System zerstören könnte! See section 6.6.1.2 Benutzung symbolischer Links für Tabellen.
  • Überprüfen Sie, dass der Unix-Benutzer, der mysqld laufen läßt, der einzige Benutzer mit Lese-/Schreibzugriffen auf die Datenbankverzeichnisse ist.
  • Geben Sie nicht allen Benutzern das process-Zugriffsrecht. Die Ausgabe von mysqladmin processlist zeigt den Text der aktuell ausgeführten Anfragen, so dass jeder, der diesen Befehl ausführen darf, in der Lage wäre, eine Anfrage eines anderen Benutzers wie UPDATE user SET password=PASSWORD('not_secure') einzusehen. mysqld reserviert eine zusätzliche Verbindung für Benutzer, die das process-Zugriffsrecht haben, so dass sich ein MySQL-root-Benutzer einloggen und Dinge überprüfen kann, selbst wenn alle normalen Verbindungen in Benutzung sind.
  • Geben Sie nicht allen Benutzern das file-Zugriffsrecht. Jeder Benutzer, der dieses Zugriffsrecht hat, kann irgendwo im Dateisystem Dateien mit den Rechten des the mysqld-Daemons schreiben! Um das etwas sicherer zu machen, sind alle Dateien, die mit SELECT ... INTO OUTFILE erzeugt werden, für jeden lesbar und können keine existierenden Dateien überschreiben. Das file-Zugriffsrecht kann auch benutzt werden, um jede Datei zu lesen, auf die der Unix-Benutzer Zugriff hat, als der der Server läuft. Das könnte zum Beispiel durch Benutzung von LOAD DATA missbraucht werden, um `/etc/passwd' in eine Tabelle zu laden, die anschließend mit SELECT gelesen wird.
  • Wenn Sie Ihrem DNS nicht trauen, sollten Sie IP-Nummern anstelle von Hostnamen in den Berechtigungstabellen verwenden. In jedem Fall sollten Sie sehr vorsichtig damit sein, Einträge in Berechtigungstabellen vorzunehmen, die Hostnamen mit Platzhaltern (Wildcards) verwenden!
  • Wenn Sie die Anzahl der Verbindungen für einen einzelnen Benutzer beschränken wollen, können Sie das tun, indem Sie die max_user_Verbindungen-Variable in mysqld setzen.

5.2.3 Startoptionen für mysqld in Bezug auf Sicherheit

Folgende mysqld-Optionen berühren Sicherheitsaspekte:

--safe-show-database
Mit dieser Option gibt SHOW DATABASES nur die Datenbanken zurück, für die der Benutzer irgend welche Rechte hat.
--safe-user-create
Wenn das angeschaltet ist, kann ein Benutzer keine neuen Benutzer mit dem GRANT-Befehl anlegen, wenn der kein INSERT-Zugriffsrecht auf die mysql.user-Tabelle hat. Wenn Sie dem Benutzer nur das Recht geben wollen, neue Benutzer mit den Berechtigungen anzulegen, die er vergeben darf, sollten Sie ihm folgende Berechtigung geben:
GRANT INSERT(benutzer) on mysql.user to 'benutzer'@'hostname';
Das stellt sicher, dass der Benutzer keine Berechtigungsspalten direkt ändern kann, sondern dafür den GRANT-Befehl benutzen muss.
--skip-grant-tables
Diese Option veranlasst den Server, das Berechtigungssystem überhaupt nicht zu benutzen. Das gibt jedem vollen Zugriff auf alle Datenbanken! (Einen laufenden Server können Sie veranlassen, die Berechtigungstabellen erneut zu verwenden, indem Sie mysqladmin flush-privileges oder mysqladmin reload ausführen.)
--skip-name-resolve
Hostnamen werden nicht aufgelöst. Alle Host-Spaltenwerte in den Berechtigungstabellen müssen IP-Nummern oder localhost sein.
--skip-networking
Keine TCP/IP-Verbindungen über das Netzwerk zulassen. Alle Verbindungen zu mysqld müssen über Unix-Sockets gemacht werden. Diese Option ist ungeeignet für Systeme, die MIT-pThreads benutzen, weil das MIT-pThreads-Paket keine Unix-Sockets unterstützt.
--skip-show-database
Mit dieser Option gibt das SHOW DATABASES-Statement nichts zurück.

5.2.4 Was das Berechtigungssystem macht

Die primäre Funktion des MySQL-Berechtigungssystem ist, einen Benutzer zu authentifizieren, der sich von einem gegebenen Host aus verbindet, und diesen Benutzer Berechtigungen auf eine Datenbank zuzuordnen, wie select, insert, update und delete.

Zusätzliche Funktionalität beinhaltet die Möglichkeit, einen anonymen Benutzer anzulegen und Berechtigungen für MySQL-spezifische Funktionen wie LOAD DATA INFILE und für administrative Operationen zu gewähren.

5.2.5 Wie das Berechtigungssystem funktioniert

Das MySQL-Berechtigungssystem stellt sicher, dass alle Benutzer nur genau die Dinge tun dürfen, zu denen sie berechtigt sind. Wenn Sie sich mit einem MySQL-Server verbinden, wird Ihre Identität durch den Host, von dem Sie sich aus verbinden, festgelegt und durch den Benutzernamen, den Sie angeben. Das System gewährt Berechtigungen gemäß Ihrer Identität und gemäß dem, was Sie tun wollen.

MySQL zieht sowohl Hostnamen als auch Benutzernamen heran, um Sie zu identifizieren, weil es kaum Grund gibt anzunehmen, dass ein gegebener Benutzername derselben Person woanders auf dem Internet gehört. So muss zum Beispiel der Benutzer bill, der sich von whitehouse.gov aus verbindet, nicht notwendigerweise dieselbe Person sein, die sich als Benutzer bill von microsoft.com aus verbindet. MySQL erlaubt Ihnen deshalb, Benutzer auf unterschiedlichen Hosts auseinander zu halten, die zufällig denselben Namen haben: Sie können bill einen Satz von Berechtigungen für Verbindungen von whitehouse.gov und einen anderen Satz von Berechtigungen für Verbindungen von microsoft.com aus gewähren.

Die MySQL-Zugriffskontrolle läuft in zwei Phasen ab:

  • Phase 1: Der Server überprüft, ob Sie das Recht haben, sich verbinden zu können.
  • Phase 2: Angenommen, Sie haben das Recht, sich zu verbinden, dann überprüft der Server jede Anfrage, die Sie absetzen, um festzustellen, ob Sie ausreichende Rechte haben, um diese auszuführen. Wenn Sie zum Beispiel Zeilen aus einer Tabellen in einer Datenbank auswählen oder eine Tabelle in einer Datenbank löschen, stellt der Server sicher, dass Sie die select-Berechtigung für die Tabelle bzw. die drop-Berechtigung für die Datenbank haben.

Der Server benutzt die user-, db- und host-Tabellen in der mysql-Datenbank in beiden Phasen der Zugriffskontrolle. Die Felder in diesen Berechtigungstabellen sind unten dargestellt:

Tabellenname user db host
Geltungsbereichs-Felder Host Host Host
User Db Db
Password User
Berechtigungs-Felder Select_priv Select_priv Select_priv
Insert_priv Insert_priv Insert_priv
Update_priv Update_priv Update_priv
Delete_priv Delete_priv Delete_priv
Index_priv Index_priv Index_priv
Alter_priv Alter_priv Alter_priv
Create_priv Create_priv Create_priv
Drop_priv Drop_priv Drop_priv
Grant_priv Grant_priv Grant_priv
References_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv

In der zweiten Phase der Zugriffskontrolle (Anfrage-Verifikation), zieht der Server gegebenenfalls zusätzlich die tables_priv- und columns_priv-Tabellen heran, falls Ihre Anfrage Tabellen betrifft. Die Felder in diesen Tabellen sind unten dargestellt:

Tabellenname tables_priv columns_priv
Geltungsbereichs-Felder Host Host
Db Db
User User
Table_name Table_name
Column_name
Berechtigungs-Felder Table_priv Column_priv
Column_priv
Sonstige Felder Timestamp Timestamp
Grantor

Jede Berechtigungstabelle enthält Geltungsbereichsfelder und Berechtigungsfelder.

Geltungsbereichsfelder legen den Geltungsbereich jedes Eintrags in den Tabellen fest, das heißt, der Kontext, für den der Eintrag gilt. So würde zum Beispiel ein user-Tabelleneintrag mit Host- und User-Werten von 'thomas.loc.gov' und 'bob' benutzt werden, um Verbindungen zum Server zu authentifizieren, die von bob vom Host thomas.loc.gov gemacht werden. In ähnlicher Weise bewirkt ein db-Tabelleneintrag in die Felder Host, User und Db mit 'thomas.loc.gov', 'bob' und 'reports', dass diese benutzt werden, wenn sich bob vom Host thomas.loc.gov verbindet und auf die reports-Datenbank zugreift. Die tables_priv- und columns_priv-Tabellen enthalten Geltungsbereichsfelder, die Tabellen oder Tabellen-Spalten-Kombinationen angeben, auf die sich der jeweilige Eintrag bezieht.

Für Zwecke der Zugriffsprüfung sind Vergleiche von Host-Werten unabhängig von der verwendeten Groß-/Kleinschreibung. User, Password, Db und Table_name-Werte sind abhängig von der verwendeten Groß-/Kleinschreibung. Column_name-Werte sind ab MySQL-Version 3.22.12 unabhängig von der verwendeten Groß-/Kleinschreibung.

Berechtigungsfelder zeigen die Berechtigungen an, die durch den Tabelleneintrag gewährt werden, das heißt, welche Operationen durchgeführt werden können. Der Server kombiniert die Informationen in den verschiedenen Berechtigungstabellen, um daraus eine komplette Beschreibung der Berechtigungen des Benutzers zu formulieren. Die Regeln, nach denen hierbei vorgegangen wird, sind in 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:

  • Das user-Tabellenbereichsfeld legt fest, ob eingehende Verbindungen zugelassen oder abgewiesen werden. Bei zugelassenen Verbindungen zeigen Berechtigungen, die in der user-Tabelle vergeben sind, die globalen (Superuser-) Rechte des Benutzers an. Diese Berechtigungen treffen auf alle Datenbanken auf dem Server zu.
  • Die db- und host-Tabellen werden zusammen benutzt:
    • Die Geltungsbereichsfelder der db-Tabelle legen fest, welche Benutzer auf welche Datenbanken von welchen Hosts aus zugreifen können. Die Berechtigungsfelder legen fest, welche Operationen zugelassen sind.
    • Die host-Tabelle wird als Erweiterung der db-Tabelle benutzt, wenn Sie wollen, dass ein gegebener db-Tabelleneintrag auf verschiedene Hosts zutrifft. Wenn Sie zum Beispiel wollen, dass ein Benutzer eine Datenbank von mehreren Hosts in Ihrem Netzwerk aus benutzen kann, lassen Sie den Host-Wert in der db-Tabelle des Benutzers leer, und füllen dann die host-Tabelle mit einem Eintrag für jeden dieser Hosts. Dieser Mechanismus ist ausführlicher in section 5.2.9 Zugriffskontrolle, Phase 2: Anfrageüberprüfung beschrieben.
  • Die tables_priv- und columns_priv-Tabellen sind der db-Tabelle ähnlich, aber feinkörniger: Sie beziehen sich auf Tabellen- und Spaltenebenen und nicht auf Datenbankebene.

Beachten Sie, dass die Verwaltungsberechtigungen (reload, shutdown usw.) nur in der user-Tabelle festgelegt werden. Das liegt daran, dass Verwaltungsoperationen Operationen auf dem Server selbst sind und nicht Datenbank-spezifisch, so dass es keinen Grund gibt, solche Berechtigungen in den anderen Berechtigungstabellen aufzuführen. So muss nur die user-Tabelle untersucht werden um festzustellen, ob man Verwaltungsoperationen durchführen kann oder nicht.

Das file-Zugriffsrecht wird auch nur in der user-Tabelle festgelegt. Es ist als solches keine Verwaltungsberechtigung, aber Ihre Möglichkeit, Dateien auf dem Server zu lesen oder zu schreiben, ist unabhängig von der Datenbank, auf die Sie zugreifen.

Der mysqld-Server liest die Inhalte der Berechtigungstabellen einmal, und zwar beim Start. Änderungen in den Berechtigungstabellen werden wirksam wie in section 5.3.3 Wann Berechtigungsänderungen wirksam werden geschildert.

Wenn Sie die Inhalte der Berechtigungstabellen ändern, sollten Sie sicherstellen, dass Ihre Änderungen Berechtigungen einführen, die Sie so haben wollen. Hilfe bei der Diagnose von Problemen finden Sie unter section 5.2.10 Gründe für Access denied-Fehler. Hinweise zu Sicherheitsthemen finden Sie unter see section 5.2.2 Wie Sie MySQL gegen Cracker sicher machen.

Ein nützliches Diagnosetool ist das mysqlaccess-Skript, das Yves Carlier für die MySQL-Distribution bereit gestellt hat. Rufen Sie mysqlaccess mit der --help-Option auf, um herauszufinden, wie es funktioniert. Beachten Sie, dass mysqlaccess den Zugriff nur anhand der user-, db- und host-Tabellen überprüft. Es überprüft keine Tabellen- oder Spaltenebenen-Berechtigungen.

5.2.6 Von MySQL zur Verfügung gestellte Berechtigungen

Informationen über Benutzerberechtigungen sind in den user-, db-, host-, tables_priv- und columns_priv-Tabellen in der mysql-Datenbank gespeichert (das heißt in der Datenbank, die mysql heißt). Der MySQL-Server liest die Inhalte dieser Tabellen, wenn er startet, und in den Fällen, die unter section 5.3.3 Wann Berechtigungsänderungen wirksam werden geschildert sind.

Die Namen, die in diesem Handbuch benutzt werden, um auf die Berechtigungen zu verweisen, die MySQL zur Verfügung stellt, sind unten dargestellt, zusammen mit den Tabellenspaltennamen, die jeder Berechtigung in the Berechtigungstabellen zugeordnet sind, und dem Kontext, auf den die Berechtigung zutrifft.

Berechtigung Spalte Kontext
select Select_priv Tabellen
insert Insert_priv Tabellen
update Update_priv Tabellen
delete Delete_priv Tabellen
index Index_priv Tabellen
alter Alter_priv Tabellen
create Create_priv Datenbanken, Tabellen oder Indexe
drop Drop_priv Datenbanken oder Tabellen
grant Grant_priv Datenbanken oder Tabellen
References References_priv Datenbanken oder Tabellen
reload Reload_priv Serververwaltung
shutdown Shutdown_priv Serververwaltung
process Process_priv Serververwaltung
file File_priv Dateizugriff auf den Server

Die select-, insert-, update- und delete-Berechtigungen erlauben Ihnen, Operationen auf Zeilen in existierenden Tabellen in einer Datenbank durchzuführen.

SELECT-Statements erfordern die select-Berechtigung nur dann, wenn tatsächlich Zeilen aus einer Tabelle abgerufen werden. Sie können bestimmte SELECT-Statements selbst ohne Berechtigung durchführen, um auf jede der Datenbanken auf dem Server zuzugreifen. Beispielsweise könnten Sie den mysql-Client als einfachen Taschenrechner benutzen:

mysql> SELECT 1+1;
mysql> SELECT PI()*2;

Die index-Berechtigung erlaubt Ihnen, Indexe zu erzeugen oder zu entfernen.

Die alter-Berechtigung erlaubt Ihnen, ALTER TABLE zu benutzen.

Die create- und drop-Berechtigungen erlauben Ihnen, neue Datenbanken und Tabellen zu erzeugen oder bestehende Datenbanken und Tabellen zu entfernen.

Denken Sie daran, dass ein Benutzer, dem Sie die drop-Berechtigung für die mysql-Datenbank gewähren, in der Lage ist, die Datenbank zu löschen, in der die MySQL-Zugriffsberechtigungen gespeichert sind!

Die grant-Berechtigung erlaubt Ihnen, die Berechtigungen, die Sie selbst besitzen, an andere Benutzer zu vergeben.

Die file-Berechtigung erlaubt Ihnen, Dateien auf dem Server zu lesen und zu schreiben, wenn Sie die LOAD DATA INFILE- und SELECT ... INTO OUTFILE-Statements benutzen. Jeder Benutzer, dem diese Berechtigung gewährt wurde, kann jedwede Datei lesen oder schreiben, die der MySQL-Server lesen oder schreiben darf.

Die restlichen Berechtigungen werden für Verwaltungsoperationen benutzt, die mit dem mysqladmin-Programm durchgeführt werden. Die unten stehende Tabelle zeigt, welche mysqladmin-Befehle mit jeder Verwaltungsberechtigung ausgeführt werden können:

Berechtigung Befehle, die dem Berechtigten erlaubt sind
reload reload, refresh, flush-privileges, flush-hosts, flush-logs und flush-tables
shutdown shutdown
process processlist, kill

Der reload-Befehl weist den Server an, die Berechtigungstabellen neu einzulesen. Der refresh-Befehl schreibt alle Tabellen auf Platte (flush) und öffnet und schließt die Log-Dateien. flush-privileges ist ein Synonym für reload. Die anderen flush-*-Befehle führen Funktionen aus, die refresh ähnlich sind, aber im Umfang beschränkter und daher in einigen Fällen zu bevorzugen. Wenn Sie zum Beispiel nur die Log-Dateien flushen wollen, ist flush-logs refresh vorzuziehen.

Der shutdown-Befehl fährt den Server herunter.

Der processlist-Befehl zeigt Informationen über die Threads an, die im Server ausgeführt werden. Der kill-Befehl killt Server-Threads. Ihre eigenen Threads können Sie jederzeit anzeigen oder killen, aber Sie brauchen die process-Berechtigung, um Threads anzuzeigen oder zu killen, die von anderen Benutzern initiiert wurden. See section 5.5.4 KILL-Syntax.

Es ist generell eine gute Idee, Berechtigungen nur den Nutzern zu gewähren, die diese tatsächlich brauchen, aber speziell bei folgenden Berechtigungen sollten Sie besondere Vorsicht walten lassen:

  • Die grant-Berechtigung erlaubt Benutzern, Ihre Berechtigungen an andere Benutzer zu übertragen. Zwei Benutzer mit unterschiedlichen Berechtigungen und mit der grant-Berechtigung sind in der Lage, Ihre Berechtigungen zu kombinieren.
  • Die alter-Berechtigung kann benutzt werden, um das Berechtigungssystem zu unterlaufen, indem Tabellen umbenannt werden.
  • Die file-Berechtigung kann missbraucht werden, um jede öffentlich lesbare Datei auf dem Server in eine Datenbanktabelle einzulesen, auf deren Inhalte dann mit SELECT zugegriffen werden kann. Das beinhaltet die Inhalte aller Datenbanken, die vom Server gehostet werden!
  • Die shutdown-Berechtigung kann missbraucht werden, um andere Benutzer komplett vom Server auszuschließen, indem der Server beendet wird.
  • Die process-Berechtigung kann benutzt werden, um den Klartext von momentan ablaufenden Anfragen einzusehen, inklusive Anfragen, die Passwörter setzen oder ändern.
  • Zugriffsrechte auf die mysql-Datenbank können benutzt werden, um Passwörter zu ändern und auf sonstige Berechtigungsinformationen zuzugreifen. (Passwörter werden verschlüsselt gespeichert, daher kann ein böswilliger Benutzer sie nicht einfach lesen und anschließend die Klartext-Passwörter kennen.) Wenn man auf die mysql.user-Passwort-Spalte zugreifen kann, kann man das nutzen, um sich als beliebiger Benutzer am MySQL-Server anzumelden. (Mit ausreichenden Rechten kann derselbe Benutzer dann Passwörter durch eigene ersetzen.)

Es gibt einige Dinge, die Sie mit dem MySQL-Berechtigungssystem nicht tun können:

  • Sie können nicht ausdrücklich festlegen, dass ein bestimmter Benutzer keinen Zugriff haben soll. Das heißt, Sie können nicht explizit mit einem bestimmten Benutzer vergleichen und dann die Verbindung ablehnen.
  • Sie können nicht festlegen, dass ein Benutzer das Recht hat, Tabellen in einer Datenbank zu erzeugen oder zu löschen, aber nicht die Datenbank selbst zu erzeugen oder zu löschen.

5.2.7 Verbinden mit dem MySQL-Server

MySQL-Client-Programme erfordern im Allgemeinen, dass Sie Verbindungsparameter festlegen, wenn Sie sich mit einem MySQL-Server verbinden wollen: Der Host, mit dem Sie sich verbinden wollen, Ihr Benutzername und Ihr Passwort. Beispielsweise kann der mysql-Client wie folgt gestartet werden (optionale Argumente sind in `[' und `]' eingeschlossen):

shell> mysql [-h hostname] [-u benutzername] [-pihr_passwort]

Alternative Formen der -h-, -u- und -p-Optionen sind --host=hostname, --user=benutzername und --password=ihr_passwort. Beachten Sie, dass zwischen -p oder --password= und dem folgenden Passwort kein Leerzeichen steht!

ACHTUNG: Ein Passwort auf der Kommandozeile anzugeben ist nicht sicher! Jeder Benutzer auf Ihrem System kann dann Ihr Passwort herausfinden, indem er einen Befehl wie ps auxww eingibt. See section 5.1.2 my.cnf-Optionsdateien.

mysql benutzt Vorgabewerte für Verbindungsparameter, die auf der Kommandozeile nicht angegeben sind:

  • Der vorgabemäßige Hostname ist localhost.
  • Der vorgabemäßige Benutzername ist Ihr Unix-Loginname.
  • Es wird kein Passwort übergeben, wenn -p fehlt.

Für einen Unix-Benutzer joe sind daher folgende Befehle gleichbedeutend:

shell> mysql -h localhost -u 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:

  • Sie können Verbindungsparameter im [client]-Abschnitt der `.my.cnf'-Konfigurationsdatei in Ihrem Heimatverzeichnis festlegen. Der relevante Abschnitt der Datei sieht etwa wie folgt aus:
    [client]
    host=hostname
    user=benutzername
    password=ihr_passwort
    
    See section 5.1.2 my.cnf-Optionsdateien.
  • Sie können Verbindungsparameter festlegen, indem Sie Umgebungsvariablen benutzen. Der Host kann für mysql festgelegt werden, indem MYSQL_HOST benutzt wird. Der MySQL-Benutzername kann mit USER festgelegt werden (nur für Windows). Das Passwort kann mit MYSQL_PWD festgelegt werden (aber das ist unsicher, siehe nächster Abschnitt). See section E Umgebungsvariablen.

5.2.8 Zugriffskontrolle, Phase 1: Verbindungsüberprüfung

Wenn Sie versuchen, sich mit einem MySQL-Server zu verbinden, akzeptiert der Server die Verbindung oder weist sie zurück, abhängig von Ihrer Identität und davon, ob Sie diese mit dem korrekten Passwort verifizieren können. Falls nicht, lehnt der Server den Zugriff vollständig ab. Ansonsten akzeptiert der Server die Verbindung, geht dann in Phase 2 und wartet auf Anfragen.

Ihre Identität basiert auf zwei Informationsbestandteilen:

  • Dem Host, von dem Sie sich verbinden
  • Ihrem MySQL-Benutzernamen

Die Identitätsüberprüfung wird anhand der drei Geltungsbereichs-Felder der user-Tabelle, nämlich (Host, User und Password) durchgeführt. Der Server akzeptiert die Verbindung nur, wenn ein user-Tabelleneintrag mit Ihrem Hostnamen und Benutzernamen übereinstimmt und Sie das korrekte Passwort angeben können.

Werte in den Geltungsbereichs-Feldern der user-Tabelle können wie folgt festgelegt werden:

  • Ein Host-Wert kann ein Hostname oder eine IP-Nummer sein, oder 'localhost', was die lokale Maschine angibt.
  • Sie können die Platzhalterzeichen `%' und `_' im Host-Feld benutzen.
  • Ein Host-Wert '%' stimmt mit jedem Hostnamen überein.
  • Ein leerer Host-Wert bedeutet, dass die Berechtigung zusammen mit dem Eintrag in der host-Tabelle gilt, der mit dem angegebenen Hostnamen übereinstimmt. Weitere Informationen hierzu finden Sie im nächsten Kapitel.
  • Ab MySQL-Version 3.23 können Host-Werte als IP-Nummern festgelegt werden, und Sie können eine Netmask festlegen, die angibt, wie viele Adress-Bits für die Netzwerknummer benutzt werden. Beispiel:
    GRANT ALL PRIVILEGES on db.* to david@'192.58.197.0/255.255.255.0';
    
    Das erlaubt jedem, sich von einer IP zu verbinden, bei der folgendes gilt:
    benutzer_ip & netmask = host_ip.
    
    Im obigen Beispiel können sich alle IP's im Intervall zwischen 192.58.197.0 bis 192.58.197.255 mit dem MySQL-Server verbinden.
  • Platzhalterzeichen sind im User-Feld nicht erlaubt. Sie können aber einen leeren Wert angeben, der mit jedem Namen übereinstimmt. Wenn der Eintrag in der user-Tabelle, der mit einer hereinkommenden Verbindung übereinstimmt, einen leeren Benutzernamen hat, wird angenommen, dass der Benutzer der anonyme Benutzer ist (der Benutzer ohne Namen), und nicht der Name, den der Client tatsächlich angegeben hat. Das bedeutet, dass ein leerer Benutzername für alle weiteren Zugriffsüberprüfungen während der laufenden Verbindung benutzt wird (also während Phase 2).
  • Das Password-Feld kann leer sein. Das bedeutet nicht, dass jedes Passwort übereinstimmt, sondern dass der Benutzer sich ohne Angabe eines Passworts verbinden muss.

Nicht-leere Password-Werte repräsentieren verschlüsselte Passwörter. MySQL speichert Passwörter nicht im Klartext, so dass jeder sie sehen könnte. Statt dessen wird das Passwort eines Benutzers, der sich zu verbinden versucht, verschlüsselt (unter Benutzung der PASSWORD()-Funktion). Das verschlüsselte Passwort wird dann benutzt, wenn Client / Server prüfen, ob das Passwort korrekt ist (das geschieht, ohne dass das verschlüsselte Passwort jemals über die Verbindung übertragen wird). Beachten Sie, dass aus der Sicht von MySQL das verschlüsselte Passwort das ECHTE Passwort ist, daher sollten Sie niemandem Zugriff darauf geben! Insbesondere sollten Sie keinem normalen Benutzer Lesezugriff auf die Tabellen der mysql-Datenbank geben!

Die unten stehenden Beispiele zeigen, wie unterschiedliche Kombinationen von Host- und-User-Werten in den user-Tabelleneinträgen auf hereinkommende Verbindungen zutreffen:

Host Wert User Wert Verbindungen, die mit dem Eintrag übereinstimmen
'thomas.loc.gov' 'fred' fred, der sich von thomas.loc.gov aus verbindet
'thomas.loc.gov' '' Jeder Benutzer, der sich von thomas.loc.gov aus verbindet
'%' 'fred' fred, der sich von jedem Host aus verbindet
'%' '' Jeder Benutzer, der sich von jedem Host aus verbindet
'%.loc.gov' 'fred' fred, der sich von jedem beliebigen Host in der loc.gov-Domäne aus verbindet
'x.y.%' 'fred' fred, der sich von x.y.net, x.y.com, x.y.edu usw. aus verbindet (wahrscheinlich eher unsinnig)
'144.155.166.177' 'fred' fred, der sich vom Host mit der IP-Adresse 144.155.166.177 aus verbindet
'144.155.166.%' 'fred' fred, der sich von jedem beliebigen Host im Class-C-Subnet 144.155.166 aus verbindet
'144.155.166.0/255.255.255.0' 'fred' Dasselbe wie im vorherigen Beispiel

Weil Sie im Host-Feld IP-Platzhalterwerte verwenden können (beispielsweise '144.155.166.%', was mit jedem Host in einem Subnet übereinstimmt), besteht die Möglichkeit, dass jemand diese Fähigkeit ausbeutet, indem er einen Host zum Beispiel 144.155.166.somewhere.com nennt. Um solche Versuche zu vereiteln, verbietet MySQL den Vergleich mit Hostnamen, die mit Ziffern und einem Punkt übereinstimmen. Wenn Sie daher einen Host haben, der so wie 1.2.foo.com benannt ist, wird sein Name nie mit der Host-Spalte der Berechtigungstabellen übereinstimmen. Nur eine IP-Nummer kann mit dem IP-Platzhalterwert übereinstimmen.

Eine hereinkommende Verbindung kann mit mehr als einem Eintrag in der user-Tabelle übereinstimmen. Beispielsweise würde eine Verbindung von thomas.loc.gov aus durch fred mit mehreren der oben genannten Einträge übereinstimmen. Wie entscheidet der Server, welcher der Einträge benutzt werden soll, wenn mehrere zutreffen? Der Server löst dieses Problem, indem er die user-Tabelle nach dem Einlesen beim Start sortiert, und danach die Einträge in sortierter Form durchsieht, wenn ein Benutzer versucht, sich zu verbinden. Der erste übereinstimmende Eintrag ist der, der benutzt wird.

Das Sortieren der user-Tabelle funktioniert wie folgt. Nehmen Sie an, dass die user-Tabelle so aussieht:

+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| %         | root     | ...
| %         | jeffrey  | ...
| localhost | root     | ...
| localhost |          | ...
+-----------+----------+-

Wenn der Server die Tabelle liest, ordnet er die Einträge mit den spezifischsten Einträgen für die Host-Werte zuerst ein ('%' in der Host-Spalte bedeutet ``jeder Host'' und ist am unspezifischsten). Einträge mit denselben Host-Werten werden mit den spezifischsten User-Werten zuerst geordnet (ein leerer User-Wert bedeutet ``jeder Benutzer'' und ist am unspezifischsten). Die daraus resultierende sortierte user-Tabelle sieht wie folgt aus:

+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| localhost | root     | ...
| localhost |          | ...
| %         | jeffrey  | ...
| %         | root     | ...
+-----------+----------+-

Beim Versuch einer Verbindung durchsucht der Server die sortierten Einträge und benutzt die ersten übereinstimmenden. Bei einer Verbindung von localhost aus durch jeffrey stimmen die Werte zuerst mit den Einträgen von 'localhost' in der Host-Spalte überein. Hiervon stimmt der Eintrag mit dem leeren Benutzernamen sowohl mit dem verbindenden Host als auch mit dem Benutzernamen überein. ('%'/'jeffrey' hätte auch übereingestimmt, aber er ist nicht der erste Tabelleneintrag, der gefunden wird.)

Hier ist ein weiteres Beispiel. Nehmen Sie an, die user-Tabelle sieht wie folgt aus:

+----------------+----------+-
| Host           | User     | ...
+----------------+----------+-
| %              | jeffrey  | ...
| thomas.loc.gov |          | ...
+----------------+----------+-

Die sortierte Tabelle sieht wie folgt aus:

+----------------+----------+-
| Host           | User     | ...
+----------------+----------+-
| thomas.loc.gov |          | ...
| %              | jeffrey  | ...
+----------------+----------+-

Eine Verbindung von thomas.loc.gov aus durch jeffrey stimmt mit dem ersten Eintrag überein, wohingegen eine Verbindung von whitehouse.gov aus durch jeffrey mit dem zweiten Eintrag übereinstimmt.

Ein häufiges Missverständnis besteht darin zu denken, dass bei einem angegebenen Benutzernamen alle Einträge, die explizit den Benutzer nennen, zuerst benutzt werden, wenn der Server versucht, eine Übereinstimmung für die Verbindung zu finden. Das stimmt schlicht nicht. Das vorherige Beispiel stellt das dar, wobei eine Verbindung von thomas.loc.gov aus durch jeffrey zuerst gerade nicht mit dem Eintrag übereinstimmt, der 'jeffrey' als User-Feldwert enthält, sondern mit dem Eintrag, der keinen Benutzernamen enthält!

Wenn Sie Probleme haben, sich mit dem Server zu verbinden, geben Sie die user-Tabelle aus und sortieren Sie sich von Hand, um zu sehen, wo die erste Übereinstimmung stattfindet.

5.2.9 Zugriffskontrolle, Phase 2: Anfrageüberprüfung

Wenn Sie erst einmal eine Verbindung hergestellt haben, geht der Server in Phase 2. Bei jeder Anfrage, die über diese Verbindung hereinkommt, prüft der Server, ob Sie ausreichende Berechtigungen haben, sie auszuführen, wobei es auf die Operation ankommt, die Sie ausführen wollen. Hier kommen die Berechtigungsfelder der Berechtigungstabellen ins Spiel. Diese Berechtigungen können aus jeder der user-, db-, host-, tables_priv- oder columns_priv-Tabellen stammen. Die Berechtigungstabellen werden mit GRANT- und REVOKE-Befehlen verändert. See section 5.3.1 GRANT- und REVOKE-Syntax. (Hilfreich sind die Ausführungen unter section 5.2.5 Wie das Berechtigungssystem funktioniert, wo die Felder aufgelistet sind, die sich in jeder der Berechtigungstabellen finden.)

Die user-Tabelle gewährt Berechtigungen, die Ihnen auf globaler Ebene zugeordnet sind und die unabhängig von der gerade aktuellen Datenbank zutreffen. Wenn beispielsweise die user-Tabelle Ihnen die delete-Berechtigung gewährt, können Sie Zeilen aus jeder Datenbank auf dem Server-Host löschen! Mit anderen Worten: Berechtigungen in der user-Tabelle sind Superuser-Berechtigungen. Es ist klug, Berechtigungen in der user-Tabelle nur Superusern wie Server- oder Datenbankverwaltern zu gewähren. Bei anderen Benutzern sollten Sie Berechtigungen in der user-Tabelle auf 'N' gesetzt lassen und Berechtigungen nur auf Datenbank-Ebene gewähren, indem Sie die db- und host-Tabellen benutzen.

Die db- und host-Tabellen gewähren Datenbank-spezifische Berechtigungen. Werte in den Geltungsbereichs-Feldern können wie folgt festgelegt werden:

  • Die Platzhalterzeichen `%' und `_' können in den Host- und Db-Feldern jeder Tabelle benutzt werden.
  • Ein '%'-Host-Wert in der db-Tabelle bedeutet ``jeder Host.'' Ein leerer Host-Wert in der db-Tabelle bedeutet ``sieh in der host-Tabelle wegen weiterer Informationen nach''.
  • Ein '%'- oder leerer Host-Wert in der host-Tabelle bedeutet ``jeder Host''.
  • Ein '%'- oder leerer Db-Wert in einer der Tabellen bedeutet ``jede Datenbank''.
  • Ein leerer User-Wert in einer der Tabellen entspricht dem anonymen Benutzer.

Die db- und host-Tabellen werden eingelesen und sortiert, wenn der Server hoch fährt (zur gleichen Zeit, wenn er die user-Tabelle einliest). Die db-Tabelle wird nach den Geltungsbereichs-Feldern Host, Db und User sortiert. Die host-Tabelle wird nach den Geltungsbereichs-Feldern Host und Db sortiert. Bei der user-Tabelle werden die spezifischsten Werte zuerst und die unspezifischsten Werte zuletzt einsortiert, und wenn der Server nach übereinstimmenden Einträgen sucht, benutzt er die erste Übereinstimmung, die er findet.

Die tables_priv- und columns_priv-Tabellen gewähren Tabellen- und Spalten-spezifische Berechtigungen. Werte in der Geltungsbereichs-Feldern können wie folgt festgelegt werden:

  • Die Platzhalterzeichen `%' und `_' können im Host-Feld beider Tabellen benutzt werden.
  • Ein '%'- oder leerer Host-Wert in jeder der beiden Tabellen bedeutet ``jeder Host.''
  • Die Db-, Table_name- und Column_name-Felder dürfen in beiden Tabellen keine Platzhalter enthalten oder leer sein.

Die tables_priv- und columns_priv-Tabellen werden nach den Host-, Db- und User-Feldern sortiert. Das geschieht ähnlich wie das Sortieren der db-Tabelle, wenngleich das Sortieren einfacher ist, weil nur das Host-Feld Platzhalter enthalten darf.

Der Prozess der Anfragenüberprüfung ist weiter unten beschrieben. (Wenn Sie mit dem Quelltext für die Zugangsüberprüfung vertraut sind, werden Sie feststellen, dass die Beschreibung hier leicht vom im Code verwendeten Algorithmus abweicht. Die Beschreibung stellt dar, was der Code tatsächlich tut; sie weicht nur deshalb ab, um die Erklärung zu erleichtern.)

Bei Verwaltungsanfragen (shutdown, reload usw.) prüft der Server nur den user-Tabelleneintrag, weil das die einzige Tabelle ist, die Verwaltungsberechtigungen festlegt. Zugriff wird gewährt, wenn der Eintrag die verlangte Operation erlaubt, ansonsten wird er verweigert. Wenn Sie zum Beispiel mysqladmin shutdown ausführen wollen, aber Ihr user-Tabelleneintrag Ihnen nicht die shutdown-Berechtigung gewährt, wird der Zugriff verweigert, ohne dass die db- oder host-Tabellen geprüft werden. (Sie enthalten keine Shutdown_priv-Spalte, daher gibt es keinen Grund, sie zur Prüfung heranzuziehen.)

Bei Datenbank-bezogenen Anfragen (insert, update usw.) prüft der Server zuerst die globalen (superuser-) Berechtigungen, indem er im user-Tabelleneintrag nachsieht. Wenn der Eintrag die verlangte Operation erlaubt, wird der Zugriff gewährt. Wenn die globalen Berechtigungen in der user-Tabelle unzureichend sind, stellt der Server die Datenbank-spezifischen Berechtigungen des Benutzers fest, indem er die db- und host-Tabellen prüft:

  1. Der Server sieht in der db-Tabelle nach einer Übereinstimmung in den Host-, Db- und User-Feldern nach. In den Host- und User-Feldern wird nach Übereinstimmung mit dem Hostnamen gesucht, von dem aus sich der Benutzer verbindet, und nach Übereinstimmung mit dem MySQL-Benutzernamen. Im Db-Feld wird nach Übereinstimmung mit der Datenbank gesucht, mit der sich der Benutzer verbinden will. Wenn es keinen Eintrag für Host und User gibt, wird der Zugriff verweigert.
  2. Wenn es keinen übereinstimmenden db-Tabelleneintrag gibt und das Host-Feld nicht leer ist, bestimmt dieser Eintrag die Datenbank-spezifischen Berechtigungen des Benutzers.
  3. Wenn das Host-Feld des übereinstimmenden db-Tabelleneintrags leer ist, bedeutet das, dass die host-Tabelle festlegt, welchen Hosts Zugriff auf die Datenbank erlaubt werden soll. In diesem Fall schlägt der Server weiter in der host-Tabelle nach, um eine Übereinstimmung in den Host- und Db-Feldern zu finden. Wenn kein host-Tabelleneintrag passt, wird der Zugriff verweigert. Bei einer Übereinstimmung werden die Datenbank-spezifischen Berechtigungen des Benutzers als Schnittmenge (nicht Vereinigungsmenge!) der Berechtigungen in den db- und host-Tabelleneinträgen berechnet, was die Berechtigungen ergibt, die in beiden Einträgen 'Y' sind. (Auf diese Weise können Sie allgemeine Berechtigungen in den db-Tabelleneinträgen vergeben und diese dann fallweise von Host zu Host beschränken, indem Sie die host-Tabelleneinträge benutzen.)

Nachdem die Datenbank-spezifischen Berechtigungen festgestellt wurden, die durch die db- und host-Tabelleneinträge gewährt werden, fügt der Server diese zu den globalen Berechtigungen in der user-Tabelle hinzu. Wenn das Ergebnis die verlangte Operation erlaubt, wird der Zugriff gewährt. Ansonsten prüft der Server die Tabellen- und Spalten-Berechtigungen des Benutzers in den tables_priv- und columns_priv-Tabellen und fügt diese zu den Benutzerberechtigungen hinzu. Aus dem Ergebnis ergibt sich, ob der Zugriff erlaubt oder verweigert wird.

Als Boole'scher Term ausgedrückt kann die vorstehende Beschreibung der Berechnung der Benutzerrechte wie folgt zusammengefasst werden:

globale Berechtigungen
ODER (Datenbankberechtigungen UND Hostberechtigungen)
ODER Tabellenberechtigungen
ODER Spaltenberechtigungen

Vielleicht ist es nicht offensichtlich, warum der Server bei anfänglich als unzureichend herausgefundenen globalen user-Eintragsberechtigungen für die verlangte Operation diese Berechtigungen anschließend zu den Datenbank-, Tabellen- und Spalten-spezifischen Berechtigungen hinzuzählt. Der Grund liegt darin, dass eine Anfrage möglicherweise mehr als eine Sorte von Berechtigungen erfordert. Wenn Sie beispielsweise ein INSERT ... SELECT-Statement ausführen, brauchen Sie eventuell sowohl die insert- als auch die select-Berechtigung. Ihre Berechtigungen mögen so sein, dass der user-Tabelleneintrag eine Berechtigung enthält und der db-Tabelleneintrag die andere. In diesem Fall haben Sie die notwendigen Berechtigungen, die Anfrage auszuführen, aber das Server kann das nicht aus nur einer der beiden Tabellen heraus erkennen, sondern muss dafür die Einträge beider Tabellen kombinieren.

Die host-Tabelle kann benutzt werden, um eine Liste sicherer Server zu pflegen.

Bei TcX enthält die host-Tabelle eine Liste aller Maschine des lokalen Netzwerks. Diesen werden alle Berechtigungen gewährt.

Sie können die host-Tabelle auch dazu benutzen, die Host aufzuführen, die nicht sicher sind. Nehmen Sie an, Sie haben eine Maschine oeffentlich.ihre.domaene, die an einem öffentlichen Ort ist, den Sie als nicht sicher erachten. Sie können allen Hosts in Ihrem Netzwerk Zugriff gewähren ausser dieser Maschine, indem Sie die host-Tabelleneinträge wie folgt benutzen:

+--------------------------+----+-
| Host                     | Db | ...
+--------------------------+----+-
| oeffentlich.ihre.domane  | %  | ... (alle Berechtigungen auf 'N' gesetzt)
| %.ihre.domaene           | %  | ... (alle Berechtigungen auf 'Y' gesetzt)
+--------------------------+----+-

Natürlich sollten Sie Ihre Einträge in die Berechtigungstabellen immer testen (indem Sie zum Beispiel mysqlaccess benutzen), um sicherzustellen, dass Ihre Zugriffsberechtigungen tatsächlich so gesetzt sind, wie Sie denken.

5.2.10 Gründe für Access denied-Fehler

Wenn Sie beim Verbindungsversuch zu einem MySQL-Server Access denied-Fehler bekommen, gibt Ihnen die folgende Liste ein paar Hinweise, das Problem zu beheben:

  • Haben Sie nach der Installation von MySQL das mysql_install_db-Skript laufen lassen, um die anfänglichen Berechtigungstabelleninhalte zu konfigurieren? Wenn nicht, tun Sie das! See 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 test
    
    Der Server sollte die Verbindung ohne Fehlermeldung zulassen. Stellen Sie auch sicher, dass Sie eine Datei `user.MYD' im MySQL-Datenbankverzeichnis haben. Üblicherweise ist das `PFAD/var/mysql/user.MYD', wobei PFAD der Pfadname zum MySQL-Installationsverzeichnis ist.
  • Nach einer gerade durchgeführten Installation sollten Sie sich mit dem Server verbinden und Ihre Benutzer und deren Zugriffsberechtigungen einrichten:
    shell> mysql -u root mysql
    
    Der Server sollte die Verbindung zulassen, weil der MySQL-root-Benutzer anfänglich kein Passwort hat. Das ist ein Sicherheitsrisiko, daher sollten Sie das root-Passwort einrichten, während Sie Ihre anderen MySQL-Benutzer einrichten. Wenn Sie versuchen, sich als root zu verbinden, und folgenden Fehler erhalten:
    Access denied for user: '@unknown' to database mysql
    
    heißt das, dass Sie in der user-Tabelle keinen Eintrag 'root' im User-Spaltenwert haben und dass mysqld den Hostnamen für Ihren Client nicht auflösen kann. In diesem Fall müssen Sie den Server mit der --skip-grant-tables-Option neu starten und Ihrer `/etc/hosts'- oder `\windows\hosts'-Datei einen Eintrag für Ihren Host hinzufügen.
  • Wenn Sie einen Fehler wie folgt erhalten:
    shell> mysqladmin -u root -pxxxx ver
    Access denied for user: 'root@localhost' (Using password: YES)
    
    bedeutet das, dass Sie ein falsches Passwort benutzen. See 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
    
  • Wenn Sie eine bestehende MySQL-Installation von einer Version vor 3.22.11 auf Version 3.22.11 oder später aktualisiert haben, haben Sie das mysql_fix_privilege_tables-Skript ausgeführt? Falls nicht, tun Sie das! Die Struktur der Berechtigungstabellen hat sich ab MySQL-Version 3.22.11 geändert, als das GRANT-Statement mit Funktion erfüllt wurde.
  • Falls es aussieht, als hätten sich Ihre Berechtigungen mitten in einer Sitzung geändert, kann es sein, dass ein Superuser sie geändert hat. Das Neuladen der Berechtigungstabellen betrifft neue Client-Verbindungen, aber auch bestehende Verbindungen, wie in section 5.3.3 Wann Berechtigungsänderungen wirksam werden beschrieben.
  • Wenn Sie es nicht schaffen, dass Ihr Passwort funktioniert, denken Sie daran, dass Sie die PASSWORD()-Funktion benutzen müssen, wenn Sie das Passwort mit den INSERT-, UPDATE- oder SET PASSWORD-Statements setzen. Die PASSWORD()-Funktion wird nicht benötigt, wenn Sie das Passwort mit dem GRANT ... INDENTIFIED BY-Statement oder dem mysqladmin password-Befehl setzen. See 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.)
  • Wenn Sie beim Versuch, sich mit mysql -u user_name db_name mit einer Datenbank zu verbinden, einen Access denied-Fehler erhalten, gibt es eventuell ein Problem mit der user-Tabelle. Das können Sie überprüfen, indem Sie mysql -u root mysql und folgendes SQL-Statement absetzen:
    mysql> SELECT * FROM user;
    
    Das Ergebnis sollte einen Eintrag enthalten, in dem die Host- und User-Spalten mit dem Hostnamen Ihres Computers und Ihrem MySQL-Benutzernamen übereinstimmen.
  • Die Access denied-Fehlermeldung sagt Ihnen, als wer Sie sich versuchen einzuloggen, den Host, von dem aus Sie versuchen, sich zu verbinden, und ob Sie ein Passwort benutzen oder nicht. Normalerweise sollten Sie in der user-Tabelle einen Eintrag haben, der exakt mit Ihrem Hostnamen und Ihrem Benutzernamen übereinstimmt, die in der Fehlermeldung ausgegeben wurden. Wenn Sie zum Beispiel eine Fehlermeldung erhalten, die Using password: NO enthält, bedeutet das, dass Sie versuchen sich einzuloggen, ohne ein Passwort anzugeben.
  • Wenn Sie folgenden Fehler erhalten, wenn Sie sich von einem anderen Host als dem, auf dem der MySQL-Server läuft, zu verbinden, gibt es keine Zeile in der user-Tabelle, die mit Ihrem Host übereinstimmt:
    Host ... is not allowed to connect to this MySQL server
    
    Das können Sie mit dem Kommandozeilentool mysql beheben (auf dem Serverhost!) und eine Zeile zur user-, db- oder host-Tabelle hinzufügen, die eine Benutzername-/Hostname-Kombination enthält, von wo aus Sie sich verbinden wollen; danach führen Sie mysqladmin flush-privileges aus. Wenn Sie nicht MySQL-Version 3.22 laufen lassen und die IP-Nummer oder den Hostnamen der Maschine nicht kennen, von der aus Sie sich verbinden, sollten Sie einen Eintrag mit '%' als Host-Spaltenwert in die user-Tabelle einfügen und mysqld mit der --log-Option auf der Servermaschine neu starten. Nach dem Verbinden von der Client-Maschine aus zeigt die Information im MySQL-Log an, wie Sie sich wirklich verbunden haben. (Ersetzen Sie danach '%' im user-Tabelleneintrag durch den tatsächlichen Hostnamen, der im Log steht. Ansonsten erhalten Sie ein System, das unsicher ist.) Ein weiterer Grund für diesen Fehler unter Linux kann sein, dass Sie eine Binärversion von MySQL benutzen, die mit einer anderen glibc-Version kompiliert wurde als die, die Sie benutzen. In diesem Fall sollten Sie entweder die glibc Ihres Betriebssystems aktualisieren oder die Quellversion von MySQL herunter laden und sie selbst kompilieren. Ein Quell-RPM läßt sich normalerweise sehr einfach kompilieren und installieren, daher stellt dies kein großes Problem dar.
  • Wenn Sie eine Fehlermeldung erhalten, in der der Hostname nicht angezeigt wird oder eine IP-Nummer ist, obwohl Sie sich mit einem Hostnamen versuchen zu verbinden:
    shell> mysqladmin -u root -pxxxx -h ein-hostname ver
    Access denied für user: 'root@' (Using password: YES)
    
    bedeutet das, dass MySQL einen Fehler beim Auflösen der IP zu einem Hostnamen erhielt. In diesem Fall können Sie mysqladmin flush-hosts ausführen, um den internen DNS-Cache zu flushen. See section 6.5.5 Wie MySQL DNS benutzt. Einige dauerhafte Lösungen sind:
    • Versuchen Sie herauszufinden, was mit Ihrem DNS-Server nicht funktioniert, und beheben Sie das Problem.
    • Geben Sie in den MySQL-Berechtigungstabellen IP-Nummern statt Hostnamen an.
    • Starten Sie mysqld mit --skip-name-resolve.
    • Starten Sie mysqld mit --skip-host-cache.
    • Verbinden Sie sich zu localhost wenn Sie Server und Client auf derselben Maschine laufen lassen.
    • Tragen Sie die Client-Maschinennamen in /etc/hosts ein.
  • Wenn mysql -u root test funktioniert, aber mysql -h your_hostname -u root test zu Access denied führt, haben Sie eventuell nicht den korrekten Namen Ihres Hosts in der user-Tabelle. Ein häufiges Problem hierbei ist, dass der Host-Wert im user-Tabelleneintrag einen unqualifizierten Hostnamen festlegt, die Namensauflösungsroutinen Ihres Systems aber einen voll qualifizierten Domänennamen zurückgeben (oder umgekehrt). Wenn Sie zum Beispiel einen Eintrag mit dem Host 'tcx' in der user-Tabelle haben, Ihr DNS MySQL aber mitteilt, dass Ihr Hostname 'tcx.subnet.se' ist, funktioniert der Eintrag nicht. Fügen Sie der user-Tabelle einen Eintrag hinzu, der die IP-Nummer Ihres Hosts als Host-Spaltenwert enthält. (Alternativ könnten Sie der user-Tabelle einen Eintrag mit einem Host-Wert hinzufügen, der einen Platzhalter enthält, zum Beispiel 'tcx.%'. Allerdings ist die Benutzung von Hostnamensendungen mit `%' unsicher und wird daher nicht empfohlen!)
  • Wenn mysql -u benutzername test funktioniert, aber mysql -u benutzername andere_datenbank nicht, haben Sie wahrscheinlich keinen Eintrag für andere_datenbank in der db-Tabelle.
  • Wenn mysql -u benutzername datenbankname funktioniert, wenn es auf der Servermaschine ausgeführt wird, aber mysql -u hostname -u benutzername datenbankname nicht, wenn es auf einer anderen Clientmaschine ausgeführt wird, ist die Clientmaschine wahrscheinlich nicht in der user-Tabelle oder der db-Tabelle aufgeführt.
  • Wenn Sie gar nicht herausfinden können, warum Sie Access denied erhalten, entfernen Sie aus der user-Tabelle alle Einträge, die Host-Werte haben, die Platzhalter enthalten (Einträge, die `%' oder `_' enthalten). Ein sehr häufiger Fehler besteht darin, einen neuen Eintrag mit Host='%' und User='irgendein_benutzer' in der Annahme hinzuzufügen, dass einem das erlaubt, localhost anzugeben, um sich von derselben Maschine aus zu verbinden. Der Grund, warum das nicht funktioniert, ist, dass die vorgabemäßigen Berechtigungen einen Eintrag mit Host='localhost' und User='' enthalten. Weil dieser Eintrag einen Host-Wert 'localhost' hat, der spezifischer ist als '%', wird er vorrangig vor dem neuen Eintrag benutzt, wenn man sich von localhost verbindet! Das korrekte Vorgehen ist, einen zweiten Eintrag mit Host='localhost' und User='irgendein_benutzer' hinzuzufügen, oder den Eintrag mit Host='localhost' und User='' zu entfernen.
  • Wenn Sie den folgenden Fehler erhalten, gibt es eventuell Probleme mit der db-