Соединение MySQL не работает: 2002 Нет такого файла или каталога

106

Я пытаюсь настроить WordPress. У меня работают Apache и MySQL, и все учетные записи и база данных настроены. Я попытался установить простое соединение:

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

И я всегда получаю это:

Ошибка: 2002 - Нет такого файла или каталога

О каком файле или каталоге может идти речь?

Я использую OS X Snow Leopard, использую встроенный Apache. Я установил MySQL с помощью dmg x86_64.

ОБНОВЛЕНИЕ: я обнаружил, что сокет находится в /tmp/mysql.sock, поэтому в php.ini я заменил им все вхождения неправильного пути.

mk12
источник
2
пожалуйста, вставьте вывод, /etc/init.d/mysql startесли вы используете базовый дистрибутив debian. в случае неудачи проверьте /etc/my.cnfфайл на предмет правильного пути к файлу сокета 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 в качестве нового пути к сокету.
Джей
1
Хм. Может, они имели в виду Леопарда или Тигра. В любом случае, веселитесь с WordPress!
Alec Gorge
3
Обратите внимание, что вам может потребоваться установить mysqli.default_socket = /path/to/mysql.sock при соединении с mysqli
razzed
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
Я проверил свой файл hosts и нашел строку с code127.0.0.1 localhost code. Что заставляет меня любопытствовать, почему подключение через localhost не работает. Если бы кто-то мог просветить меня, я был бы счастлив.
ola
2
Это потому, что mysql.default_socket в php.ini неверен. Запустите «php -i | grep mysql.default_socket»
Иона
1
Это сработало для меня, я нахожусь на El Capitan с mysql 5.7, установленным через homebrew. Я пытался установить WP, и когда я изменил «localhost» на «127.0.0.1», он смог подключиться.
dgig
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, но, поскольку мне пришлось внести в Google некоторые конкретные изменения, чтобы настроить его в моей конфигурации, в основном для Mac OS X, я подумал, что добавлю его сюда для полноты картины.

Включить поддержку PHP5 для Apache HTTP

Убедитесь, что поддержка 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

Поиск имени файла сокета

Когда 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

Окончательная проверка

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

sudo apachectl restart 

Проверьте журналы, нет ли ошибок, связанных с PHP5. Отсутствие ошибок означает, что все готово, и PHP5 с MySQL должен работать нормально. Поздравляю!

Яцек Ласковски
источник
Этот ответ помогает
Vigneshwaran
Это чушь. Это не имеет ничего общего с задаваемым вопросом и представляет собой в основном только учебник am (acos) amp, который, если он хорош, будет еще более потраченным, если поместить его здесь, а не в то место, где люди, которые фактически ищут настройку стека усилителя на macos смотрят. Что касается задаваемого вопроса: этот ответ не объясняет, почему возникает ошибка и почему php пытается подключиться через сокет вместо имени хоста, хотя это передается mysql_connect, что является реальной проблемой исходного вопроса, а не общего неправильное представление об установке программного обеспечения.
ohcibi 07
@ohcibi Я написал: «Я подумал, что добавлю его сюда для полноты картины». и подумал, что этого будет достаточно (и, учитывая положительные голоса, нескольким людям это понравилось). Мне нравится ваша идея облегчить поиск ответа, но не знаю как. Не могли бы вы поделиться своими мыслями и помочь мне ... снова? Спасибо!
Яцек Ласковски
@JacekLaskowski в целом: напишите сообщение в блоге и прокомментируйте ссылку на принятый / получивший наибольшее количество голосов ответ с тем же намерением, что и вы здесь («добавьте его для полноты»). Но в этой самой ветке я даже не вижу смысла размещать эту ссылку. ОП сказал, что он использует macOS, но эта проблема не имеет ничего общего с какой-либо операционной системой, а связана с интерпретацией mySQL localhost. Никто, ищущий помощи по настройке xamp на macos, не попадет сюда через гугл. Поэтому я использовал термин «дерьмо». Этот поток не имеет ничего общего с macos, а только с mysql (даже не с php).
ohcibi
14

