Wenn beim Versuch, eine Verbindung zum MySQL-Server herzustellen, Probleme auftreten, dann können Sie die in diesem Abschnitt beschriebenen Schritte ausführen, um diese Probleme zu beseitigen.
Vergewissern Sie sich zunächst, dass der Server auch ausgeführt wird. Läuft er nicht, dann können Sie auch keine Verbindung herstellen. Wenn Sie beispielsweise versuchen, eine Verbindung zum Server herzustellen, und eine Meldung wie die folgende angezeigt wird, dann kann Ursache hierfür auch sein, dass der Server schlichtweg nicht läuft:
shell>mysql
ERROR 2003: Can't connect to MySQL server on 'host_name
' (111) shell>mysql
ERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)
Ferner ist es möglich, dass der Server zwar ausgeführt
wird, Sie aber eine Verbindung über einen TCP/IP-Port, eine
Named Pipe oder eine Unix-Socketdatei herstellen wollen, die
nicht mit der Ressource übereinstimmt, auf der der Server
horcht. Um dieses Problem zu beheben, geben Sie beim Aufruf
eines Clientprogramms eine Option --port
oder --socket
an, um die korrekte
Portnummer bzw. Named Pipe oder Unix-Socketdatei anzugeben.
Mithilfe des folgenden Befehls ermitteln Sie, wo die
Socketdatei sich befindet:
shell> netstat -ln | grep mysql
Die Grant-Tabellen müssen korrekt konfiguriert sein, damit
der Server sie zur Zugriffssteuerung verwenden kann. Bei
einigen Distributionstypen (z. B. Binärdistributionen für
Windows oder RPM-Distributionen für Linux) initialisiert
der Installationsvorgang die
mysql
-Datenbank, die die Grant-Tabellen
enthält. Wenn Ihre Distribution dies nicht tut, dann
müssen Sie die Grant-Tabellen manuell initialisieren, indem
Sie das Skript mysql_install_db
ausführen. Detaillierte Informationen finden Sie in
Abschnitt 2.9.2, „Schritte nach der Installation unter Unix“.
Eine Möglichkeit, zu ermitteln, ob Sie die Grant-Tabellen
initialisieren müssen, besteht darin, nach einem
Verzeichnis mysql
zu suchen, das sich
im Datenverzeichnis befindet. (Das Datenverzeichnis heißt
normalerweise data
oder
var
und befindet sich seinerseits im
MySQL-Installationsverzeichnis.) Vergewissern Sie sich, dass
eine Datei namens user.MYD
im
Datenverzeichnis mysql
vorhanden ist.
Sollte dies nicht der Fall sein, dann führen Sie das Skript
mysql_install_db aus. Nach Ausführung
des Skripts und dem Starten des Servers können Sie die
anfänglich vorhandenen Berechtigungen durch Ausführung des
folgenden Befehls überprüfen:
shell> mysql -u root test
Der Server sollte die Herstellung dieser Verbindung ohne Fehler gestatten.
Nach einer frischen Installation sollten Sie eine Verbindung mit dem Server herstellen und Ihre Benutzer und deren Zugriffsberechtigungen einrichten:
shell> mysql -u root mysql
Der Server sollte diese Verbindung gestatten, da der
MySQL-Benutzer root
anfänglich kein
Passwort hat. Dies ist natürlich auch ein Sicherheitsrisiko
d. h. Sie sollten das Passwort für das
root
-Konto einrichten, während Sie auch
die übrigen MySQL-Konten konfigurieren. Anweisungen zur
Einstellung der anfänglichen Passwörter finden Sie in
Abschnitt 2.9.3, „Einrichtung der anfänglichen MySQL-Berechtigungen“.
Haben Sie, sofern Sie eine vorhandene MySQL-Installation auf eine neuere Version aktualisiert haben, das Skript mysql_fix_privilege_tables ausgeführt? Wenn nicht, holen Sie dies schleunigst nach. Die Struktur der Grant-Tabellen ändert sich ab und an, wenn neue Funktionalitäten hinzugefügt werden. Deswegen sollten Sie nach einem Upgrade immer sicherstellen, dass Ihre Tabellen die aktuell gültige Struktur aufweisen. Informationen zur Vorgehensweise finden Sie in Abschnitt 5.6, „mysql_fix_privilege_tables — Upgrade von MySQL-Systemtabellen“.
Wenn ein Clientprogramm beim Verbindungsversuch die folgende Fehlermeldung erhält, bedeutet dies, dass der Server Passwörter in einem neueren Format als dem erwartet, das der Client erzeugen kann:
shell> mysql
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
Informationen dazu, wie Sie in diesem Fall verfahren, finden
Sie in Abschnitt 5.8.9, „Kennwort-Hashing ab MySQL 4.1“, und
Abschnitt A.2.3, „Client does not support authentication protocol
“.
Wenn Sie eine Verbindung als root
herstellen und die folgende Fehlermeldung erhalten, dann
heißt das, dass kein Datensatz in der Tabelle
user
gefunden wurde, der in der Spalte
User
den Wert 'root'
aufweist – mysqld kann den Hostnamen
Ihres Clients in diesem Fall nicht auflösen:
Access denied for user ''@'unknown' to database mysql
Sie müssen den Server in einem solchen Fall mit der Option
--skip-grant-tables
neu starten und in
Ihrer Datei /etc/hosts
bzw.
\windows\hosts
einen Eintrag für den
Host hinzufügen.
Zur Erinnerung: Clientprogramme verwenden
Verbindungsparameter, die in Optionsdateien oder über
Umgebungsvariablen angegeben sind. Wenn ein Clientprogramm
offensichtlich unzutreffende Standardverbindungsparameter
sendet, weil Sie auf der Befehlszeile keine entsprechenden
Informationen angegeben haben, überprüfen Sie die Umgebung
und alle relevanten Optionsdateien. Wenn Sie beispielsweise
bei der Ausführung eines Clients ohne Optionen die
Fehlermeldung Access denied
erhalten,
vergewissern Sie sich, dass Sie in keiner Ihrer
Optionsdateien ein altes Passwort angegeben haben!
Sie können die Verwendung von Optionsdateien durch ein
Clientprogramm unterdrücken, indem Sie es mit der Option
--no-defaults
aufrufen. Zum Beispiel:
shell> mysqladmin --no-defaults -u root version
Die von Clients verwendeten Optionsdateien sind in Abschnitt 4.3.2, „my.cnf-Optionsdateien“ aufgelistet. Umgebungsvariablen werden in Anhang F, Umgebungsvariablen beschrieben.
Wenn Sie die folgende Fehlermeldung erhalten, bedeutet dies,
dass Sie das falsche root
-Passwort
benutzen:
shell> mysqladmin -u root -pxxxx
ver
Access denied for user 'root'@'localhost' (using password: YES)
Wenn dieser Fehler auftritt, obwohl Sie gar kein Passwort
angegeben haben, ergibt sich daraus, dass ein falsches
Passwort in irgendeiner Optionsdatei aufgeführt sein muss.
Probieren Sie in diesem Fall die Option
--no-defaults
wie im vorhergehenden
Abschnitt beschrieben aus.
Informationen zur Änderung von Passwörtern finden Sie in Abschnitt 5.9.5, „Kennwörter einrichten“.
Haben Sie das root
-Passwort verloren oder
vergessen, dann können Sie mysqld mit
--skip-grant-tables
neu starten, um das
Passwort zu ändern. Siehe auch
Abschnitt A.4.1, „Wie ein vergessenes Kennwort zurückgesetzt wird“.
Wenn Sie ein Passwort mit SET PASSWORD
,
INSERT
oder UPDATE
ändern, müssen Sie es mit der Funktion
PASSWORD()
verschlüsseln. Verwenden Sie
PASSWORD()
für diese Anweisungen nicht,
dann funktioniert das Passwort nicht. So wird mit der
folgenden Anweisung ein Passwort zwar eingestellt, aber
nicht verschlüsselt – und der Benutzer kann nachfolgend
keine Verbindung herstellen:
SET PASSWORD FOR 'abe'@'host_name
' = 'eagle';
Stattdessen muss das Passwort wie folgt eingestellt werden:
SET PASSWORD FOR 'abe'@'host_name
' = PASSWORD('eagle');
Die Funktion PASSWORD()
ist entbehrlich,
wenn Sie ein Passwort mit GRANT
- oder
CREATE USER
-Anweisungen oder dem Befehl
mysqladmin password festlegen. Sie alle
verschlüsseln das Passwort automatisch mit
PASSWORD()
. Siehe auch
Abschnitt 5.9.5, „Kennwörter einrichten“, und
Abschnitt 13.5.1.1, „CREATE USER
“.
localhost
ist ein Synonym für Ihren
lokalen Hostnamen und zudem der standardmäßige Host, mit
dem Clients eine Verbindung herzustellen versuchen, wenn Sie
keinen Host explizit angeben.
Um dieses Problem auf solchen Systemen zu umgehen, können
Sie die Option --host=127.0.0.1
verwenden,
um den Serverhost explizit anzugeben. Hierdurch wird eine
TCP/IP-Verbindung mit dem lokalen
mysqld-Server hergestellt. Sie können
TCP/IP auch verwenden, indem Sie eine Option
--host
angeben, die den eigentlichen
Hostnamen des lokalen Hosts verwendet. In diesem Fall muss
der Hostname in einem Datensatz in der Tabelle
user
auf dem Serverhost angegeben sein,
auch wenn Sie das Clientprogramm auf demselben Host wie den
Server ausführen.
Wenn Sie die Fehlermeldung Access denied
erhalten, wenn Sie mit mysql -u
eine
Verbindung zur Datenbank herstellen, liegt unter Umständen
ein Problem mit der Tabelle user_name
user
vor. Sie
können dies überprüfen, indem Sie mysql -u root
mysql
ausführen und die folgende SQL-Anweisung
absetzen:
SELECT * FROM user;
Das Ergebnis sollte einen Datensatz mit
Host
- und
User
-Spaltenwerten enthalten, die mit dem
Hostnamen Ihres Computers bzw. Ihrem MySQL-Benutzernamen
übereinstimmen.
Die Fehlermeldung Access denied
sagt
Ihnen, als wer Sie eine Verbindung herzustellen versuchen,
von welchem Clienthost Sie diese Verbindung herzustellen
versuchen und ob Sie ein Passwort angegeben haben.
Normalerweise sollte genau ein Datensatz in der Tabelle
user
vorhanden sein, für den eine
Übereinstimmung mit dem Host- und dem Benutzernamen
vorliegt, die in der Fehlermeldung angegeben werden.
Erhalten Sie beispielsweise eine Fehlermeldung, die
using password: NO
enthält, dann
bedeutet dies, dass Sie versucht haben, sich ohne Passwort
anzumelden.
Tritt der folgende Fehler auf, wenn Sie versuchen, eine
Verbindung von einem anderen als dem Host herzustellen, auf
dem der MySQL-Server ausgeführt wird, dann bedeutet dies,
dass in der Tabelle user
kein Datensatz
mit einem zum Clienthost passenden
Host
-Wert gefunden wurde:
Host ... is not allowed to connect to this MySQL server
Sie können dieses Problem beheben, indem Sie ein Konto für die Kombination aus Clienthostname und Benutzername erstellen, die Sie zur Verbindungsherstellung verwenden.
Wenn Sie IP-Adresse oder Hostname des Computers, von dem aus
Sie die Verbindung herstellen, nicht kennen, dann sollten
Sie einen Datensatz mit dem Wert '%'
in
die Spalte Host
der Tabelle
user
einfügen. Nachdem Sie versucht
haben, eine Verbindung vom Clientsystem herzustellen,
ermitteln Sie mit einer SELECT
USER()
-Abfrage, wie Sie die Verbindung
tatsächlich hergestellt haben. (Ändern Sie nachfolgend den
Eintrag '%'
im betreffenden Datensatz der
Tabelle user
zu dem im Log angegebenen
Hostnamen. Wenn Sie dies versäumen, bleibt Ihr System
unsicher, da es dem angegebenen Benutzernamen Verbindungen
von jedem Host aus gestattet.)
Unter Linux kann ein anderer Grund für diese Fehlermeldung
darin bestehen, dass Sie eine aus einer Binärdistribution
stammende MySQL-Version verwenden, die mit einer anderen
Version der glibc
-Bibliothek als der von
Ihnen verwendeten kompiliert wurde. In diesem Fall sollten
Sie entweder Ihr Betriebssystem oder
glibc
aktualisieren oder eine
Quelldistribution der MySQL-Version herunterladen und selbst
kompilieren. Dies ist kein Problem, da Kompilierung und
Installation eines Quellcode-RPM in der Regel einfach und
schnell erledigt sind.
Wenn Sie beim Verbindungsversuch einen Hostnamen angeben, aber eine Fehlermeldung erhalten, in der der Hostname nicht oder an seiner Stelle eine IP-Adresse angegeben ist, dann bedeutet dies, dass am MySQL-Server bei dem Versuch, die IP-Adresse des Clients in einen Namen aufzulösen, ein Fehler aufgetreten ist:
shell> mysqladmin -u root -pxxxx
-h some_hostname
ver
Access denied for user 'root'@'' (using password: YES)
Dies weist auf ein DNS-Problem hin. Um es zu beheben, setzen Sie den internen DNS-Hostnamens-Cache durch Ausführen von mysqladmin flush-hosts zurück. Siehe auch Abschnitt 7.5.6, „Wie MySQL DNS benutzt“.
Die folgenden Lösungen versprechen dauerhaften Erfolg:
Ermitteln Sie, was bei Ihrem DNS-Server nicht stimmt, und beheben Sie das Problem.
Geben Sie in den MySQL-Grant-Tabellen IP-Adressen statt Hostnamen an.
Fügen Sie für den Namen des Clientcomputers einen
Eintrag in /etc/hosts
bzw.
\windows\hosts
hinzu.
Starten Sie mysqld mit der Option
--skip-name-resolve
.
Starten Sie mysqld mit der Option
--skip-host-cache
.
Stellen Sie eine Verbindung mit
localhost
her, wenn Sie unter Unix
den Server und den Client auf demselben Computer
ausführen. Für Verbindungen mit
localhost
verwendet Unix statt TCP/IP
eine Unix-Socketdatei.
Stellen Sie eine Verbindung mit dem Hostnamen
.
(Punkt) her, wenn Sie unter Windows
den Server und den Client auf demselben Computer
ausführen und der Server Named Pipes unterstützt.
Verbindungen mit .
verwenden statt
TCP/IP eine Named Pipe.
Wenn mysql -u root test
funktioniert,
aber mysql -h
zur Fehlermeldung your_hostname
-u root
testAccess
denied
führt (wobei
your_hostname
der tatsächliche
Hostname des lokalen Hosts ist), dann steht unter Umständen
für Ihren Host nicht der korrekte Name in der Tabelle
user
. Ein häufig auftretendes Problem
besteht hier darin, dass der Host
-Wert
des Datensatzes in der Tabelle user
einen
unqualifizierten Hostnamen angibt, die
Namensauflösungsroutinen Ihres Systems aber einen
vollqualifizierten Domänennamen zurückgeben (oder
umgekehrt). Wenn Sie also beispielsweise einen Eintrag mit
dem Host 'tcx'
in der Tabelle
user
haben, aber Ihr DNS MySQL meldet,
dass Ihr Hostname 'tcx.subnet.se'
lautet,
dann funktioniert der Eintrag nicht. Versuchen Sie, der
Tabelle user
einen Eintrag hinzufügen,
der die IP-Adresse Ihres Hosts als
Host
-Spaltenwert enthält. (Alternativ
können Sie einen Eintrag in der Tabelle
user
mit einem
Host
-Wert hinzufügen, der ein
Jokerzeichen enthält – z. B. 'tcx.%'
.
Allerdings ist die Verwendung von Hostnamen, die auf
‘%
’ enden, ein
Sicherheitsrisiko. Wir raten
dringend davon ab!)
Wenn mysql -u
funktioniert, user_name
testmysql -u
aber
nicht, dann haben Sie dem betreffenden Benutzer keinen
Datenbankzugriff auf
user_name
other_db_name
other_db_name
gewährt.
Wenn mysql -u
bei einer
Ausführung auf dem Serverhost funktioniert, user_name
mysql
-h
jedoch bei
der Ausführung auf dem Clienthost jedoch nicht, dann haben
Sie für den betreffenden Benutzernamen den Zugriff vom
entfernten Host auf den Server nicht aktiviert.
host_name
-u
user_name
Wenn Sie nicht feststellen können, warum Sie den Fehler
Access denied
erhalten, entfernen Sie aus
der Tabelle user
alle Einträge, die
Host
-Werte mit Jokerzeichen aufweisen
(d. h. Einträge, die ‘%
’
oder ‘_
’ enthalten). Ein sehr
häufiger Fehler besteht darin, einen neuen Eintrag mit
Host
='%'
und
User
='
einzufügen, weil man der Ansicht ist, dass dies die Angabe
von some_user
'localhost
zur Verbindung von
demselben Computer aus ermöglicht. Der Grund dafür, dass
dies nicht funktioniert, ist, dass die
Standardberechtigungen einen Eintrag mit
Host
='localhost'
und
User
=''
enthalten. Da
dieser Eintrag einen Host
-Wert
'localhost'
aufweist, der spezifischer
ist als '%'
, wird er anstelle des neuen
Eintrags verwendet, wenn eine Verbindung von
localhost
aus hergestellt wird! Die
korrekte Vorgehensweise besteht darin, einen zweiten Eintrag
mit Host
='localhost'
und
User
='
einzufügen oder den Eintrag mit
some_user
'Host
='localhost'
und
User
=''
zu löschen.
Nach dem Löschen des Eintrags dürfen Sie nicht vergessen,
eine FLUSH PRIVILEGES
-Anweisung
abzusetzen, um die Grant-Tabellen neu zu laden.
Wenn Sie den folgenden Fehler erhalten, liegt unter
Umständen ein Problem mit den Tabellen
db
oder host
vor:
Access to database denied
Wenn der in der Tabelle db
gewählte
Eintrag einen leeren Wert in der Spalte
Host
aufweist, müssen Sie sicherstellen,
dass mindestens ein entsprechender Eintrag in der Tabelle
host
vorhanden ist, der angibt, für
welche Hosts der Eintrag in der Tabelle
db
gilt.
Wenn Sie eine Verbindung mit dem MySQL-Server herstellen
können, aber immer dann eine Fehlermeldung Access
denied
erhalten, wenn Sie eine SELECT ...
INTO OUTFILE
- oder LOAD DATA
INFILE
-Anweisung absetzen, ist für Ihren Eintrag
in der Tabelle user
die Berechtigung
FILE
nicht aktiviert.
Ändern Sie die Grant-Tabellen direkt (z. B. mit
INSERT
, UPDATE
oder
DELETE
) und werden Ihre Änderungen
offenbar ignoriert, dann dürfen Sie nicht vergessen, eine
FLUSH PRIVILEGES
-Anweisung oder den
Befehl mysqladmin flush-privileges
auszuführen, damit der Server Ihre Berechtigungstabellen
neu einliest. Andernfalls werden Ihre Änderungen erst beim
nächsten Neustart des Servers umgesetzt. Denken Sie auch
immer daran, dass Sie, wenn Sie das
root
-Passwort mit einem
UPDATE
-Befehl geändert haben, das neue
Passwort erst nach dem Schreiben der Berechtigungen angeben
müssen, da der Server vorher gar nicht weiß, dass Sie Ihr
Passwort geändert haben!
Wenn Ihre Berechtigungen im Verlauf einer Sitzung offensichtlich geändert werden, besteht die Möglichkeit, dass ein MySQL-Administrator die Änderungen vorgenommen hat. Das Neuladen der Grant-Tabellen wirkt sich auf neue Clientverbindungen, aber auch auf vorhandene Verbindungen aus (siehe auch Abschnitt 5.8.7, „Wann Berechtigungsänderungen wirksam werden“).
Wenn Sie bei einem Perl-, PHP-, Python- oder ODBC-Programm
Probleme mit dem Zugriff haben, sollten Sie versuchen, eine
Serververbindung mit mysql -u
oder
user_name
db_name
mysql -u
herzustellen.
Wenn Sie eine Verbindung mit dem
mysql-Client herstellen können, wird das
Problem von Ihrem Programm und nicht von den
Zugriffsberechtigungen verursacht. (Zwischen
user_name
-pyour_pass
db_name
-p
und dem Passwort ist kein Leerzeichen
vorhanden; Sie können auch die Syntax
--password=
zur Angabe des Passworts verwenden. Wenn Sie die Option
your_pass
-p
bzw. --password
ohne
Passwortwert benutzen, fordert Sie MySQL zur Eingabe des
Passworts auf.)
Zu Testzwecken starten Sie den
mysqld-Server mit der Option
--skip-grant-tables
. Sie können dann die
MySQL-Grant-Tabellen ändern und das Skript
mysqlaccess zur Überprüfung verwenden,
ob Ihre Änderungen die gewünschte Wirkung hervorrufen.
Wenn Sie mit den Änderungen zufrieden sind, führen Sie
mysqladmin flush-privileges aus, um dem
mysqld-Server anzuweisen, die neuen
Grant-Tabellen ab sofort zu verwenden. (Das Neuladen der
Grant-Tabellen hat Vorrang vor der Option
--skip-grant-tables
. Dies ermöglicht
Ihnen, den Server zur sofortigen Verwendung der neuen
Grant-Tabellen anzuweisen, ohne dass ein Serverneustart
erforderlich wäre.)
Wenn alles andere fehlschlägt, starten Sie den
mysqld-Server mit einer Debug-Option
(z. B. --debug=d,general,query
). Hierdurch
werden Host- und Benutzerinformationen zu
Verbindungsversuchen sowie Angaben zu allen abgesetzten
Befehlen ausgegeben. Siehe auch
Abschnitt E.1.2, „Trace-Dateien erzeugen“.
Wenn Sie andere Probleme mit den MySQL-Grant-Tabellen haben
und diese der Mailingliste beschreiben wollen, fügen Sie
auch immer einen Speicherauszug der MySQL-Grant-Tabellen
bei. Diesen können Sie mit dem Befehl mysqldump
mysql erstellen. Verwenden Sie zum Übermitteln
eines Fehlerberichts die in Abschnitt 1.8, „Wie man Bugs oder Probleme meldet“
beschriebenen Anweisungen. In manchem Fällen müssen Sie
mysqld unter Umständen mit der Option
--skip-grant-tables
neu starten, um
mysqldump ausführen zu können.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.