web-dev-qa-db-fra.com

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

Je voudrais analyser le trafic mysql. À l'heure actuelle, toutes les requêtes mysql sont envoyées au 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 sur le bouclage. J'ai essayé de commenter toutes les directives socket dans le my.cnf et debian.cnf fichiers et redémarré MySQL mais cela ne faisait aucune différence.

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

info supplémentaire: je cours MySQL 5.1 sur ubuntu 10.04.

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

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

Je ne vois toujours aucune connexion tentant de 127.0.0.1:3306 provenant de ma webapp (site Drupal).

mis à jour avec la réponse

Il semble en effet que le problème provient du connecteur mysqli que Drupal utilise (dans .ht_config.php Pour ceux qui sont intéressés). Il a été défini: mysqli://drupal:***@localhost/drupal, en remplaçant localhost par 127.0.0.1 a résolu le problème (c.-à-d. Drupal établit maintenant des connexions avec la prise réseau).

47
Max

Utilisez une liaison IP pour 127.0.0.1. Cela devrait activer un port d'écoute sur localhost. Côté client, n'utilisez pas localhost - utilisez 127.0.0.1 au lieu. De nombreux clients ont un alias interne qui les fait se connecter au socket si vous spécifiez localhost comme cible.

MySQL est étrange.

53
Nils

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

Vous pouvez remplacer cela de 3 manières: 1) Spécifiez un nom d'hôte différent comme 127.0.0.1 (mysql -h 127.0.0.1) ou le véritable nom d'hôte de votre serveur 2) Spécifiez que vous souhaitez utiliser TCP et non un socket (mysql --protocol tcp)

Vous pouvez également facilement définir la valeur par défaut ma modification de votre fichier my.cnf afin qu'il ait ceci ([client] signifie n'importe quel client:

[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

83
Jonathan Amend

N'est-ce pas vraiment un problème client? Si vous utilisez le programme mysql Vous pouvez utiliser le --protocol commutateur. Depuis 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”.

J'ai juste essayé

mysql --protocol=TCP -u root -p

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

mysql  -u root -p

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

ÉDITER:

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

Aller à sites/<sitename> ou sites/default et modifiez le settings.php fichier

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' => '',
    ),
  ),
);

Changer la 'localhost' à '127.0.0.1' et enregistrez le fichier.

16
user9517

Modifiez my.cnf et ajoutez la directive

bind-address = 127.0.0.1

ou votre adresse IP préférée pour la rendre accessible sur le réseau. Redémarrez mysql après pour le faire fonctionner.

1
Chris

le client php mysqli utilisera le fichier socket Unix au lieu du réseau tcp 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" dedans

1
diyism

Cela peut sembler un peu fou

Essayez de définir le fichier socket sur un chemin absolu dont le chemin réside sur une autre machine

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

Sinon, vous ne pouvez pas contourner ce comportement par défaut car un fichier socket doit exister pour que mysqld puisse communiquer.

1
RolandoMySQLDBA

J'ai dû supprimer /etc/my.cnf (après l'avoir sauvegardé), puis redémarré le serveur. Ensuite, j'ai pu me connecter avec une prise et l'erreur a disparu.

0
robrecord