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.

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.


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.


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.


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

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

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.


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.


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


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.


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

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/


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


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 .


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.


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
    );

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.