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.