MySQL tidak dapat terhubung melalui "localhost", hanya 127.0.0.1

27

ini agak misteri bagi saya. Satu-satunya cara saya dapat terhubung ke MySQL adalah jika saya menyebutnya melalui "127.0.0.1" ... misalnya, skrip koneksi PHP saya TIDAK akan bekerja dengan localhost

Saya menjalankan Mac OS X Lion, apache2 bawaan, MySQL, PHP, phpMyAdmin

mysqladmin:

count                             0
debug-check                       FALSE
debug-info                        TRUE
force                             FALSE
compress                          FALSE
character-sets-dir                (No default value)
default-character-set             auto
host                              (No default value)
no-beep                           FALSE
port                              0
relative                          FALSE
socket                            (No default value)
sleep                             0
ssl                               FALSE
ssl-ca                            (No default value)
ssl-capath                        (No default value)
ssl-cert                          (No default value)
ssl-cipher                        (No default value)
ssl-key                           (No default value)
ssl-verify-server-cert            FALSE
user                              (No default value)
verbose                           FALSE
vertical                          FALSE
connect-timeout                   43200
shutdown-timeout                  3600
plugin-dir                        (No default value)
default-auth                      (No default value)
dcolumbus
sumber
1
Ini mungkin lebih untuk kesalahan Server, tetapi pastikan file host Anda memiliki alias localhost.
Matt
127.0.0.1 localhost ada di file host saya.
dcolumbus
Buka command prompt dan ketik ping localhostdan lihat apa yang dikatakannya.
Steve Robbins
64 byte dari 127.0.0.1: icmp_seq = 0 ttl = 64 waktu = 0.100 ms 64 byte dari 127.0.0.1: icmp_seq = 1 ttl = 64 waktu = 0.102 ms 64 byte dari 127.0.0.1: icmp_seq = 2 ttl = 64 waktu = 0.096 ms
dcolumbus

Jawaban:

26

MySQL akan mencoba untuk terhubung ke soket unix jika Anda mengatakannya untuk terhubung ke "localhost". Jika Anda menyuruhnya terhubung ke 127.0.0.1 Anda memaksanya untuk terhubung ke soket jaringan. Jadi, mungkin Anda memiliki MySQL yang dikonfigurasi untuk hanya mendengarkan soket jaringan dan tidak ke soket sistem file.

Apa yang sebenarnya salah dengan soket unix Anda sulit dikatakan. Tetapi saya menyarankan Anda untuk membaca halaman ini di panduan referensi MySQL. Ini akan membantu Anda.

UPDATE: Berdasarkan pertanyaan yang diperbarui: Parameter "socket" harus seperti ini: "/var/lib/mysql/mysql.sock". Halaman ini dalam Manual Referensi memiliki beberapa informasi lebih lanjut.

Di sini Anda memiliki awal file /etc/my.cnf saya:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

File Anda harus serupa. Maka masalah Anda harus diselesaikan. Jangan lupa untuk me-restart server MySQL sebelum Anda mengujinya.

Raffael Luthiger
sumber
1
Wow: "File soket Unix digunakan jika Anda tidak menentukan nama host atau jika Anda menentukan nama host khusus localhost." Sepertinya ... tidak intuitif. Karena itu semua jawaban lainnya.
Mark Wagner
Itu bagus untuk diketahui +1
Matt
Saya menghargai teorinya ... hanya tidak tahu apa jawabannya.
dcolumbus
@columbus: Seperti yang sudah saya tulis, sulit untuk mengatakannya. Yang bisa saya rekomendasikan kepada Anda adalah membuka konsol dan cukup menulis perintah "mysql". Mungkin Anda mendapatkan informasi lebih lanjut. Hal lain adalah melihat ke dalam file log. Milik saya terletak di direktori / var / log / dan disebut mysql.log. Anda dapat memiliki nama lain atau lokasi lain. Jika Anda dapat memberi kami informasi lebih lanjut, kami mungkin dapat membantu Anda lebih baik.
Raffael Luthiger
2
php.ini memiliki referensi ke "/var/mysql/mysql.sock" (3 tempat tepatnya) yang perlu diubah menjadi "/tmp/mysql.sock" ... Terima kasih atas bantuan Anda!
dcolumbus
8

Anda mungkin memiliki IPv6 yang diaktifkan, localhost yang sangat mungkin memutuskan ke localv ip6, yang tidak didefinisikan dalam konfigurasi msql Anda.

