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

Я пытаюсь настроить 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 с помощью x86_64 dmg.

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

Ответ 1

Если вы используете Linux: путь к файлу mysql.sock неверен. Обычно это происходит потому, что вы используете (LAMPP) XAMPP и не находитесь в /tmp/mysql.sock

Откройте файл php.ini и найдите следующую строку:

mysql.default_socket

И сделайте это

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

Ответ 2

У меня была аналогичная проблема, и я смог решить ее, обратившись к моему mysql с помощью 127.0.0.1 вместо localhost.

Это, вероятно, означает, что у меня что-то не так в настройках моих хостов, но это быстрое решение заставит меня идти прямо сейчас.

Ответ 3

Это для Mac OS X с собственной установкой Apache HTTP и пользовательской установкой MySQL.

Ответ основан на отличном ответе @alec-gorge, но поскольку мне пришлось учесть некоторые конкретные изменения, которые были настроены в моей конфигурации, в основном Mac OS X-specific, я думал, что добавлю это ради меня полноты.

Включить поддержку 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

Поиск имени файла 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

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

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

sudo apachectl restart 

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

Ответ 4

Помогло заменить "localhost" на "127.0.0.1" в файле конфигурации (соединение db)

Ответ 5

Во-первых, убедитесь, что MySQL запущен. Команда: mysqld start

Если вы все еще не можете подключиться, выполните следующие действия: Как выглядит ваш /etc/my.cnf?

Другие 2 сообщения верны в том, что вам нужно проверить свой сокет, потому что 2002 - ошибка сокета.

Большой учебник по настройке LAMP: http://library.linode.com/lamp-guides/centos-5.3/index-print

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

Расширение на Ответ Matthias D здесь Я смог решить эту ошибку 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.

Ответ 11

Перезапуск сервера MySQL может помочь. В моем случае перезапуск сервера сэкономил много времени.

service mysql restart

PS - используйте sudo service mysql restart для пользователя без полномочий root.

Ответ 12

Ошибка 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.

Ответ 13

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

Ответ 14

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

Шаг 3: - Перезапустите ваши лампы с использованием/opt/перезапуск лампы/лампы

Вам должно быть хорошо идти:)

Ответ 15

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

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

Ответ 16

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

mysqli.default_socket

к:

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

благодаря @Alec Gorge

Ответ 17

У меня такая же проблема. Мой сокет был в конце концов найден в /tmp/mysql.sock. Затем я добавил этот путь к php.ini. Я нашел сокет от проверки страницы "Состояние сервера" в MySQL Workbench. Если ваш сокет не находится в /tmp/mysql.sock, то, возможно, MySQL Workbench мог бы сказать вам, где он находится? (Конечно, вы используете MySQL Workbench...)

Ответ 18

Я установил 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.

Ответ 19

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

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

sudo systemctl start mariadb.service