MySQL'i Unix soketi yerine TCP ile bağlanmaya zorlamak nasıl?


46

mysqlTrafiği analiz etmek istiyorum . Şu anda, tüm mysql istekleri MySQL unix soketine gönderilir:

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

MySQL'i geri döngü yerine ağ soketini kullanmaya zorlamak için bu soketi devre dışı bırakmaya çalışıyorum. Ve dosyalarındaki tüm socketdirektifleri yorumlamaya çalıştım ve MySQL'i yeniden başlattım ama hiçbir farkı yoktu.my.cnfdebian.cnf

MySQL'i ağ üzerinden zorlamak için MySQL unix soketini nasıl devre dışı bırakabilirim?

Ek bilgi: ben koşuyorum MySQL 5.1üzerinde ubuntu 10.04.

Soruyla ilgili hassasiyetler Bir
çok insan ağ soketini etkinleştirmeyi önerdiğinden, bağlantı adresinin zaten etkin olduğunu bind-address = 127.0.0.1ve bir dinleme bağlantısının mevcut olduğunu belirterek sorumu açıklığa kavuşturmak isterim :

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

Yine de 127.0.0.1:3306webapp'ımdan (Drupal web sitesi) hiçbir bağlantı gelmediğini görmüyorum .

Cevapla güncellendi

Gerçekten de, sorunun mysqliDrupal'ın kullandığı bağlayıcıdan geldiği anlaşılıyor ( .ht_config.phpilgilenenler için). Bu ayarlandı: mysqli://drupal:***@localhost/drupaldeğişen localhostiçin 127.0.0.1(yani Drupal şimdi ağ soketine bağlantı yapıyor) sabit konuya.

Yanıtlar:


52

İçin bir IP bağlaması kullanın 127.0.0.1. Bu bir dinleme portunu aktif hale getirmeli localhost. İstemci tarafında kullanmayın localhost- 127.0.0.1bunun yerine kullanın. localhostHedef olarak belirtirseniz , çoğu istemcinin sokete bağlanmasını sağlayan dahili bir diğer adı vardır .

MySQL tuhaf.


6
Sadece kullan --protocol.. Jonathan'ın cevabına bakınız.
Pacerier

75

Linux ve diğer * nix'lerde MySQL, "localhost" ana bilgisayarına bağlanırsanız (varsayılan ana bilgisayar adı olur) bir soket kullanmak istediğinizi varsayar.

Bunu 3 şekilde geçersiz kılabilirsiniz: 1) 127.0.0.1 ( mysql -h 127.0.0.1) veya sunucunuzun gerçek ana bilgisayar adı gibi farklı bir ana bilgisayar adı belirtin 2) Bir soket değil, TCP kullanmak istediğinizi belirtin ( mysql --protocol tcp)

Ayrıca, varsayılan olarak benim cnf'inizi düzenlememin varsayılan olmasını da sağlayabilirsiniz, böylece bunu ([istemci] herhangi bir müşteri anlamına gelir:

[client]
protocol=tcp

MySQL'in buraya nasıl bağlanacağına nasıl karar verdiğinin tam açıklamasını görebilirsiniz:

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


6
Bu kabul edilen cevap olmalı.
Pacerier

MySQL sunucusunu, docker oluşturuculu bir Docker konteynerinin içinde, ana bilgisayar adı olarak konteyner adının kullanımıyla çalıştırmak, ağ protokolünün soket protokolü üzerinden kullanılmasını zorlar mı?
Stephane

açıklık kabul edilen cevap olmalıdır. yol 3 (protokol = my.cnf'de tcp), herhangi bir komut dosyasında değişiklik yapmadan çalışan herhangi bir ek komut satırı parametresi olmadan çalışan tek yoldur.
Tuncay Göncüoğlu

16

Bu gerçekten bir müşteri sorunu değil mi? MySQL programını kullanıyorsanız --protocolanahtarı kullanabilirsiniz . Man sayfasından

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

Az önce denedim

mysql --protocol=TCP -u root -p

3306 no'lu limanı izleyerek tcpdump -i lo tcp port 3306trafikten izleyebiliyorum.

mysql  -u root -p

I (doğru) 3306 numaralı bağlantı noktasında trafik görmüyorum.

DÜZENLE:

Şimdi bize DRUPAL kullandığınızı söylediğiniz için çözüm oldukça kolaydır.

Dosyaya git sites/<sitename>veya sites/defaultdüzenlesettings.php

Bunun gibi bir yapı bulacaksınız

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

Değişim 'localhost'için '127.0.0.1've dosyayı kaydetmektedir.


Bu gerçekten bir müşteri sorunu olabilirdi ama müşteri bir web uygulaması (Drupal) olduğundan ve bunun üzerinde hiçbir kontrolüm olmadığı için onu sistem açısından zorlamak için bir yol arıyordum.
Maksimum

1
no controlDiyelim ki dramatik olduğumu söyleyerek . .ht_config.phpDosyayı değiştirebilir ve sorunu çözebilirim.
Maksimum

Belki biraz dramatik ama bu bir müşteri sorunudur ve kolayca çözülebilir. Düzenlemeye bak.
user9517, GoFundMonica

Maalesef yorumumu ekledikten sonra soruma cevabımı güncelledim. Nedense .ht_config.phpyerine kullanıyoruz settings.php. Neden olduğunu bilmiyorum (geliştirici ekibi böyle olmasını istedi). Şimdi mesele şu ki, Drupal .ht_config.phpher performansta dosyayı okuyor gibi görünüyor (çünkü eğer değiştirirsem, performanslar hemen dikkate alınamıyor. Bu ayarları uygulama katmanında önbelleğe almanın bir yolunu arayacağız, ancak bu farklı bir sorun.
Maksimum

Not: yapamaz --protocol=socketEğer bir varsa hostgirişi [client]bölümünde .my.cnfo verir wrong or unknown protocolhatası. (mysql 5.7.13)
Kris


1

My.cnf dosyasını düzenleyin ve yönergeyi ekleyin

bind-address = 127.0.0.1

veya tercih ettiğiniz IP’yi ağ üzerinden erişilebilir hale getirmek için. Çalışmasını sağlamak için mysql'yi yeniden başlatın.



0

/Etc/my.cnf dosyasını silmek zorunda kaldım (yedekledikten sonra), ardından sunucuyu yeniden başlattım. Sonra bir soket ile bağlanabilir ve hata kayboldu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.