Підключення MySQL не працює: 2002 Немає такого файлу чи каталогу


106

Я намагаюся налаштувати WordPress. У мене запущені Apache та MySQL, а облікові записи та база даних налаштовані. Я спробував зробити просте з'єднання:

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

І я завжди отримую таке:

Помилка: 2002 - такого файлу чи каталогу немає

Про який файл чи каталог він може йти?

Я перебуваю на сніговому леопарді OS X, використовуючи вбудований Apache. Я встановив MySQL за допомогою dmg x86_64.

ОНОВЛЕННЯ: Я виявив, що сокет знаходиться на /tmp/mysql.sock, тому в php.ini я замінив усі випадки неправильного шляху цим.


2
будь ласка, вставте висновок, /etc/init.d/mysql startякщо ви перебуваєте на базі дистрибутива debian. якщо не вдалося, перевірте /etc/my.cnfфайл на правильний шлях файлу socket mysql.
sepehr

4
вирішили ту ж проблему в OS X з XAMPP, використовуючи "127.0.0.1" замість "localhost".
Джузеппе Урсо

Відповіді:


97

Якщо ви використовуєте Linux: шлях до файлу mysql.sock невірний. Це зазвичай тому, що ви використовуєте (LAMPP) XAMPP, і це не в /tmp/mysql.sock

Відкрийте файл php.ini і знайдіть цей рядок:

mysql.default_socket

І зробити це

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

5
якщо ви не впевнені, спробуйте /var/lib/mysql/mysql.sock як новий шлях до сокета.
Jay

1
Хм. Можливо, вони мали на увазі Леопарда чи Тигра. У будь-якому випадку, веселіться з WordPress!
Алек Ущелина

3
Зауважте, що вам може знадобитися встановити mysqli.default_socket = /path/to/mysql.sock при з'єднанні з mysqli
розбито

2
Типовим розташуванням сокета для встановлення запасу MySQL є /tmp/mysql.sock.
Джонатан Хілл

4
"Ім'я хоста localhost має особливе значення. Це пов'язано з використанням сокетів домену Unix. Неможливо відкрити TCP / IP-з'єднання, використовуючи ім'я хоста localhost, замість цього потрібно використовувати 127.0.0.1." - php.net/manual/en/mysqli.quickstart.connections.php . Тому в основному щось не працює з підключенням до розеток домену Unix, які дозволяють localhostпрацювати, і TCP / IP працює, тому зміна його на TCP / IP-адресу 127.0.0.1буде працювати.
Едвард

154

У мене була подібна проблема, і я зміг її вирішити, звернувшись до мого mysql, а 127.0.0.1не до localhost.

Це, ймовірно, означає, що у мене в програмі хостів щось не так, але зараз я швидко виправляю цю проблему.


2
Ви просто заощадили мені дорогоцінний час.
uchamp

2
Я перевірив файл хостів і знайшов рядок з code127.0.0.1 localhost code. Що мене цікавить, чому зв’язок через localhost не працював. Якби хтось міг просвітити мене, я був би радий.
ola

2
Це тому, що mysql.default_socket у php.ini неправильний. Виконати "php -i | grep mysql.default_socket"
Йона

1
Це працювало для мене, я перебуваю на El Capitan w / mysql 5.7, встановленому через homebrew. Я намагався встановити WP, і коли я змінив "localhost" на "127.0.0.1", він зміг підключитися.
дгіг

5
"Ім'я хоста localhost має особливе значення. Це пов'язано з використанням сокетів домену Unix. Неможливо відкрити TCP / IP-з'єднання, використовуючи ім'я хоста localhost, замість цього потрібно використовувати 127.0.0.1." - php.net/manual/en/mysqli.quickstart.connections.php . Тому в основному щось не працює з підключенням до розеток домену Unix, які дозволяють localhostпрацювати, і TCP / IP працює, тому зміна його на TCP / IP-адресу 127.0.0.1буде працювати.
Едвард

39

Це для Mac OS X із вбудованою установкою Apache HTTP та власною установкою MySQL .

Відповідь ґрунтується на чудовій відповіді @ alec-gorge, але оскільки мені довелося переглядати деякі конкретні зміни, щоб налаштувати її в моїй конфігурації, в основному для Mac OS X, я подумав, що додам її сюди заради повноти.

