Comment forcer MySQL à se connecter par TCP au lieu d'un socket Unix?

46

Je voudrais analyser le mysqltrafic. Pour le moment, toutes les requêtes mysql sont envoyées à la socket MySQL Unix:

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

J'essaie de désactiver ce socket pour forcer MySQL à utiliser le socket réseau à la place du bouclage. J'ai essayé de commenter toutes les socketdirectives dans les my.cnfet debian.cnffichiers et remis en marche MySQL , mais il n'a fait aucune différence.

Comment désactiver le socket Unix MySQL pour forcer MySQL sur le réseau?

informations supplémentaires: je cours MySQL 5.1sur ubuntu 10.04.

Précisions sur la question
Étant donné que de nombreuses personnes ont suggéré d'activer la prise réseau, j'aimerais clarifier ma question en précisant que l'adresse de liaison était déjà activée avec bind-address = 127.0.0.1et qu'une connexion d'écoute était disponible:

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

Je ne vois toujours aucune connexion tenter 127.0.0.1:3306de sortir de mon application Web (site Web Drupal).

Mis à jour avec la réponse

Il semble en effet que le problème vienne du mysqliconnecteur utilisé par Drupal ( .ht_config.phppour ceux qui sont intéressés). Il a été défini mysqli://drupal:***@localhost/drupal:, changer localhostpour 127.0.0.1résoudre le problème (c’est-à-dire que Drupal est maintenant connecté à la prise réseau).

Max
la source

Réponses:

52

Utilisez un IP-binding to 127.0.0.1. Cela devrait activer un port d’écoute localhost. Du côté client, n'utilisez pas localhost- utilisez 127.0.0.1plutôt. De nombreux clients ont un alias interne qui leur permet de se connecter au socket si vous spécifiez localhostcomme cible.

MySQL est étrange.

Nils
la source
6
Il suffit d'utiliser --protocol.. voir la réponse de Jonathan.
Pacerier
76

Dans Linux et d'autres * nixes, MySQL supposera que vous voulez utiliser un socket si vous vous connectez à l'hôte "localhost" (qui serait le nom d'hôte par défaut).

Vous pouvez remplacer ceci de 3 manières: 1) Spécifiez un nom d’hôte différent, tel que 127.0.0.1 ( mysql -h 127.0.0.1) ou le nom d’hôte réel de votre serveur. 2) Spécifiez que vous souhaitez utiliser TCP et non un socket ( mysql --protocol tcp).

Vous pouvez aussi facilement faire en sorte que ma modification par défaut soit votre my.cnf.

[client]
protocol=tcp

Vous pouvez voir la description complète de la façon dont MySQL décide comment se connecter ici:

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

Jonathan Amend
la source
6
Cela devrait être la réponse acceptée.
Pacerier
L'exécution du serveur MySQL dans un conteneur Docker avec docker-compos avec l'utilisation du nom du conteneur comme nom d'hôte oblige-t-elle l'utilisation du protocole réseau sur un protocole de socket?
Stéphane
devrait être la réponse acceptée. way 3 (protocole = tcp dans my.cnf) est le seul moyen de fonctionner sans aucun paramètre de ligne de commande supplémentaire, donc sans modifications dans les scripts.
Tuncay Göncüoğlu
16

N'est-ce pas vraiment un problème de client? Si vous utilisez le programme mysql Vous pouvez utiliser le --protocolcommutateur. De la page de manuel

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

Je viens d'essayer

mysql --protocol=TCP -u root -p

tout en surveillant le port 3306 avec tcpdump -i lo tcp port 3306et je peux voir le trafic alors que si je viens de courir

mysql  -u root -p

Je ne vois (correctement) pas de trafic sur le port 3306.

MODIFIER:

Maintenant que vous nous dites que vous utilisez DRUPAL, la solution est relativement simple.

Allez à sites/<sitename>ou sites/defaultet éditez le settings.phpfichier

Vous trouverez une structure comme celle-ci

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

Changez le 'localhost'en '127.0.0.1'et sauvegardez le fichier.

Iain
la source
cela pourrait bien être dû à un problème client, mais comme le client est une application Web (Drupal) et que je n’exerce aucun contrôle sur elle, je cherchais un moyen de le forcer du point de vue du système.
Max
1
bien en disant que no controlj'étais dramatique. Je pourrais modifier le .ht_config.phpfichier et résoudre le problème.
Max
Un peu dramatique peut-être mais c'est un problème de client et il est facilement résolu. Voir mon édition.
user9517 prend en charge GoFundMonica
Désolé, j'ai mis à jour ma question avec la réponse après avoir ajouté mon commentaire. Pour une raison quelconque, nous utilisons .ht_config.phpau lieu de settings.php. Je ne sais pas pourquoi (l'équipe de développement a demandé que ce soit ainsi). Maintenant, le problème est que Drupal semble lire le .ht_config.phpfichier à chaque requête (car si je le modifie, les modifications sont immédiatement prises en compte), ce qui ne peut pas aider les performances. Nous rechercherons un moyen de mettre en cache ces paramètres au niveau de la couche application, mais le problème est différent.
Max
Remarque: vous ne pouvez pas le faire --protocol=socketsi vous avez une hostentrée dans la [client]section .my.cnfqui donne une wrong or unknown protocolerreur. (mysql 5.7.13)
Kris
1

Editez le fichier my.cnf et ajoutez la directive

bind-address = 127.0.0.1

ou votre adresse IP préférée pour le rendre accessible sur le réseau. Redémarrez mysql après pour que cela fonctionne.

Chris
la source
1

Le client php mysqli utilisera un fichier de socket unix au lieu de tcp network lorsque vous passerez la valeur NULL ou la chaîne "localhost" ( http://www.php.net/manual/en/mysqli.construct.php )

il semble que le client sqlyog utilise toujours le réseau tcp même lorsque vous remplissez "localhost"

diyisme
la source
0

Je devais supprimer /etc/my.cnf (après l'avoir sauvegardé), puis redémarrer le serveur. Ensuite, je pouvais me connecter avec un socket et l'erreur disparaissait.

Robrecord
la source