MySQL bağlantısı çalışmıyor: 2002 Böyle bir dosya veya dizin yok


106

WordPress kurmaya çalışıyorum. Apache ve MySQL çalışıyor ve hesaplar ve veritabanı ayarlandı. Basit bir bağlantı kurmaya çalıştım:

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

Ve her zaman şunu anlıyorum:

Hata: 2002 - Böyle bir dosya veya dizin yok

Hangi dosya veya dizinden bahsediyor olabilir?

Yerleşik Apache'yi kullanan bir OS X Snow Leopard kullanıyorum. X86_64 dmg kullanarak MySQL'i kurdum.

GÜNCELLEME: Soketin /tmp/mysql.sock'ta olduğunu buldum, bu yüzden php.ini'de, yanlış yolun tüm oluşumlarını bununla değiştirdim.


2
/etc/init.d/mysql startDebian tabanlı bir dağıtımdaysanız lütfen çıktısını yapıştırın . başarısız olursa /etc/my.cnf, doğru mysql soket dosyası yolu için dosyayı kontrol edin .
sepehr

4
"localhost" yerine "127.0.0.1" kullanarak XAMPP ile OS X'te aynı sorunu çözdü.
Giuseppe Urso

Yanıtlar:


97

Linux kullanıyorsanız: mysql.sock dosyasının yolu yanlış. Bunun nedeni genellikle (LAMPP) XAMPP kullanmanız ve /tmp/mysql.sock'ta olmamasıdır.

Php.ini dosyasını açın ve şu satırı bulun:

mysql.default_socket

Ve yap

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

5
emin değilseniz, sokete giden yeni yol olarak /var/lib/mysql/mysql.sock'u deneyin.
Jay

1
Hmm. Belki Leopar veya Kaplan demek istediler. Her durumda, WordPress ile eğlenin!
Alec Gorge

3
Mysqli ile bağlanıyorsanız mysqli.default_socket = /path/to/mysql.sock ayarlamanız gerekebileceğini unutmayın
39'da razzed

2
Stok MySQL yüklemesi için varsayılan soket konumu /tmp/mysql.sock'tur.
Jonathan Tepesi

4
"Yerel ana bilgisayar adı özel bir anlama sahiptir. Unix etki alanı soketlerinin kullanımına bağlıdır. Yerel ana bilgisayar adını kullanarak bir TCP / IP bağlantısı açmak mümkün değildir, bunun yerine 127.0.0.1 kullanmanız gerekir." - php.net/manual/en/mysqli.quickstart.connections.php . Yani temelde Unix etki alanı soketlerine bağlanarak localhostçalışmasına izin veren bir şey çalışmıyor ve TCP / IP çalışıyor, bu yüzden onu TCP / IP adresine değiştirmek 127.0.0.1işe yarayacaktır.
Edward

154

Benzer bir problemim vardı ve mysql'mi 127.0.0.1yerine ile ele alarak çözebildim localhost.

Bu muhtemelen ana bilgisayar kurulumumda bir sorunum olduğu anlamına geliyor, ancak bu hızlı düzeltme şu anda beni harekete geçiriyor.


2
Bana biraz zaman kazandırdın.
uchamp

2
Hosts dosyamı kontrol ettim ve code127.0.0.1 localhost ile bir satır buldum code. Bu da beni localhost üzerinden bağlanmanın neden işe yaramadığını merak ediyor. Biri beni aydınlatabilseydi mutlu olurdum.
ola

2
Bunun nedeni php.ini'deki mysql.default_socket'in yanlış olmasıdır. Çalıştır "php -i | grep mysql.default_socket"
Jonah

1
Bu benim için çalıştı, homebrew aracılığıyla yüklenen el Capitan w / mysql 5.7 üzerindeyim. Bir WP yüklemesini deniyordum ve "localhost" u "127.0.0.1" olarak değiştirdiğimde bağlanabildi.
dgig

