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


46

Я хотел бы проанализировать mysqlтрафик. Прямо сейчас все запросы mysql отправляются в Unix-сокет MySQL:

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 теперь делает соединение с сетевой розеткой).

Ответы:


52

Используйте IP-привязку к 127.0.0.1. Это должно активировать порт прослушивания localhost. На стороне клиента не используйте localhost- используйте 127.0.0.1вместо этого. Многие клиенты имеют внутренний псевдоним, который позволяет им подключаться к сокету, если вы укажете в localhostкачестве цели.

MySQL странный.


6
Просто используйте --protocol.. см. Ответ Джонатана.
Pacerier

76

В Linux и других * nixes MySQL предполагает, что вы хотите использовать сокет, если вы подключаетесь к хосту «localhost» (который будет именем хоста по умолчанию).

Вы можете переопределить это тремя способами: 1) Укажите другое имя хоста, например, 127.0.0.1 ( mysql -h 127.0.0.1) или реальное имя хоста вашего сервера. 2) Укажите, что вы хотите использовать TCP, а не сокет ( mysql --protocol tcp).

Вы также можете легко сделать так, чтобы по умолчанию я редактировал ваш my.cnf, чтобы он имел это ([клиент] означает любой клиент:

[client]
protocol=tcp

Вы можете увидеть полное описание того, как MySQL решает, как подключиться здесь:

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


6
Это должен быть принятый ответ.
Pacerier

Вызывает ли запуск сервера MySQL внутри контейнера Docker с docker-compose с использованием имени контейнера в качестве имени хоста принудительное использование сетевого протокола по протоколу сокетов?
Стефан

безусловно, должен быть принятый ответ. способ 3 (protocol = tcp в my.cnf) является единственным способом, который работает без каких-либо дополнительных параметров командной строки, поэтому работает без изменений в любом скрипте.
Tuncay Göncüoğlu

16

Разве это не проблема клиента? При использовании программы 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'и сохранить файл.


это действительно может быть связано с проблемой клиента, но так как клиент является веб-приложением (Drupal), и я не могу его контролировать, я искал способ заставить его с системной точки зрения.
Макс

1
хорошо, говоря, что no controlя был драматичным. Я мог бы изменить .ht_config.phpфайл и исправить проблему.
Макс

Возможно, это немного драматично, но это проблема клиента, и ее легко решить. Смотрите мое редактирование.
user9517 поддерживает GoFundMonica

Извините, я обновил свой вопрос ответом после того, как добавил свой комментарий. Почему-то мы используем .ht_config.phpвместо settings.php. Я не знаю почему (команда разработчиков попросила, чтобы это было так). Теперь проблема в том, что Drupal, похоже, читает .ht_config.phpфайл при каждом запросе (потому что, если я изменю его, изменения сразу же будут учтены), что не может помочь с выступлениями. Мы будем искать способ кэширования этих настроек на уровне приложения, но это другая проблема.
Макс

Примечание: вы не можете сделать, --protocol=socketесли у вас есть hostзапись в [client]разделе, .my.cnfэто дает wrong or unknown protocolошибку. (mysql 5.7.13)
Крис

1

Это может звучать немного сумасшедшим

Попробуйте установить для файла сокета абсолютный путь, путь которого находится на другом компьютере.

http://dev.mysql.com/doc/refman/5.0/en/server-options.html#option_mysqld_socket

В противном случае вы не сможете обойти это поведение по умолчанию, поскольку для взаимодействия с mysqld должен существовать файл сокета.


1

Отредактируйте my.cnf и добавьте директиву

bind-address = 127.0.0.1

или ваш предпочтительный IP-адрес, чтобы сделать его доступным по сети. Перезапустите mysql после того, как все заработало.


1

Клиент php mysqli будет использовать файл сокета unix вместо сети tcp, когда вы передаете значение NULL или строку "localhost" ( http://www.php.net/manual/en/mysqli.construct.php ).

кажется, что клиент sqlyog всегда использует tcp сеть, даже когда вы заполняете в нем "localhost"


0

Мне пришлось удалить /etc/my.cnf (после его резервного копирования), а затем перезапустить сервер. Тогда я мог соединиться с сокетом, и ошибка исчезла.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.