Koneksi MySQL tidak berfungsi: 2002 Tidak ada file atau direktori seperti itu

106

Saya mencoba menyiapkan WordPress. Saya menjalankan Apache dan MySQL, dan akun serta database sudah siap. Saya mencoba membuat koneksi sederhana:

<?php
    $conn = mysql_connect('localhost', 'USER', 'PASSWORD');
    if(!$conn) {
        echo 'Error: ' . mysql_errno() . ' - ' . mysql_error();
    }
?>

Dan saya selalu mendapatkan ini:

Kesalahan: 2002 - Tidak ada file atau direktori seperti itu

File atau direktori apa yang sedang dibicarakan?

Saya menggunakan OS X Snow Leopard, menggunakan Apache bawaan. Saya menginstal MySQL menggunakan x86_64 dmg.

PEMBARUAN: Saya menemukan bahwa soket di /tmp/mysql.sock, jadi di php.ini, saya mengganti semua kemunculan jalur yang salah dengan itu.

mk12
sumber
2
silahkan paste output /etc/init.d/mysql startjika Anda menggunakan distro berbasis debian. jika gagal, periksa /etc/my.cnffile untuk jalur file soket mysql yang benar.
Sepehr
4
memecahkan masalah yang sama di OS X dengan XAMPP menggunakan "127.0.0.1" sebagai pengganti "localhost".
Giuseppe Urso

Jawaban:

97

Jika Anda menggunakan Linux: jalur ke file mysql.sock salah. Ini biasanya karena Anda menggunakan (LAMPP) XAMPP dan tidak ada di /tmp/mysql.sock

Buka file php.ini dan temukan baris ini:

mysql.default_socket

Dan lakukanlah

mysql.default_socket = /path/to/mysql.sock
Alec Gorge
sumber
5
jika Anda tidak yakin, coba /var/lib/mysql/mysql.sock sebagai jalur baru ke soket.
Jay
1
Hmm. Mungkin yang mereka maksud adalah Macan Tutul atau Macan. Bagaimanapun, bersenang-senanglah dengan WordPress!
Alec Gorge
3
Perhatikan bahwa Anda mungkin perlu mengatur mysqli.default_socket = /path/to/mysql.sock jika terhubung dengan mysqli
dihancurkan
2
Lokasi soket default untuk instalasi MySQL stok adalah /tmp/mysql.sock.
Jonathon Hill
4
"Hostname localhost memiliki arti khusus. Ini terikat pada penggunaan soket domain Unix. Tidak mungkin untuk membuka koneksi TCP / IP menggunakan hostname localhost, Anda harus menggunakan 127.0.0.1 sebagai gantinya." - php.net/manual/en/mysqli.quickstart.connections.php . Jadi pada dasarnya ada sesuatu yang tidak berfungsi dengan menghubungkan ke soket domain Unix yang memungkinkan localhostuntuk bekerja dan TCP / IP berfungsi sehingga mengubahnya ke alamat TCP / IP 127.0.0.1akan berfungsi.
Edward
154

Saya memiliki masalah yang sama dan dapat mengatasinya dengan menggunakan mysql saya 127.0.0.1alih - alih localhost.

Ini mungkin berarti saya memiliki sesuatu yang salah dalam pengaturan host saya, tetapi perbaikan cepat ini membuat saya pergi sekarang.

Bryan kennedy
sumber
2
Anda baru saja menghemat waktu saya yang berharga.
uchamp
2
Saya memeriksa file host saya dan menemukan baris dengan code127.0.0.1 localhost code. Yang membuat saya penasaran mengapa menghubungkan melalui localhost tidak berhasil. Jika seseorang bisa mencerahkan saya, saya akan bahagia.
ola
2
Ini karena mysql.default_socket di php.ini salah. Jalankan "php -i | grep mysql.default_socket"
Jonah
1
Ini berhasil untuk saya, saya di el Capitan w / mysql 5.7 diinstal melalui homebrew. Saya mencoba menginstal WP dan ketika saya mengubah "localhost" menjadi "127.0.0.1", ia dapat terhubung.
dgig
5
"Hostname localhost memiliki arti khusus. Ini terikat pada penggunaan soket domain Unix. Tidak mungkin untuk membuka koneksi TCP / IP menggunakan hostname localhost, Anda harus menggunakan 127.0.0.1 sebagai gantinya." - php.net/manual/en/mysqli.quickstart.connections.php . Jadi pada dasarnya ada sesuatu yang tidak berfungsi dengan menghubungkan ke soket domain Unix yang memungkinkan localhostuntuk bekerja dan TCP / IP berfungsi sehingga mengubahnya ke alamat TCP / IP 127.0.0.1akan berfungsi.
Edward
39

