Jak zmusić MySQL do połączenia przez TCP zamiast gniazda Unix?

46

Chciałbym przeanalizować mysqlruch. W tej chwili wszystkie żądania mysql są wysyłane do gniazda unix MySQL:

unix  2      [ ACC ]     STREAM     LISTENING     3734388  15304/mysqld        /var/run/mysqld/mysqld.sock

Próbuję wyłączyć to gniazdo, aby zmusić MySQL do używania gniazda sieciowego zamiast w pętli zwrotnej. Próbowałem komentowania wszystkie socketwytyczne w my.cnforaz debian.cnfpliki i ponownie MySQL, ale to nie miało znaczenia.

Jak mogę wyłączyć gniazdo unix MySQL, aby wymusić MySQL w sieci?

Dodatkowe informacje: biegnę MySQL 5.1na ubuntu 10.04.

Precyzja pytania
Ponieważ wiele osób zasugerowało włączenie gniazda sieciowego, chciałbym wyjaśnić moje pytanie, wskazując, że adres powiązania został już włączony bind-address = 127.0.0.1i że dostępne jest połączenie nasłuchujące:

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      15601/mysqld 

Nadal nie widzę żadnych prób połączenia 127.0.0.1:3306z moją aplikacją internetową (strona internetowa Drupal).

Zaktualizowano z odpowiedzią

Wygląda na to, że problem pochodzi ze mysqlizłącza, z którego korzysta Drupal ( .ht_config.phpdla tych, którzy są zainteresowani). Zostało ustawione mysqli://drupal:***@localhost/drupal:, zmiana w localhostcelu 127.0.0.1naprawienia problemu (tj. Drupal wykonuje teraz połączenia z gniazdem sieciowym).

Max
źródło

Odpowiedzi:

52

Użyj powiązania adresu IP z 127.0.0.1. To powinno aktywować port nasłuchiwania localhost. Po stronie klienta nie używaj localhost- 127.0.0.1zamiast tego używaj . Wielu klientów ma wewnętrzny alias, który powoduje, że łączą się z gniazdem, jeśli zostanie określony localhostjako docelowy.

MySQL jest dziwny.

Nils
źródło
6
Po prostu użyj --protocol... zobacz odpowiedź Jonathana.
Pacerier
75

W Linuksie i innych * nixach MySQL zakłada, że ​​chcesz użyć gniazda, jeśli podłączysz się do hosta „localhost” (który byłby domyślną nazwą hosta).

Możesz to zmienić na 3 sposoby: 1) Podaj inną nazwę hosta, np. 127.0.0.1 ( mysql -h 127.0.0.1) lub prawdziwą nazwę hosta serwera 2) Podaj, że chcesz używać TCP, a nie gniazda ( mysql --protocol tcp)

Możesz także łatwo ustawić domyślną edycję mojego pliku my.cnf, aby miał on tę opcję ([klient] oznacza dowolnego klienta:

[client]
protocol=tcp

Pełny opis tego, jak MySQL decyduje o sposobie połączenia tutaj:

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

Jonathan Amend
źródło
6
To powinna być zaakceptowana odpowiedź.
Pacerier
Czy uruchomienie serwera MySQL w kontenerze Docker z kompozycją dokującą przy użyciu nazwy kontenera, ponieważ nazwa hosta wymusza użycie protokołu sieciowego przez protokół gniazda?
Stephane
zdecydowanie powinna być przyjętą odpowiedzią. sposób 3 (protokół = tcp w my.cnf) to jedyny sposób, który działa bez żadnych dodatkowych parametrów wiersza poleceń, więc działa bez zmian w żadnym skrypcie.
Tuncay Göncüoğlu
16

Czy to naprawdę nie jest problem klienta? Jeśli używasz programu mysql Możesz użyć --protocolprzełącznika. Ze strony podręcznika

 --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”.

Właśnie próbowałem

mysql --protocol=TCP -u root -p

podczas monitorowania portu 3306 zi tcpdump -i lo tcp port 3306widzę ruch, ale gdybym tylko uruchomił

mysql  -u root -p

(Prawidłowo) nie widzę ruchu na porcie 3306.

EDYTOWAĆ:

Teraz, gdy powiesz nam, że korzystasz z DRUPAL, rozwiązanie jest stosunkowo łatwe.

Przejdź do sites/<sitename>lub sites/defaultedytuj settings.phpplik

Znajdziesz taką strukturę

$databases = array (
  'default' =>
  array (
    'default' =>
    array (
      'database' => 'databasename',
      'username' => 'databaseuser',
      'password' => 'databasepassword',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);

Zmienić 'localhost'się '127.0.0.1'i zapisz plik.

Iain
źródło
może rzeczywiście problem z klientem, ale ponieważ klient jest aplikacją internetową (Drupal) i nie mam nad nim kontroli, szukałem sposobu na wymuszenie go z systemowego punktu widzenia.
Maks.
1
cóż, mówiąc, no controlże byłem dramatyczny. Mógłbym zmodyfikować .ht_config.phpplik i naprawić problem.
Max.
Może trochę dramatyczny, ale jest to problem klienta i można go łatwo rozwiązać. Zobacz moją edycję.
user9517 obsługuje GoFundMonica
Przepraszamy, zaktualizowałem swoje pytanie o odpowiedź po dodaniu komentarza. Z jakiegoś powodu używamy .ht_config.phpzamiast settings.php. Nie wiem dlaczego (zespół deweloperów poprosił, żeby tak było). Problem polega na tym, że Drupal wydaje się czytać .ht_config.phpplik przy każdym żądaniu (ponieważ jeśli go zmienię, zmiany zostaną natychmiast uwzględnione), co nie może pomóc w występach. Będziemy szukać sposobu buforowania tych ustawień w warstwie aplikacji, ale to inny problem.
Maks.
Uwaga: nie możesz tego zrobić, --protocol=socketjeśli masz hostwpis w [client]sekcji, .my.cnfktóra zawiera wrong or unknown protocolbłąd. (mysql 5.7.13)
Kris
1

To może brzmieć trochę szalone

Spróbuj ustawić plik gniazda na ścieżkę bezwzględną, której ścieżka znajduje się na innym komputerze

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

W przeciwnym razie nie można ominąć tego domyślnego zachowania, ponieważ plik mysqld musi istnieć, aby mógł się z nim komunikować.

RolandoMySQLDBA
źródło
1

Edytuj plik my.cnf i dodaj dyrektywę

bind-address = 127.0.0.1

lub preferowany adres IP, aby był dostępny przez sieć. Uruchom ponownie mysql po, aby działał.

Chris
źródło
1

klient php mysqli użyje pliku gniazda unix zamiast sieci tcp, gdy podasz wartość NULL lub ciąg „localhost” ( http://www.php.net/manual/en/mysqli.construct.php )

wygląda na to, że klient sqlyog zawsze używa sieci tcp, nawet jeśli wpiszesz w niej „localhost”

diyizm
źródło
0

Musiałem usunąć plik /etc/my.cnf (po utworzeniu kopii zapasowej), a następnie zrestartowałem serwer. Następnie mógłbym połączyć się z gniazdem i błąd zniknął.

robrecord
źródło