Як змусити MySQL підключатися через TCP замість Unix-сокета?


46

Я хотів би проаналізувати 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 тепер робить з'єднання з мережевою розеткою).

Відповіді:


52

Використовуйте IP-прив'язку до 127.0.0.1. Це повинно активувати порт прослуховування localhost. На стороні клієнта не використовуйте localhost- використовуйте 127.0.0.1замість цього. У багатьох клієнтів є внутрішній псевдонім, який змушує їх підключатися до сокета, якщо ви вказали localhostяк ціль.

MySQL дивно.


6
Просто використовуйте --protocol.. див. Відповідь Джонатана.
Pacerier

75

В Linux та інших * nixes MySQL припустить, що ви хочете використовувати сокет, якщо ви підключитесь до хоста "localhost" (що було б ім'ям хоста за замовчуванням).

Ви можете змінити це 3 способами: 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/uk/connecting.html


6
Це має бути прийнятою відповіддю.
Pacerier

Чи запускає сервер MySQL всередині контейнера Docker з docker-compose з використанням імені контейнера як імені хоста, змушує використовувати мережевий протокол через протокол socket?
Стефан

Однозначно має бути прийнята відповідь. спосіб 3 (протокол = 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)
Kris

1

Це може здатися трохи божевільним

Спробуйте встановити файл сокета на абсолютний шлях, шлях якого знаходиться на іншій машині

http://dev.mysql.com/doc/refman/5.0/uk/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.