Предупреждение: mysql_connect (): [2002] Нет такого файла или каталога (пытается подключиться через unix: ///tmp/mysql.sock) в


246

Я пытаюсь подключиться к моей базе данных MySQL через терминал на моем Apple (с PHP).

Вчера все работало нормально, а теперь я внезапно получаю ошибку в названии.

Сценарий работает, когда я использую свой браузер для его запуска (у меня установлен XAMPP), но Терминал отказывается подключаться к БД.

Вот файл, который я включаю для подключения (скрипт работает, когда я его не включаю, но затем он не подключается к БД):

<?php
    mysql_connect("localhost", "root", "") or die(mysql_error());
    mysql_select_db("FNB1C_data") or die(mysql_error());
?>

Это должно работать, так как он работает с моим браузером.

Использование команды I в терминале есть php scriptname.php.

Ответы:


415

По какой-то причине mysql в OS X получает неправильное расположение требуемого файла сокета, но, к счастью, решение так же просто, как установка символической ссылки.

Вы можете иметь сокет (отображаемый как файл нулевой длины) как /tmp/mysql.sockили /var/mysql/mysql.sock, но одно или несколько приложений ищут его в другом месте. Узнайте с помощью этой команды:

ls -l /tmp/mysql.sock /var/mysql/mysql.sock

Вместо того, чтобы перемещать сокет, редактируйте файлы конфигурации и не забывайте хранить отредактированные файлы локально и вдали от серверов, на которых пути указаны правильно, просто создайте символическую ссылку, чтобы ваш Mac нашел нужный сокет, даже если он ищет в неправильном месте. !

Если у вас есть, /tmp/mysql.sockно нет /var/mysql/mysql.sock...

cd /var 
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /tmp/mysql.sock mysql.sock

Если у вас есть, /var/mysql/mysql.sockно нет /tmp/mysql.sock...

cd /tmp
ln -s /var/mysql/mysql.sock mysql.sock

Для создания каталога и ссылки вам потребуются разрешения, поэтому при необходимости просто добавьте к приведенным выше командам команду sudo.


Хороший ответ. Фикс сработал для меня. Знаете ли вы, почему это может сработать один раз, а потом снова не сработать? У меня была та же проблема.
— Николь

16
Это довольно глупо. Я очень рекомендую ответ @luismreis, чтобы обойти этот скрытый ярлык MySQL.
— MattiSG

2
У меня не сработало ... У меня нет ни одного из этих файлов. Но ответ luismreis сработал!
— Грегуар

4
Это не "хаки". Это правильный способ заставить localhostсокет работать, и он может быть важен, если вы не хотите, чтобы дополнительные издержки отправлялись на маршрутизатор до получения доступа к базе данных.
— Кебман

1
Путь на моем Ubuntu 10.04 был неправильным. Я должен был сделать это: cd /tmpа потом: sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock.
— franzlorenzon

371

У меня тоже была эта ошибка, но я мог ее исправить только с помощью предложения здесь .

Подводя итог, используйте:

127.0.0.1

Вместо того:

localhost

Причина в том, что «localhost» - это специальное имя для драйвера MySQL, заставляющее его использовать сокет UNIX для подключения к MySQL вместо сокета TCP.


1
Если это работает, то проверьте ваш hostsфайл, он может отсутствовать или испортиться
— Fabrizio

3
Также, возможно, стоит упомянуть: при использовании MAMP, как я, вы должны снять флажок «Разрешить только локальный доступ»
— '17

Это решение создает дополнительные издержки, так как пакет отправляется маршрутизатором первым. Обычно это не большая проблема при тестировании, но это может стать проблемой с большими пакетами данных.
— Кебман

3
@ Фабрицио Нет, это не связано. Когда вы используете localhost в качестве имени, mysql будет использовать вместо этого сокет Unix, который обрабатывается через запись файла (например, mysql.sock), а не через Inet, независимо от того, объявлен ли localhost в / etc / hosts или нет. Однако, когда вы вместо этого используете IP-адрес, даже 127.0.0.1, вы заставляете mysql вместо этого открывать сокет Inet.
— Фран Марзоа

1
Означает ли это, что все гранты, которые вы предоставили на MySQL db для 'user'% 'localhost', сломаются?
— Осьминог

24

У меня была такая же проблема, и вот как я ее исправил:

У меня было это, и это не сработало:

$con = mysql_connect('localhost', 'root', '1234');

Я сделал это, и это сработало:

$con = mysql_connect(':/Applications/MAMP/tmp/mysql/mysql.sock', 'root', '1234');

Вместо использования сервера MySQL я подключился напрямую к Unix Socket. Работал на меня.


Это единственное решение, которое сработало и для меня. У меня нет /var/mysql/mysql.sock. И у меня нет /tmp/mysql.sock.
— JeffB6688

вы пробовали 127.0.0.1 вместо localhost?
— Mantisse

21

Сокет MySQL, как правило, находится в /tmp/mysql.sockили /var/mysql/mysql.sock, но, вероятно, PHP выглядит не в том месте.

  1. Проверьте, где ваша розетка с:

     sudo /usr/libexec/locate.updatedb
  2. Когда updatedb прекращается:

     locate mysql.sock
  3. Затем найдите ваш php.ini:

     php -i | grep php.ini

    это выведет что-то вроде:

     Configuration File (php.ini) Path => /opt/local/etc/php54
     Loaded Configuration File => /opt/local/etc/php54/php.ini
  4. Отредактируйте свой php.ini

     sudo vim /opt/local/etc/php54/php.ini
  5. Измените строки:

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

    где /tmp/mysql.sock - это путь к вашему сокету.

  6. Сохраните ваши изменения и выйдите из ESC + SHIFT: x

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

     sudo apachectl stop
     sudo apachectl start

У меня нет php.ini; У меня есть только php.ini.default, так что кажется, что обходной путь здесь необходим: apple.stackexchange.com/questions/65802/… Однако он не сработал для меня.
— user124384 30.06.15

@ user124384 Ваша установка, вероятно, не работает: переименуйте вашу php.ini.defaultв php.ini.
— существительное

Apache можно перезапустить с помощью одной строки:sudo apachectl restart
— fbiazi

11

Я работаю на XAMPP в Mac OS X, и решение Брайана Лоу, приведенное выше, работало с небольшой модификацией .

Файл mysql.sock находится в папке "/ Applications / xampp / xamppfiles / var / mysql /". Поэтому пришлось связать его как в / tmp, так и / var / mysql. Я не проверял, какой из них используется в командной строке PHP, но это помогло, поэтому я счастлив :-)

