Ostrzeżenie: mysql_connect (): [2002] Brak takiego pliku lub katalogu (próba połączenia przez unix: ///tmp/mysql.sock) w

246

Próbuję połączyć się z moją bazą danych MySQL za pomocą terminala na moim Apple (z PHP).

Wczoraj działało dobrze, a teraz nagle pojawia się błąd w tytule.

Skrypt działa, gdy używam mojej przeglądarki do uruchomienia go (mam zainstalowany XAMPP), ale Terminal odmawia połączenia z bazą danych.

Oto plik, który dołączam do połączenia (skrypt działa, gdy go nie uwzględnię, ale potem nie łączy się z bazą danych):

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

To powinno działać, ponieważ działa z moją przeglądarką.

Polecenie, którego używam w terminalu to php scriptname.php.

Nr 28
źródło

Odpowiedzi:

415

Z jakiegoś powodu mysql w OS X źle traktuje lokalizację wymaganego pliku gniazda, ale na szczęście rozwiązanie jest tak proste, jak skonfigurowanie dowiązania symbolicznego.

Możesz mieć gniazdo (wyświetlane jako plik o zerowej długości) jako /tmp/mysql.socklub /var/mysql/mysql.sock, ale jedna lub więcej aplikacji szuka go w innej lokalizacji. Dowiedz się za pomocą tego polecenia:

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

Zamiast przesuwać gniazdo, edytować pliki konfiguracyjne i pamiętać o tym, aby edytować pliki lokalnie i z dala od serwerów, na których ścieżki są poprawne, po prostu utwórz dowiązanie symboliczne, aby komputer Mac znalazł odpowiednie gniazdo, nawet jeśli szuka w niewłaściwym miejscu !

Jeśli masz, /tmp/mysql.sockale nie, /var/mysql/mysql.sockto ...

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

Jeśli masz, /var/mysql/mysql.sockale nie, /tmp/mysql.sockto ...

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

Będziesz potrzebował uprawnień, aby utworzyć katalog i łącze, więc w razie potrzeby po prostu poprzedź powyższe polecenia sudo.

Brian Lowe
źródło
Dobra odpowiedź. Fix działał dla mnie. Czy wiesz, dlaczego to może zadziałać raz, a potem nie? Miałem ten sam problem.
Nicole,
16
To jest raczej zuchwałe. Raczej polecam odpowiedź @luismreis, aby obejść ukryty skrót MySQL.
MattiSG
2
Nie działało dla mnie ... Nie mam żadnego z tych plików. Ale odpowiedź luismreis zadziałała!
Gregoire,
4
To nie jest „hacky”. Jest to właściwy sposób, aby localhostgniazdo działało, i może być ważne, jeśli nie chcesz, aby dodatkowe obciążenie związane z wysyłaniem pakietów do routera przed uzyskaniem dostępu do bazy danych.
Kebman
1
Ścieżka na moim Ubuntu 10.04 była niepoprawna. Musiałem to zrobić: cd /tmpa następnie: sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock.
franzlorenzon
371

Miałem również ten błąd, ale mogłem go naprawić tylko dzięki sugestii tutaj .

Podsumowując, użyj:

127.0.0.1

Zamiast:

localhost

Powodem jest to, że „localhost” jest specjalną nazwą dla sterownika MySQL, który wykorzystuje gniazdo UNIX do łączenia się z MySQL zamiast gniazda TCP.

luismreis
źródło
1
Jeśli to działa, a następnie sprawdzić swój hostsplik, to może brakować lub pomieszane
Fabrizio
3
także może warto wspomnieć: Używając MAMPa jak ja, musisz odznaczyć pole „Zezwalaj tylko na dostęp lokalny”
zupa
To rozwiązanie powoduje dodatkowe obciążenie, ponieważ pakiet jest najpierw wysyłany przez router. Zwykle nie jest to duży problem podczas testowania, ale może stać się problemem z dużymi pakietami danych.
Kebman
3
@Fabrizio Nie, to nie jest powiązane. Gdy użyjesz localhost jako nazwy, mysql użyje zamiast tego gniazda Unix, które jest obsługiwane przez pozycję pliku (na przykład mysql.sock), a nie Inet, bez względu na to, czy localhost jest zadeklarowany w / etc / hosts, czy nie. Jeśli jednak użyjesz adresu IP, nawet 127.0.0.1, zmusisz mysql do otwarcia gniazda Inet.
Fran Marzoa,
1
Czy to oznacza, że ​​wszystkie granty podane w bazie danych MySQL dla „użytkownika”% „localhost” ulegną awarii?
Ośmiornica
24

Miałem ten sam problem i tak go naprawiłem:

Miałem to i to nie działało:

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

Zrobiłem to i zadziałało:

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

Zamiast korzystać z serwera mysql, podłączyłem się bezpośrednio do Unix Socket. Pracował dla mnie.

Caio
źródło
To jedyne rozwiązanie, które zadziałało również dla mnie. Nie mam /var/mysql/mysql.sock. I nie mam /tmp/mysql.sock.
JeffB6688,
próbowałeś 127.0.0.1 zamiast localhost?
Mantisse
21

Gniazdo MySQL znajduje się ogólnie w /tmp/mysql.socklub /var/mysql/mysql.sock, ale prawdopodobnie PHP wygląda w niewłaściwym miejscu.

  1. Sprawdź, gdzie jest twoje gniazdo:

     sudo /usr/libexec/locate.updatedb
  2. Po zakończeniu aktualizacji updatedb:

     locate mysql.sock
  3. Następnie zlokalizuj swój php.ini:

     php -i | grep php.ini

    spowoduje to wyświetlenie czegoś takiego:

     Configuration File (php.ini) Path => /opt/local/etc/php54
     Loaded Configuration File => /opt/local/etc/php54/php.ini
  4. Edytuj swój php.ini

     sudo vim /opt/local/etc/php54/php.ini
  5. Zmień linie:

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

    gdzie /tmp/mysql.sock jest ścieżką do twojego gniazda.

  6. Zapisz zmiany i wyjdź z ESC + SHIFT: x

  7. Uruchom ponownie Apache

     sudo apachectl stop
     sudo apachectl start
rzeczownik
źródło
Nie mam php.ini; Mam tylko php.ini.default, więc wygląda na to, że obejście tutaj jest konieczne: apple.stackexchange.com/questions/65802/… Jednak to nie zadziałało.
user124384
@ user124384 Twoja instalacja prawdopodobnie jest zepsuta: zmień nazwę php.ini.defaultna php.ini.
rzeczownik
Apache można zrestartować za pomocą jednej linii:sudo apachectl restart
fbiazi
11

Jestem na XAMPP na Mac OS X, a powyższe rozwiązanie Briana Lowe'a działało z niewielką modyfikacją .

Plik mysql.sock znajduje się w folderze „/ Applications / xampp / xamppfiles / var / mysql /”. Musiałem więc połączyć go zarówno w / tmp, jak i / var / mysql. Nie sprawdziłem, który jest używany przez wiersz poleceń PHP, ale to naprawiło, więc cieszę się :-)

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
Nirav Mehta
źródło
1
ty - szukałem rozwiązania przez kilka dni i to ten w końcu wszystko naprawił! =) XAMPP na OS X też
ljubiccica
10

