Назад | Перейти на главную страницу

Как заставить MySQL подключаться по TCP вместо сокета Unix?

Я хотел бы проанализировать 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 решает, как подключиться здесь:

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

Используйте привязку 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 (после его резервного копирования), а затем перезапустить сервер. Затем я смог подключиться к розетке, и ошибка исчезла.