sudo su
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /tmp/mysql.sock
mkdir /var/mysql
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /var/mysql/mysql.sock

1
Ты - я искал решение несколько дней, и это то, что, наконец, сделало все правильно! =) XAMPP на OS X тоже
— ljubiccica

10

Mac OS X EL Capitan + MAMP Pro Сделайте это

cd /var
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

Тогда сделай это

cd /tmp
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

Надеюсь, это сэкономит вам время.


Это связывает mysql.dockв то, /tmpчто это решило. Спасибо!
— Мохаммед Дж. Разем

6

Причина в том, что php не может найти правильный путь mysql.sock.

Пожалуйста, убедитесь, что ваш mysql запущен первым.

Затем, пожалуйста, подтвердите, что путь mysql.sockрасположен, например,/tmp/mysql.sock

затем добавьте эту строку пути в php.ini:

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

Наконец, перезапустите Apache.


6

Когда вы сталкиваетесь со следующей проблемой:

Ошибка генерирования PHP «Предупреждение: mysql_connect () http: //function.mysql-connect : 2002 Нет такого файла или каталога (при попытке подключения через unix: ///tmp/mysql.sock)»

Установите значение "mysql.default_socket" в вашем /etc/php.iniк

 "mysql.default_socket = /var/mysql/mysql.sock". 

Затем перезапустите веб-сервис в админке сервера.


Это был лучший ответ для меня - в моем случае я использую MAMP, я добавил в свой php.ini: mysqli.default_socket = /Applications/MAMP/tmp/mysql/mysql.sock mysql.default_socket = / Applications / MAMP / tmp /mysql/mysql.sock
— Адамски

3

Исправлена ​​ошибка с надвигающимся сокетом 2002 года, которая связывает, где MySQL размещает сокет и где OSX считает, что это должно быть, MySQL помещает его в / tmp, а OSX ищет его в / var / mysql, сокет - это тип файла, который позволяет клиенту mysql / сервер связи.

sudo mkdir /var/mysql

а потом

sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

источник: http://coolestguidesontheplanet.com/get-apache-mysql-php-phpmyadmin-working-osx-10-10-yosemite/


1

Другое решение состоит в том, чтобы исправить местоположение сокета в файле конфигурации php.ini следующим образом:

