Wie erzwinge ich, dass MySQL eine TCP-Verbindung anstelle eines Unix-Sockets herstellt?

46

Ich möchte den mysqlVerkehr analysieren . Im Moment werden alle MySQL-Anfragen an den MySQL-Unix-Socket gesendet:

unix  2      [ ACC ]     STREAM     LISTENING     3734388  15304/mysqld        /var/run/mysqld/mysqld.sock

Ich versuche, diesen Socket zu deaktivieren, um MySQL zu zwingen, den Netzwerksocket stattdessen im Loopback zu verwenden. Ich habe versucht, alle socketAnweisungen in den my.cnfund debian.cnf-Dateien auszukommentieren und MySQL neu gestartet, aber es machte keinen Unterschied.

Wie kann ich den MySQL-Unix-Socket deaktivieren, um MySQL über das Netzwerk zu erzwingen?

Zusatzinfo: Ich laufe MySQL 5.1weiter ubuntu 10.04.


Präzisierungen zur Frage Da viele Leute vorgeschlagen haben, den Netzwerk-Socket zu aktivieren, möchte ich meine Frage klären, indem ich darauf hinweise, dass die Bindungsadresse bereits aktiviert wurde bind-address = 127.0.0.1und eine Abhörverbindung verfügbar ist:

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      15601/mysqld 

Trotzdem sehe ich keine Verbindungsversuche 127.0.0.1:3306von meiner Webapp (Drupal-Website).

Aktualisiert mit der Antwort

Es scheint in der Tat, dass das Problem von dem mysqliConnector stammt, den Drupal verwendet ( .ht_config.phpfür diejenigen, die interessiert sind). Es wurde festgelegt :, geändert mysqli://drupal:***@localhost/drupal, localhostum 127.0.0.1das Problem zu beheben (dh Drupal stellt jetzt Verbindungen zum Netzwerk-Socket her).

Max
quelle

Antworten:

52

Verwenden Sie eine IP-Bindung an 127.0.0.1. Das sollte einen Listening Port einschalten localhost. Auf der Clientseite nicht verwenden localhost- 127.0.0.1stattdessen verwenden. Viele Clients verfügen über einen internen Alias, über den sie eine Verbindung zum Socket herstellen können, wenn Sie localhostals Ziel angeben .

MySQL ist seltsam.

Nils
quelle
6
Benutze einfach --protocol... siehe Jonathans Antwort.
Pacerier
75

Unter Linux und anderen * Nixen geht MySQL davon aus, dass Sie einen Socket verwenden möchten, wenn Sie eine Verbindung zum Host "localhost" herstellen (dies wäre der Standard-Hostname).

Sie können dies auf drei Arten außer Kraft setzen: 1) Geben Sie einen anderen Hostnamen wie 127.0.0.1 ( mysql -h 127.0.0.1) oder den tatsächlichen Hostnamen Ihres Servers an. 2) Geben Sie an, dass Sie TCP verwenden möchten und keinen Socket ( mysql --protocol tcp).

