73 votes

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

Je voudrais analyser mysql trafic. Actuellement, toutes les requêtes mysql sont envoyées vers le socket unix MySQL :

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 au lieu du loopback. J'ai essayé de commenter tous les éléments socket dans les directives de l my.cnf y debian.cnf et redémarré MySQL mais cela n'a fait aucune différence.

Comment puis-je désactiver le socket unix de MySQL pour forcer MySQL à passer par le réseau ?

informations supplémentaires : Je suis en train d'exécuter MySQL 5.1 sur ubuntu 10.04 .

Précisions sur la question
Puisque beaucoup de personnes ont suggéré d'activer la prise réseau, je voudrais clarifier ma question en précisant que l'adresse de liaison était déjà activée avec la commande 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 pas de tentative de connexion 127.0.0.1:3306 provenant de ma webapp (site web Drupal).

Mis à jour avec la réponse

Il semble en effet que le problème vienne de l' mysqli que Drupal utilise (dans .ht_config.php pour ceux qui sont intéressés). C'était réglé : mysqli://drupal:***@localhost/drupal en changeant localhost a 127.0.0.1 a corrigé le problème (c'est-à-dire que Drupal établit maintenant des connexions avec le socket réseau).

138voto

Hawk2zer0 Points 21

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

Vous pouvez passer outre de trois façons : 1) Spécifier un nom d'hôte différent comme 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 voulez utiliser TCP et non une socket ( mysql --protocol tcp )

Vous pouvez aussi facilement faire en sorte que ce soit la valeur par défaut en éditant votre my.cnf pour qu'il contienne 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 de la connexion ici :

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

65voto

Nils Points 7622

Utiliser un lien IP pour 127.0.0.1 . Cela devrait activer un port d'écoute sur localhost . Du côté client, n'utilisez pas localhost - utiliser 127.0.0.1 à la place. De nombreux clients ont un alias interne qui leur permet de se connecter à la socket si vous spécifiez localhost comme cible.

MySQL est étrange.

18voto

user9517 Points 113163

Ne s'agit-il pas plutôt d'un problème de client ? Si vous utilisez le programme mysql, vous pouvez utiliser la commande --protocol interrupteur. Extrait 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 3306 et je peux voir le trafic alors que si j'exécute juste

mysql  -u root -p

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

EDIT:

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

Ir a sites/<sitename> o 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' => '',
    ),
  ),
);

Changez le 'localhost' a '127.0.0.1' et enregistrez le fichier.

1voto

Adam Points 11

Cela peut sembler un peu fou

Essayez de définir le fichier de 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 avec.

1voto

Chris Points 1135

Editez le my.cnf et ajoutez la directive

bind-address = 127.0.0.1

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X