pdo_mysql.default_socket=/tmp/mysql.sock

Конечно, символическая ссылка тоже работает, поэтому вы предпочитаете, какую из них изменить.


1

Когда вы устанавливаете php53-mysql, используя порт, он возвращает следующее сообщение, которое является решением этой проблемы:

To use mysqlnd with a local MySQL server, edit /opt/local/etc/php53/php.ini
and set mysql.default_socket, mysqli.default_socket and
pdo_mysql.default_socket to the path to your MySQL server's socket file.

For mysql5, use /opt/local/var/run/mysql5/mysqld.sock
For mysql51, use /opt/local/var/run/mysql51/mysqld.sock
For mysql55, use /opt/local/var/run/mysql55/mysqld.sock
For mariadb, use /opt/local/var/run/mariadb/mysqld.sock
For percona, use /opt/local/var/run/percona/mysqld.sock

Я использую Mountain Lion и установил MySQL, используя macports.
— Шерик

1

у меня была та же проблема

[PDOException] SQLSTATE [HY000] [2002] Нет такого файла или каталога

[ErrorException] Предупреждение: PDO :: __ construct (): [2002] Нет такого файла или каталога (пытается подключиться через unix: ///var/mysql/mysql.sock) в… htdocs / Symfony / vendor / doctrine-dbal / Библиотека / Doctrine / DBAL / Водитель / PDOConnection.php

Таким образом, решение заключается в создании символической ссылки на файл sock, что решает проблему. Сделайте следующее, чтобы решить это:

$ sudo mkdir / private / var / mysql /

$ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /private/var/mysql/mysql.sock

источник: http://www.reecefowell.com/2012/07/21/symfony2-cli-does-not-connect-to-mysql- while-browser-works-fine/


Разместите здесь свой ответ, а не ссылку на внешний сайт.
— ElmerCat

0

Я получил те же ошибки. Mysql работал как отдельное приложение до того, как я запустил phpMyAdmin.

Я просто остановил MySQL Затем sudo / Applications / XAMPP / xamppfiles / xampp stop sudo / Applications / XAMPP / xamppfiles / xampp start

Все работало нормально


0

У меня просто была эта проблема, но она появилась только при загрузке определенных страниц (другие страницы работали нормально). Оказалось, что я звонил в MySQL после того, как закрыл соединение с mysql_close(). Итак, как сказал @brucenan: убедитесь, что MySQL работает, когда вы его вызываете .


0

Вы можете сделать это, просто добавив псевдоним MAMP php на терминал Apple:

alias phpmamp='/Applications/MAMP/bin/php/php7.0.0/bin/php'

Пример: > phpmamp - v

Теперь вы можете запустить что-то вроде: > phpmamp scriptname.php

Примечание. Это будет применяться только для текущего сеанса терминала.


0

Поскольку вы можете использовать MAMP, либо измените ваш порт на 3306 по умолчанию, либо используйте 127.0.0.1 в файле database.php

$db['default'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',// leave it for port 3306
    'username' => 'yourUserhere',
    'password' => 'yourPassword',
    'database' => 'yourDatabase',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

Или с настройками по умолчанию:

$db['default'] = array(
        'dsn'   => '',
        'hostname' => '127.0.0.1:8889',// leave it for port 8889
        'username' => 'yourUserhere',
        'password' => 'yourPassword',
        'database' => 'yourDatabase',
        'dbdriver' => 'mysqli',
        'dbprefix' => '',
        'pconnect' => FALSE,
        'db_debug' => (ENVIRONMENT !== 'production'),
        'cache_on' => FALSE,
        'cachedir' => '',
        'char_set' => 'utf8',
        'dbcollat' => 'utf8_general_ci',
        'swap_pre' => '',
        'encrypt' => FALSE,
        'compress' => FALSE,
        'stricton' => FALSE,
        'failover' => array(),
        'save_queries' => TRUE
    );

0

Клиент mySQL по умолчанию пытается подключиться через локальный файл, называемый сокетом, вместо подключения к адресу обратной связи (127.0.0.1) для localhost.

Расположение по умолчанию этого файла сокета, по крайней мере в OSX, - /tmp/mysql.sock.

БЫСТРОЕ, МЕНЬШЕ ЭЛЕГАНТНОЕ РЕШЕНИЕ

Создайте символическую ссылку, чтобы обмануть ОС и найти правильный сокет.

ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp

Правильное решение

Измените путь сокета, определенный в startMysql.shфайле в /Applications/MAMP/bin.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.