ive juga punya masalah di mana saya harus menambahkan 'localhost' di tempat '127.0.0.1' ke subnet yang diizinkan untuk pengguna itu, tidak mengerti mengapa (saya menggunakan ipv4 dan beberapa waktu yang lalu) tetapi patut dicoba.

Silverfire
sumber
Anda dapat memeriksa ini dengan melihat apakah 'host localhost' di baris perintah mengembalikan :: 1 serta 127.0.0.1. Jika demikian, Anda dapat menghapus pemetaan :: 1 dari / private / etc / hosts atau mengkonfigurasi ulang MySQL untuk mendengarkan pada alamat IPv6 :: 1 dan juga 127.0.0.1
David North
Saya rasa saya ingat pernah membaca di suatu tempat bahwa IPv6 diaktifkan secara default pada Mac OS X ... apakah itu masalahnya?
dcolumbus
ipv6 diaktifkan untuk hampir semua OS modern hari ini, im pada osx10.6 dan diaktifkan secara default.
Silverfire
salah. Localhost memiliki makna khusus untuk klien mysql - lihat serverfault.com/a/295300/67675
poige
5

Bagi saya, builtin php OSX dikonfigurasi untuk menggunakan unix-socket yang berbeda dari mysql homebrew. Dengan demikian ia tidak dapat terhubung melalui localhost yang menggunakan soket itu.

Saya memperbaikinya dengan hack cepat dengan menghubungkan socket-path php yang dikonfigurasi untuk menunjuk ke yang benar-benar digunakan mysql.

sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

Perintah diagnostik berikut ini sangat membantu.

Periksa jalur soket default yang digunakan oleh php dan mysql:

php -i | fgrep 'mysql.default_socket'
mysql -e 'show variables where variable_name = "socket"'

Hubungkan menggunakan soket yang ditentukan:

php -r 'var_dump(mysql_connect("localhost:/tmp/mysql.sock", "user", "pass"));'
mysql --socket=/tmp/mysql.sock

Tentukan jenis socket mysql client yang digunakan untuk menghubungkan:

lsof | egrep '^mysql .*(IPv|unix)'
soliton_zero
sumber
2

Bisakah Anda memeriksa mysql/conf/my.conf(struktur direktori harus hampir sama pada OSx) untuk melihat apakah skip-networkingtidak diomortasikan? Jika demikian, tambahkan #in-front of the line dan restart mysql-server.

Saya sebenarnya memiliki masalah yang sama beberapa waktu lalu (walaupun itu tidak ada di OSx), jadi saya pikir ini mungkin layak dicoba.

karllindmark
sumber
1
Mengapa ini diturunkan? Penjelasan akan sangat membantu.
karllindmark
Saya tidak memilih Anda, tetapi jawaban Anda sebenarnya berlawanan dengan apa yang diminta OP. Tapi saya tidak memilih Anda karena saya berjuang dengan kondisi yang berlawanan - akan terhubung melalui soket, tetapi TIDAK melalui jaringan. Omong-omong, saya TIDAK BISA memperbaiki ini melalui my.conf; Saya harus meletakkannya di baris perintah: "mysqlf --skip_networking = 0 ..."
Jan Steinman
2

PHP masih mencoba menggunakan lokasi soket default. Masalah ini dapat muncul jika Anda telah memindahkan folder MariaDB / MySQL dari / var / lib / mysql ke lokasi lain. Untuk mengatasi masalah ini, Anda harus menentukan lokasi soket baru di file /etc/php.ini .

mysqli.default_socket =/newDBLocation/mysql/mysql.sock

Awas, tergantung pada driver yang Anda gunakan, Anda mungkin harus menentukan pdo_mysql.default_socket = !

Untuk memeriksa direktori Anda saat ini, jalankan perintah berikut di mysql:

select @@datadir;
joelschmid
sumber
1

Apakah localhost didefinisikan dalam /private/etc/hostsfile Anda ?

Justin ᚅᚔᚈᚄᚒᚔ
sumber
127.0.0.1 localhost ada di file host saya.
dcolumbus
4
/private? Belum pernah melihat itu sebelumnya
TheLQ
@TheLQ: Ini masalah Mac. Meskipun ada adalah sebuah symlink dari / etc ke / private / etc, untuk beberapa alasan Apel umumnya menyarankan menggunakan "benar" jalan: support.apple.com/kb/TA27291
Justin ᚅᚔᚈᚄᚒᚔ
1

Saya dapat membuat kembali gejala yang sama pada kotak tes saya, semoga ini membantu.

