I would like to analyze mysql
traffic. Right now, all mysql requests are sent to the MySQL unix socket:
unix 2 [ ACC ] STREAM LISTENING 3734388 15304/mysqld /var/run/mysqld/mysqld.sock
I'm trying to disable that socket to force MySQL to use the network socket instead on the loopback. I tried commenting out all the socket
directives in the my.cnf
and debian.cnf
files and restarted MySQL but it made no difference.
How can I disable the MySQL unix socket to force MySQL over the network?
additional info: I'm running MySQL 5.1
on ubuntu 10.04
.
Precisions on the question
Since plenty of people suggested enabling the network socket I would like to clarify my question by pointing out that the bind address was already enabled with bind-address = 127.0.0.1
and that a listening connection is available:
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 15601/mysqld
Still I see no connections attempt to 127.0.0.1:3306
coming from my webapp (Drupal website).
Updated with the answer
It appears indeed that the issue is coming from the mysqli
connector that Drupal uses (in .ht_config.php
for those who are interested). It was set: mysqli://drupal:***@localhost/drupal
, changing localhost
to 127.0.0.1
fixed the issue (i.e. Drupal is now making connections to the network socket).
In Linux and other *nixes, MySQL will assume you want to use a socket if you connect to the host "localhost" (which would be the default hostname).
You can override this in 3 ways: 1) Specify a different hostname like 127.0.0.1 (
mysql -h 127.0.0.1
) or your server's real hostname 2) Specify that you want to use TCP and not a socket (mysql --protocol tcp
)You can also easily make that the default my editing your my.cnf so it has this ([client] means any client:
You can see the full description of how MySQL decides how to connect here:
http://dev.mysql.com/doc/refman/5.5/en/connecting.html
Use an IP-binding to
127.0.0.1
. That should activate a listening port onlocalhost
. On the client side do not uselocalhost
- use127.0.0.1
instead. Many clients have an internal alias that makes them connect to the socket if you specifylocalhost
as target.MySQL is strange.
Isn't this really a client issue ? If using the mysql program You can use the
--protocol
switch. From the man pageI just tried
whilst monitoring port 3306 with
tcpdump -i lo tcp port 3306
and I can see traffic whereas if I just runI (correctly) see no traffic on port 3306.
EDIT:
Now that you tell us you are using DRUPAL, the solution is relatively easy.
Go to
sites/<sitename>
orsites/default
and edit thesettings.php
fileYou will find a structure like this
Change the
'localhost'
to'127.0.0.1'
and save the file.This may sound a little crazy
Try setting the socket file to an absolute path whose path resides on another machine
http://dev.mysql.com/doc/refman/5.0/en/server-options.html#option_mysqld_socket
Otherwise, you cannot bypass this default behavior because a socket file must exist for mysqld to communicate with.
Edit the my.cnf and add the directive
or your preferred IP to make it accessible over network. Restart mysql after to get it work.
php mysqli client will use unix socket file instead of tcp network when you pass in the NULL value or the string "localhost"(http://www.php.net/manual/en/mysqli.construct.php)
it seems that sqlyog client always use tcp network even when you fill "localhost" in it
I had to delete /etc/my.cnf (after backing it up), then restarted the server. Then I could connect with a socket and the error disappeared.