5
"Yerel ana bilgisayar adı özel bir anlama sahiptir. Unix etki alanı soketlerinin kullanımına bağlıdır. Yerel ana bilgisayar adını kullanarak bir TCP / IP bağlantısı açmak mümkün değildir, bunun yerine 127.0.0.1 kullanmanız gerekir." - php.net/manual/en/mysqli.quickstart.connections.php . Yani temelde Unix etki alanı soketlerine bağlanarak localhostçalışmasına izin veren bir şey çalışmıyor ve TCP / IP çalışıyor, bu yüzden onu TCP / IP adresine değiştirmek 127.0.0.1işe yarayacaktır.
Edward

39

Bu, Apache HTTP'nin yerel kurulumunu ve MySQL'in özel kurulumunu içeren Mac OS X içindir .

Cevap @ alec-gorge'un mükemmel yanıtına dayanıyor, ancak yapılandırmamda, çoğunlukla Mac OS X'e özgü olmak üzere yapılandırmak için bazı özel değişiklikleri google'a çevirmem gerektiğinden, eksiksizlik uğruna buraya eklemeyi düşündüm.

Apache HTTP için PHP5 desteğini etkinleştirin

İçinde PHP5 desteğinin etkinleştirildiğinden emin olun /etc/apache2/httpd.conf.

Düzenleme ile dosya sudo vi /etc/apache2/httpd.conf(remove (sorulduğunda parolayı girin) ve yorumsuz ;başından itibaren) çizgi yüklemek için php5_module modülü.

LoadModule php5_module libexec/apache2/libphp5.so

Apache HTTP'yi ile başlatın sudo apachectl start(veya restartzaten başlatılmışsa ve yapılandırma dosyasını yeniden okumak için yeniden başlatılması gerekiyorsa).

Bunun /var/log/apache2/error_log, php5_module'ün etkinleştirildiğini söyleyen bir satır içerdiğinden emin olun - görmelisiniz PHP/5.3.15(veya benzeri).

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

Soket dosyasının adını arama

MySQL çalışırken ve çalışırken (ile ./bin/mysqld_safe), günlük dosyalarını nerede bulabileceğinizi söyleyen, konsola yazdırılmış hata ayıklama satırları olmalıdır. Dosya adındaki ana bilgisayar adını not edin - localhostbenim durumumda - bu, yapılandırmanız için farklı olabilir.

Ardından gelen dosya Logging toönemlidir. MySQL'in çalışmasını kaydettiği yer burasıdır.

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

localhost.errDosyayı açın (yine sizinki farklı adlandırılmış olabilir), yani tail -1 /Users/jacek/apps/mysql/data/localhost.errsoket dosyasının adını bulmak için - bu son satır olmalıdır.

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

Parçaya dikkat edin socket:- bu, kullanmanız gereken soket dosyasıdır php.ini.

MySQL'de oturum açıp şunu çalıştırarak soketin dosya adının konumunu belirlemenin başka bir yolu (bazıları daha kolay olduğunu söylüyor):

show variables like '%socket%';

PHP5'i MySQL desteğiyle yapılandırma - /etc/php.ini

Php.ini'den bahsetmişken ...

Gelen /etcdizinde var /etc/php.ini.default dosyası. /Etc/php.ini dosyasına kopyalayın .

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

Mysql.default_socket'i açın /etc/php.inive arayın .

sudo vi /etc/php.ini

Varsayılan mysql.default_socketDİR /var/mysql/mysql.sock. Daha önce not ettiğiniz değere değiştirmelisiniz - bu /tmp/mysql.sockbenim durumumdaydı.

/etc/php.iniDosyayı, soket dosyasının adını yansıtacak şekilde değiştirin :

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

Nihai doğrulama

Apache HTTP'yi yeniden başlatın.

sudo apachectl restart 

PHP5 ile ilgili herhangi bir hata yoksa günlükleri kontrol edin. Hata yok, işin bittiğini ve MySQL ile PHP5'in iyi çalışması gerektiği anlamına gelir. Tebrikler!