Di MySQL, pengguna didefinisikan oleh dua bagian (nama dan host). Secara default, MySQL akan memiliki 3 pengguna root:

mysql> SELECT host,user,password FROM mysql.user WHERE user='root';
+-----------------------+------+-------------------------------------------+
| host                  | user | password                                  |
+-----------------------+------+-------------------------------------------+
| localhost             | root |                                           |
| localhost.localdomain | root |                                           |
| 127.0.0.1             | root | *PASSWORD_HASH_GOES_HERE                  |
+-----------------------+------+-------------------------------------------+

Kolom kata sandi akan kosong (tanpa kata sandi) atau menyimpan hash. Jika Anda mengatur kata sandi untuk satu pengguna tertentu, itu tidak secara otomatis memperbarui semua, karena MySQL melihatnya sebagai pengguna yang berbeda.

Sebagai contoh:

mysql> set password for 'root'@'127.0.0.1' = password('Password');

akan memperbarui kata sandi untuk 'root'@'127.0.0.1', tetapi tidak 'root'@'localhost'atau'root'@'localhost.localdomain'

Lihatlah skip_name_resolvevariabelnya:

mysql> show variables like 'skip_name_resolve';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | ON    |
+-------------------+-------+
1 row in set (0.00 sec)

Secara default skip_name_resolveadalah OFF, dan akan berusaha untuk menyelesaikan semua alamat IP ke nama host. Misalnya, jika Anda terhubung dengan 'root'@'127.0.0.1', MySQL akan mengubah menghubungkan Anda dengan 'root'@'localhost'.

Jika ya ON, MySQL akan melihat dan terhubung 'root'@'127.0.0.1'serta 'root'@'localhost'sebagai pengguna yang terpisah. Dan mereka mungkin atau mungkin tidak memiliki kata sandi yang berbeda, tergantung pada bagaimana mereka ditetapkan.


Jadi pertama, saya akan memeriksa untuk melihat perbedaan kata sandi: mysql> SELECT host,user,password FROM mysql.user WHERE user='root';

Jika ada, Anda dapat memperbaikinya, atau Anda dapat melanjutkan penyelidikan.

Maka saya akan memeriksa skip_name_resolve: mysql> show variables like 'skip_name_resolve';

Jika ya ON, saya akan mencari tahu di mana itu sedang diatur (misalnya /etc/my.cnf) dan menghapusnya, kecuali ada kebutuhan untuk itu.

Semoga ini bisa membantu Anda!

pferate
sumber
1

Saya mengalami masalah ini dan saya tidak bisa mengatasinya. Saya mencoba semua yang saya bisa tetapi tidak berhasil.

Saya menemukan bahwa saya memiliki .netrc di / root / yang memiliki info di dalamnya.

Saya menghapusnya dan masalah hilang.

Dapat masuk ke mysql menggunakan mysql -uroot -p tanpa masalah sekarang.

Saya tahu ini adalah posting lama tapi semoga ini membantu seseorang.

Terry
sumber
1

Bagi saya, mengubah izin agar dapat dibaca secara publik di direktori induk dari mysql.sock memperbaiki masalah ini:

chmod 755 /var/lib/mysql
zmonteca
sumber
1

Untuk orang-orang yang menggunakan CageFS dengan CloudLinux:

Saya diciptakan ulang /var/lib/mysqlkarena saya sedang membangun kembali server MySQL dari awal ...

yang melepas jalur dari cagefs. Saya tahu ini tidak terkait, tapi saya menggunakan cPanel dan CloudLinux. Saya tidak dapat memverifikasi mengapa koneksi soket tidak berfungsi, dan akhirnya, saya sadar.

menambahkan /var/lib/mysqlke /etc/cagefs/cagefs.mp (jika sudah ada lanjutkan ke langkah berikutnya) dan berjalan

cagefsctl --remount-all

memperbaiki masalah

Luka
sumber
1
OH TUHAN! Inilah yang diperbaiki untuk saya! Itu sudah dalam /etc/cagefs/cagefs.mptetapi berjalan cagefsctl --remount-allmemperbaikinya. Terima kasih sobat!
Alvaro Flaño Larrondo
0

Anda harus mendefinisikannya di private / etc / hosts saya pikir ... atau hanya menggunakan 127.0.0.1 karena itu adalah hal yang sama, hanya sebuah alias.

Shackrock
sumber
127.0.0.1 localhost ada di file host saya.
dcolumbus