it-swarm.com.de

Es kann keine Verbindung zum lokalen MySQL-Server über Socket '/tmp/mysql.sock hergestellt werden

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)
97
Alex Gaynor
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.

138
Pratyay

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:

  • Wenn Host auf localhost eingestellt ist, wird ein Socket oder eine Pipe verwendet.
  • Wenn Host auf 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.

68
jtoberon

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
63
yask

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': '',
    },
}

HINWEIS

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.

21

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': '',
},
12
Sirbito X

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

funktioniert auch für mariadb

10
aurny2420289

Führen Sie das folgende Cmd-In-Terminal aus 

/ usr/local/mysql/bin/mysqld_safe

enter image description here

Starten Sie anschließend die Maschine neu, um die Änderungen zu übernehmen. Es klappt!!

8
Prashanth Sams

Ü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.

7
hsen

Nachdem ich einige dieser Lösungen ausprobiert hatte und keinen Erfolg hatte, funktionierte dies für mich:

  1. System neu starten
  2. mysql.server start
  3. Erfolg!
7
Mark Lohr

Dies kann eines der folgenden Probleme sein.

  1. Falsche Mysql-Sperre: Lösung: Sie müssen den korrekten Mysql-Socket ermitteln, indem Sie

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. 

5
Chamith Malinda

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.

4
Martin

Ich habe zwei hinterlistige Vermutungen zu dieser

KONJEKTUR # 1

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.

KONJEKTUR # 2

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?

  • USER () gibt an, wie Sie sich in MySQL authentifiziert haben
  • CURRENT_USER () gibt an, wie Sie sich in MySQL authentifizieren durften

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.

3
RolandoMySQLDBA

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!

3
Ben Rollert

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' : ''
    }
}
3
Shyam

Stellen Sie sicher, dass in/etc/hosts 127.0.0.1 localhost enthalten ist, und es sollte einwandfrei funktionieren

2
hd1

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.

2
beiller

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;
2
preynolds

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.

1
Blaszard

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.

1
HomerPlata

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?

1
Koreth

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
0
Only You

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.

0
MaxV

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).

Ich habe den Dienst mit mysqld_safe & gestartet.

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.

0
Robin LI

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.

0
eloone

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=
0
ZackZang