У мене `PDOException: SQLSTATE [HY000] [2002] Немає такого файлу чи каталогу`, коли використовується drush [закрито]


21

Я вперше встановив Drush (тому це може бути помилка конфігурації) і намагаюся оновити до останньої основної версії Drupal.

Друш дає мені цю помилку - я перебуваю на коробці 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.

1
Ви виконали ці кроки? Я знаю, що це може бути не саме вашою проблемою, але це може допомогти.
Чапабу

Яку версію барабану ви використовуєте? Існує проблема , яка , здається, збігаються з вашими: drupal.org/node/832472
F1234k

Я використовую версію drush-7.x-4.5 та drupal 7.9
FLY

додав кроки, які я дотримувався до свого запитання. Шви на зразок схожих степів, які ви набираєте @Chapabu
FLY

1
У вас проблема з підключенням PHP / MySQL (не пов’язана з Drupal) - stackoverflow.com/questions/2412009/…
Clive

Відповіді:


42

Ось як я вирішив це на macOS:

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

Джерело: Робота з Drush on Mamp .


Для мене він шукав у файлі "/ tmp" файл mysql.sock. Тому мені довелося створити там симпосилання до моєї установки MAMP. Просто FYI для тих, хто стикається з цим.
Патрік

37

У конфігурації вашої бази даних у файлі settings.php для сайту Drupal спробуйте змінити хост на 127.0.0.1 замість localhost.

замініть за замовчуванням: 'host' => 'localhost',

з: 'хост' => '127.0.0.1',

У мене була помилка в OS X XAMPP, але рішення має застосовуватися і тут. Як згадував Клайв, його проблема з підключенням MySQL. У цій публікації детальніше про основну проблему.


Акуратне і просте рішення. Хоча це працює і за кожним сайтом, але тут зроблено фокус.
Ігнасіо Сегура Постіго

Більш популярна відповідь не працює для мене (я використовую MAMP Pro), але ця є. Спасибі!
Келлі Керрі

1
Ні! Це може змусити Друша працювати ... але згодом це спричиняє збій
Друпала

11

Пояснення

PDOException - помилка 2002 означає , що ваш Drush не може підключитися до локального сервера баз даних MySQL через файл сокета (наприклад /tmp/mysql.sock) в відповідно до настройками в вашому php.ini.

Це насправді не дуже пов’язано з drushсамостією, це ваша конфігурація PHP, і ця помилка може бути відтворена:

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

Виправити

Якщо ваш MySQL працює правильно, переконайтеся, що ці два файли:

  1. mysql_config --socket

    або: mysqladmin variables | grep socket

  2. php -i | grep -w default_socket

    або: php -r 'phpinfo();' | grep -w default_socket

збіг та вказує на один і той же файл, і вони обидва існують.

Якщо ні, перевірте, який з них правильний:

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

потім вирішіть проблему одним із наступних рішень:

  • зробіть символічне посилання, щоб вказати на робочий mysql.sockсокет Unix (про MAMP див. відповідь Андрія ),

    • наприклад, якщо ви використовуєте MAMP, ви можете зробити символьне посилання на розташування за замовчуванням:

      sudo ln -vs /Applications/MAMP/tmp/mysql /var/mysql
  • правильний шлях вашого pdo_mysql.default_socket, mysql.default_socketабоmysqli.default_socket в вашомуphp.ini

  • вкажіть unix_socketу settings.phpсвоїй $databasesзмінній, наприклад

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

Вирішення проблем

Інші кейси можуть бути:

  • неправильні дозволи (наприклад, для батьківських папок),
  • у вас немає місця,
  • у вас кілька версій PHP, перевірте, яку саме ви використовуєте та яку конфігурацію ви змінюєте,
  • Налагодження з XDebug:

    • echo '<?php xdebug_start_trace("/tmp/foo.log");' > init.php
    • drush -c init.php ev 'Database::getConnection("default", "default");'
    • або встановити xdebug.show_exception_trace=1у своємуxdebug.ini
  • Налагодження: в ОС X з sudo dtruss -fn mysqld , на Linux зstrace
  • Дивіться також: MySQL не працює: 2002 Немає такого файлу чи каталогу в SO

6

Я використовую MAMP Pro і в мене була ця сама проблема. Найпростіший спосіб, який я міг знайти, щоб виправити це, було додати наступний рядок до масиву баз даних $ у файлі settings.php.

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

У повному обсязі він повинен виглядати так:

