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).
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.
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:
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.
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.
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
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.
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.