Ini untuk Mac OS X dengan penginstalan asli Apache HTTP dan penginstalan kustom MySQL .

Jawabannya didasarkan pada respon yang sangat baik dari @ alec-gorge, tetapi karena saya harus mencari di Google beberapa perubahan spesifik untuk mengonfigurasi konfigurasi saya, kebanyakan khusus untuk Mac OS X, saya pikir saya akan menambahkannya di sini demi kelengkapan.

Aktifkan dukungan PHP5 untuk Apache HTTP

Pastikan dukungan PHP5 diaktifkan di /etc/apache2/httpd.conf.

Edit file dengan sudo vi /etc/apache2/httpd.conf(masukkan kata sandi saat diminta) dan hapus komentar (hapus ;dari awal) baris untuk memuat modul php5_module .

LoadModule php5_module libexec/apache2/libphp5.so

Mulai Apache HTTP dengan sudo apachectl start (atau restartjika sudah dimulai dan perlu dimulai ulang untuk membaca kembali file konfigurasi).

Pastikan itu /var/log/apache2/error_logberisi baris yang memberi tahu Anda bahwa php5_module diaktifkan - Anda akan melihatnyaPHP/5.3.15 (atau serupa).

[notice] Apache/2.2.22 (Unix) DAV/2 PHP/5.3.15 with Suhosin-Patch configured -- resuming normal operations

Mencari nama file Socket

Saat MySQL aktif dan berjalan (dengan ./bin/mysqld_safe ) harus ada baris debug yang dicetak ke konsol yang memberi tahu Anda di mana Anda dapat menemukan file log. Catat nama host dalam nama file - localhostdalam kasus saya - yang mungkin berbeda untuk konfigurasi Anda.

File yang muncul setelah Logging toitu penting. Di situlah MySQL mencatat pekerjaannya.

130309 12:17:59 mysqld_safe Logging to '/Users/jacek/apps/mysql/data/localhost.err'.
130309 12:17:59 mysqld_safe Starting mysqld daemon with databases from /Users/jacek/apps/mysql/data

Buka localhost.errfile (sekali lagi, nama Anda mungkin berbeda), yaitu tail -1 /Users/jacek/apps/mysql/data/localhost.erruntuk mengetahui nama file soket - ini harus menjadi baris terakhir.

$ tail -1 /Users/jacek/apps/mysql/data/localhost.err
Version: '5.5.27'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server (GPL)

Perhatikan socket:bagian - itu file soket yang harus Anda gunakanphp.ini .

Ada cara lain (beberapa mengatakan cara yang lebih mudah) untuk menentukan lokasi nama file soket dengan masuk ke MySQL dan menjalankan:

show variables like '%socket%';

Konfigurasi PHP5 dengan dukungan MySQL - /etc/php.ini

Berbicara tentang php.ini ...

Di /etcdirektori ada file /etc/php.ini.default . Salin ke /etc/php.ini .

sudo cp /etc/php.ini.default /etc/php.ini

Buka /etc/php.inidan cari mysql.default_socket .

sudo vi /etc/php.ini

Defaultnya mysql.default_socketadalah /var/mysql/mysql.sock. Anda harus mengubahnya ke nilai yang telah Anda catat sebelumnya - itu /tmp/mysql.sockdalam kasus saya.

Ganti /etc/php.inifile untuk mencerminkan nama file soket:

mysql.default_socket = /tmp/mysql.sock
mysqli.default_socket = /tmp/mysql.sock

Verifikasi akhir

Mulai ulang HTTP Apache.

sudo apachectl restart 

Periksa log jika tidak ada kesalahan yang terkait dengan PHP5. Tidak ada kesalahan berarti Anda sudah selesai dan PHP5 dengan MySQL seharusnya berfungsi dengan baik. Selamat!