Mac OS X EL Capitan + MAMP Pro Zrób to

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

Zrób to

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

Mam nadzieję, że to pozwoli Ci zaoszczędzić trochę czasu.

Jsonras
źródło
To łączący mysql.dockw /tmpktóre go rozwiązać. Dzięki!
Mohammed J. Razem
6

Powodem jest to, że php nie może znaleźć właściwej ścieżki mysql.sock.

Upewnij się, że twój mysql jest uruchomiony jako pierwszy.

Następnie potwierdź mysql.sock, na przykład , która ścieżka jest zlokalizowana/tmp/mysql.sock

następnie dodaj ten ciąg ścieżki do php.ini:

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

Na koniec uruchom ponownie Apache.

brucenan
źródło
6

Gdy napotykasz następujący problem:

Błąd rzucania PHP „Ostrzeżenie: mysql_connect () http: //function.mysql-connect : 2002 Brak takiego pliku lub katalogu (próba połączenia przez unix: ///tmp/mysql.sock)”

Ustaw „mysql.default_socket” wartość w /etc/php.iniDo

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

Następnie uruchom ponownie usługę sieci web w serwerze administratora

Cristian
źródło
To była dla mnie najlepsza odpowiedź - w moim przypadku korzystam z MAMP, dodałem do php.ini: mysqli.default_socket = /Applications/MAMP/tmp/mysql/mysql.sock mysql.default_socket = / Aplikacje / MAMP / tmp /mysql/mysql.sock
Adamski
1