Sie können auch einfach festlegen, dass die my.cnf standardmäßig so bearbeitet wird, dass sie Folgendes enthält ([client] bedeutet einen beliebigen Client:

[client]
protocol=tcp

Die vollständige Beschreibung, wie MySQL entscheidet, wie eine Verbindung hergestellt werden soll, finden Sie hier:

http://dev.mysql.com/doc/refman/5.5/en/connecting.html

Jonathan Amend
quelle
6
Dies sollte die akzeptierte Antwort sein.
Pacerier
Erzwingt das Ausführen des MySQL-Servers in einem Docker-Container mit docker-compose unter Verwendung des Containernamens als Hostnamen die Verwendung des Netzwerkprotokolls über ein Socket-Protokoll?
Stephane
auf jeden Fall sollte die akzeptierte Antwort sein. Weg 3 (protocol = tcp in my.cnf) ist der einzige Weg, der ohne zusätzliche Befehlszeilenparameter funktioniert, also ohne Änderungen in einem Skript.
Tuncay Göncüoğlu
16

Ist das nicht wirklich ein Kundenproblem? Wenn Sie das Programm mysql verwenden, können Sie den --protocolSchalter verwenden. Von der Manpage

 --protocol={TCP|SOCKET|PIPE|MEMORY}

       The connection protocol to use for connecting to the server. It is
       useful when the other connection parameters normally would cause a
       protocol to be used other than the one you want. For details on the
       allowable values, see Section 4.2.2, “Connecting to the MySQL
       Server”.

Ich habe es versucht

mysql --protocol=TCP -u root -p

während der Überwachung von Port 3306 mit tcpdump -i lo tcp port 3306und ich kann den Verkehr sehen, während, wenn ich gerade laufen

mysql  -u root -p

Ich sehe (richtig) keinen Verkehr auf Port 3306.

BEARBEITEN:

Jetzt, da Sie uns mitteilen, dass Sie DRUPAL verwenden, ist die Lösung relativ einfach.

Gehen Sie zu sites/<sitename>oder sites/defaultund bearbeiten Sie die settings.phpDatei

Sie finden eine Struktur wie diese

$databases = array (
  'default' =>
  array (
    'default' =>
    array (
      'database' => 'databasename',
      'username' => 'databaseuser',
      'password' => 'databasepassword',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);

Ändern Sie das 'localhost'in '127.0.0.1'und speichern Sie die Datei.

Iain
quelle
Es könnte in der Tat von einem Client-Problem stammen, aber da der Client eine Webanwendung (Drupal) ist und ich keine Kontrolle darüber habe, suchte ich nach einer Möglichkeit, dies vom Standpunkt des Systems aus zu erzwingen.
Max
1
Nun, indem no controlich sagte, ich sei dramatisch. Ich könnte die .ht_config.phpDatei ändern und das Problem beheben.
Max
Ein bisschen dramatisch vielleicht, aber es ist ein Kundenproblem und es ist leicht zu lösen. Siehe meine Bearbeitung.
user9517 unterstützt GoFundMonica
Entschuldigung, ich habe meine Frage mit der Antwort aktualisiert, nachdem ich meinen Kommentar hinzugefügt habe. Aus irgendeinem Grund verwenden wir .ht_config.phpstatt settings.php. Ich weiß nicht warum (das Entwicklerteam hat darum gebeten, dass es so sein soll). Jetzt ist das Problem, dass Drupal die .ht_config.phpDatei bei jeder Anfrage zu lesen scheint (wenn ich sie ändere, werden Änderungen sofort berücksichtigt), was bei den Performances nicht helfen kann. Wir werden nach einer Möglichkeit suchen, diese Einstellungen auf Anwendungsebene zwischenzuspeichern, aber das ist ein anderes Problem.
Max
Hinweis: Dies ist nicht möglich, --protocol=socketwenn Sie einen hostEintrag im [client]Abschnitt haben, der .my.cnfeinen wrong or unknown protocolFehler anzeigt. (mysql 5.7.13)
Kris
1

Das hört sich vielleicht etwas verrückt an

Versuchen Sie, die Socket-Datei auf einen absoluten Pfad festzulegen, dessen Pfad sich auf einem anderen Computer befindet

http://dev.mysql.com/doc/refman/5.0/de/server-options.html#option_mysqld_socket

Andernfalls können Sie dieses Standardverhalten nicht umgehen, da für die Kommunikation mit mysqld eine Socket-Datei vorhanden sein muss.

RolandoMySQLDBA
quelle
1

Bearbeiten Sie die Datei my.cnf und fügen Sie die Direktive hinzu

bind-address = 127.0.0.1

oder Ihre bevorzugte IP-Adresse, um den Zugriff über das Netzwerk zu ermöglichen. Starten Sie mysql danach neu, damit es funktioniert.

Chris
quelle
1

Wenn Sie den NULL-Wert oder die Zeichenfolge "localhost" ( http://www.php.net/manual/en/mysqli.construct.php ) eingeben, verwendet der MySQL-Client eine Unix-Socket-Datei anstelle des TCP-Netzwerks.

Es scheint, dass der sqlyog-Client immer das TCP-Netzwerk verwendet, auch wenn Sie "localhost" eingeben

Diyismus
quelle
0

Ich musste /etc/my.cnf löschen (nachdem ich es gesichert hatte) und dann den Server neu starten. Dann konnte ich mich mit einer Steckdose verbinden und der Fehler verschwand.

robrecord
quelle