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


21

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

Drush дает мне эту ошибку - я на OSX box.

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
Вы завершили эти шаги? Я знаю, что это не совсем ваша проблема, но это может помочь.
Чапабу

Какую версию drush вы используете? Существует проблема, которая, похоже, совпадает с вашей: 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 на Mamp .


Для меня он искал в "/ tmp" файл mysql.sock. Поэтому мне пришлось создать там символическую ссылку на мою установку MAMP. Просто FYI для тех, кто сталкивается с этим.
Патрик

37

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

замените значение по умолчанию: 'host' => 'localhost',

с: 'host' => '127.0.0.1',

Я имел эту ошибку на OS X XAMPP, но решение должно применяться и здесь. Как упоминал Клайв, это проблема с подключением к MySQL. Этот пост имеет больше по основной проблеме.


Аккуратное и простое решение. Это работает на основе сайта, хотя, но это добилось цели здесь.
Игнасио Сегура Постиго

Более популярный ответ не работает для меня (я использую MAMP Pro), но этот работает. Благодарность!
Келли Карри

1
Нет! Это может привести к тому, что Drush сработает ... но впоследствии это приведет к сбою Drupal
sea26.2

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

Fix

Если ваш 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
  • Отладка: на OS X с sudo dtruss -fn mysqld, на Linux сstrace
  • См. Также: MySQL соединение не работает: 2002 Нет такого файла или каталога в SO

6

Я использую MAMP Pro, и у меня была такая же проблема. Самым простым способом, который я смог найти, чтобы исправить это, было добавление следующей строки в ваш массив $ database в файле 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
ant

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' для их замены.

Если все это кажется сложным, альтернативой является изменение хоста в setting.php с localhost на 127.0.0.1. Это замедлит работу сайта, но для сайта разработки это может быть незаметным или важным. Для производственного сайта вы хотите использовать сокет Unix и должны разобраться в конфигурации.


Это действительно то, что делает это. Я проверял это бесчисленное количество раз.
asiby

1

Найден более простой / альтернативный способ установки Drush на Mac:

Установите homebrew , вставив его в отдельный терминал

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

Затем добавьте drush, запустив следующее из того же терминала

brew install drush

Статус запущенного дроша теперь работает нормально.


1

Если вы работаете с установкой MySQL на MySQL.com, вам просто нужно указать 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)

Команда Bloquote 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.