Увімкніть підтримку PHP5 для HTTP Apache

Переконайтеся, що підтримка PHP5 включена /etc/apache2/httpd.conf.

Відредагуйте файл за допомогою sudo vi /etc/apache2/httpd.conf(введіть пароль при запиті ) та відмініть (видаліть ;з початку) рядок, щоб завантажити модуль php5_module .

LoadModule php5_module libexec/apache2/libphp5.so

Запустіть Apache HTTP за допомогою sudo apachectl start(або restartякщо він вже запущений і його потрібно перезапустити, щоб перечитати файл конфігурації).

Переконайтеся, що /var/log/apache2/error_logмістить рядок, який повідомляє вам, що php5_module увімкнено - ви повинні побачити PHP/5.3.15(або подібне).

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

Пошук імені файлу Socket

Коли MySQL працює і працює (з ./bin/mysqld_safe), на консолі повинні бути надруковані рядки налагодження, які підкажуть, де можна знайти файли журналів. Зверніть увагу на ім'я хоста у назві файлу - localhostв моєму випадку - яке може відрізнятися для вашої конфігурації.

Файл, який надається після, Logging toє важливим. Ось де MySQL записує свою роботу.

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.errфайл (знову ж таки, ваш може бути названий інакше), тобто tail -1 /Users/jacek/apps/mysql/data/localhost.errдізнатися ім'я файлу сокета - це повинен бути останній рядок.

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

Зверніть увагу на socket:частину - це файл сокета, в якому ви повинні використовувати php.ini.

Є ще один спосіб (деякі кажуть простіший спосіб) визначити розташування імені файлу сокета, увійшовши в MySQL та запустивши:

show variables like '%socket%';

Налаштування PHP5 з підтримкою MySQL - /etc/php.ini

Якщо говорити про php.ini ...

У /etcкаталозі є /etc/php.ini.default файл. Скопіюйте його в /etc/php.ini .

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

Відкрийте /etc/php.iniі шукайте mysql.default_socket .

sudo vi /etc/php.ini

За замовчуванням mysql.default_socket- /var/mysql/mysql.sock. Ви повинні змінити його на значення, яке ви відзначили раніше - це було /tmp/mysql.sockв моєму випадку.

Замініть /etc/php.iniфайл, щоб відображати ім'я файлу сокета:

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

Остаточна перевірка

Перезапустіть HTTP Apache.

sudo apachectl restart 

Перевірте журнали, якщо немає помилок, пов’язаних із PHP5. Жодних помилок означає, що ви готові, і PHP5 з MySQL має працювати добре. Вітаю!


Ця відповідь допомагає
Vigneshwaran

Ця відповідь лайна. Це не має нічого спільного з запитанням, яке задається, і в основному це лише підручник підсилювача am (acos), який - якщо добре - ще більше витрачається, якщо розмістити тут, а не там, де люди, які фактично шукають налаштування стека підсилювачів. макос дивиться. Щодо запитуваного питання: ця відповідь не пояснює лайно щодо того, чому трапляється помилка і чому php намагається підключитися через сокет замість імені хоста, замість цього передається mysql_connect, що є актуальною проблемою оригінального питання, а не загальної. неправильне уявлення про встановлення програмного забезпечення.
ohcibi

@ohcibi Я написав "Я думав, що додам його сюди заради повноти". і подумав, що цього буде достатньо (і зважаючи на анонс кількох людей сподобалось). Мені подобається ваша ідея зробити відповідь простіше знайти, але не знаю як. Не могли б ви поділитися своїми думками та допомогти мені ... знову? Дякую!
Яцек Ласковський

@JacekLaskowski взагалі: напишіть допис у блозі та прокоментуйте посилання на прийняту / найбільш схвалену відповідь з тим самим наміром, який ви мали тут ("додайте її заради повноти"). Але в цій самій темі я навіть не бачу причини розміщувати це посилання. ОП заявив, що він використовує macOS, але ця проблема взагалі не має нічого спільного з будь-якою операційною системою, крім способу інтерпретації mySQL localhost. Ніхто, хто шукає допомоги щодо встановлення Xamp на macos, не потрапить сюди за допомогою Google. Отже, я вжив термін "лайно". Цей потік взагалі не має нічого спільного з macos, але лише з mysql (навіть не з php).
ohcibi