Jacek Laskowski
sumber
Jawaban ini membantu
Vigneshwaran
Jawaban ini omong kosong. Ini tidak ada hubungannya dengan pertanyaan yang ditanyakan dan pada dasarnya hanya tutorial amp (acos), yang - jika bagus - bahkan lebih sia-sia jika diletakkan di sini dan bukan di tempat di mana orang-orang yang sebenarnya mencari untuk menyiapkan tumpukan amp maco sedang melihat. Mengenai pertanyaan yang ditanyakan: jawaban ini tidak menjelaskan apa-apa tentang mengapa kesalahan terjadi dan mengapa php mencoba untuk terhubung melalui soket alih-alih nama host sebagai gantinya, meskipun itu diteruskan ke mysql_connect, yang merupakan masalah sebenarnya dari pertanyaan asli dan bukan umum kesalahpahaman tentang menginstal perangkat lunak.
ohcibi
@ohcibi Saya menulis "Saya pikir saya akan menambahkannya di sini demi kelengkapan." dan berpikir itu sudah cukup (dan diberi suara positif beberapa orang menyukainya). Saya suka ide Anda untuk membuat jawaban lebih mudah ditemukan, tetapi tidak tahu caranya. Bisakah Anda berbagi pemikiran Anda dan membantu saya ... lagi? Terima kasih!
Jacek Laskowski
@JacekLaskowski secara umum: tulis posting blog dan komentari tautannya ke tanggapan yang diterima / paling disukai dengan maksud yang sama dengan yang Anda miliki di sini ("tambahkan demi kelengkapan"). Tetapi di utas ini saya bahkan tidak melihat alasan untuk memposting tautan itu. OP mengatakan bahwa dia menggunakan macOS tetapi masalah ini sama sekali tidak ada hubungannya dengan sistem operasi apa pun kecuali dengan cara menafsirkan mySQL localhost. Tidak ada yang mencari bantuan untuk menyiapkan xamp di macOS akan sampai ke sini dengan googling. Karenanya saya menggunakan istilah 'omong kosong'. Utas ini tidak ada hubungannya sama sekali dengan macOS tetapi hanya dengan mysql (bahkan tidak php).
ohcibi
14

Mengganti 'localhost' menjadi '127.0.0.1' di file konfigurasi (koneksi db) membantu!

Oleg
sumber
1
tapi kenapa harus dibantu?
Enamul Hassan
"Mengganti 'localhost' ke '127.0.0.1'" atau 127.0.0.1 ke alamat server MySQL yang sebenarnya, yaitu u55151.mysql.someserver.eu.
pengguna2812532
13

Memulai ulang server mysql mungkin membantu. Dalam kasus saya, memulai ulang server menghemat banyak waktu.

service mysql restart

PS- digunakan sudo service mysql restartuntuk pengguna non-root.

Avani Khabiya
sumber
2
Ini sangat bagus ketika solusi sederhana benar-benar berfungsi.
abalter
10

Pertama, pastikan MySQL sedang berjalan. Perintah: mulai mysqld

Jika Anda masih tidak dapat terhubung maka: Seperti apa tampilan /etc/my.cnf Anda? (atau /etc/msyql/my.cnf)

2 posting lainnya sudah benar sehingga Anda perlu memeriksa soket Anda karena 2002 adalah kesalahan soket.

Tutorial bagus tentang menyiapkan LAMP adalah: http://library.linode.com/lamp-guides/centos-5.3/index-print

Todd Moses
sumber
Pemasang tidak menaruh file my.cnf, namun ada /usr/local/mysql/mysql-test/include/default_my.cnf, haruskah saya menyalinnya sebagai my.cnf ke /etc?
mk12
ya, tetapi Anda mungkin perlu memodifikasinya nanti.
Todd Moses
7

Bukan berarti itu banyak membantu Anda, tetapi dalam versi terbaru (dan bahkan yang lebih baru ) dari MySQL, kode kesalahan 2002 berarti "Tidak dapat terhubung ke server MySQL lokal melalui soket [nama-soket]", jadi itu mungkin memberi tahu Anda sedikit lagi.

