Mam `PDOException: SQLSTATE [HY000] [2002] Brak takiego pliku lub katalogu` przy użyciu drush [zamknięty]

21

Zainstalowałem Drusha po raz pierwszy (więc może to być błąd konfiguracji) i próbuję zaktualizować do najnowszej podstawowej wersji Drupala.

Drush podaje mi ten błąd - jestem na polu OSX.

dev5:clientnamedirectory my.name$ drush pm-update projects drupal-7.25
<h1>Additional uncaught exception thrown while handling exception.</h1>

<h2>Original</h2><p>PDOException: SQLSTATE[HY000] [2002] No such file or directory in drupal_get_installed_schema_version() (line 155 of /Users/my.name/Sites/proface/includes/install.inc).</p>

<h2>Additional</h2>

<p>PDOException: SQLSTATE[HY000] [2002] No such file or directory in system_list() (line 165 of /Users/my.name/Sites/clientnamedirectory/includes/module.inc).</p><hr />

Drush command terminated abnormally due to an unrecoverable error.
Jack Ryan
źródło
1
Czy wykonałeś te kroki? Wiem, że to nie może być twój problem, ale może pomóc.
Chapabu
Z jakiej wersji drusha korzystasz? Istnieje problem, który wydaje się być identyczny z twoim: drupal.org/node/832472
F1234k
Używam wersji drush-7.x-4.5 i drupal 7.9
FLY
dodał kroki, które wykonałem do mojego pytania. Szwy jak podobne paski, które sugerujesz @Chapabu
FLY
1
Masz problem z połączeniem PHP / MySQL (niezwiązany z Drupalem) - stackoverflow.com/questions/2412009/…
Clive

Odpowiedzi:

42

Oto jak rozwiązałem to na macOS:

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

Źródło: Praca z Drushem na Mampie .

Jack Ryan
źródło
Dla mnie szukał w „/ tmp” pliku mysql.sock. Musiałem więc utworzyć tam dowiązanie symboliczne do mojej instalacji MAMP. Tylko FYI dla każdego, kto na to wpadnie.
Patrick
37

W konfiguracji bazy danych w pliku settings.php dla witryny Drupal, spróbuj zmienić hosta na 127.0.0.1 zamiast localhost.

zamień domyślny: „host” => „localhost”,

z: „host” => „127.0.0.1”,

Wystąpił ten błąd w systemie OS X XAMPP, ale rozwiązanie również powinno mieć zastosowanie. Jak wspomniał Clive, jest to problem z połączeniem MySQL. Ten post zawiera więcej informacji na temat problemu.

darkcody
źródło
Schludne i proste rozwiązanie. Działa to jednak w odniesieniu do poszczególnych witryn, ale udało się tutaj.
Ignacio Segura Postigo,
Bardziej popularna odpowiedź nie działa dla mnie (używam MAMP Pro), ale ta działa. Dzięki!
Kelley Curry
1
Nie! To może sprawić, że Drush zadziała ... ale później spowoduje awarię Drupala
morze26.2
11

Wyjaśnienie

PDOException - błąd 2002 oznacza, że drush nie może połączyć się z serwerem bazy danych MySQL za pośrednictwem lokalnego pliku gniazda (na przykład /tmp/mysql.sock) jako skonfigurowany w twojej php.ini.

To nie jest tak naprawdę związane z drushsamym sobą, to twoja konfiguracja PHP i ten błąd może być odtworzony przez:

php -r "new PDO('mysql:host=localhost;port=3306;charset=utf8;dbname=dbname', 'root', 'root');"

Naprawić

Jeśli twój MySQL działa poprawnie, upewnij się, że te dwa pliki:

  1. mysql_config --socket

    lub: mysqladmin variables | grep socket

  2. php -i | grep -w default_socket

    lub: php -r 'phpinfo();' | grep -w default_socket

dopasowanie i wskazuje ten sam plik i oba istnieją.