14

Заміна "localhost" на "127.0.0.1" у конфігураційному файлі (db-з'єднання) допомогла!


1
але чому йому слід допомагати?
Енамул Хассан

"Заміна" localhost "на" 127.0.0.1 "" або 127.0.0.1 на фактичну адресу сервера MySQL, тобто u55151.mysql.someserver.eu.
користувач2812532

13

Перезапуск сервера mysql може допомогти. У моєму випадку перезапуск сервера економив багато часу.

service mysql restart

PS - використання sudo service mysql restartдля некорінного користувача.


2
Це так чудово, коли просте рішення насправді працює.
abalter

10

Спочатку переконайтеся, що MySQL працює. Команда: mysqld start

Якщо ви все ще не можете підключитися, як виглядає ваш /etc/my.cnf? (або /etc/msyql/my.cnf)

Інші 2 повідомлення є правильними в тому, що вам потрібно перевірити ваш сокет, оскільки 2002 рік - це помилка сокета.

Чудовим посібником із налаштування LAMP є: http://library.linode.com/lamp-guides/centos-5.3/index-print


Інсталятор не поставив файл my.cnf, однак є /usr/local/mysql/mysql-test/include/default_my.cnf, чи слід копіювати його як my.cnf /etc?
mk12

так, але ви можете виявити, що вам потрібно змінити деякі останні.
Тодд Мойсей

7

Не те, що тобі дуже допомагає, але в останніх версіях (і навіть менш останніх ) MySQL код помилки 2002 означає «Неможливо підключитися до локального сервера MySQL через сокет [name-of-socket]», так що це може сказати вам трохи більше.


1
На OSX 10.9.x з MySQL 5.5.38, встановленим з джерела, я отримував цю помилку. Ця порада була вірною: це проблема з сокетом, навіть якщо mysqli_connect_errno () та mysqli_connect_error ()) говорили, що файл 2002 року не знайдено повідомлення. Мені вдалося вирішити це, відредагувавши /etc/php.ini та встановивши mysql.default_socket AND mysqli.default_socket, щоб виправити значення сокета (оскільки моя програма використовувала mysqli для з'єднань)
Ronnie

7

Розкриваючи тут відповідь Маттіаса Д, я зміг вирішити цю помилку 2002 року як на MySQL, так і на MariaDB точними шляхами за допомогою цих команд:

Спочатку знайдіть фактичний шлях до сокета MySQL:

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

Потім отримайте шлях до PHP :

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

Використовуючи вихід цих двох команд , зв’яжіть їх:

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

Якщо це повертається, No such file or directoryвам просто потрібно створити шлях до PHP mysql.sock, наприклад, якщо ваш шлях був /var/mysql/mysql.sockби ви запустили:

sudo mkdir -p /var/mysql

Потім спробуйте команду sudo ln ще раз.


6

Я перевірив би ваш файл php.ini і переконався, що файл mysql.default_socket встановлений правильно, а також переконаюся, що ваш mysqld правильно налаштований з файлом сокета, до якого він може отримати доступ. Типовим типом є "/tmp/mysql.sock".


Гаразд, це говорить /var/mysql/mysql.sock, але цього шляху не існує.
mk12

6

Я також зіткнувся з цією проблемою, тоді я змінив 'localhost' на '127.0.0.1', він працює.


6

у моєму випадку у мене проблема з mysqli_connect.
коли я хочу підключити
mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error (), поверніть мені цю помилку "Немає такого файлу чи каталогу"

це працювало для мене mysqli_connect('localhost:3306', 'myuser','mypassword')


Це добре працювало для мене; мені було потрібно змінити, щоб завантажити пакет статистичних даних американського футболу Armchair Analysis в локальну установку Mysql OS X. Дякую!
Майкл Скотт Катберт

рада почути це :)
masoud2011,

4

Помилка 2002 року означає, що MySQL не може підключитися до локального сервера баз даних через файл сокета (наприклад, /tmp/mysql.sock).

Щоб дізнатися, де знаходиться ваш файл сокета, запустіть:

mysql_config --socket

потім двічі перевірте, чи ваша програма використовує правильний файл сокет Unix або підключиться через порт TCP / IP.