Помогла замена localhost на 127.0.0.1 в файле конфигурации (подключение к базе данных)!

Олег
источник
1
но почему это надо помогать?
Энамул Хассан
«Замена localhost на 127.0.0.1» или 127.0.0.1 на фактический адрес сервера MySQL, то есть u55151.mysql.someserver.eu.
user2812532
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 04
да, но вы можете обнаружить, что вам нужно изменить его позже.
Тодд Мозес
7

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

Артур Ройтенауэр
источник
1
В OSX 10.9.x с MySQL 5.5.38, установленным из исходного кода, я получал эту ошибку. Этот совет был правильным: это проблема с сокетом, хотя mysqli_connect_errno () и mysqli_connect_error ()) сообщали, что файл 2002 года не найден. Я смог решить эту проблему, отредактировав мой /etc/php.ini и установив mysql.default_socket И mysqli.default_socket, чтобы исправить значение сокета (поскольку мое приложение использовало mysqli для соединений)
Ронни
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 .

mattbell87
источник
6

Я бы проверил ваш файл php.ini и убедился, что mysql.default_socket установлен правильно, а также проверил, что ваш mysqld правильно настроен с файлом сокета, к которому он может получить доступ. Типичное значение по умолчанию - «/tmp/mysql.sock».

Майлз
источник
Хорошо, он говорит /var/mysql/mysql.sock, но этого пути не существует.
mk12 04
6

Я тоже столкнулся с этой проблемой, затем я изменил localhost на 127.0.0.1, он работает.

JackSun
источник
6

в моем случае у меня проблема с mysqli_connect.
когда я хочу подключиться,
mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error () возвращает мне эту ошибку «Нет такого файла или каталога»

это сработало для меня mysqli_connect('localhost:3306', 'myuser','mypassword')

masoud2011
источник
Это хорошо сработало для меня; это было изменение, которое мне потребовалось для загрузки пакета статистики американского футбола 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, именованный канал или файл сокета 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.
Kenorb
источник
3

Убедитесь, что ваш локальный сервер (MAMP, XAMPP, WAMP и т. Д.) Работает.

Хусейн Аль Фарадж
источник
В дополнение к этому, если вы используете MAMP на MacOS (очевидно!), Вы также получите эту ошибку, если вы войдете на свой сайт сразу после выхода Mac из спящего режима. Решение, конечно же, - просто подождать и попробовать еще раз. :-)
texelate 06
0

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

Тебе должно быть хорошо :)

Джигнеш Равал
источник
0

На Mac, прежде чем выполнять всю тяжелую работу, просто проверьте свои настройки System Preferences > MySQL. С тех пор я чаще всего сталкивался с этой проблемой The MySQL Server Instance is stopped.

Нажмите Start MySQL Serverкнопку, и произойдет волшебство.

Стивен Вентимилья
источник
0

Я использую PHP-FPM или несколько версий PHP на моем сервере. В моем случае я обновляю значение mysqli, так как нет параметра сокета по умолчанию 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 ...)

Fom
источник
0

Я установил MySQL с помощью установщика. Фактически, рядом с каталогом bin не было каталога данных.

Итак, я вручную создал каталог «data» в «C: \ Program Files \ MySQL \ MySQL Server 8.0». И это сработало (изменение пароля root в соответствии с инструкциями, предложенными на https://dev.mysql.com/doc/mysql-windows-excerpt/5.7/en/resetting-permissions-windows.html .

Пак Чон Бом
источник
0

Digital Ocean MySql 2002-нет-такого-файла-или-каталога

Добавить этот конец файла /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1

Перезапустите MySql

service mysql restart

аджмирани
источник
-1

У меня тоже была такая же проблема на сервере Linux. Мне помогла команда sudo reboot , которая используется для перезагрузки сервера Linux.

СумитК
источник
-2

включить и запустить службу mariadb

sudo systemctl включить mariadb.service

sudo systemctl start mariadb.service

Анил К Шреста
источник