Połączenie MySQL nie działa: 2002 Brak takiego pliku lub katalogu


106

Próbuję skonfigurować WordPress. Mam uruchomione Apache i MySQL, a konta i baza danych są skonfigurowane. Próbowałem stworzyć proste połączenie:

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

I zawsze to rozumiem:

Błąd: 2002 - Brak takiego pliku lub katalogu

O jakim pliku lub katalogu może on mówić?

Korzystam z systemu OS X Snow Leopard, używając wbudowanego Apache. Zainstalowałem MySQL przy użyciu dmg x86_64.

AKTUALIZACJA: Odkryłem, że gniazdo znajduje się w /tmp/mysql.sock, więc w php.ini zastąpiłem nim wszystkie wystąpienia złej ścieżki.


2
proszę wklej wynik polecenia, /etc/init.d/mysql startjeśli korzystasz z podstawowej dystrybucji Debiana. jeśli się nie powiedzie, sprawdź, czy w /etc/my.cnfpliku jest poprawna ścieżka do gniazda mysql.
wrzesień

4
rozwiązano ten sam problem na OS X z XAMPP używając „127.0.0.1” zamiast „localhost”.
Giuseppe Urso

Odpowiedzi:


97

Jeśli używasz Linuksa: ścieżka do pliku mysql.sock jest nieprawidłowa. Dzieje się tak zwykle dlatego, że używasz (LAMPP) XAMPP i nie ma go w /tmp/mysql.sock

Otwórz plik php.ini i znajdź tę linię:

mysql.default_socket

I zrób to

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

5
jeśli nie jesteś pewien, wypróbuj /var/lib/mysql/mysql.sock jako nową ścieżkę do gniazda.
Jay

1
Hmm. Może mieli na myśli Leoparda lub Tygrysa. W każdym razie baw się dobrze z WordPress!
Alec Gorge

3
Zauważ, że może być konieczne ustawienie mysqli.default_socket = /path/to/mysql.sock, jeśli
łączysz się

2
Domyślna lokalizacja gniazda dla standardowej instalacji MySQL to /tmp/mysql.sock.
Jonathon Hill

4
„Nazwa hosta localhost ma specjalne znaczenie. Jest związana z używaniem gniazd domeny Unix. Nie jest możliwe otwarcie połączenia TCP / IP przy użyciu nazwy hosta localhost. Zamiast tego należy użyć 127.0.0.1”. - php.net/manual/en/mysqli.quickstart.connections.php . Więc w zasadzie coś nie działa z łączeniem się z gniazdami domeny Unix, które pozwalają localhostna pracę, a TCP / IP działa, więc zmiana go na adres TCP / IP 127.0.0.1będzie działać.
Edward

154

Miałem podobny problem i udało mi się go rozwiązać, adresując mój mysql za pomocą 127.0.0.1zamiast localhost.

Prawdopodobnie oznacza to, że coś jest nie tak w konfiguracji mojego hosta, ale ta szybka poprawka sprawia, że ​​teraz zaczynam.


2
zaoszczędziłeś mi trochę cennego czasu.
uchamp

2
Sprawdziłem plik hostów i znalazłem wiersz z codeadresem 127.0.0.1 localhost code. Ciekawe, dlaczego połączenie przez localhost nie działa. Gdyby ktoś mógł mnie oświecić, byłbym szczęśliwy.
ola

2
Dzieje się tak, ponieważ mysql.default_socket w php.ini jest nieprawidłowy. Uruchom „php -i | grep mysql.default_socket”
Jonasz

1
To zadziałało dla mnie, jestem na el Capitan w / mysql 5.7 zainstalowanym przez homebrew. Próbowałem zainstalować WP i kiedy zmieniłem „localhost” na „127.0.0.1”, udało mi się połączyć.
dgig

5
„Nazwa hosta localhost ma specjalne znaczenie. Jest związana z używaniem gniazd domeny Unix. Nie jest możliwe otwarcie połączenia TCP / IP przy użyciu nazwy hosta localhost. Zamiast tego należy użyć 127.0.0.1”. - php.net/manual/en/mysqli.quickstart.connections.php . Więc w zasadzie coś nie działa z łączeniem się z gniazdami domeny Unix, które pozwalają localhostna pracę, a TCP / IP działa, więc zmiana go na adres TCP / IP 127.0.0.1będzie działać.
Edward

39

Dotyczy to systemu Mac OS X z natywną instalacją Apache HTTP i niestandardową instalacją MySQL .

Odpowiedź opiera się na doskonałej odpowiedzi @ alec-gorge, ale ponieważ musiałem wygooglować pewne konkretne zmiany, aby skonfigurować je w mojej konfiguracji, głównie specyficznej dla Mac OS X, pomyślałem, że dodam go tutaj ze względu na kompletność.