Bu cevap yardımcı olur
Vigneshwaran

Bu cevap saçmalık. Sorulan soruyla hiçbir ilgisi yoktur ve temelde sadece am (acos) amp öğreticisidir, bu - eğer iyiyse - buraya konursa daha da fazla israf olur ve gerçekten bir amfi yığını kurmak için arama yapan insanların olduğu bir yerde değil. macos bakıyor. Sorusu karşısında isteniyor: O geçirilir rağmen bu cevap, php çalışır yerine Ana makine adı yerine soketi üzerinden bağlantı neden hata olur ve neden bok açıklamak doesnt mysql_connectolan fiili asıl soruya sorunu ve jenerik değil yazılım yükleme konusunda yanlış anlama.
ohcibi

@ohcibi " Eksiksizlik adına buraya ekleyeceğimi düşündüm" yazdım . ve yeterli olacağını düşündü (ve verilen olumlu oylar birkaç kişinin hoşuna gitti). Cevabı bulmayı kolaylaştırma fikrini beğendim ama nasıl olduğunu bilmiyorum. Düşüncelerinizi paylaşıp bana tekrar yardım eder misiniz? Teşekkürler!
Jacek Laskowski

@JacekLaskowski genel olarak: bir blog yazısı yazın ve buradaki aynı niyetle kabul edilen / en çok oy alan yanıta giden bir bağlantıya yorum yapın ("bütünlük uğruna ekleyin"). Ancak bu ileti dizisinde, bu bağlantıyı yayınlamak için bir neden bile görmüyorum. OP, macOS kullandığını söyledi, ancak bu sorunun herhangi bir işletim sistemiyle ilgisi yok, ancak mySQL'in yorumlama yolu ile ilgisi yok localhost. Maco'larda xamp kurulumu konusunda yardım arayan hiç kimse, googling yoluyla buraya ulaşamaz. Bu yüzden "bok" terimini kullandım. Bu iş parçacığının macos ile hiçbir ilgisi yoktur, sadece mysql ile (php bile değil).
ohcibi

14

Yapılandırma dosyasında (db bağlantısı) 'localhost'u' 127.0.0.1 'olarak değiştirmek yardımcı oldu!


1
ama neden yardım edilmeli?
Enamul Hassan

"'Localhost'u' 127.0.0.1 'olarak" veya 127.0.0.1'i gerçek MySQL sunucu adresiyle, yani u55151.mysql.someserver.eu ile değiştirme.
user2812532

13

Mysql sunucusunu yeniden başlatmak yardımcı olabilir. Benim durumumda, sunucuyu yeniden başlatmak çok zaman kazandırdı.

service mysql restart

PS- sudo service mysql restartroot olmayan kullanıcılar için kullanın .


2
Basit çözümün gerçekten işe yaraması çok güzel.
2018

10

Öncelikle MySQL'in çalıştığından emin olun. Komut: mysqld start

Hala bağlanamıyorsanız: /etc/my.cnf dosyanız neye benziyor? (veya /etc/msyql/my.cnf)

Diğer 2 gönderi doğrudur, çünkü soketinizi kontrol etmeniz gerekir, çünkü 2002 bir soket hatasıdır.

LAMP kurulumuyla ilgili harika bir öğretici: http://library.linode.com/lamp-guides/centos-5.3/index-print


Yükleyici bir my.cnf dosyası koymadı, ancak var /usr/local/mysql/mysql-test/include/default_my.cnf, bunu my.cnf olarak kopyalamalı /etcmıyım?
mk12

evet, ancak daha sonra onu değiştirmeniz gerektiğini fark edebilirsiniz.
Todd Moses

7

Size çok yardımcı olacağından değil, ancak MySQL'in son sürümlerinde (ve hatta daha az yeni olan ) 2002 hata kodu, "Yerel MySQL sunucusuna soket [soket adı] yoluyla bağlanamıyorum" anlamına gelir, bu size söyleyebilir Biraz daha.