Потім двічі перевірте, чи ваш PHP має правильну настройку сокетів MySQL:

php -i | grep mysql.default_socket

і переконайтеся, що файл існує .

Перевірте розетку:

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

Якщо сокет Unix невірний або не існує, ви можете символізувати його, наприклад:

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

або виправте файл конфігурації (наприклад php.ini).

Щоб перевірити PDO- з'єднання безпосередньо з PHP, ви можете запустити:

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

Перевірте також конфігурацію між Apache та CLI (інтерфейс командного рядка), оскільки конфігурація може відрізнятися.

Можливо, сервер працює, але ви намагаєтесь підключитися за допомогою порту TCP / IP, імені pipe або файлу сокетів Unix, відмінного від того, на якому слухає сервер. Щоб виправити, що вам потрібно викликати клієнтську програму (наприклад, вказавши --portопцію), щоб вказати правильний номер порту або відповідний названий файл труби або файл сокета Unix (наприклад, --socketопція).

Див.: Виправлення неполадок підключення до MySQL


Інші утиліти / команди, які можуть допомогти відстежити проблему:

  • 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=1вашимxdebug.ini
  • На OS X спробуйте sudo dtruss -fn mysqld, на Linux налагоджуйтеstrace
  • Перевірте дозволи на сокет Unix: stat $(mysql_config --socket)і якщо у вас достатньо вільного місця ( df -h).
  • Перезавантажте MySQL.
  • Перевірити net.core.somaxconn.

3

Переконайтеся, що ваш локальний сервер (MAMP, XAMPP, WAMP тощо) працює.


На додаток до цього, якщо ви використовуєте MAMP на MacOS (очевидно!), Ви також отримаєте цю помилку, якщо ви отримаєте доступ до свого веб-сайту відразу після пробудження свого Mac від сну. Рішенням, звичайно, є просто почекати і спробувати ще раз. :-)
texelate

0

У мене була схожа проблема.
В основному тут проблема полягає в тому, що, ймовірно, є два екземпляри запуску mysql.
A) Один, що працює на /etc/init.d
B) Лампа встановлюється в / opt / lamp
Рішення:
Крок 1: - Знайдіть усі запущені екземпляри mysql, використовуючи commnad "find / | grep mysqld".
Крок 2: - Вимкнення служб, що працюють на /etc/init.d за допомогою служби mysql stop
Крок 3: - Перезапустіть свої служби лампи за допомогою / opt / lamp / перезапустіть лампу

Вам слід добре піти :)


0

На комп'ютері Mac, перш ніж зробити всю важку роботу, просто перевірте свої налаштування в System Preferences > MySQL. Частіше за все я відчував, як команда зіткнулася з цією проблемою The MySQL Server Instance is stopped.

Натисніть Start MySQL Serverкнопку, і магія станеться.


0

Я використовую PHP-FPM або кілька версій PHP на своєму сервері. У моєму випадку я оновлюю значення mysqli, оскільки не існує параметра socket mysql за замовчуванням:

mysqli.default_socket

до:

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

завдяки @Alec Gorge


0

У мене була така ж проблема. Зрештою, мій розетку було знайдено в /tmp/mysql.sock. Потім я додав цей шлях до php.ini. Я знайшов сокет там, перевіривши сторінку "Статус сервера" в MySQL Workbench. Якщо ваш сокет не в /tmp/mysql.sock, можливо, MySQL Workbench міг би сказати вам, де він знаходиться? (Звісно, ​​ви використовуєте MySQL Workbench ...)


0

Я встановив MySQL за допомогою інсталятора. Насправді, не було жодного каталогу даних поряд із каталогом 'bin'.

Отже, я вручну створив каталог «data» у розділі «C: \ Program Files \ MySQL \ MySQL Server 8.0». І це спрацювало (змінивши кореневий пароль, виконавши наступні кроки, запропоновані на https://dev.mysql.com/doc/mysql-windows-excerpt/5.7/uk/resetting-permissions-windows.html .


0

Цифровий океан MySql 2002-no-such-file-or-directory

Додайте цей кінець файлу /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1

Перезапустіть MySql

service mysql restart


-1

У мене також був такий самий випуск на сервері Linux. Що мені допомогло - це команда ' sudo reboot ', яка використовується для перезавантаження сервера Linux.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.