Włącz obsługę PHP5 dla Apache HTTP

Upewnij się, że obsługa PHP5 jest włączona w /etc/apache2/httpd.conf.

Edytuj plik za pomocą sudo vi /etc/apache2/httpd.conf(wprowadź hasło, gdy zostaniesz o to poproszony) i usuń komentarz (usuń ;od początku) wiersz, aby załadować moduł php5_module .

LoadModule php5_module libexec/apache2/libphp5.so

Uruchom Apache HTTP z sudo apachectl start(lub restartjeśli jest już uruchomiony i wymaga ponownego uruchomienia, aby ponownie odczytać plik konfiguracyjny).

Upewnij się, że /var/log/apache2/error_logzawiera wiersz informujący, że moduł php5_module jest włączony - powinieneś zobaczyć PHP/5.3.15(lub podobnie).

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

Wyszukiwanie nazwy pliku gniazda

Gdy MySQL jest uruchomiony (z ./bin/mysqld_safe), na konsoli powinny być wydrukowane wiersze debugowania, które informują, gdzie można znaleźć pliki dziennika. Zanotuj nazwę hosta w nazwie pliku - localhostw moim przypadku - która może być inna dla twojej konfiguracji.

Plik, który nastąpi później, Logging tojest ważny. Tam MySQL rejestruje swoją pracę.

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

Otwórz localhost.errplik (ponownie, twój może mieć inną nazwę), tj. tail -1 /Users/jacek/apps/mysql/data/localhost.errAby znaleźć nazwę pliku gniazda - powinna to być ostatnia linia.

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

Zwróć uwagę na socket:część - jest to plik gniazda, którego powinieneś użyć w php.ini.

Istnieje inny sposób (niektórzy twierdzą, że jest to łatwiejszy sposób), aby określić lokalizację nazwy pliku gniazda, logując się do MySQL i uruchamiając:

show variables like '%socket%';

Konfiguracja PHP5 z obsługą MySQL - /etc/php.ini

A propos php.ini ...

W /etckatalogu znajduje się plik /etc/php.ini.default . Skopiuj go do /etc/php.ini .

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

Otwórz /etc/php.inii poszukaj mysql.default_socket .

sudo vi /etc/php.ini

Wartość domyślna mysql.default_socketto /var/mysql/mysql.sock. Powinieneś to zmienić na wartość, którą zanotowałeś wcześniej - tak było /tmp/mysql.sockw moim przypadku.

Zastąp /etc/php.iniplik, aby odzwierciedlić nazwę pliku gniazda:

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

Ostateczna weryfikacja

Zrestartuj Apache HTTP.

sudo apachectl restart 

Sprawdź dzienniki, jeśli nie ma błędów związanych z PHP5. Brak błędów oznacza, że ​​wszystko jest gotowe, a PHP5 z MySQL powinno działać dobrze. Gratulacje!


Ta odpowiedź pomaga
Vigneshwaran

Ta odpowiedź to bzdura. Nie ma to nic wspólnego z zadawanym pytaniem i jest w zasadzie tylko samouczkiem dotyczącym wzmacniacza (acos), który - jeśli jest dobry - jest jeszcze bardziej zmarnowany, jeśli zostanie umieszczony tutaj, a nie w miejscu, w którym ludzie, którzy faktycznie szukają ustawienia stosu wzmacniaczy patrzą na macos. Jeśli chodzi o zadane pytanie: ta odpowiedź nie wyjaśnia, dlaczego wystąpił błąd i dlaczego php próbuje połączyć się przez gniazdo zamiast nazwy hosta, chociaż jest to przekazywane mysql_connect, co jest rzeczywistym problemem pierwotnego pytania, a nie ogólnym błędne przekonanie o instalacji oprogramowania.
ohcibi

@ohcibi Napisałem: „Pomyślałem, że dodam to tutaj ze względu na kompletność”. i pomyślałem, że to wystarczy (i biorąc pod uwagę głosy za kilka osób to polubiło). Podoba mi się twój pomysł, aby ułatwić znalezienie odpowiedzi, ale nie wiem jak. Czy mógłbyś podzielić się swoimi przemyśleniami i pomóc mi ... znowu? Dzięki!
Jacek Laskowski

@JacekLaskowski w ogólności: napisz post na blogu i skomentuj link do niego do zaakceptowanej / najczęściej ocenianej odpowiedzi, z takim samym zamiarem, jaki miałeś tutaj ("dodaj go ze względu na kompletność"). Ale w tym wątku nie widzę nawet powodu, aby publikować ten link. OP powiedział, że używa macOS, ale ten problem nie ma nic wspólnego z żadnym systemem operacyjnym, ale ze sposobem interpretacji MySQL localhost. Nikt, kto nie szuka pomocy w konfiguracji Xampa na macos, nie dostanie się tutaj przez Google. Dlatego użyłem terminu „bzdury”. Ten wątek nie ma w ogóle nic wspólnego z macos, ale tylko z mysql (nawet z php).
ohcibi