Arthur Reutenauer
sumber
1
Di OSX 10.9.x dengan MySQL 5.5.38 diinstal dari sumber, saya mendapatkan kesalahan ini. Tip ini benar: ini masalah soket meskipun mysqli_connect_errno () dan mysqli_connect_error ()) mengatakan file 2002 tidak ditemukan pesan. Saya dapat menyelesaikan ini dengan mengedit /etc/php.ini saya dan mengatur mysql.default_socket AND mysqli.default_socket ke mengoreksi nilai socket (karena aplikasi saya menggunakan mysqli untuk koneksi)
Ronnie
7

Memperluas jawaban Matthias D di sini saya bisa mengatasi kesalahan 2002 ini pada MySQL dan MariaDB dengan jalur yang tepat menggunakan perintah ini:

Pertama, dapatkan jalur sebenarnya ke soket MySQL:

netstat -ln | grep -o -m 1 '/.*mysql.sock'

Kemudian dapatkan jalur PHP :

php -r 'echo ini_get("mysql.default_socket") . "\n";'

Menggunakan output dari dua perintah ini , hubungkan mereka:

sudo ln -s /actualpath/mysql.sock /phppath/mysql.sock

Jika itu mengembalikan No such file or directoryAnda hanya perlu membuat jalur ke PHP mysql.sock, misalnya jika jalur /var/mysql/mysql.sockAnda adalah Anda akan menjalankan:

sudo mkdir -p /var/mysql

Kemudian coba lagi perintah sudo ln .

mattbell87
sumber
6

Saya akan memeriksa file php.ini Anda dan memverifikasi mysql.default_socket diatur dengan benar dan juga memverifikasi bahwa mysqld Anda dikonfigurasi dengan benar dengan file socket yang dapat diaksesnya. Default tipikal adalah "/tmp/mysql.sock".

Myles
sumber
Ok, Ia mengatakan /var/mysql/mysql.sock, tapi jalan itu tidak ada.
mk12
6

Saya mengalami masalah ini juga, lalu saya memodifikasi 'localhost' menjadi '127.0.0.1', berhasil.

JackSun
sumber
6

dalam kasus saya, saya punya masalah dengan mysqli_connect.
ketika saya ingin terhubung
mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error () kembalikan kesalahan ini "Tidak ada file atau direktori seperti itu"

ini berhasil untuk saya mysqli_connect('localhost:3306', 'myuser','mypassword')

masoud2011
sumber
Ini bekerja dengan baik untuk saya; itu adalah perubahan yang saya perlukan untuk memuat paket statistik sepak bola Amerika dari Armchair Analysis ke dalam instalasi OS X lokal Mysql. Terima kasih!
Michael Scott Cuthbert
senang mendengarnya :)
masoud2011
4

Kesalahan 2002 berarti MySQL tidak dapat terhubung ke server database lokal melalui file soket (misalnya /tmp/mysql.sock).

Untuk mengetahui di mana file socket Anda, jalankan:

mysql_config --socket

lalu periksa kembali apakah aplikasi Anda menggunakan file soket Unix yang benar atau sambungkan melalui port TCP / IP.

Kemudian periksa kembali apakah PHP Anda memiliki pengaturan soket MySQL yang benar:

php -i | grep mysql.default_socket

dan pastikan file itu ada .

Uji soket:

mysql --socket=/var/mysql/mysql.sock

Jika soket Unix salah atau tidak ada, Anda dapat melakukan symlink, misalnya:

ln -vs /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock

atau perbaiki file konfigurasi Anda (misalnya php.ini).

Untuk menguji koneksi PDO langsung dari PHP, Anda dapat menjalankan:

php -r "new PDO('mysql:host=localhost;port=3306;charset=utf8;dbname=dbname', 'root', 'root');"

Periksa juga konfigurasi antara Apache dan CLI (antarmuka baris perintah), karena konfigurasinya bisa berbeda.

Mungkin server sedang berjalan, tetapi Anda mencoba menyambung menggunakan port TCP / IP, pipa bernama, atau file soket Unix yang berbeda dari yang digunakan server untuk mendengarkan. Untuk mengoreksi bahwa Anda perlu menjalankan program klien (mis. Menentukan --portopsi) untuk menunjukkan nomor port yang tepat, atau pipa bernama yang tepat atau file soket Unix (mis. --socketOpsi).

