Was sollte mysqld.sock enthalten, warum habe ich es nicht?

22

Weiß jemand, warum sich meine /var/run/mysqld/mysqld.sockSocket-Datei nicht auf meinem Computer befindet, wenn ich MySQL 5.1 installiere (oder neu installiere)?

Im Moment, wenn ich versuche, einen Server mit mysqld zu starten, erhalte ich Fehler wie Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect, aber das Erstellen einer leeren Datei mit diesem Namen (wie in den Ubuntu-Foren vorgeschlagen) war nicht erfolgreich.

Ich hatte sowohl Mysql als auch Postgres in Ordnung, bis ich vor einiger Zeit auf Natty umgestiegen bin. Ich habe Stunden damit verbracht, durch beide Datenbanken zu gehen, um herauszufinden, was los ist. Ich kann Postgres aufgeben, aber ich kann nicht ohne eine Arbeitskopie von MySQL arbeiten.

Der seltsamste Teil: Ich benutze Kubuntu und verstehe, dass KDE mysql verwendet, um Benutzerberechtigungen usw. zu speichern. Ich habe keine seltsamen Berechtigungsprobleme. Kann ich das so verstehen, dass (irgendwie?) MySQL tatsächlich funktioniert?

Vielleicht leben diese Socket-Dateien an einem anderen Ort in natty? Wäre es einfacher, das Betriebssystem einfach neu zu installieren? An dieser Stelle bin ich offen für alle Vorschläge, die aufhören, meine Zeit zu verschwenden.

Egbutter
quelle
Sie müssen zuerst mysql server starten und dann wird diese Datei /var/run/mysqld/mysqld.sockerstellt. Wie @Paul sagte, müssen Sie alle Dateien entfernen, die Sie an diesem Ort abgelegt haben.
Evan Hu

Antworten:

18

Eine Socket-Datei enthält eigentlich keine Daten, sie transportiert sie. Es handelt sich um einen speziellen, ungewöhnlichen Dateityp, der mit speziellen Systemaufrufen / Befehlen erstellt wird. Es ist keine gewöhnliche Datei.

Es ist wie eine Pipe, mit der der Server und die Clients Anforderungen und Daten verbinden und austauschen können. Es wird auch nur lokal verwendet. Seine Bedeutung ist lediglich ein vereinbarter Treffpunkt im Dateisystem.

Wenn Sie eine einfache alte Datei erstellen und an diesem Speicherort ablegen, kann dies zu Problemen beim Erstellen des Servers führen. Dadurch wird verhindert, dass lokale Clients eine Verbindung zum Server herstellen.

Ich empfehle, alle Dateien zu entfernen, die Sie an den Speicherort gestellt haben. Die spezielle Socket-Datei wird vom Server erstellt.

Paul
quelle
1
Vielen Dank für die Erklärung der Socket-Dateien und Entschuldigung für die falsch formulierte Frage: Mein ursprüngliches Problem war, dass die Socket-Datei fehlte - der Fehler, den mysql immer wieder Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect
auslöste
aber wie entsteht es? weil ich es immer noch nicht habe ..: -s irgendeine idee?
jpganz18
Sie haben wahrscheinlich einen Mysql-Client, der erwartet, dass sich der Socket an diesem Ort befindet, aber der Server erstellt ihn dort nicht (oder der Server läuft nicht). Wenn der Server läuft, suchen Sie in / tmp oder verwenden Sie find oder locate to Suchen Sie die Socket-Datei und starten Sie den MySQL-Client mit -S <Pfad zur Socket-Datei>
sed_and_done
20

Wenn Sie dies angeben host=localhost, versucht der MySQL-Client, sich mit einer Unix-Named-Pipe, für die eine .sockDatei erforderlich ist, beim MySQL-Server anzumelden .

Dies kann umgangen werden, indem host = 127.0.0.1 angegeben wird. Dadurch verwendet der MySQL-Client TCP, um eine Verbindung zum Server herzustellen.

Aus der MySQL-Dokumentation entnommen :

