Saya mendapatkan `PDOException: SQLSTATE [HY000] [2002] Tidak ada file atau direktori seperti itu` saat menggunakan drush [ditutup]


21

Saya menginstal Drush untuk pertama kalinya (jadi ini mungkin kesalahan konfigurasi) dan saya mencoba memperbarui ke versi inti terbaru dari Drupal.

Drush memberiku kesalahan ini - aku ada di kotak 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
Sudahkah Anda menyelesaikan langkah - langkah ini ? Saya tahu ini mungkin bukan masalah Anda, tetapi mungkin membantu.
Chapabu

Versi drush apa yang Anda gunakan? Ada masalah yang tampaknya identik dengan Anda: drupal.org/node/832472
F1234k

Saya menggunakan versi drush-7.x-4.5 dan drupal 7.9
FLY

menambahkan langkah-langkah yang saya ikuti untuk pertanyaan saya. Jahitan seperti tumpukan yang sama Anda sugessting @ Chapabu
FLY

1
Anda memiliki masalah koneksi PHP / MySQL (tidak terkait Drupal) - stackoverflow.com/questions/2412009/…
Clive

Jawaban:


42

Ini adalah bagaimana saya menyelesaikannya di macOS:

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

Sumber: Bekerja dengan Drush on Mamp .


Bagi saya itu sedang mencari "/ tmp" untuk file mysql.sock. Jadi saya harus membuat symlink di sana untuk menginstal MAMP saya. Hanya FYI untuk siapa saja yang mengalami itu.
Patrick

37

Dalam konfigurasi database Anda di file settings.php untuk situs Drupal, cobalah mengubah host menjadi 127.0.0.1 alih-alih localhost.

ganti default: 'host' => 'localhost',

dengan: 'host' => '127.0.0.1',

Saya mengalami kesalahan ini pada OS X XAMPP, tetapi solusinya juga harus berlaku di sini. Seperti yang disebutkan Clive, ini adalah masalah koneksi MySQL. Posting ini memiliki lebih banyak masalah mendasar.


Solusi yang rapi dan sederhana. Ini bekerja pada basis per-situs, tetapi itu membuat trik di sini.
Ignacio Segura Postigo

Jawaban yang lebih populer tidak bekerja untuk saya (saya menggunakan MAMP Pro), tetapi yang ini tidak. Terima kasih!
Kelley Curry

1
Tidak! Ini mungkin membuat Drush bekerja ... tetapi kemudian menyebabkan Drupal gagal
sea26.2

11

Penjelasan

The PDOException - error 2002 berarti bahwa drush Anda tidak dapat terhubung ke server database MySQL lokal melalui file socket (misalnya /tmp/mysql.sock) seperti yang dikonfigurasi dalam Anda php.ini.

Ini sebenarnya tidak banyak terkait dengan drushitu sendiri, itu adalah konfigurasi PHP Anda dan kesalahan itu dapat direproduksi oleh:

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

Memperbaiki

Jika MySQL Anda berfungsi dengan benar, pastikan kedua file ini:

  1. mysql_config --socket

    atau: mysqladmin variables | grep socket

  2. php -i | grep -w default_socket

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

cocok dan menunjuk ke file yang sama dan keduanya ada.

Jika tidak, periksa yang mana yang benar dengan:

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

kemudian perbaiki masalah dengan salah satu solusi berikut:

  • buat tautan simbolik untuk menunjuk ke mysql.socksoket unix yang berfungsi (untuk MAMP, lihat jawaban Andrew ),

    • misalnya, jika Anda menggunakan MAMP, Anda dapat membuat tautan simbolis ke lokasi default:

      sudo ln -vs /Applications/MAMP/tmp/mysql /var/mysql
  • jalur yang benar dari Anda pdo_mysql.default_socket, mysql.default_socketatau mysqli.default_socketdi Andaphp.ini

  • tentukan unix_socketdi settings.phpdalam $databasesvariabel Anda , mis

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

Penyelesaian masalah

Kasus tepi lainnya dapat berupa:

  • izin salah (mis. ke folder induk),
  • Anda kehabisan ruang,
  • Anda memiliki beberapa versi PHP, periksa apa yang Anda gunakan dan konfigurasi mana yang Anda ubah,
  • Debug dengan XDebug:

    • echo '<?php xdebug_start_trace("/tmp/foo.log");' > init.php
    • drush -c init.php ev 'Database::getConnection("default", "default");'
    • atau atur xdebug.show_exception_trace=1dixdebug.ini
  • Debug: pada OS X dengan sudo dtruss -fn mysqld, di Linux denganstrace
  • Lihat juga: Koneksi MySQL tidak berfungsi: 2002 Tidak ada file atau direktori di SO

6

Saya menggunakan MAMP Pro dan memiliki masalah yang sama. Cara termudah yang dapat saya temukan untuk memperbaikinya adalah dengan menambahkan baris berikut ke $ database array Anda di file settings.php.

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

