Bagaimana cara memaksa MySQL untuk terhubung dengan TCP, bukannya soket Unix?

46

Saya ingin menganalisis mysqllalu lintas. Saat ini, semua permintaan mysql dikirim ke soket unix MySQL:

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

Saya mencoba untuk menonaktifkan soket itu untuk memaksa MySQL untuk menggunakan soket jaringan sebagai gantinya pada loopback. Saya mencoba mengomentari semua socketarahan dalam my.cnfdan debian.cnffile dan me-restart MySQL tetapi tidak ada bedanya.

Bagaimana saya bisa menonaktifkan soket unix MySQL untuk memaksa MySQL melalui jaringan?

info tambahan: Aku sedang menjalankan MySQL 5.1di ubuntu 10.04.

Tindakan atas pertanyaan
Karena banyak orang menyarankan mengaktifkan soket jaringan saya ingin mengklarifikasi pertanyaan saya dengan menunjukkan bahwa alamat bind sudah diaktifkan dengan bind-address = 127.0.0.1dan bahwa koneksi mendengarkan tersedia:

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

Namun saya masih melihat tidak ada koneksi yang mencoba 127.0.0.1:3306datang dari aplikasi web saya (situs web Drupal).

Diperbarui dengan jawabannya

Tampaknya memang masalah tersebut berasal dari mysqlikonektor yang digunakan Drupal ( .ht_config.phpbagi mereka yang tertarik). Sudah diatur mysqli://drupal:***@localhost/drupal:, mengubah localhostuntuk 127.0.0.1memperbaiki masalah (yaitu Drupal sekarang membuat koneksi ke soket jaringan).

Maks
sumber

Jawaban:

52

Gunakan IP-binding untuk 127.0.0.1. Itu harus mengaktifkan port mendengarkan localhost. Di sisi klien jangan gunakan localhost- gunakan 127.0.0.1saja. Banyak klien memiliki alias internal yang membuat mereka terhubung ke soket jika Anda menetapkan localhostsebagai target.

MySQL itu aneh.

Nils
sumber
6
Gunakan saja --protocol.. lihat jawaban Jonathan.
Pacerier
76

Di Linux dan * nixes lainnya, MySQL akan menganggap Anda ingin menggunakan soket jika Anda terhubung ke host "localhost" (yang akan menjadi nama host default).

Anda dapat menimpanya dalam 3 cara: 1) Tentukan nama host yang berbeda seperti 127.0.0.1 ( mysql -h 127.0.0.1) atau nama host asli server Anda 2) Tentukan bahwa Anda ingin menggunakan TCP dan bukan soket ( mysql --protocol tcp)

Anda juga dapat dengan mudah membuat default saya mengedit my.cnf Anda sehingga memiliki ini ([klien] berarti klien apa pun:

[client]
protocol=tcp

Anda dapat melihat deskripsi lengkap tentang bagaimana MySQL memutuskan cara terhubung di sini:

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

Jonathan Amend
sumber
6
Ini harus menjadi jawaban yang diterima.
Pacerier
Apakah menjalankan server MySQL di dalam wadah Docker dengan menulis docker dengan menggunakan nama wadah sebagai nama host memaksa penggunaan protocl jaringan melalui protokol socket?
Stephane
defintiely harus menjadi jawaban yang diterima. cara 3 (protokol = tcp di my.cnf) adalah satu-satunya cara yang berfungsi tanpa parameter baris perintah tambahan sehingga berfungsi tanpa perubahan pada skrip apa pun.
Tuncay Göncüoğlu
16

Bukankah ini benar-benar masalah klien? Jika menggunakan program mysql Anda dapat menggunakan --protocolsakelar. Dari halaman manual

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

Saya baru saja mencoba

mysql --protocol=TCP -u root -p

sementara memantau port 3306 dengan tcpdump -i lo tcp port 3306dan saya bisa melihat lalu lintas sedangkan jika saya hanya menjalankan

mysql  -u root -p

Saya (dengan benar) tidak melihat lalu lintas di port 3306.

SUNTING:

Sekarang setelah Anda memberi tahu kami bahwa Anda menggunakan DRUPAL, solusinya relatif mudah.

Buka sites/<sitename>atau sites/defaultedit settings.phpfile

Anda akan menemukan struktur seperti ini

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

Ubah 'localhost'to '127.0.0.1'dan simpan file.

Iain
sumber
memang bisa karena masalah klien tetapi karena klien adalah aplikasi web (Drupal) dan saya tidak punya kendali atasnya, saya mencari cara untuk memaksanya dari sudut pandang sistem.
Maks.
1
baik dengan mengatakan no controlsaya sedang dramatis. Saya bisa memodifikasi .ht_config.phpfile dan memperbaiki masalah ini.
Maks.
Sedikit dramatis mungkin tetapi ini adalah masalah klien dan mudah diselesaikan. Lihat hasil edit saya.
user9517 mendukung GoFundMonica
Maaf, saya memperbarui pertanyaan saya dengan jawaban setelah saya menambahkan komentar saya. Untuk beberapa alasan kami menggunakan .ht_config.phpalih-alih settings.php. Saya tidak tahu mengapa (tim dev memintanya seperti itu). Sekarang masalahnya adalah bahwa Drupal tampaknya membaca .ht_config.phpfile pada setiap permintaan (karena jika saya mengubahnya, perubahan segera diperhitungkan) yang tidak dapat membantu dengan pertunjukan. Kami akan mencari cara untuk men-cache pengaturan itu pada lapisan aplikasi tapi itu masalah yang berbeda.
Maks.
Catatan: Anda tidak dapat melakukannya --protocol=socketjika Anda memiliki hostentri di [client]bagian .my.cnfitu memberikan wrong or unknown protocolkesalahan. (mysql 5.7.13)
Kris
1

Edit my.cnf dan tambahkan arahan

bind-address = 127.0.0.1

atau IP pilihan Anda untuk membuatnya dapat diakses melalui jaringan. Mulai ulang mysql setelah membuatnya berfungsi.

Chris
sumber
1

klien php mysqli akan menggunakan file unix socket bukan jaringan tcp ketika Anda memasukkan nilai NULL atau string "localhost" ( http://www.php.net/manual/en/mysqli.construct.php )

tampaknya klien sqlyog selalu menggunakan jaringan tcp bahkan ketika Anda mengisi "localhost" di dalamnya

diyism
sumber
0

Saya harus menghapus /etc/my.cnf (setelah mencadangkannya), lalu me-restart server. Lalu saya bisa terhubung dengan soket dan kesalahannya hilang.

robrecord
sumber