mysql --host=127.0.0.1 --port=3306 --user=your_uname --password=your_pass
sccott
quelle
Dies ist tatsächlich eine brillante (und dringend benötigte) Antwort, da ich historisch gesehen habe, dass diese mysql.sockin jeder Version von MySQL, mit der ich gearbeitet habe (zurück zu 4.0), ohne triftigen Grund verschwunden ist. In diesem Fall logge ich mich einfach so ein, benutze aber --protocol=tcpstattdessen --port. Wenn Sie mysql herunterfahren, sucht der Dienst nach der Socket-Datei. Somit service mysql stopwürde das Laufen scheitern. Um die fehlenden Socket-Kopfschmerzen zu umgehen, renne ich mysqladmin -h127.0.0.1 --protocol=tcp -uroot -p shutdown. Übrigens +1 !!!
RolandoMySQLDBA
Vielen Dank. Dies war meine erste Online-Antwort :) Und ja. Eine alternative Methode zur Verwendung von TCP ist die Angabe von --protocol = tcp.
sccott
14

Ein Socket ist eine spezielle Pseudodatei, die zum Lesen und Schreiben von Daten und nicht zum Speichern von Daten verwendet wird.

Die Socket-Datei wird beim Starten des Dienstes erstellt und beim Beenden des Dienstes entfernt. Der Speicherort der Datei wird folgendermaßen definiert /etc/my.cnf:

[mysqld]
socket=/var/run/mysql/mysql.sock
Michael
quelle
8

In meinem Fall hat das Ausführen mysqld_safeeine neue mysqld.sockDatei erstellt.

$ cd /etc/init.d/
$ mysqld_safe

Sie werden wahrscheinlich keine Rückmeldung erhalten, aber wenn Sie Ihre Sitzung neu starten, befindet sich irgendwo eine mysqld.sock-Datei. Finde es mit

$ sudo find / -type s | grep mysqld.sock
Aviggiano
quelle
2

Ich hatte das gleiche Problem mit dem fehlenden mysqld.sock. Ich ging zu dem Verzeichnis, das MySQL enthielt, und zwar /usr/binin meinem Fall. Dann gab ich den Befehl

mysql mysql --host=localhost --password=whatever --port=3306

Das doppelte mysql ist kein Tippfehler, sondern eine Datenbank, die in einer neuen MySQL-Installation immer zur Verfügung steht. Ich weiß nicht , ob --host, --passwordoder --portsind erforderlich , aber da es funktionierte für mich mit diesen Parametern ich sie bin auch. Sobald MySQL gestartet war, ging ich in die Benutzertabelle und stellte das Passwort für root ein. Nach dem Start von MySQL wurde die fehlende Socket-Datei erstellt. Ich hoffe, das hilft jemandem, da ich tagelang gekämpft habe.

James
quelle
1

Wenn Sie nginx php-fastcgi verwenden und einen 502 Bad Gateway- Fehler haben, müssen Sie die Konfiguration Ihres virtuellen Hosts in der nginx-Konfigurationsdatei überprüfen. Sie müssen den fastcgi_passParameter einstellen oder korrigieren. Dies fastcgi_passist die Variable, um die Socket-Verbindung zwischen nginx und php CGI einzustellen.

Ein weiterer Punkt ist, dass das Binär-Starterskript die folgenden (wichtigen) Einträge übersehen könnte, die geöffnet wurden mit: nano /usr/bin/php-fastcgi

SOCKET=/var/run/php-fastcgi/php-fastcgi.socket
PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid

Der vollständige Inhalt meines Starterskripts / usr / bin / php-fastcgi:

#!/bin/bash

FASTCGI_USER=www-data
FASTCGI_GROUP=www-data
SOCKET=/var/run/php-fastcgi/php-fastcgi.socket
PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid
CHILDREN=6
PHP5=/usr/bin/php5-cgi

/usr/bin/spawn-fcgi -s $SOCKET -P $PIDFILE -C $CHILDREN -u $FASTCGI_USER -g $FASTCGI_GROUP -f $PHP5
Aysad Kozanoglu
quelle