Wenn ich während meiner Testsuite versuchte, eine Verbindung zu einem lokalen MySQL-Server herzustellen, schlägt er mit dem folgenden Fehler fehl:
OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)")
Ich kann jedoch jederzeit eine Verbindung zu MySQL herstellen, indem Sie die Befehlszeile mysql
ausführen. Ein ps aux | grep mysql
zeigt an, dass der Server läuft, und stat /tmp/mysql.sock
bestätigt, dass der Socket vorhanden ist. Wenn ich außerdem einen Debugger in der except
-Klausel dieser Ausnahme öffne, kann ich Mit den exakt gleichen Parametern zuverlässig verbinden.
Dieses Problem wird relativ zuverlässig reproduziert, scheint jedoch nicht zu 100% zu sein, da jedes Mal in einem blauen Mond meine Testsuite tatsächlich ohne __ ausgeführt wird, der diesen Fehler trifft. Als ich versuchte, mit Sudo dtruss
zu laufen, wurde es nicht reproduziert.
Der gesamte Clientcode befindet sich in Python, obwohl ich nicht herausfinden kann, wie das relevant wäre.
Beim Umschalten auf Host 127.0.0.1
wird der Fehler angezeigt:
DatabaseError: Can't connect to MySQL server on '127.0.0.1' (61)
Sudo /usr/local/mysql/support-files/mysql.server start
Das hat bei mir funktioniert. Wenn dies jedoch nicht funktioniert, stellen Sie sicher, dass mysqld ausgeführt wird, und versuchen Sie, eine Verbindung herzustellen.
Der relevante Abschnitt des MySQL-Handbuchs ist hier . Ich fange damit an, die dort aufgeführten Debugging-Schritte durchzugehen.
Denken Sie auch daran, dass localhost und 127.0.0.1 in diesem Zusammenhang nicht dasselbe sind:
localhost
eingestellt ist, wird ein Socket oder eine Pipe verwendet.127.0.0.1
eingestellt ist, muss der Client TCP/IP verwenden.So können Sie beispielsweise überprüfen, ob Ihre Datenbank auf TCP -Verbindungen vi netstat -nlp
wartet. Es scheint wahrscheinlich, dass es IS auf TCP Verbindungen wartet, weil Sie sagen, dass mysql -h 127.0.0.1
gut funktioniert. Um zu überprüfen, ob Sie über Sockets eine Verbindung zu Ihrer Datenbank herstellen können, verwenden Sie mysql -h localhost
.
Wenn dies alles nicht hilft, müssen Sie wahrscheinlich mehr Details zu Ihrer MySQL-Konfiguration veröffentlichen, wie Sie die Verbindung instanziieren usw.
Für mich bestand das Problem darin, dass kein mysql-Server ausgeführt wurde .. _. Führen Sie zuerst den Server aus und dann mysql
.
$ mysql.server start
$ mysql -h localhost -u root -p
Ich habe dies in meinem Shop gesehen, als meine Entwickler einen Stack-Manager wie MAMP installiert haben, der vorkonfiguriert ist und MySQL an einem nicht standardmäßigen Ort installiert ist.
an deinem Terminal laufen
mysql_config --socket
das gibt Ihnen den Pfad zur Socken-Datei. Nehmen Sie diesen Pfad und verwenden Sie ihn in Ihrem DATABASES Host-Parameter.
Was Sie tun müssen, ist Ihr zu zeigen
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.mysql',
'NAME': 'test',
'USER': 'test',
'PASSWORD': 'test',
'Host': '/Applications/MAMP/tmp/mysql/mysql.sock',
'PORT': '',
},
}
führen Sie auch which mysql_config
aus, wenn auf dem Computer mehrere Instanzen von MySQL-Servern installiert sind, die möglicherweise eine Verbindung zum falschen Server herstellen.
Ich habe gerade die Host
von localhost
in 127.0.0.1
geändert und es funktioniert gut:
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.mysql',
'NAME': 'db_name',
'USER': 'username',
'PASSWORD': 'password',
'Host': '127.0.0.1',
'PORT': '',
},
Wenn Sie Ihren Daemon mysql in Mac OSx verlieren, aber in anderem Pfad in private/var vorhanden sind, führen Sie den folgenden Befehl aus
1)
ln -s /private/var/mysql/mysql.sock /tmp/mysql.sock
2) Starten Sie Ihre Verbindung zu mysql neu mit:
mysql -u username -p -h Host databasename
Führen Sie das folgende Cmd-In-Terminal aus
/ usr/local/mysql/bin/mysqld_safe
Starten Sie anschließend die Maschine neu, um die Änderungen zu übernehmen. Es klappt!!
Überprüfen Sie die Anzahl der geöffneten Dateien für den mysql-Prozess mit dem Befehl lsof.
Erhöhen Sie das Limit für offene Dateien und führen Sie es erneut aus.
Nachdem ich einige dieser Lösungen ausprobiert hatte und keinen Erfolg hatte, funktionierte dies für mich:
Dies kann eines der folgenden Probleme sein.
mysqladmin -p variables | grep sockel
und dann in den DB-Verbindungscode einfügen:
pymysql.connect(db='db', user='user', passwd='pwd', unix_socket="/tmp/mysql.sock")
/tmp/mysql.sock wird von grep zurückgegeben
2.Korrigieren Sie den MySQL-Port Lösung: Sie müssen den korrekten Mysql-Port herausfinden:
mysqladmin -p variables | grep port
und dann in deinem Code:
pymysql.connect(db='db', user='user', passwd='pwd', Host='localhost', port=3306)
3306 ist der vom grep zurückgegebene Port
Ich denke, die erste Option wird Ihr Problem lösen.
Ich glaube, ich habe vor einiger Zeit dasselbe Verhalten gesehen, kann mich aber nicht an Details erinnern.
In unserem Fall war das Problem der Moment, in dem der Testläufer die Datenbankverbindungen in Bezug auf die erste erforderliche Datenbankinteraktion initialisiert hat, z. B. durch Import eines Moduls in settings.py oder einer anderen __init __ Weitere Informationen finden Sie hier, aber dies könnte für Ihren Fall bereits eine Glocke läuten.
Ich habe zwei hinterlistige Vermutungen zu dieser
Prüfen Sie die Möglichkeit, nicht auf die /tmp/mysql.sock
-Datei zugreifen zu können. Beim Einrichten von MySQL-Datenbanken lasse ich normalerweise die Socket-Dateiseite in /var/lib/mysql
. Wenn Sie sich bei mysql als [email protected]
anmelden, muss Ihre Betriebssystemsitzung Zugriff auf den /tmp
-Ordner haben. Stellen Sie sicher, dass /tmp
die richtigen Zugriffsrechte im Betriebssystem hat. Stellen Sie außerdem sicher, dass der Sudo-Benutzer die Datei immer in /tmp
lesen kann.
Der Zugriff auf mysql über 127.0.0.1
kann zu Verwirrung führen, wenn Sie nicht aufpassen. Wie?
Wenn Sie über 127.0.0.1
eine Verbindung zu MySQL herstellen, müssen Sie möglicherweise das TCP/IP-Protokoll angeben.
mysql -uroot -p -h127.0.0.1 --protocol=tcp
oder versuchen Sie den DNS-Namen
mysql -uroot -p -hDNSNAME
Dadurch wird die Anmeldung als [email protected]
umgangen. Stellen Sie jedoch sicher, dass Sie [email protected]'127.0.0.1'
definiert haben.
Wenn Sie sich das nächste Mal mit MySQL verbinden, führen Sie Folgendes aus:
SELECT USER(),CURRENT_USER();
Was gibt dir das?
Wenn diese Funktionen mit denselben Werten zurückkehren, stellen Sie eine Verbindung her und authentifizieren sich wie erwartet. Wenn die Werte unterschiedlich sind, müssen Sie möglicherweise den entsprechenden Benutzer [email protected]
erstellen.
Hatte das gleiche Problem. Es stellte sich heraus, dass mysqld
nicht mehr ausgeführt wurde (ich bin unter Mac OSX). Ich habe es neu gestartet und der Fehler ging weg.
Ich habe herausgefunden, dass mysqld
aufgrund dieses Links nicht weitgehend ausgeführt wurde: http://dev.mysql.com/doc/refman/5.6/de/can-not-connect-to-server.html
Beachten Sie den ersten Tipp!
wenn Sie einen Fehler wie folgt erhalten:
Django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")
Dann suchen Sie einfach nach dem Ort Ihrer mysqld.sock-Datei und fügen Sie ihn zu "Host" hinzu.
Wie ich xampp unter Linux verwende, ist meine mysqld.sock
-Datei an einem anderen Ort. also funktioniert es nicht für '/var/run/mysqld/mysqld.sock
'
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.mysql',
'NAME': 'asd',
'USER' : 'root',
'PASSWORD' : '',
'Host' : '/opt/lampp/var/mysql/mysql.sock',
'PORT' : ''
}
}
Stellen Sie sicher, dass in/etc/hosts 127.0.0.1 localhost
enthalten ist, und es sollte einwandfrei funktionieren
Vergewissern Sie sich, dass Ihr mysql nicht die maximale Anzahl von Verbindungen erreicht hat oder sich nicht in einer Art Boot-Schleife befindet, wie es häufig der Fall ist, wenn die Einstellungen in my.cnf falsch sind.
Verwenden Sie ps aux | grep mysql um zu überprüfen, ob sich die PID ändert.
Schaute sich online zu lange um nicht beizutragen. Nachdem ich versucht hatte, die mysql-Eingabeaufforderung über die Befehlszeile einzugeben, erhielt ich diese Nachricht weiterhin:
FEHLER 2002 (HY000): Es kann keine Verbindung zum lokalen MySQL-Server über den Socket '/tmp/mysql.sock' (2) hergestellt werden.
Dies war darauf zurückzuführen, dass mein lokaler MySQL-Server nicht mehr aktiv war. Um den Server neu zu starten, bin ich zu navigiert
Shell> cd /user/local/bin
wo sich mein mysql.server befand. Von hier aus einfach eingeben:
Shell> mysql.server start
Dadurch wird der lokale MySQL-Server neu gestartet.
Von dort können Sie das Root-Passwort bei Bedarf zurücksetzen.
mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass')
-> WHERE User='root';
mysql> FLUSH PRIVILEGES;
Für diejenigen, die ein Upgrade von 5.7 auf 8.0 über Homebrew durchgeführt haben, wird dieser Fehler wahrscheinlich dadurch verursacht, dass das Upgrade nicht abgeschlossen ist. In meinem Fall hat mysql.server start
den folgenden Fehler erhalten:
ERROR! Der Server wurde ohne Aktualisierung der PID-Datei beendet
Dann habe ich die Protokolldatei über cat /usr/local/var/mysql/YOURS.err | tail -n 50
geprüft und folgendes gefunden:
InnoDB: Upgrade nach einem Absturz wird nicht unterstützt.
Wenn Sie sich auf demselben Boot befinden, installieren Sie zuerst [email protected]
über Homebrew, stoppen Sie den Server und starten Sie das 8.0-System erneut.
brew install [email protected]
/usr/local/opt/[email protected]/bin/mysql.server start
/usr/local/opt/[email protected]/bin/mysql.server stop
Dann,
mysql.server start
Dies würde Ihr MySQL (8.0) wieder zum Laufen bringen.
Ich musste alle Instanzen von mysql beenden, indem ich zuerst alle Prozess-IDs fand:
ps aux | grep mysql
Und sie dann umbringen:
töte -9 {pid}
Dann:
mysql.server start
Arbeitete für mich.
Der Socket befindet sich in/tmp. Auf Unix-Systemen kann dies aufgrund von Modi und Eigentümern von/tmp zu Problemen führen. Solange Sie uns jedoch mitteilen, dass Sie Ihre mysql-Verbindung normal verwenden KÖNNEN, ist dies vermutlich kein Problem auf Ihrem System. Eine grundlegende Überprüfung sollte darin bestehen, mysql.sock in ein neutraleres Verzeichnis zu verschieben.
Die Tatsache, dass das Problem "zufällig" (oder nicht jedes Mal) auftritt, lässt mich denken, dass es ein Serverproblem sein könnte.
Befindet sich Ihr/tmp auf einer Standardfestplatte oder auf einem exotischen Mount (wie im RAM)?
Ist dein/tmp leer?
Zeigt iotop
etwas falsch an, wenn Sie auf das Problem stoßen?
Konfigurieren Sie Ihre DB-Verbindung im Dialogfeld "DB-Verbindungen verwalten". Wählen Sie als Verbindungsmethode 'Standard (TCP/IP)'.
Weitere Informationen finden Sie auf dieser Seite http://dev.mysql.com/doc/workbench/de/wb-manage-db-connections.html
Gemäß dieser anderen Seite wird eine Socket-Datei verwendet, auch wenn Sie localhost angeben.
Eine Unix-Socket-Datei wird verwendet, wenn Sie keinen Hostnamen angeben oder Geben Sie den speziellen Hostnamen localhost an.
Außerdem wird gezeigt, wie Sie den Server mithilfe der folgenden Befehle überprüfen können:
Wenn ein mysqld-Prozess ausgeführt wird, können Sie dies mit dem Befehl __ überprüfen. folgende Befehle. Die Portnummer oder der Name der Unix-Socket-Datei lautet möglicherweise anders in Ihrem Setup. Host_ip repräsentiert die IP-Adresse von Maschine, auf der der Server läuft.
Shell> mysqladmin version
Shell> mysqladmin variables
Shell> mysqladmin -h `hostname` version variables
Shell> mysqladmin -h `hostname` --port=3306 version
Shell> mysqladmin -h Host_ip version
Shell> mysqladmin --protocol=SOCKET --socket=/tmp/mysql.sock version
Wenn es sich um einen Socket handelt, lesen Sie diese Datei
/etc/mysql/my.cnf
und sehen Sie, wie der Standard-Sockelstandort Es ist eine Zeile wie:
socket = /var/run/mysqld/mysqld.sock
erstellen Sie jetzt einen Alias für Ihre Shell wie:
alias mysql="mysql --socket=/var/run/mysqld/mysqld.sock"
Auf diese Weise benötigen Sie keine Root-Berechtigungen.
Ich bin sicher, dass mysqld gestartet ist und die Befehlszeile mysql richtig funktionieren kann. Der httpd-Server zeigt jedoch das Problem an (Verbindung zu MySQL kann nicht über Socket hergestellt werden).
als ich schließlich den mysqld-Dienst mit dem Dienst mysqld start starte, gab es Probleme (selinux-Berechtigungsproblem). Wenn ich das Problem mit selinux behebe und die mysqld mit "service mysqld start" starte, verschwinden die httpd-Verbindungsprobleme. Wenn ich die mysqld jedoch mit mysqld_safe & starte, kann mysqld bearbeitet werden. (MySQL-Client kann richtig funktionieren). Es gibt jedoch immer noch Probleme beim Verbinden mit httpd.
Versuchen Sie einfach, mysqld
auszuführen.
Dies war, was auf Mac nicht funktioniert hat. Falls dies nicht funktioniert, gehen Sie zu /usr/local/var/mysql/<your_name>.err
, um detaillierte Fehlerprotokolle anzuzeigen.
in Ubuntu 14.04 können Sie dies tun, um dieses Problem zu lösen.
[email protected]:~/pycodes/python-scraping/chapter5$ **mysqladmin -p variables|grep socket**
Enter password:
| socket | ***/var/run/mysqld/mysqld.sock*** |
[email protected]:~/pycodes/python-scraping/chapter5$***ln -s /var/run/mysqld/mysqld.sock /tmp/mysql.sock***
[email protected]:~/pycodes/python-scraping/chapter5$ ll /tmp/mysql.sock
lrwxrwxrwx 1 zack zack 27 11月 29 13:08 /tmp/mysql.sock -> /var/run/mysqld/mysqld.sock=