$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',
        ),
    ),
);

Точна помилка, яку я отримував, виглядала так:

Додатковий винятковий виняток, кинутий під час обробки винятку.

Оригінал

PDOException: SQLSTATE [HY000] [2002] У файлі drupal_is_denied () немає такого файлу чи каталогу (рядок 2193 з ...

Додатковий

PDOException: SQLSTATE [HY000] [2002] У _registry_check_code () немає такого файлу чи каталогу (рядок 3477 із ...


Команда Drush припиняється аномально через невиправлену помилку.


2
це було найшвидшим та найпростішим виправленням для мене за допомогою MAMP
мураха

3

Я вирішив це за допомогою наступних кроків, подібних до попередніх відповідей, але не тим самим.

Додайте символьне посилання:

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

Знайдіть використовуваний php.ini:

php -i | grep php.ini

Додайте такі параметри до php.ini:

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

1

Це пов’язано з помилкою конфігурації у ваших конфігураціях PHP / SQL. Десь сокет, який використовує ваш веб-сервер і командний рядок, налаштований інакше. Рекомендую перевірити конфігурацію MySQL, щоб побачити, що використовується unix-сокет, а потім переконайтесь, що те саме значення використовується у всіх конфігураціях та компіляціях php.ini.

Якщо ви не можете виправити конфігурацію, слід виконати наступні дії:

  1. Отримайте версію розробки Drush 5.x (http://ftp.drupal.org/files/projects/drush-All-versions-5.x-dev.tar.gz) та встановіть її замість цього. Це може спричинити інші проблеми, але в цілому досить стабільно.
  2. У ваших сайтах Drupal settings.php видаліть настройки хоста та порту для підключення до бази даних та додайте у 'unix_socket' => '/path/to/mysql.sock', щоб замінити їх.

Якщо все це здається складним, альтернативою є зміна хоста в settings.php з localhost на 127.0.0.1. Це зробить сайт повільніше, але для сайту для розробки він може бути не помітним чи важливим. Для виробничого сайту ви хочете використовувати unix-сокет і слід розібратися в конфігурації.


Це справді те, що це робить. Я тестував це незліченну кількість разів.
asiby

1

Знайшов простіший / альтернативний спосіб встановити барабан на Mac:

Встановіть домашню мову , вставивши її в окремий термінал

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

Потім додайте барабан, запустивши наступне з того ж терміналу

brew install drush

Запуск статусу барабану зараз працює нормально.


1

Якщо ви працюєте з установкою MySQL.com MySQL, вам просто потрібно вказати PHP на потрібне місце для .sockфайлу.

У ваших php.ini, додати / змінити ці два рядки:

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

Щоб знайти місце вашого php.ini (воно може ще не існувати), використовуйте це

php -i | grep php.ini

Якщо php.iniфайл там ще не існує, створіть його.


0

Погодьтеся з іншими відповідями, що Drupal не може знайти розетку mysql. Інші відповіді мені допомогли, але були неповними для встановлення з встановленим офіційним сервісом Oracle Mysql. А саме - розташування файлу mysql.sock за замовчуванням. Ось ось резюме моїх рекомендованих відповідей залежно від випадку використання:

Якщо ви використовуєте mysql, включений в офіційний пакет MAMP, використовуйте відповідь @Andrew Alexander:

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

Для офіційного Oracle MYSQL:

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

0

Для налаштування MAMP 4 рішенням було встановлено прапорець "Зробити цю версію доступною в командному рядку".

Конфігурація MAMP


0

У терміналі я отримав таке повідомлення:

(MAMP PRO + PHP 7)

Команда Blockquote Drush припиняється аномально через помилку, яку не можна усунути.
[помилка] PDOException: SQLSTATE [HY000] [2002] Немає такого файлу чи каталогу в Drupal \ Component \ DependencyInjection \ PhpArrayContainer-> createService () Blockquote

Я вирішив проблему за допомогою цих інструкцій


0

Я забув, що мій локальний mysql працює на унікальному номері порту, тому мене збентежило, чому я отримую це, поки не переглянув мою конфігурацію на іншому локальному сайті.

$databases['default']['default'] = array (
  'database' => 'hou',
  'username' => 'root',
  'password' => '',
  'prefix' => '',
  'host' => '127.0.0.1',
  'port' => '3306',
  'driver' => 'mysql',
  'collation' => 'utf8mb4_general_ci',
);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.