27.1 Checkliste bei Zugriffsproblemen
Wieso es beim Zugriff auf MySQL zu Access denied-Meldungen kommen kann,
hat viele mögliche Ursachen. Die folgende Checkliste sollte deshalb
gründlich durchgearbeitet werden.
- Wurden die MySQL Grant-Tabellen mittels des Scipts:
mysql_install_db erzeugt ?
Um dies zu testen, sollte der Befehl
mysql -u root test
ausgeführt werden, welcher keine Fehlermeldung erzeugen sollte.
Ferner kann geprüft werden, ob eine Datei mit dem Namen
user.ISD im Datenbankverzeichnis
(Installationsverzeichnis/var/mysql/user.ISD)vorhanden
ist.
- Nach einer Erstinstallation sollte mittels
mysql -u root mysql
eine Verbindung auf die Grant-Tabellen erfolgen und alle Rechte gesetzt
werden.
- Nach jeder Änderung in der Zugriffsberechtigung ist ein
mysqladmin reload
erforderlich, damit die Änderungen auch greifen. Zum testen kann der
mysqld-Daemon mit der Option
--without-grant-tables
gestartet werden. Dann können die Grant-Tabellen angepaßt und mittels
mysqlaccess überprüft werden.
Mittels mysqladmin reload
wird der Daemon mit den geänderten Grant-Tabellen neu gestartet.
- Auch bei Zugriffsproblemen von PERL, Python oder ODBC aus sollten die
Tests mittels
mysql -u User Database
oder
mysql -u User -pPassword Database
durchgeführt werden.
Zwischen dem Schalter -p und dem eigentlichen Paßwort ist kein Leerzeichen
erlaubt. Die Syntax
--password=Passwordkann statt dessen verwendet werden.
- Kommt es zu der Meldung
Access denied
beim Zugriff mittels
mysql -u user database
liegt dies an einer nicht korrekten Einstellung in der
user-Tabelle. Zur
Überprüfung sollte man sich mittels
mysql -u root mysql
verbinden und die Tabellen durch das Kommando
select * from user
anzeigen lassen. In der Tabelle muß auf alle Fälle ein Eintrag für
User und Hostname enthalten sein,
welcher mit dem aktuellen Benutzer und Host übereinstimmt.
Werden Client und Server auf dem gleichen Host ausgeführt, und es
wurde nicht die mysql- Option
--host
sowie das MIT-pthread-Packet verwendet, ist localhost
ein Synonym für den Hostnamen.
- Die Access denied-Meldung zeigt zusätzlich an,
mit welchem Benutzernamen, von welchem Host aus
man einen Connect aufbauen wollte und ob man ein Paßwort verwendet oder
nicht. In der user-Tabelle sollte ebenfalls ein Eintrag enthalten sein, der mit diesen
Angaben (User und Hostname) genau übereinstimmt.
- Kommt es zu der Meldung
Host... is not allowed to connect to this MySQL server
beim Verbindungsaufbau von einem anderen Host aus, ist in der
user Tabelle
der entsprechende Eintrag, welcher diesen Host betrifft nicht vorhanden.
Der fehlende Eintrag sollte auf bekannte Weise erstellt werden. Verwendet
man nicht MySQL 3.22 und man kennt nicht die IP bzw. den Hostnamen, von
welchem man sich
connecten will, sollte & als Hostname in der Tabelle
user eingetragen
und der mysql-Daemon mit der Option
-log
neu gestartet werden.
Nach einem erneuten Verbindungsversuch findet man in dem MySQL-Logfile die
genaue Bezeichnung des Hostnamens.
- Wenn eine Verbindung mittels
mysql -u root test
funktioniert aber
mysql -h hostname -u root test
die Meldung
Access denied...
verursacht, liegt dies daran, daß der Hostname in der
user-Tabelle nicht
korrekt ist. Dies kann dann passieren, wenn der Hostname z.B. als
tcx definiert wurde der DNS
aber den Namen als tcx.subnet.se auflöst. Zum testen dieser Situation
sollte man statt des Hostnamens die IP-Adresse eintragen. Alternativ kann
auch der Hostname
mittels tcx% eingetragen werden, was aber sehr unsicher ist.
- Wenn man nicht feststellen kann, weshalb weiterhin die Meldung
Access denied...
erzeugt wird, sollte man alle Hostnamen-Einträge die einen Wildcard
(%< oder _) beinhalten aus der user- Tabelle entfernen.
Oft geht man davon aus, daß man mittels des Eintrags
Host=% und user=User
die Möglichkeit hat, sich von dem lokalen Host (localhost) aus zu connecten.
Der Grund, warum dies nicht funktioniert ist, daß der Eintrag
host=localhost und user= vor dem Eintrag
host=% und user=user bevorzugt wird!
Um dies zu beheben sollte ein Eintrag host=localhost und
user= user erstellt oder der Eintrag user= entfernt werden.
- Werden die MIT-pthreads verwendet, wird localhost nie verwendet!
Alle Verbindungen zu dem mysqld-Daemon erfolgen mittels
TCP/IP, weshalb der
richtige Hostname in der user-Tabelle vorhanden sein muß, selbst dann,
wenn der Client auf dem selben Host ausgeführt wird wie der Server.
- Bei der Fehlermeldung
Access to database denied
liegt ein Problem in der db-Tabelle vor. Beinhaltet der entsprechende
Eintrag in der db-Tabelle einen leeren Hostname sollte ebenfalls die
host-Tabelle überprüft werden.
- Funktioniert der Befehl
mysql -u user database
auf der Server-Maschine aber nicht
mysql -h host -u user database
auf einer anderen Client-Maschine, dann fehlt der entsprechende Eintrag in
der user oder db-Tabelle für diese Client-Maschine.
- Alle Paßwörter müssen mit der PASSWORD-Funktion eingegeben werden.
- Wenn
mysql -u user test
funktioniert, aber
mysql -u user andere_database
nicht, fehlt der entsprechende Eintrag für andere_database in der
db-Tabelle.
- Kommt es bei den SQL-Befehl
SELECT...INTO OUTFILE
oder
LOAD DATA
zu der Meldung:
Access to database denied
wurden vermutlich die File_priv Berechtigungen in der
user-Tabelle nicht gesetzt.
- Sollte die Fehlersuche dennoch negativ verlaufen, ist der
mysqld-Daemon mit der Option:
--debug=d,general,query
zu starten. Dadurch werden Informationen zu dem Host und User, welcher eine
Verbindung aufbauen will, sowie über jedes ausgeführte Kommando ausgegeben.
Ist der Fehler dennoch nicht zu finden
und man möchte eine entsprechende Anfrage an die Mailingliste richten,
sollte ein Auszug der Grant-Tabellen beigefügt werden.
- Bei der Meldung
Cant connect to local mySQL server
oder
Cant connect to MySQL server on hostname
kann davon ausgegangen werden, daß der mysqld-Daemon nicht läuft oder daß
man versucht auf einen falschen Port oder Socket zu connecten. Hierzu sollte
man prüfen, ob
der Socket vorhanden ist (normalerweise /tmp/mysql.socket) oder eine
Verbindung mittels
telnet hostname 3306
aufbauen. Durch
mysqladmin version
können ebenfalls weitere Informationen ausgegeben werden.
- Verwendet man einen Client ohne Angabe von Parametern sollte man
prüfen ob ggf. noch falsche Paßwörter in den Konfigurations-Dateien vorhanden
sind.