Frage Wie kann MySQL gezwungen werden, sich per TCP anstatt mit einem Unix-Socket zu verbinden?


Ich würde gerne analysieren mysql der Verkehr. 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 Netzwerk-Socket stattdessen auf dem Loopback zu verwenden. Ich habe versucht, all das zu kommentieren socket Richtlinien in der my.cnf und debian.cnf Dateien und Neustart von MySQL, aber es machte keinen Unterschied.

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

Zusatzinfo: Ich renne MySQL 5.1 auf ubuntu 10.04.

Präzision in der Frage
Da viele Leute vorgeschlagen haben, den Netzwerk-Socket zu aktivieren, möchte ich meine Frage klären, indem ich darauf hinwies, dass die Bind-Adresse bereits aktiviert war bind-address = 127.0.0.1 und dass eine hörende Verbindung verfügbar ist:

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

Trotzdem sehe ich keine Verbindungen zu versuchen 127.0.0.1:3306 von meiner Webapp (Drupal Website) kommen.

Mit der Antwort aktualisiert

Es scheint in der Tat, dass das Problem von der mysqli Anschluss, den Drupal verwendet (in .ht_config.php für diejenigen, die daran interessiert sind). Es war festgelegt: mysqli://drupal:***@localhost/drupal, Ändern localhost zu 127.0.0.1 behebt das Problem (d. h. Drupal macht jetzt Verbindungen zum Netzwerk-Socket).


35
2017-12-05 17:42


Ursprung




Antworten:


Verwenden Sie eine IP-Bindung an 127.0.0.1. Das sollte einen Listening-Port aktivieren localhost. Auf der Client-Seite nicht verwenden localhost - benutzen 127.0.0.1 stattdessen. Viele Clients haben einen internen Alias, durch den sie sich mit dem Socket verbinden, wenn Sie dies angeben localhost als Ziel.

MySQL ist seltsam.


42
2017-12-05 19:00



Benutz einfach --protocol.. siehe Jonathans Antwort. - Pacerier


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

Sie können dies auf 3 Arten überschreiben: 1) Geben Sie einen anderen Hostnamen wie 127.0.0.1 (mysql -h 127.0.0.1) oder den echten Hostnamen Ihres Servers 2) Geben Sie an, dass Sie TCP und keinen Socket verwenden möchten (mysql --protocol tcp)

Sie können das auch so einfach zum Standard machen, indem Sie Ihre my.cnf so bearbeiten, dass sie dies hat ([client] bedeutet irgendeinen Client:

[client]
protocol=tcp

Sie können die vollständige Beschreibung sehen, wie MySQL entscheidet, wie man sich hier anmeldet:

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


62
2017-12-05 22:29



Dies sollte die akzeptierte Antwort sein. - Pacerier
Wenn der MySQL-Server in einem Docker-Container mit Andockfenster ausgeführt wird und der Name des Containers als Hostname verwendet wird, wird die Verwendung des Netzwerkprotokolls über ein Socket-Protokoll erzwungen. - Stephane


Ist das nicht wirklich ein Kundenproblem? Wenn Sie das mysql-Programm verwenden, können Sie das verwenden --protocol Schalter. 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 Port 3306 mit überwacht wird tcpdump -i lo tcp port 3306 und ich kann Verkehr sehen, wenn ich nur renne

mysql  -u root -p

Ich sehe (richtig) keinen Verkehr auf Port 3306.

BEARBEITEN:

Nachdem Sie uns mitgeteilt haben, dass Sie mit DRUPAL arbeiten, ist die Lösung relativ einfach.

Gehe zu sites/<sitename> oder sites/default und editiere die settings.php Datei

Sie werden eine Struktur wie diese finden

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

Ändere das 'localhost' zu '127.0.0.1' und speichern Sie die Datei.


12
2017-12-05 18:14



Es könnte tatsächlich durch ein Client-Problem, aber da der Client eine Web-Anwendung (Drupal) ist und ich keine Kontrolle darüber habe, suchte ich nach einer Möglichkeit, es vom Systemstandpunkt aus zu erzwingen. - Max
gut, indem ich sage no control Ich war dramatisch. Ich könnte das ändern .ht_config.php Datei und beheben Sie das Problem. - Max
Ein bisschen dramatisch vielleicht, aber es ist ein Client-Problem, und es ist leicht zu lösen. Siehe meine Bearbeitung. - Iain
Entschuldigung, ich habe meine Frage mit der Antwort aktualisiert, nachdem ich meinen Kommentar hinzugefügt habe. Aus irgendeinem Grund verwenden wir .ht_config.php anstatt settings.php. Ich weiß nicht warum (das Dev-Team hat darum gebeten). Jetzt ist das Problem, dass Drupal zu lesen scheint .ht_config.php Datei bei jeder Anfrage (weil, wenn ich es ändere, Änderungen sofort berücksichtigt werden), die mit den Leistungen nicht helfen können. Wir werden nach einer Möglichkeit suchen, diese Einstellungen auf Anwendungsebene zwischenzuspeichern, aber das ist ein anderes Problem. - Max
Hinweis: Das geht nicht --protocol=socket wenn du eine hast host Eintrag in der [client] Abschnitt von .my.cnf es gibt wrong or unknown protocol Error. (mysql 5.7.13) - Kris


Das mag ein bisschen verrückt klingen

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

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

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


1
2017-12-05 22:42





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

bind-address = 127.0.0.1

oder Ihre bevorzugte IP-Adresse, um sie über das Netzwerk zugänglich zu machen. Starten Sie mysql neu, damit es funktioniert.


1
2017-10-12 04:15





php mysqli client verwendet die Unix-Socket-Datei anstelle des TCP-Netzwerks, wenn Sie den NULL-Wert oder die Zeichenfolge "localhost" übergeben (http://www.php.net/manual/en/mysqli.construct.php)

Es scheint, dass sqlog Client immer tcp-Netzwerk verwenden, auch wenn Sie "localhost" darin füllen


1
2017-10-29 14:46





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


0