Innym rozwiązaniem jest naprawienie położenia gniazda w pliku konfiguracyjnym php.ini w następujący sposób:

pdo_mysql.default_socket=/tmp/mysql.sock

Oczywiście dowiązanie symboliczne również działa, więc kwestią preferencji jest to, który zmienisz.

Michael Böckling
źródło
1

Podczas instalacji php53-mysql przy użyciu portu zwraca następujący komunikat, który jest rozwiązaniem tego problemu:

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
źródło
Korzystam z Mountain Lion i zainstalowałem MySQL przy użyciu Macports.
Sheric
1

miałem ten sam problem

[PDOException] SQLSTATE [HY000] [2002] Brak takiego pliku lub katalogu

[ErrorException] Ostrzeżenie: PDO :: __ construct (): [2002] Brak takiego pliku lub katalogu (próba połączenia przez unix: ///var/mysql/mysql.sock) w… htdocs / Symfony / vendor / doctrine-dbal / lib / Doctrine / DBAL / Driver / PDOConnection.php

Rozwiązaniem jest więc utworzenie dowiązania symbolicznego do pliku skarpety, co rozwiąże problem. Wykonaj następujące czynności, aby to rozwiązać:

$ sudo mkdir / private / var / mysql /

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

źródło: http://www.reecefowell.com/2012/07/21/symfony2-cli-does-not-connect-to-mysql-while-browser-works-fine/

tanveer ahmad dar
źródło
Opublikuj swoją odpowiedź tutaj, a nie link do zewnętrznej strony internetowej.
ElmerCat
0

Mam te same błędy. Mysql działał jako samodzielna aplikacja przed uruchomieniem phpMyAdmin.

Właśnie zatrzymałem mysql Następnie sudo / Aplikacje / XAMPP / xamppfiles / xampp stop sudo / Aplikacje / XAMPP / xamppfiles / xampp start

Działa dobrze

minhas23
źródło
0

Właśnie miałem ten problem, ale pojawił się tylko podczas ładowania niektórych stron (inne strony działały poprawnie). Okazało się, że dzwoniłem do MySQL po zamknięciu połączenia mysql_close(). Tak jak powiedział @brucenan: upewnij się, że MySQL działa, gdy go wywołujesz .

RoberRM
źródło
0

Możesz to zrobić po prostu aliasingując MAMP php na terminalu Apple:

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

Przykład: > phpmamp - v

Teraz możesz uruchomić coś takiego: > phpmamp scriptname.php

Uwaga: zostanie to zastosowane tylko do bieżącej sesji terminala.

Naresh Chennuri
źródło
0

Ponieważ możesz używać MAMP, zmień port na domyślny 3306 lub użyj 127.0.0.1 w 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
);

Lub przy ustawieniach domyślnych:

$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
źródło
0

Klient mySQL domyślnie próbuje połączyć się przez plik lokalny zwany gniazdem zamiast połączyć się z adresem pętli zwrotnej (127.0.0.1) dla hosta lokalnego.

Domyślna lokalizacja tego pliku gniazda, przynajmniej w OSX, to /tmp/mysql.sock .

SZYBKIE, MNIEJ ELEGANCKIE ROZWIĄZANIE

Utwórz dowiązanie symboliczne, aby oszukać system operacyjny w znalezieniu odpowiedniego gniazda.

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

PRAWIDŁOWE ROZWIĄZANIE

Zmień ścieżkę gniazda zdefiniowaną w startMysql.shpliku w /Applications/MAMP/bin.

rekin
źródło