Предупреждение: 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.

№ 28
источник

Ответы:

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.

luismreis
источник
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

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

Jsonras
источник
Это связывает 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.

brucenan
источник
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". 

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

Cristian
источник
Это был лучший ответ для меня - в моем случае я использую 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/

kingus
источник
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
Sheric
источник
Я использую 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

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

minhas23
источник
0

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

RoberRM
источник
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
    );
Cyber
источник
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.

акула
источник