PDOException SQLSTATE [HY000] [2002] Böyle bir dosya veya dizin yok


319

(Çok temel) sitemi fortrabbit'e başarıyla dağıttığımı düşünüyorum, ancak bazı komutları çalıştırmak için SSH'ye bağlanır bağlanmaz ( php artisan migrateveya gibi php artisan db:seed) bir hata mesajı alıyorum:

[PDOException]
SQLSTATE[HY000] [2002] No such file or directory

Bir noktada göç çalışmış olmalı, çünkü tablolarım orada - ama bu neden benim için neden çalışmadığını açıklamıyor.



1
bazen sadece mysql yüklü henüz sığınak çünkü
Hassan Gilak

Yanıtlar:


142

Hata mesajı, soket üzerinden MySQL bağlantısının denendiğini (desteklenmiyor) gösterir.

Laravel (esnaf) bağlamında, muhtemelen farklı / doğru bir ortam kullanmak istiyorsunuz. Örn: php artisan migrate --env=production(veya herhangi bir ortam). Buraya bakın .


1
Sorunumun çözümü buydu, şirketimizdeki geliştiricilerden biri Homestead'i kullanmıyor ve mysql'e soketle bağlanıyor. Soket yapılandırmasını app / database.php dosyamdan kaldırdım. Sorun çözüldü
borislemke

Ben sadece php.ini mysqli.so uzantısı etkinleştirmek zorunda
Mehulkumar

4
Config / database.php dosyasına "'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock'" eklemek zorunda kaldım
Ángel Carlos del Pozo Muela

merhaba topluluk, ben laravel kullanmama rağmen bu hatayı alıyorum sorun burada bakabilirsiniz stackoverflow.com/questions/60796332/…
Kiran Patel

655

Laravel 4: Dosyadaki "host" app/config/database.phpdosyasını "localhost" yerine "127.0.0.1" olarak değiştirin

Laravel 5: Dosyadaki "DB_HOST" .envdosyasını "localhost" yerine "127.0.0.1" olarak değiştirin

Ben de aynı problemi yaşadım. Yukarıdaki çözümlerin hiçbiri benim için işe yaramadı. /App/config/database.php dosyasındaki "ana bilgisayar" ı "localhost" yerine "127.0.0.1" olarak değiştirerek sorunu çözdüm.

Neden "localhost" varsayılan olarak çalışmıyor emin değilim ama ben bu soruyu bir symfony2 yazı çözüldü benzer bir soruda buldum. https://stackoverflow.com/a/9251924/1231563

Güncelleme: Bazı insanlar bu düzeltmenin neden işe yaradığını sordular, bu yüzden konuyla ilgili biraz araştırma yaptım. Bu yayında açıklandığı gibi farklı bağlantı türleri kullanıyor gibi görünüyor https://stackoverflow.com/a/9715164/1231563

Burada ortaya çıkan sorun, "localhost" un UNIX soketi kullanması ve standart dizinde veritabanını bulamamasıdır. Ancak "127.0.0.1" TCP (İletim Kontrol Protokolü) kullanır, bu da temelde bilgisayarınızdaki "yerel internet" üzerinden UNIX soketinden çok daha güvenilir olduğu anlamına gelir.


3
çok benim için bir çözüm olduğunu garip, ama mysql --host = localhost - ile komut satırından bağlayabilirsiniz ama PDO değil çalışır.
John

26
NEDEN localhostişe yaramıyor ve işe yarayıp yaramadığını bilmek isterim 127.0.0.1??
Justin

6
Bu benim için komut satırında (terminal) bir php dosyası çalıştıran bir MAMP sisteminde çalıştı. Bir web sayfası olarak çalıştı, ancak localhost'u '127.0.0.1' olarak değiştirene kadar komut satırı dosyası olarak
çalışmadı

1
@Justin 127.0.0.1 TCP kullanırken, localhost soket kullanmaya çalışır çünkü düşünüyorum.
pebbo

10
A Unix socket file is used if you do not specify a host name or if you specify the special host name localhost. dev.mysql.com/doc/refman/5.7/tr/can-not-connect-to-server.html
x-yuri

94

