Soru MySQL'in Unix soketi yerine TCP ile bağlanmaya nasıl zorlanır?


Analiz etmek istiyorum mysql trafik. Şu anda, tüm mysql istekleri MySQL unix soketine gönderilir:

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

Bu soketi, MySQL'i loopback yerine ağ soketini kullanmaya zorlamak için devre dışı bırakmaya çalışıyorum. Tüm yorum yapmayı denedim socket direktifler my.cnf ve debian.cnf dosyaları ve MySQL'i yeniden başlattı ancak fark yaratmadı.

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

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

Sorudaki kesinlikler
Pek çok kişi ağ soketini etkinleştirmeyi önerdiğinden, bağlantı adresinin zaten etkinleştirilmiş olduğunu belirterek sorumu açıklığa kavuşturmak istiyorum. bind-address = 127.0.0.1 ve bir dinleme bağlantısı mevcut:

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

Hala bağlantı girişimi göremiyorum 127.0.0.1:3306 webapp'umdan geliyor (Drupal web sitesi).

Cevapla güncellendi

Gerçekten de sorunun konudan geldiğini görüyoruz. mysqli Drupal'ın kullandığı konektör ( .ht_config.php ilgilenenler için). Ayarlandı: mysqli://drupal:***@localhost/drupal, değiştirme localhost için 127.0.0.1 sorunu çözdü (yani Drupal şimdi ağ soketine bağlantı yapıyor).


36
2017-12-05 17:42


Menşei




Cevaplar:


İçin bir IP bağlaması kullanın 127.0.0.1. Bu bir dinleme portunu etkinleştirmeli localhost. Müşteri tarafında kullanmayın localhost - kullan 127.0.0.1 yerine. Birçok istemcinin, belirttiyseniz yuvaya bağlanmasını sağlayan bir iç takma adı vardır. localhost hedef olarak

MySQL garip.


43
2017-12-05 19:00



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


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

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

Bunu kolayca yapabilirsiniz, böylece my.cnf dosyasını düzenleyebilirim, böylece bu ([client] herhangi bir istemci 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


62
2017-12-05 22:29



Bu kabul edilen cevap olmalı. - Pacerier
MySQL sunucusunu docker-compose ile bir Docker konteynerinin içinde çalıştırarak, ana bilgisayar adı olarak kapsayıcı adının kullanılmasıyla ağ protokolünün bir soket protokolü üzerinden kullanılmasını zorlar mı? - Stephane


Bu gerçekten bir müşteri meselesi değil mi? Eğer mysql programı kullanıyorsanız --protocol geçin. 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 numaralı bağlantı noktasını izlerken tcpdump -i lo tcp port 3306 ve ben koşarsam trafiği görebilirim

mysql  -u root -p

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

DÜZENLE:

Şimdi bize DRUPAL kullandığınızı söyleyin, çözüm nispeten kolaydır.

Git sites/<sitename> veya sites/default ve düzenle settings.php dosya

Böyle 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ştir 'localhost' için '127.0.0.1' ve dosyayı kaydedin.


12
2017-12-05 18:14



Bir müşteri meselesi ile gerçekten olabilir ama müşteri bir web uygulaması (Drupal) olduğu için ve üzerinde hiçbir kontrole sahip olmadığım için onu sistem açısından zorlamak için bir yol arıyordum. - Max
iyi söyleyerek no control Dramatik davranıyordum. Değiştirebilirim .ht_config.php dosyayı düzeltin ve düzeltin. - Max
Belki biraz dramatik ama bu bir müşteri meselesi ve kolayca çözülür. Düzenlememe bak. - Iain
Üzgünüm, yorumumu ekledikten sonra sorumu yanıtla güncelledim. Bazı sebeplerden dolayı kullanıyoruz .ht_config.php yerine settings.php. Nedenini bilmiyorum (dev ekibi bu şekilde olmasını istedi). Şimdi sorun şu ki Drupal okuyormuş gibi görünüyor. .ht_config.php Her istek üzerine dosya (eğer değiştirirseniz, değişiklikler hemen hesaba katılır), bu da performanslara yardımcı olamaz. Bu ayarları uygulama katmanında önbelleğe almanın bir yolunu arıyor olacağız, ancak bu farklı bir problem. - Max
Not: yapamazsınız --protocol=socket eğer varsa host giriş [client] bölümü .my.cnf o verir wrong or unknown protocol hata. (mysql 5.7.13) - Kris


Bu biraz çılgınca gelebilir

Soket dosyasını, yolu başka bir makinede bulunan mutlak bir yola ayarlamayı deneyin.

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

Aksi takdirde, bu varsayılan davranışı atlayamazsınız, çünkü mysqld ile iletişim kurmak için bir soket dosyası bulunması gerekir.


1
2017-12-05 22:42





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

bind-address = 127.0.0.1

ya da ağ üzerinden erişilebilir hale getirmek için tercih ettiğiniz IP. Çalışmak için mysql'i yeniden başlatın.


1
2017-10-12 04:15





php mysqli istemcisi, NULL değerini veya "localhost" dizesini ilettiğinizde tcp ağı yerine unix soket dosyasını kullanır.http://www.php.net/manual/en/mysqli.construct.php)

sqlyog istemcisinde her zaman "localhost" yazdığınızda bile tcp ağını kullanır gibi görünüyor


1
2017-10-29 14:46





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


0