1
Kaynaktan MySQL 5.5.38 kurulu OSX 10.9.x'te bu hatayı alıyordum. Bu ipucu doğruydu: mysqli_connect_errno () ve mysqli_connect_error ()) 2002 dosyası bulunamadı mesajını söylese bile bu bir soket sorunu. Bunu, /etc/php.ini'mi düzenleyerek ve mysql.default_socket AND mysqli.default_socket'i soket değerini düzeltecek şekilde ayarlayarak çözebildim (çünkü uygulamam bağlantılar için mysqli kullanıyordu)
Ronnie

7

Burada Matthias D'nin cevabını genişleterek, bu 2002 hatasını hem MySQL hem de MariaDB'de şu komutları kullanarak tam yollarla çözebildim :

Önce MySQL soketine giden gerçek yolu bulun:

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

Ardından PHP yolunu alın :

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

Bu iki komutun çıktısını kullanarak onları birbirine bağlayın:

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

Bu geri dönerse No such file or directory, PHP mysql.sock'un yolunu oluşturmanız yeterlidir, örneğin, yolunuz /var/mysql/mysql.sockolsaydı şunu çalıştırırdınız:

sudo mkdir -p /var/mysql

Ardından sudo ln komutunu tekrar deneyin .


6

Php.ini dosyanızı kontrol edip mysql.default_socket'in doğru ayarlandığını ve ayrıca mysqld'nizin erişebileceği bir soket dosyasıyla doğru şekilde yapılandırıldığını doğrularım. Tipik varsayılan "/tmp/mysql.sock" şeklindedir.


Tamam, diyor /var/mysql/mysql.sockama bu yol yok.
mk12

6

Ben de bu problemle karşılaştım, sonra 'localhost'u' 127.0.0.1 'olarak değiştirdim, çalışıyor.


6

benim durumumda mysqli_connect ile sorun yaşıyorum. mysqli_connect_error ()
bağlanmak istediğimde
mysqli_connect('localhost', 'myuser','mypassword')
bana şu hatayı döndür "Böyle bir dosya veya dizin yok"

bu benim için çalıştı mysqli_connect('localhost:3306', 'myuser','mypassword')


Bu benim için iyi çalıştı; Armchair Analysis'in Amerikan futbolu istatistik paketini OS X yerel Mysql kurulumuna yüklemek için ihtiyacım olan değişiklik buydu. Teşekkürler!
Michael Scott Cuthbert

duyduğuma sevindim :)
masoud2011

4

2002 hatası, MySQL'in soket dosyası (örn. /tmp/mysql.sock) Aracılığıyla yerel veritabanı sunucusuna bağlanamayacağı anlamına gelir .

Soket dosyanızın nerede olduğunu bulmak için şunu çalıştırın:

mysql_config --socket

ardından uygulamanızın doğru Unix soket dosyasını kullandığını veya bunun yerine TCP / IP portu üzerinden bağlanıp bağlanmadığını iki kez kontrol edin.

Ardından PHP'nizin doğru MySQL soket kurulumuna sahip olup olmadığını iki kez kontrol edin:

php -i | grep mysql.default_socket

ve bu dosyanın var olduğundan emin olun .

Soketi test edin:

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

Unix soketi yanlışsa veya yoksa, sembolik bağlayabilirsiniz, örneğin:

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

veya yapılandırma dosyanızı düzeltin (örn. php.ini).

PDO bağlantısını doğrudan PHP'den test etmek için şunu çalıştırabilirsiniz:

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

Yapılandırma farklı olabileceğinden Apache ve CLI (komut satırı arabirimi) arasındaki yapılandırmayı da kontrol edin.