Aynı sorunu yaşadım ve Mac OS X 10.10 Yosemite kullanıyorum. İşletim sistemi ile birlikte gelen Apache Server ve PHP'yi etkinleştirdim. Sonra mCrypt kütüphanesini başlamak için yapılandırdım. Bundan sonra modeller ve DB ile çalışırken hatayı aldım:

[PDOException]
SQLSTATE[HY000] [2002] No such file or directory

Bulduğum sebep, PHP ve MySQL'in kendilerine bağlanamaması. Bu sorunu gidermek için aşağıdaki adımları izliyorum:

  1. Bir terminal açın ve mysql'e aşağıdakilerle bağlanın:

    mysql -u root -p
  2. Sizden ilgili şifreyi soracaktır. Sonra mysql promt aldıktan sonra sonraki komutu yazın:

    mysql> show variables like '%sock%'
  3. Bunun gibi bir şey alacaksınız:

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
  4. Son satırın değerini koru:

    /tmp/mysql.sock
  5. Senin içinde laravelproje klasörüne için göz DatabaseFunctions.php DB bağlantı parametrelerini yapılandırmak nerede dosyası vardır. Gelen MySQL bölümüne sonunda sonraki satırı ekleyin:

    'unix_socket' => '/tmp/mysql.sock'
  6. Bunun gibi bir şeye sahip olmalısınız:

    'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'SchoolBoard',
            'username'  => 'root',
            'password'  => 'venturaa',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'unix_socket' => '/tmp/mysql.sock',
        ),

Şimdi değişiklikleri kaydedin ve sayfayı yeniden yükleyin ve çalışması gerekir!


3
En "düz" çözüm. Thanx, bu beni Mamp pro ile Laravel koşma sabit
animaacija

Bunun için teşekkürler. Bu benim için çalıştı. OSX 10.10.5 MAMP Pro'yu kullanma
marknt15 5:15

Bu benim için de MAMP pro ve OS X 10.11.x ile çalıştı. Sona erdi:/Applications/MAMP/tmp/mysql/mysql.sock
Bort Plaka

1
+1. Yamartino'nun cevabında söylediği gibi yapılandırmada "localhost" yerine "127.0.0.1" kullanımı iyi çalışıyor ancak bir soketle daha hızlı ve bu cevap sorunu çözüyor. Unix_socket olsa da tanımlandığında mysql "localhost" u böyle tuhaf bir şekilde ele alır ...
Shautieh

@GregFerrell Evet bu doğru ama iyi ... Umarım faydalı olabilir
alexventuraio

51

[PDOException] SQLSTATE[HY000] [2002] No such file or directoryFarklı bir nedenden dolayı hatayla karşılaştım . Ubuntu 12.04'te Apache 2.4.7, PHP v5.5.10 ve MySQL 5.6.16 ile yepyeni bir LAMP yığını oluşturmayı bitirdim. Sitelerimi geri taşıdım ve tetikledim. Ancak, [PDOException]yukarıdaki nedenlerden dolayı Laravel 4.2.x tabanlı sitemi yükleyemedim . php -i | grep pdoBu çizgiyi kontrol ettim ve fark ettim:

pdo_mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock

Ancak, /etc/my.cnf dosyamda aslında çorap dosyası var /var/run/mysqld/mysqld.sock.

Bu yüzden php.ini dosyamı açtım ve değerini ayarladım pdo_mysql.default_socket:

pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock

Sonra apache'yi yeniden başlattım ve kontrol ettim php -i | grep pdo:

pdo_mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock

Bu benim için sorunumu çözdü.


Bu benim için çalıştı düzeltme, sorun ben mysql iki sürümü yüklü ve bir kaldı, 127.0.0.1 değişiklik işe yaramadı veya yapılandırma yapılandırma çorap ekleyerek oldu, teşekkürler! @dcarrith
Luis

2
Bu benim sorunumu bulmama yardımcı oldu - ben MAMP php ikili değil, OSX paketli php kullanıyordum. Bu yüzden doğru php.ini, vb işaret eden php doğru sürümünü kullandığınızdan emin olun. Kesin "doh!" an.
dragonflyesque

43

@Stuyam'ın cevabı benim için "Böyle bir dosya veya dizin yok" sorununu çözdü