Jeśli nie, sprawdź, który z nich jest poprawny:

mysql --socket=/path/to/mysql.sock

następnie rozwiąż problem za pomocą jednego z następujących rozwiązań:

  • utwórz dowiązanie symboliczne, aby wskazać działające mysql.sockgniazdo unixowe (w przypadku MAMP patrz odpowiedź Andrew ),

    • na przykład, jeśli używasz MAMP, możesz utworzyć symboliczny link do domyślnej lokalizacji:

      sudo ln -vs /Applications/MAMP/tmp/mysql /var/mysql
  • poprawna ścieżka twojego pdo_mysql.default_socket, mysql.default_socketlub mysqli.default_sockettwojegophp.ini

  • podaj unix_socketw settings.phpswojej $databaseszmiennej, np

    $databases['default']['default'] = array(
      // ...
      'unix_socket' => '/var/mysql/mysql.sock',

Rozwiązywanie problemów

Inne przypadki na krawędziach mogą być:

  • złe uprawnienia (np. do folderów nadrzędnych),
  • brakuje ci miejsca
  • masz wiele wersji PHP, sprawdź, którego dokładnie używasz i którą konfigurację zmieniasz,
  • Debuguj za pomocą XDebug:

    • echo '<?php xdebug_start_trace("/tmp/foo.log");' > init.php
    • drush -c init.php ev 'Database::getConnection("default", "default");'
    • lub ustaw xdebug.show_exception_trace=1w swoimxdebug.ini
  • Debugowanie: w systemie OS X za pomocą sudo dtruss -fn mysqld, w systemie Linux za pomocąstrace
  • Zobacz także: Połączenie MySQL nie działa: 2002 Brak takiego pliku lub katalogu w SO
kenorb
źródło
6

Używam MAMP Pro i miałem ten sam problem. Najłatwiejszym sposobem, aby to naprawić, było dodanie następującego wiersza do tablicy $ bazy danych w pliku settings.php.

'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',

W całości powinno to wyglądać tak:

$databases = array (
    'default' =>
     array (
        'default' =>
        array (
            'database' => 'your_database_name',
            'username' => 'username',
            'password' => 'password',
            'host' => 'localhost',
            'port' => '',
            'driver' => 'mysql',
            'prefix' => '',
            'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
        ),
    ),
);

Dokładny błąd, który się pojawiał, wyglądał tak:

Zgłoszono dodatkowy nieprzechwycony wyjątek podczas obsługi wyjątku.

Oryginalny

PDOException: SQLSTATE [HY000] [2002] Brak takiego pliku lub katalogu w drupal_is_denied () (wiersz 2193 z ...

Dodatkowy

PDOException: SQLSTATE [HY000] [2002] Brak takiego pliku lub katalogu w _registry_check_code () (wiersz 3477 z ...


Polecenie Drush zostało zakończone nienormalnie z powodu nieodwracalnego błędu.

digitalblake
źródło
2
było to dla mnie najszybsze i najłatwiejsze rozwiązanie przy użyciu MAMP
ant
3

Rozwiązałem to, wykonując następujące kroki, podobne do poprzednich odpowiedzi, ale nie takie same.

Dodaj dowiązanie symboliczne:

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

Znajdź używany plik php.ini:

php -i | grep php.ini

Dodaj następujące ustawienia do php.ini:

pdo_mysql.default_socket= /var/mysql/mysql.sock
mysql.default_socket = /var/mysql/mysql.sock
mysqli.default_socket = /var/mysql/mysql.sock
ryrye
źródło
1

Jest to spowodowane błędem konfiguracji w konfiguracjach PHP / SQL. Gdzieś gniazdo używane przez twój serwer WWW i linie poleceń są skonfigurowane inaczej. Polecam sprawdzenie konfiguracji MySQL, aby zobaczyć, które gniazdo UNIX jest używane, a następnie upewnić się, że ta sama wartość jest używana we wszystkich konfiguracjach i kompilacjach php.ini.

Jeśli nie możesz naprawić konfiguracji, powinny działać następujące kroki:

  1. Pobierz wersję rozwojową Drush 5.x (http://ftp.drupal.org/files/projects/drush-All-versions-5.x-dev.tar.gz) i zainstaluj ją zamiast tego. Może to powodować inne problemy, ale ogólnie jest dość stabilne.
  2. W ustawieniach witryn Drupal.php usuń ustawienia hosta i portu dla połączenia z bazą danych i dodaj „unix_socket” => '/path/to/mysql.sock', aby je zastąpić.

Jeśli wszystko wydaje się skomplikowane, alternatywą jest zmiana hosta w pliku setting.php z localhost na 127.0.0.1. Spowoduje to spowolnienie witryny, ale w przypadku witryny programistycznej może nie być zauważalna lub ważna. W przypadku strony produkcyjnej chcesz użyć gniazda unix i powinieneś uporządkować konfigurację.

Kjartan
źródło
To naprawdę to robi. Testowałem to niezliczoną ilość razy.
asiby
1

Znaleziono łatwiejszy / alternatywny sposób instalacji drush na komputerze Mac:

Zainstaluj homebrew , wklejając go w samodzielnym terminalu

/usr/bin/ruby -e "$(curl -fsSL https://raw.github.com/gist/323731)"

Następnie dodaj drush, uruchamiając następujące polecenie z tego samego terminala

brew install drush

Uruchamianie statusu drush działa teraz dobrze.

LATAĆ
źródło
1

Jeśli pracujesz z instalacją MySQL.com w MySQL, wystarczy wskazać PHP we właściwej lokalizacji dla .sockpliku.

W swoim php.inidodaj / zmień te dwa wiersze:

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

Aby znaleźć lokalizację pliku php.ini (może jeszcze nie istnieć), użyj tego

php -i | grep php.ini

Jeśli php.iniplik jeszcze tam nie istnieje, utwórz go.

Chris Burgess
źródło
0

Zgadzam się z innymi odpowiedziami, że Drupal nie może znaleźć gniazda mysql. Inne odpowiedzi pomogły mi, ale były niekompletne z powodu zainstalowania oficjalnej usługi Oracle Mysql. Mianowicie domyślna lokalizacja pliku mysql.sock. Oto podsumowanie moich zalecanych odpowiedzi w zależności od przypadku użycia:

Jeśli używasz mysql zawartego w oficjalnym pakiecie MAMP, użyj odpowiedzi @Andrew Alexander:

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

W przypadku oficjalnej bazy danych Oracle MYSQL:

sudo mkdir /var/mysql
sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock
bdombro
źródło
0

W przypadku konfiguracji MAMP 4 rozwiązaniem było sprawdzenie „Udostępnij tę wersję w wierszu polecenia”.

Konfiguracja MAMP

Shaun Dychko
źródło
0

W terminalu dostałem następujący komunikat:

(MAMP PRO + PHP 7)

Komenda Blockquote Drush została zakończona nienormalnie z powodu niemożliwego do naprawienia błędu.
[błąd] PDOException: SQLSTATE [HY000] [2002] Brak takiego pliku lub katalogu w bloku Drupal \ Component \ DependencyInjection \ PhpArrayContainer-> createService ()

Rozwiązałem problem za pomocą tych instrukcji

Lesley N.
źródło
0

Zapomniałem, że mój lokalny mysql działa na unikalnym numerze portu, więc byłem zdezorientowany, dlaczego to otrzymałem, dopóki nie sprawdziłem mojej konfiguracji na innej stronie lokalnej.

$databases['default']['default'] = array (
  'database' => 'hou',
  'username' => 'root',
  'password' => '',
  'prefix' => '',
  'host' => '127.0.0.1',
  'port' => '3306',
  'driver' => 'mysql',
  'collation' => 'utf8mb4_general_ci',
);
powpow12
źródło