Sunucu çalışıyor olabilir, ancak sunucunun dinlediğinden farklı bir TCP / IP bağlantı noktası, adlandırılmış kanal veya Unix soket dosyası kullanarak bağlanmaya çalışıyorsunuz. --portDoğru bağlantı noktası numarasını veya uygun adlandırılmış kanalı veya Unix soket dosyasını (örn. --socketSeçenek) belirtmek için bir istemci programını (örn. Seçenek belirtme ) çağırmanız gerektiğini düzeltmek için .

Bkz: MySQL'e Bağlanma Sorunlarını Giderme


Sorunun izlenmesine yardımcı olabilecek diğer araçlar / komutlar:

  • mysql --socket=$(php -r 'echo ini_get("mysql.default_socket");')
  • netstat -ln | grep mysql
  • php -r "phpinfo();" | grep mysql
  • php -i | grep mysql
  • XDebug'ı xdebug.show_exception_trace=1kendixdebug.ini
  • OS X'de sudo dtruss -fn mysqldLinux'ta hata ayıklamayı deneyinstrace
  • Unix soketindeki izinleri kontrol edin: stat $(mysql_config --socket)ve yeterli boş alanınız olup olmadığını ( df -h).
  • MySQL'inizi yeniden başlatın.
  • Kontrol edin net.core.somaxconn.

3

Yerel sunucunuzun (MAMP, XAMPP, WAMP, vb.) Çalıştığından emin olun.


Buna ek olarak, MacOS'ta MAMP kullanıyorsanız (tabii ki!) Mac'inizi uykudan uyandırdıktan hemen sonra sitenize eriştiğinizde de bu hatayı alırsınız. Çözüm, elbette, beklemek ve tekrar denemektir. :-)
texelate

0

Benzer bir problemim vardı.
Temel olarak burada sorun, muhtemelen çalışan iki mysql örneği olmasıdır.
A) /etc/init.d adresinde çalışan biri
B) Lamba / opt / lamp konumuna takılıyor
Çözüm:
Adım 1: - commnad "find / | grep mysqld" kullanarak tüm mysql çalışan örneklerini bulun
Adım 2: - Şurada çalışan hizmetleri kapatın /etc/init.d service mysql stop kullanarak
Adım 3: - / opt / lamp / lamp restart kullanarak Lamp hizmetlerinizi yeniden başlatın

Gitmekte iyi olmalısın :)


0

Bir Mac'te, tüm zor işi yapmadan önce ayarlarınızı kontrol edin System Preferences > MySQL. Çoğu zaman, o zamandan beri ekibin bu sorunla karşılaştığını deneyimledim The MySQL Server Instance is stopped.

Start MySQL ServerDüğmeyi tıklayın ve sihir gerçekleşecek.


0

Sunucumda PHP-FPM veya birden fazla php sürümü kullanıyorum. Benim durumumda mysqli değerini güncelliyorum çünkü mysql varsayılan soket parametresi yok:

mysqli.default_socket

to:

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

@Alec Gorge'a teşekkürler


0

Ben de aynı sorunu yaşadım. Soketim sonunda /tmp/mysql.sock'ta bulundu. Sonra bu yolu php.ini'ye ekledim. Soketi, MySQL Workbench'teki "Sunucu Durumu" sayfasını kontrol ederek buldum. Soketiniz /tmp/mysql.sock içinde değilse, o zaman MySQL Workbench size nerede olduğunu söyleyebilir? (MySQL Workbench kullanmanıza izin verildi ...)



0

Digital Ocean MySql 2002-böyle-dosya veya dizin yok

Dosyanın bu sonunu ekleyin /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1

MySql'i yeniden başlatın

service mysql restart


-1

Bir Linux sunucusunda da aynı sorunu yaşadım. Bana yardımcı olan, Linux sunucusunu yeniden başlatmak için kullanılan ' sudo reboot ' komutu.


-2

mariadb hizmetini etkinleştir ve başlat

sudo systemctl mariadb.service'i etkinleştir

sudo systemctl start mariadb.service

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.