Kısa yanıt: /app/config/database.php dosyasındaki "ana bilgisayar" ı "localhost" yerine "127.0.0.1" olarak değiştirin

Ama sonra "Bağlantı reddedildi" hatasıyla karşılaştım. Herkes aynı sorunu vardı, bunun için benim çözüm app / config / local / database.php dosyasını güncellemekti böylece bağlantı noktası 8889:

'mysql' => array(
        'driver'    => 'mysql',
        'host'      => '127.0.0.1',
        'port'      => '8889',
        'database'  => 'databaseName',
        'username'  => 'root',
        'password'  => 'root',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),

4
Benim durumumda, öyleydi 'port' => '33060'ama bu cevap beni oraya getirdi !
mopo922

26

Laravel Homestead kullanıyorsanız, sunucudaki komutları aradığınızdan emin olun.

homestead ssh

Sonra sadece doğru dizine cd ve orada komut ateş.


2
Bu işe yaradı, önce ssh yerine bilgisayarımdan komut çalıştırıyordum ve orada komut çalıştırıyordum.
cmac

Bu adımı daima unuturum. Heh. 1. source ~/.zshrc2. homestead up --provision3.homestead ssh
Marcel

1
vagrant sshbenim durumumda
Marcos Curvello

22

Benim durumumda hiç sorun yaşamadım, sadece mysql servisini başlatmayı unuttum ...

sudo service mysqld start

19

Mamp kullanıcı etkinleştirme seçeneği MYSQL'e ağ erişimine izin ver

resim açıklamasını buraya girin


18

Aşağıdaki örnek gibi database.php dosyasına mysql.sock yolunu ekleyin

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

Eample

'mysql' => [
        'driver' => 'mysql',
        'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '8889'),

18

Bu I değişiklikten sonra çalıştı DB_HOST=localhostetmek DB_HOST=127.0.0.1.env dosyaya


2
Bu işe yaradı, haklısın. Neden localhostişe yaramadığını açıklayan herhangi bir fikriniz var mı?
Fusion

1
@Fusion uygulamanızı bir kap içinde çalıştırıyorsanız, kapsayıcı olarak 'localhost' anlayacaktır, 127.0.0.1, ana bilgisayarın
db'sini

Ayrıca böyle bir sorunum vardı, önbelleği temizleyemedim veya esnaf hizmetini çalıştıramadım
Tom Mwenda

17

Bunun nedeni PDO'nun "localhost" ana bilgisayarına özel davranmasıdır:

Not: Yalnızca Unix: Ana bilgisayar adı "localhost" olarak ayarlandığında, sunucu bağlantısı bir etki alanı soketi aracılığıyla yapılır. PDO_MYSQL libmysqlclient'e göre derlenmişse, soket dosyasının konumu libmysqlclient'in yerinde derlenir. PDO_MYSQL mysqlnd'ye göre derlenmişse, pdo_mysql.default_socket ayarıyla varsayılan bir soket ayarlanabilir.

( http://php.net/manual/en/ref.pdo-mysql.connection.php adresinden )

Localhost'un 127.0.0.1 olarak değiştirilmesi TCP kullanımını "zorlar".

Not: mysqli_connect, localhost ile iyi çalışıyor.


12

@Dcarrith'in yanıtı üzerine inşa ...

Yapılandırma dosyalarını düzenlemek yerine, PHP'nin aradığı konumda gerçek mysql.sock dosyasına bağlanan bir takma ad oluşturdum. ( kaynak )

Sadece bu iki komutu çalıştırın (yeniden başlatma gerekmez):

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

11

Aşama 1

Sadece koşmak için unix_socket yolunu bulun netstat -ln | grep mysql

Böyle bir şey almalısın

unix  2      [ ACC ]     STREAM     LISTENING     17397    /var/run/mysqld/mysqld.sock

Adım 2

Bunu al ve unix_socket parametrenize ekle

'mysql' => array(
            'driver'    => 'mysql',
            'host'      => '67.25.71.187',
            'database'  => 'dbname',
            'username'  => 'username',
            'password'  => '***',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'unix_socket'    => '/var/run/mysqld/mysqld.sock' <-----
            ),
        ),

Umarım yardımcı olur !!


8

MAMP Pro üzerinde çalışıyorum ve (db tabloları oluşturmak) geçirmeye çalışırken bu benzer bir sorun vardı. Bu önerilerden bir kaçını da denedim ama benim için yapmadı.

Basitçe (bir saat çalıştıktan sonra), /config/database.php dosyasına iki şey ekledim.

'port' => '1234',
'unix_socket' => '/path/to/my/socket/mysqld.sock'

Şimdi iyi çalışıyor!


4

Limanı dikkatlice kontrol et. Benim durumumda 8889 oldu ve ben 8888 kullanıyorum. "DB_HOST" değiştirmek "localhost" "127.0.0.1" ve tersi


Harika, teşekkür ederim, limanım 3306 ama gerçek limanım 8889
David

4

Docker kapsayıcılarını kullanarak uygulamamı çalıştırırken bu sorunları yaşadım.

Çözüm docker_compose.ymlDB_HOST üzerinde kullandığım MySQL servis konteynerinin ismini koydu . Benim durumumdadb :

DB_HOST=db

Umarım yardımcı olur.


2

Laravel 5'ten itibaren veritabanı kullanıcı adı ve parolası proje dizininde bulunan .env dosyasına gider, örn.

DB_HOST=127.0.0.1
DB_DATABASE=db1
DB_USERNAME=user1
DB_PASSWORD=pass1

Gördüğünüz gibi, bu ortam değişkenleri burada 'forge' dizelerini geçersiz kılıyor, bu yüzden değiştirmenin bir etkisi yok:

    'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', 'localhost'),
        'database'  => env('DB_DATABASE', 'forge'),
        'username'  => env('DB_USERNAME', 'forge'),
        'password'  => env('DB_PASSWORD', ''),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ],

