Я хотел бы проанализировать mysql
трафик. Прямо сейчас все запросы mysql отправляются в сокет MySQL unix:
unix 2 [ ACC ] STREAM LISTENING 3734388 15304/mysqld /var/run/mysqld/mysqld.sock
Я пытаюсь отключить этот сокет, чтобы MySQL использовал сетевой сокет вместо петли. Я пробовал комментировать все socket
директивы в my.cnf
и debian.cnf
файлы и перезапустили MySQL, но это не имело значения.
Как я могу отключить сокет MySQL unix, чтобы заставить MySQL работать по сети?
дополнительная информация: я бегу MySQL 5.1
на ubuntu 10.04
.
Уточнения по вопросу
Поскольку многие люди предлагали включить сетевой сокет, я хотел бы уточнить свой вопрос, указав, что адрес привязки уже был включен с помощью bind-address = 127.0.0.1
и что доступно прослушивающее соединение:
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 15601/mysqld
Тем не менее я не вижу попыток подключения к 127.0.0.1:3306
исходящий из моего веб-приложения (веб-сайт Drupal).
Обновлено с ответом
Похоже, что проблема исходит из mysqli
коннектор, который использует Drupal (в .ht_config.php
для интересующихся). Было установлено: mysqli://drupal:***@localhost/drupal
, изменение localhost
к 127.0.0.1
исправлена проблема (т.е. теперь Drupal подключается к сетевому сокету).
В Linux и других * nix-версиях MySQL предполагает, что вы хотите использовать сокет, если вы подключаетесь к хосту «localhost» (который будет именем хоста по умолчанию).
Вы можете переопределить это тремя способами: 1) Укажите другое имя хоста, например 127.0.0.1 (mysql -h 127.0.0.1
) или реальное имя хоста вашего сервера 2) Укажите, что вы хотите использовать TCP, а не сокет (mysql --protocol tcp
)
Вы также можете легко сделать это по умолчанию моим редактированием вашего my.cnf, чтобы он имел это ([client] означает любой клиент:
[client]
protocol=tcp
Вы можете увидеть полное описание того, как MySQL решает, как подключиться здесь:
Используйте привязку IP к 127.0.0.1
. Это должно активировать порт прослушивания на localhost
. На стороне клиента не используйте localhost
- использовать 127.0.0.1
вместо. Многие клиенты имеют внутренний псевдоним, который заставляет их подключаться к сокету, если вы укажете localhost
как цель.
MySQL странный.
Разве это не проблема клиента? Если вы используете программу mysql, вы можете использовать --protocol
переключатель. Со страницы руководства
--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”.
Я просто попробовал
mysql --protocol=TCP -u root -p
при мониторинге порта 3306 с tcpdump -i lo tcp port 3306
и я вижу трафик, а если просто бегу
mysql -u root -p
Я (правильно) не вижу трафика на порту 3306.
РЕДАКТИРОВАТЬ:
Теперь, когда вы сообщили нам, что используете DRUPAL, решение относительно простое.
Перейти к sites/<sitename>
или sites/default
и отредактируйте settings.php
файл
Вы найдете такую структуру
$databases = array (
'default' =>
array (
'default' =>
array (
'database' => 'databasename',
'username' => 'databaseuser',
'password' => 'databasepassword',
'host' => 'localhost',
'port' => '',
'driver' => 'mysql',
'prefix' => '',
),
),
);
Изменить 'localhost'
к '127.0.0.1'
и сохраните файл.
Отредактируйте my.cnf и добавьте директиву
bind-address = 127.0.0.1
или ваш предпочтительный IP-адрес, чтобы сделать его доступным по сети. Перезапустите mysql, чтобы он заработал.
Это может показаться немного безумным
Попробуйте установить для файла сокета абсолютный путь, путь к которому находится на другом компьютере
http://dev.mysql.com/doc/refman/5.0/en/server-options.html#option_mysqld_socket
В противном случае вы не сможете обойти это поведение по умолчанию, потому что для обмена данными mysqld должен существовать файл сокета.
Клиент php mysqli будет использовать файл сокета unix вместо сети tcp, когда вы передадите значение NULL или строку "localhost" (http://www.php.net/manual/en/mysqli.construct.php)
кажется, что клиент sqlyog всегда использует сеть tcp, даже если вы заполняете в ней "localhost"
Мне пришлось удалить /etc/my.cnf (после его резервного копирования), а затем перезапустить сервер. Затем я смог подключиться к розетке, и ошибка исчезла.