Lihat: Mengatasi Masalah Menghubungkan ke MySQL


Utils / perintah lain yang dapat membantu melacak masalah:

  • mysql --socket=$(php -r 'echo ini_get("mysql.default_socket");')
  • netstat -ln | grep mysql
  • php -r "phpinfo();" | grep mysql
  • php -i | grep mysql
  • Gunakan XDebug dengan xdebug.show_exception_trace=1dixdebug.ini
  • Di OS X coba sudo dtruss -fn mysqld, di Linux debug denganstrace
  • Periksa izin pada soket Unix: stat $(mysql_config --socket)dan jika Anda memiliki cukup ruang kosong ( df -h).
  • Mulai ulang MySQL Anda.
  • Periksa net.core.somaxconn.
kenorb
sumber
3

Pastikan server lokal Anda (MAMP, XAMPP, WAMP, dll ..) sedang berjalan.

Husain Al Faraj
sumber
Selain itu, jika Anda menggunakan MAMP di MacOS (jelas!) Anda juga mendapatkan kesalahan ini jika Anda mengakses situs Anda segera setelah membangunkan Mac dari mode tidur. Solusinya, tentu saja, adalah menunggu dan mencoba lagi. :-)
texelate
0

Saya memiliki masalah serupa.
Pada dasarnya di sini masalahnya mungkin ada dua contoh mysql berjalan.
A) Satu berjalan di /etc/init.d
B) Lampu dipasang di / opt / lamp
Solusi:
Langkah 1: - Temukan semua contoh berjalan mysql menggunakan commnad "find / | grep mysqld"
Langkah 2: - Matikan layanan yang berjalan di /etc/init.d menggunakan layanan mysql stop
Langkah 3: - Restart layanan Lamp Anda menggunakan / opt / lamp / lamp restart

Anda sebaiknya pergi :)

Jignesh Rawal
sumber
0

Di Mac, sebelum melakukan semua pekerjaan berat, cukup periksa pengaturan Anda di System Preferences > MySQL. Lebih sering daripada tidak, saya mengalami tim yang mengalami masalah ini sejak saat ituThe MySQL Server Instance is stopped .

Klik Start MySQL Servertombolnya, dan keajaiban akan terjadi.

Steven Ventimiglia
sumber
0

Saya menggunakan PHP-FPM atau beberapa versi php di server saya. Dalam kasus saya, saya memperbarui nilai mysqli karena tidak ada parameter soket default mysql:

mysqli.default_socket

kepada:

mysql.default_socket = /path/to/mysql.sock

terima kasih kepada @Alec Gorge

navotera.dll
sumber
0

Saya memiliki masalah yang sama. Soket saya akhirnya ditemukan di /tmp/mysql.sock. Lalu saya menambahkan path itu ke php.ini. Saya menemukan soket di sana dari memeriksa halaman "Status Server" di MySQL Workbench. Jika soket Anda tidak ada di /tmp/mysql.sock, maka mungkin MySQL Workbench dapat memberi tahu Anda di mana tempatnya? (Memang Anda menggunakan MySQL Workbench ...)

Fom
sumber
0

Saya telah menginstal MySQL menggunakan installer. Faktanya, tidak ada direktori data di samping direktori 'bin'.

Jadi, saya secara manual membuat direktori 'data' di bawah "C: \ Program Files \ MySQL \ MySQL Server 8.0". Dan itu berhasil (mengubah kata sandi root mengikuti langkah-langkah yang disarankan di https://dev.mysql.com/doc/mysql-windows-excerpt/5.7/en/resetting-permissions-windows.html .

Park JongBum
sumber
0

Digital Ocean MySql 2002-tidak ada-file-atau-direktori

Tambahkan akhir file ini /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1

Mulai ulang MySql

service mysql restart

ajmirani
sumber
-1

Saya juga mengalami masalah yang sama di server Linux. Yang membantu saya adalah perintah ' sudo reboot ', yang digunakan untuk mereboot server Linux.

SumitK
sumber
-2

aktifkan dan mulai layanan mariadb

sudo systemctl mengaktifkan mariadb.service

sudo systemctl mulai mariadb.service

Anil K Shrestha
sumber