Daha fazla bilgi burada https://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables


2

Ben Vagrant çevre olarak Elixir / Gulp ve Homestead PHPUnit çalıştırırken bu sorunla karşılaştım.

Benim durumumda ben den .env dosyayı düzenleyen DB_HOST=localhostiçin DB_HOST=192.168.10.10nerede 192.168.10.10benim Serseri / Homestead ana bilgisayarın IP olduğunu.


2

Localhost'a bağlanmaya çalışın:

SQLSTATE[HY000] [2002] No such file or directory

127.0.0.1'e bağlanmaya çalışın:

SQLSTATE[HY000] [2002] Connection refused

Tamam, aşağıdaki ayarı almak için my.cnf dosyasından (OS X 10.5:) yorum yapın / kaldırın /opt/local/etc/mysqlxx/my.cnf:

[mysqld]
# skip-networking

Tabii ki, MySQL Server'ı durdurun ve başlatın.


2

Drupal web siteme erişirken benzer sorunlar yaşadım. Komut satırını açıp MySQL sunucumu veya hizmetimi yeniden başlatarak düzelttim:

service mysqld restart

Bu çalışmalı. Başlamazsa, yerel web sunucunuzu yeniden başlatın:

service httpd restart

O kadarı yeterli olacaktır. Umarım diğer ortamlar için de çalışır. Bu komutların genellikle süper kullanıcı ayrıcalıkları gerektirdiğini unutmayın.


1

Laravel Homestead kullanıyorsanız, ayarlar

(Vagrant-Sanal Makinesi dahil)

.bash profilli

alias vm="ssh vagrant@127.0.0.1 -p 2222"

DatabaseFunctions.php

    'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', '127.0.0.1'),
        'database'  => env('DB_DATABASE', 'homestead'),
        'username'  => env('DB_USERNAME', 'homestead'),
        'password'  => env('DB_PASSWORD', 'secret'),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ],

terminal

vm

vagrant@homestead:~/Code/projectFolder  php artisan migrate:install

1

Hala yanıt arayan varsa, .env dosyanızı kontrol etmeniz yeterlidir. Nedense laravel bir .env.example dosyası oluşturduğundan tüm bu yanıtlar benim için çalışmadı. .Env.example dosyasını .env olarak yeniden adlandırmayla ilgili sorunumu çözdüm