14

Zmiana „localhost” na „127.0.0.1” w pliku konfiguracyjnym (połączenie z bazą danych) pomogła!


1
ale po co mu pomagać?
Enamul Hassan

„Zastępowanie„ localhost ”na„ 127.0.0.1 ”lub 127.0.0.1 na rzeczywisty adres serwera MySQL, tj. U55151.mysql.someserver.eu.
user2812532

13

Może pomóc ponowne uruchomienie serwera mysql. W moim przypadku ponowne uruchomienie serwera zaoszczędziło sporo czasu.

service mysql restart

PS - używany sudo service mysql restartdla użytkownika innego niż root.


2
To wspaniałe, gdy proste rozwiązanie faktycznie działa.
abalter

10

Najpierw upewnij się, że MySQL działa. Polecenie: mysqld start

Jeśli nadal nie możesz się połączyć, to: Jak wygląda twój /etc/my.cnf? (lub /etc/msyql/my.cnf)

Pozostałe 2 posty są poprawne, ponieważ musisz sprawdzić gniazdo, ponieważ 2002 to błąd gniazda.

Świetny poradnik dotyczący konfigurowania LAMP to: http://library.linode.com/lamp-guides/centos-5.3/index-print


Instalator nie umieścił pliku my.cnf, jednak istnieje /usr/local/mysql/mysql-test/include/default_my.cnf, czy powinienem go skopiować jako my.cnf do /etc?
mk12

tak, ale może się okazać, że będziesz musiał to zmodyfikować później.
Todd Moses

7

Nie żeby to ci dużo pomagało, ale w najnowszych (i jeszcze mniejszych ) wersjach MySQL kod błędu 2002 oznacza „Nie można połączyć się z lokalnym serwerem MySQL przez gniazdo [nazwa-gniazda]”, więc może ci to powiedzieć trochę więcej.


1
Na OSX 10.9.x z MySQL 5.5.38 zainstalowanym ze źródła, otrzymywałem ten błąd. Ta wskazówka była poprawna: był to problem z gniazdem, mimo że mysqli_connect_errno () i mysqli_connect_error ()) wyświetlały komunikat o nieznalezieniu pliku 2002. Udało mi się rozwiązać ten problem, edytując moje /etc/php.ini i ustawiając mysql.default_socket AND mysqli.default_socket na poprawną wartość gniazda (ponieważ moja aplikacja używała mysqli do połączeń)
Ronnie

7

Rozwijając tutaj odpowiedź Matthiasa D, udało mi się rozwiązać ten błąd 2002 w MySQL i MariaDB z dokładnymi ścieżkami za pomocą tych poleceń:

Najpierw uzyskaj rzeczywistą ścieżkę do gniazda MySQL:

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

Następnie pobierz ścieżkę PHP :

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

Korzystając z danych wyjściowych tych dwóch poleceń , połącz je:

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

Jeśli to zwróci No such file or directory, po prostu musisz utworzyć ścieżkę do PHP mysql.sock, na przykład jeśli twoja ścieżka /var/mysql/mysql.sockbyłaby uruchomiona:

sudo mkdir -p /var/mysql

Następnie spróbuj ponownie wykonać polecenie sudo ln .


6

Sprawdzę twój plik php.ini i sprawdzę, czy mysql.default_socket jest ustawiony poprawnie, a także sprawdzę, czy twój mysqld jest poprawnie skonfigurowany z plikiem gniazda, do którego ma dostęp. Typowa wartość domyślna to „/tmp/mysql.sock”.


Ok, mówi /var/mysql/mysql.sock, ale ta ścieżka nie istnieje.
mk12

6

Napotkałem również ten problem, a następnie zmodyfikowałem „localhost” na „127.0.0.1”, to działa.


6

w moim przypadku mam problem z mysqli_connect.
kiedy chcę się połączyć
mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error () zwraca mi ten błąd „Brak takiego pliku lub katalogu”

to działało dla mnie mysqli_connect('localhost:3306', 'myuser','mypassword')


To działało dobrze dla mnie; była to zmiana, której potrzebowałem, aby załadować pakiet statystyk futbolu amerykańskiego firmy Armchair Analysis do lokalnej instalacji MySQL w systemie OS X. Dzięki!
Michael Scott Cuthbert,

miło to słyszeć :)
masoud2011

4

Błąd 2002 oznacza, że ​​MySQL nie może połączyć się z lokalnym serwerem bazy danych przez plik gniazda (np /tmp/mysql.sock.).