Secara penuh seharusnya terlihat seperti ini:

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

Kesalahan persis yang saya dapatkan tampak seperti ini:

Pengecualian tanpa tertangkap tambahan dilemparkan saat menangani pengecualian.

Asli

PDOException: SQLSTATE [HY000] [2002] Tidak ada file atau direktori di drupal_is_denied () (baris 2193 dari ...

Tambahan

PDOException: SQLSTATE [HY000] [2002] Tidak ada file atau direktori di _registry_check_code () (baris 3477 dari ...


Perintah Drush diakhiri secara tidak normal karena kesalahan yang tidak dapat dipulihkan.


2
ini adalah perbaikan tercepat dan termudah bagi saya menggunakan MAMP
semut

3

Saya memecahkan ini dengan langkah-langkah berikut, mirip dengan balasan sebelumnya tetapi tidak sama.

Tambahkan symlink:

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

Temukan php.ini yang digunakan:

php -i | grep php.ini

Tambahkan pengaturan berikut ke 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

Ini karena kesalahan konfigurasi dalam konfigurasi PHP / SQL Anda. Di suatu tempat soket yang digunakan server web Anda dan baris perintah menggunakan dikonfigurasi secara berbeda. Saya sarankan memeriksa konfigurasi MySQL Anda untuk melihat apa soket unix digunakan, dan kemudian pastikan nilai yang sama digunakan di semua konfigurasi dan kompilasi php.ini.

Jika Anda tidak dapat memperbaiki konfigurasi, langkah-langkah berikut harus berhasil:

  1. Dapatkan versi pengembangan Drush 5.x (http://ftp.drupal.org/files/projects/drush-All-versions-5.x-dev.tar.gz) dan instal saja. Ini mungkin menyebabkan masalah lain, tetapi secara keseluruhan cukup stabil.
  2. Di situs Drupal Anda, settings.php hapus pengaturan host dan port untuk koneksi database dan tambahkan 'unix_socket' => '/path/to/mysql.sock' untuk menggantinya.

Jika semua ini tampaknya rumit, alternatifnya adalah mengubah host di setting.php dari localhost ke 127.0.0.1. Ini akan membuat situs lebih lambat, tetapi untuk situs pengembangan mungkin tidak terlihat atau penting. Untuk situs produksi, Anda ingin menggunakan soket unix dan harus memilah konfigurasi.


Inilah yang sebenarnya melakukannya. Saya telah mengujinya berkali-kali.
asiby

1

Menemukan cara yang lebih mudah / alternatif untuk menginstal drush pada Mac:

Instal homebrew dengan menempelkan ini di terminal yang berdiri sendiri

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

Kemudian tambahkan drush dengan menjalankan yang berikut ini dari terminal yang sama

brew install drush

Menjalankan status drush berjalan dengan baik sekarang.


1

Jika Anda bekerja dengan instalasi MySQL.com dari MySQL, Anda hanya perlu mengarahkan PHP di lokasi yang tepat untuk .sockfile tersebut.

Di Anda php.ini, tambahkan / ubah dua baris ini:

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

Untuk menemukan lokasi php.ini Anda (mungkin belum ada), gunakan ini

php -i | grep php.ini

Jika php.inifile tersebut belum ada di sana, buatlah.


0

Setuju dengan jawaban lain bahwa Drupal tidak dapat menemukan soket mysql. Jawaban lain membantu saya tetapi tidak lengkap untuk menginstal dengan layanan resmi Oracle Mysql diinstal. Yaitu, lokasi default dari file mysql.sock. Jadi, inilah rekap jawaban yang saya rekomendasikan tergantung pada use case Anda:

Jika menggunakan mysql seperti yang termasuk dalam paket MAMP resmi, gunakan jawaban @Andrew Alexander:

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

Untuk Oracle MYSQL resmi:

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

0

Untuk pengaturan MAMP 4, solusinya adalah memeriksa "Buat versi ini tersedia di baris perintah."

Konfigurasi MAMP


0

Saya mendapat pesan berikut di terminal:

(MAMP PRO + PHP 7)

Perintah Blockquote Drush dihentikan secara tidak normal karena kesalahan yang tidak dapat dipulihkan.
[kesalahan] PDOException: SQLSTATE [HY000] [2002] Tidak ada file atau direktori di Drupal \ Component \ DependencyInjection \ PhpArrayContainer-> createService () Blockquote

Saya memecahkan masalah dengan bantuan instruksi ini


0

Saya lupa bahwa mysql lokal saya berjalan pada nomor port yang unik jadi saya bingung mengapa saya mendapatkan ini sampai saya meninjau konfigurasi saya di situs lokal lain.

$databases['default']['default'] = array (
  'database' => 'hou',
  'username' => 'root',
  'password' => '',
  'prefix' => '',
  'host' => '127.0.0.1',
  'port' => '3306',
  'driver' => 'mysql',
  'collation' => 'utf8mb4_general_ci',
);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.