Bu sorunun tek bir doğru cevabı yoktur çünkü yapılabilecek çeşitli hatalar vardır. .Env dosyasını uzak bir sunucuya kopyalayamadığı için bu bunlardan biri. Bu nedenle, hem var olduğundan hem de bağlantı kurmak için gerekli bilgileri içerdiğinden emin olmak için sorguyu çalıştırmaya çalıştığınız sunucudaki .env dosyasını kontrol etmeye değer.
petercoles

1

Bu benim başıma geldi çünkü MySQL çalışmıyor. Dizim eksik olduğu için MySQL başlatılamadı /usr/local/etc/my.cnf.d/.

Bu /usr/local/etc/my.cnfglob include ( include /usr/local/etc/my.cnf.d/*.cnf) olarak benim yapılandırma dosyası tarafından gerekiyordu .

Çalıştırılması mkdir /usr/local/etc/my.cnf.dve ardından MySQL'in başlatılması sorunu çözdü.


1

Benim durumumda, ben vagrant içine ssh ve oradan çalıştırmak gerektiğinde, benim mac terminalinde php esnaf göç çalışıyordu. Umut etmek birisi baş ağrısı yardımcı olur.


1

dbDocker_compose.yml dosyasında Docker ve MySQL hizmet adını kullanarak aynı sorunu vardı :

.envDosyaya aşağıdakileri ekledim :

DB_HOST=db

Ayrıca barındırıcınızın php uygulamasından bulunabilir olduğundan emin olmalısınız.

PHP, bağlanmak için hangi ana bilgisayarı kullanacağını anlamamıştı.


0

Bir VirtualMachine kullanırken o makineye ssh emin olun ve App klasörünüze gidin ve oradan php artisan migrate komutunu arayın.


0

Belki de sadece

vagrant up

onun yerine

homestead up

homestead kullanarak forge larval kurulum için. Bunun sitenin sunulduğu anlamına geldiğini varsayıyorum, ancak MySQL sunucusu hiç önyüklenmedi. Vagrant kutumu başlatmak için ikinci komutu kullandığımda hata ortadan kalktı.


0

Tüm bu cevaplar ağır kaldırma gibi görünüyor ...

Az önce bir .envdosya oluşturdum ; dosyamı düzenledi bootstrap/app.phpve şu satırı uncommented etti ...

Dotenv::load(__DIR__.'/../');

Umarım bu birine yardımcı olur


0

Yeni bir db bağlantısı oluşturmaya çalışan herkes için laravel değil ama burada Terminal PDO çalıştırmak için cevap arayan çarptı. Bu size yardımcı olacaktır. Ve sizin için en iyi şekilde çalışmak için yeniden düzenleyebilirsiniz.

<?php

class db
{
   private $DBHOST = 'localhost'; // you don't need 127.0.0.1
   private $DRIVER = 'mysql';
   private $PORT   = '8888'; // database port. 8888 is mine
   private $DB     = 'example-db';
   private $PASS   = 'example-pass';
   private $USER   = 'root';
   private $SOCKS  = ''; // can fill this or leave blank.


   // - connect (dummy connection)
   private function con()
   {
       if ($this->SOCKS == '')
       {
           // run shell command to get 
           $socks = shell_exec('netstat -ln | grep mysql');
           $socks = trim(substr($socks, strpos($socks, '/')));

           $this->SOCKS = strlen($socks) > 0 ? ';unix_socket='.$socks : '';
       }
       else
       {
          $this->SOCKS = ';unix_socket='.$this->SOCKS;
       }

       $dsn = $this->DRIVER.':host='.$this->DBHOST.';dbname='.$this->DB;

       // add socks
       $dsn .= $this->SOCKS;

       // add port
       $dsn .= (strlen($this->PORT) > 0) ? ';port='.$this->PORT : '';

       // extablish connection
       $con = new PDO($dsn, $user, $pass);

       // return PDO instance.
       return $con;
   }
   // - ends here

   // now you can call $this->con() within class to use connection 
   // would run fine on any terminal

} 

Umarım yardımcı olur!


0

Benim durumumda bootstrap / cache klasörünü kaldırıp tekrar denemek zorunda kaldım.

Benim senaryom sunucu geçişinden sonra oldu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.