Aby dowiedzieć się, gdzie jest twój plik gniazda, uruchom:

mysql_config --socket

następnie sprawdź dokładnie, czy twoja aplikacja używa właściwego pliku gniazda Unix lub zamiast tego łączy się przez port TCP / IP.

Następnie sprawdź dokładnie, czy Twój PHP ma odpowiednią konfigurację gniazda MySQL:

php -i | grep mysql.default_socket

i upewnij się, że plik istnieje .

Przetestuj gniazdo:

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

Jeśli gniazdo Unix jest nieprawidłowe lub nie istnieje, możesz je dowiązać symbolicznie, na przykład:

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

lub popraw plik konfiguracyjny (np php.ini.).

Aby przetestować połączenie PDO bezpośrednio z PHP, możesz uruchomić:

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

Sprawdź również konfigurację między Apache i CLI (interfejs wiersza poleceń), ponieważ konfiguracja może być inna.

Możliwe, że serwer działa, ale próbujesz się połączyć przy użyciu portu TCP / IP, nazwanego potoku lub pliku gniazda Unix innego niż ten, na którym nasłuchuje serwer. Aby to naprawić, musisz wywołać program klienta (np. Określając --portopcję), aby wskazać właściwy numer portu lub odpowiedni nazwany potok lub plik gniazda Unix (np. --socketOpcja).

Zobacz: Rozwiązywanie problemów z połączeniem z MySQL


Inne narzędzia / polecenia, które mogą pomóc w śledzeniu problemu:

  • mysql --socket=$(php -r 'echo ini_get("mysql.default_socket");')
  • netstat -ln | grep mysql
  • php -r "phpinfo();" | grep mysql
  • php -i | grep mysql
  • Użyj XDebug xdebug.show_exception_trace=1w swoimxdebug.ini
  • W systemie OS X spróbuj sudo dtruss -fn mysqld, w systemie Linux debuguj zstrace
  • Sprawdź uprawnienia do gniazda Unix: stat $(mysql_config --socket)i jeśli masz wystarczająco dużo wolnego miejsca (df -h ).
  • Uruchom ponownie MySQL.
  • Sprawdź net.core.somaxconn.

3

Upewnij się, że Twój lokalny serwer (MAMP, XAMPP, WAMP itp.) Jest uruchomiony.


Oprócz tego, jeśli używasz MAMP na MacOS (oczywiście!), Ten błąd pojawia się również, jeśli uzyskasz dostęp do swojej witryny natychmiast po wybudzeniu Maca ze snu. Rozwiązaniem jest oczywiście po prostu poczekaj i spróbuj ponownie. :-)
texelate

0

Miałem podobny problem.
Zasadniczo problem polega na tym, że prawdopodobnie są uruchomione dwa wystąpienia mysql.
A) Jedna działająca w /etc/init.d
B) Lampa jest instalowana w / opt / lamp
Rozwiązanie:
Krok 1: - Znajdź wszystkie uruchomione instancje mysql za pomocą polecenia commnad "find / | grep mysqld"
Krok 2: - Zamknij usługi działające w /etc/init.d using service mysql stop
Krok 3: - Uruchom ponownie usługi lampy za pomocą / opt / lamp / lamp restart

Powinieneś być gotowy do drogi :)


0

Na komputerze Mac, zanim wykonasz całą ciężką pracę, po prostu sprawdź ustawienia System Preferences > MySQL. Częściej niż nie, od tamtej pory zespół napotyka ten problemThe MySQL Server Instance is stopped .

Kliknij Start MySQL Serverprzycisk, a magia się wydarzy.


0

Używam PHP-FPM lub wielu wersji php na moim serwerze. W moim przypadku aktualizuję wartość mysqli, ponieważ nie ma domyślnego parametru gniazda mysql:

mysqli.default_socket

do :

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

dzięki @Alec Gorge


0

Miałem ten sam problem. Moje gniazdo zostało ostatecznie znalezione w /tmp/mysql.sock. Następnie dodałem tę ścieżkę do php.ini. Znalazłem tam gniazdo sprawdzając stronę „Server Status” w MySQL Workbench. Jeśli twojego gniazda nie ma w /tmp/mysql.sock, może MySQL Workbench może ci powiedzieć, gdzie to jest? (Przyznane, że używasz MySQL Workbench ...)



0

Digital Ocean MySql 2002-no-such-file-or-directory

Dodaj ten koniec pliku /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1

Uruchom ponownie MySql

service mysql restart


-1

Miałem też ten sam problem na serwerze Linux. Pomogło mi poleceniesudo reboot ”, które służy do ponownego uruchamiania serwera Linux.


-2

włącz i uruchom usługę mariadb

sudo systemctl włącz mariadb.service

sudo systemctl start mariadb.service

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.