У меня `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.