Ich habe einen anderen Server für meine Datenbank.
Als ich mich mit PDO mit der Datenbank verbunden habe, habe ich die IP-Adresse der Datenbank-VM als Hostparameter verwendet:
$dbh = new pdo("mysql:host=192.168.56.103;port=3306;dbname=data",'root','root')
Aber die Verbindung wird abgelehnt (PDOException‘ mit der Meldung ‚SQLSTATE[HY000] [2002]‘). Ich vermute, dass MySQL dort nicht gefunden werden konnte. Die VM mit dieser IP konnte jedoch gefunden werden.
Antwort1
Prüfen Sie dann, ob MySQL wirklich nicht läuft:
sudo aptitude install nmap
Und dann:
sudo nmap -sS <ipofdbserverhere>
Sie können das Tool auch auf dem MySQL-Server installieren. Der Befehl lautet dann:
sudo nmap -sS localhost
In beiden Fällen sollte Ihre Antwort so aussehen.
[simmel]@[mars]$ sudo nmap -sS 172.16.1.41
Starting Nmap 6.40 ( http://nmap.org ) at 2015-04-08 15:09 CEST
Nmap scan report for 172.16.1.41
Host is up (0.010s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
3306/tcp open mysql
Nmap done: 1 IP address (1 host up) scanned in 33.17 seconds
Wenn Port 3306 angezeigt wird, ist er tatsächlich offen und bereit für Verbindungen. Wenn das der Fall ist, verwenden Sie MySQL über die Befehlszeile von Ihrem Computer aus.
mysql -u<USER> -p<PASSWORD> -h<ipofdbserverhere> <databasename>
Es erscheint die gleiche Meldung? Verbindung abgelehnt? Dann hat Ihr Benutzer wahrscheinlich die falschen Rechte.
Ein weiterer Grund hierfür ist, wenn der MySQL-Server an eine bestimmte Adresse gebunden ist, beispielsweise 127.0.0.1.
Um dies herauszufinden, überprüfen Sie die Ausgabe von:
sudo netstat -tlpen
0.0.0.0:3306
Wenn MySQL nicht auf , sondern auf hört 127.0.0.1:3306
, können Sie nur vom lokalen Host aus eine Verbindung herstellen.
Um dies zu ändern, gehen Sie zu /etc/mysql/my.cnf
und kommentieren Sie die folgende Zeile aus:
bind-address = 127.0.0.1
Sie können es auskommentieren, indem Sie ein führendes #
Zeichen hinzufügen:
#bind-address = 127.0.0.1
Speichern Sie die Datei und starten Sie den MySQL-Dienst neu
sudo service mysql restart
Jetzt sollten Sie eine Verbindung herstellen können.
Um den Port zu ändern, geben Sie beispielsweise ein:
port = 8888
In /etc/mysql/my.cnf
.
Speichern Sie die Datei und starten Sie den MySQL-Dienst neu:
sudo service mysql restart
Antwort2
Der Fehler 2002 bedeutet, dass MySQL keine Verbindung zum lokalen Datenbankserver über die Socket-Datei (z. B. /tmp/mysql.sock
) herstellen kann.
Um herauszufinden, wo sich Ihre Socket-Datei befindet, führen Sie Folgendes aus:
mysql_config --socket
Überprüfen Sie dann noch einmal, ob Ihre Anwendung die richtige Unix-Socket-Datei verwendet, oder stellen Sie stattdessen die Verbindung über den TCP/IP-Port her.
Testen Sie die Steckdose:
mysql --socket=/var/mysql/mysql.sock
Wenn der Unix-Socket falsch ist, können Sie einen symbolischen Link darauf erstellen, zum Beispiel:
ln -vs /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock
oder korrigieren Sie Ihre Konfigurationsdatei (zB php.ini
).
Zum Testen dergeschützte UrsprungsbezeichnungVerbindung direkt von PHP aus herstellen, können Sie Folgendes ausführen:
php -r "new PDO('mysql:host=localhost;port=3306;charset=utf8;dbname=dbname', 'root', 'root');"
Überprüfen Sie auch die Konfiguration zwischen Apache und CLI (Befehlszeilenschnittstelle), da die Konfiguration unterschiedlich sein kann.
Möglicherweise läuft der Server, aber Sie versuchen, eine Verbindung über einen anderen TCP/IP-Port, eine andere Named Pipe oder eine andere Unix-Socket-Datei herzustellen als die, die der Server abhört. Um dies zu korrigieren, müssen Sie ein Client-Programm aufrufen (z. B. durch Angabe
--port
einer Option), um die richtige Portnummer oder die richtige Named Pipe oder Unix-Socket-Datei (z. B.--socket
Option) anzugeben.
Sehen:Beheben von Problemen bei der Verbindung mit MySQL
Andere Dienstprogramme/Befehle, die bei der Problemverfolgung helfen können:
netstat -ln | grep mysql
php -r "phpinfo();" | grep mysql
php -i | grep mysql
- Verwenden Sie XDebug mit
xdebug.show_exception_trace=1
in Ihremxdebug.ini
- Unter OS X versuchen Sie es
sudo dtruss -fn mysqld
, unter Linux debuggen Sie mitstrace
- Überprüfen Sie die Berechtigungen für den Unix-Socket:
stat $(mysql_config --socket)
und ob Sie genügend freien Speicherplatz haben (df -h
). - Starten Sie MySQL neu.
- Überprüfen
net.core.somaxconn
.