PDOException SQLSTATE [HY000] [2002] Không có tệp hoặc thư mục như vậy


319

Tôi tin rằng tôi đã triển khai thành công trang web (rất cơ bản) của mình lên fortrabbit, nhưng ngay khi tôi kết nối với SSH để chạy một số lệnh (chẳng hạn như php artisan migratehoặc php artisan db:seed), tôi nhận được thông báo lỗi:

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

Tại một số điểm, việc di chuyển phải hoạt động, bởi vì các bảng của tôi ở đó - nhưng điều này không giải thích tại sao nó không hoạt động với tôi bây giờ.



1
đôi khi chỉ vì bạn chưa cài đặt mysql
Hassan Gilak

Câu trả lời:


142

Thông báo lỗi cho biết kết nối MySQL qua ổ cắm đã được thử (không được hỗ trợ).

Trong bối cảnh của Laravel (nghệ nhân), có lẽ bạn muốn sử dụng một môi trường khác / chính xác. Vd: php artisan migrate --env=production(hoặc bất cứ môi trường nào). Xem tại đây .


1
Đây là giải pháp cho vấn đề của tôi, một trong những nhà phát triển tại công ty chúng tôi không sử dụng Homestead và kết nối với mysql thông qua socket. Tôi đã gỡ bỏ cấu hình socket trong tệp app / database.php của mình. Vấn đề đã được giải quyết
borislemke

Tôi vừa phải kích hoạt tiện ích mở rộng mysqli.so trong php.ini
Mehulkumar

4
Tôi đã phải thêm "'unix_socket' => '/Appluggest/MAMP/tmp/mysql/mysql.sock'" vào cấu hình / cơ sở dữ liệu.php
Ángel Carlos del Pozo Muela

xin chào cộng đồng, tôi đang gặp phải lỗi này mặc dù tôi không sử dụng laravel, bạn có thể xem vấn đề ở đây là stackoverflow.com/questions/60796332/
Kiran Patel

655

Laravel 4: Thay đổi "máy chủ" trong app/config/database.phptệp từ "localhost" thành "127.0.0.1"

Laravel 5: Thay đổi "DB_HOST" trong .envtệp từ "localhost" thành "127.0.0.1"

Tôi cũng có chính xác vấn đề đấy. Không có giải pháp nào ở trên làm việc cho tôi. Tôi đã giải quyết vấn đề bằng cách thay đổi "máy chủ" trong tệp /app/config/database.php từ "localhost" thành "127.0.0.1".

Không chắc chắn tại sao "localhost" không hoạt động theo mặc định nhưng tôi đã tìm thấy câu trả lời này trong một câu hỏi tương tự được giải trong bài đăng symfony2. https://stackoverflow.com/a/9251924/1231563

Cập nhật: Một số người đã hỏi tại sao sửa lỗi này hoạt động vì vậy tôi đã thực hiện một chút nghiên cứu về chủ đề này. Có vẻ như họ sử dụng các loại kết nối khác nhau như được giải thích trong bài đăng này https://stackoverflow.com/a/9715164/1231563

Vấn đề nảy sinh ở đây là "localhost" sử dụng ổ cắm UNIX và không thể tìm thấy cơ sở dữ liệu trong thư mục chuẩn. Tuy nhiên "127.0.0.1" sử dụng TCP (Giao thức điều khiển truyền), về cơ bản có nghĩa là nó chạy qua "internet cục bộ" trên máy tính của bạn đáng tin cậy hơn nhiều so với ổ cắm UNIX trong trường hợp này.


3
lạ là nó cũng là giải pháp cho tôi, nhưng tôi có thể kết nối từ dòng lệnh với mysql --host = localhost - hoạt động, nhưng không phải từ PDO.
Giăng

26
Tôi rất muốn biết TẠI SAO localhostkhông hoạt động và 127.0.0.1làm gì ??
Justin

6
Điều này làm việc cho tôi trên một hệ thống MAMP chạy tệp php trên dòng lệnh (terminal). Nó hoạt động như một trang web, nhưng không phải là một tệp dòng lệnh cho đến khi tôi thay đổi localhost thành '127.0.0.1'
Samuel Fullman

1
@Justin Tôi nghĩ đó là vì localhost cố gắng sử dụng socket, trong khi 127.0.0.1 sử dụng TCP.
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/en/can-not-connect-to-server.html
x-yuri

94

Tôi gặp vấn đề tương tự và tôi đang chạy Mac OS X 10.10 Yosemite. Tôi đã kích hoạt Máy chủ Apache và PHP đi kèm với HĐH. Sau đó, tôi chỉ cần cấu hình thư viện mCrypt để bắt đầu. Sau đó khi tôi đang làm việc với các mô hình và DB tôi đã gặp lỗi:

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

Lý do tôi tìm thấy là vì PHP và MySQL không thể tự kết nối. Để khắc phục sự cố này, tôi làm theo các bước tiếp theo:

  1. Mở một thiết bị đầu cuối và kết nối với mysql bằng:

    mysql -u root -p
  2. Nó sẽ hỏi bạn mật khẩu liên quan. Sau đó, khi bạn nhận được mã thông báo mysql, hãy gõ lệnh tiếp theo:

    mysql> show variables like '%sock%'
  3. Bạn sẽ nhận được một cái gì đó như thế này:

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
  4. Giữ giá trị của hàng cuối cùng:

    /tmp/mysql.sock
  5. Trong laravelthư mục dự án của bạn , hãy tìm tệp tin cơ sở dữ liệu có nơi bạn định cấu hình các tham số kết nối DB. Trong phần mysql thêm dòng tiếp theo ở cuối:

    'unix_socket' => '/tmp/mysql.sock'
  6. Bạn phải có một cái gì đó như thế này:

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

Bây giờ chỉ cần lưu các thay đổi và tải lại trang và nó phải hoạt động!


3
Giải pháp "thẳng vấn đề" nhất. Thanx, điều này đã cố định tôi khi chạy Laravel với MAMP pro
animaacija

Cảm ơn vì điều đó. Điều này làm việc cho tôi. Sử dụng OSX 10.10.5 MAMP Pro
marknt15

Điều này cũng làm việc với tôi với MAMP pro và OS X 10.11.x. Kết thúc là:/Applications/MAMP/tmp/mysql/mysql.sock
Biển số Bort

1
+1. Sử dụng "127.0.0.1" trong cấu hình thay vì "localhost" như Yamartino đã nói trong câu trả lời của mình hoạt động tốt nhưng nó nhanh hơn với một ổ cắm và câu trả lời này giải quyết vấn đề. Đó là một mysql xấu hổ đối xử với "localhost" theo cách kỳ dị như vậy khi unix_socket được xác định mặc dù ...
Shautieh

@GregFerrell Vâng đúng vậy nhưng tôi hy vọng nó có thể hữu ích
alexventuraio

51

Tôi gặp [PDOException] SQLSTATE[HY000] [2002] No such file or directorylỗi vì một lý do khác. Tôi vừa hoàn thành việc xây dựng một ngăn xếp LAMP hoàn toàn mới trên Ubuntu 12.04 với Apache 2.4.7, PHP v5.5.10 và MySQL 5.6.16. Tôi di chuyển các trang web của tôi trở lại và sa thải chúng. Nhưng, tôi không thể tải trang web dựa trên Laravel 4.2.x của mình vì những điều [PDOException]trên. Vì vậy, tôi đã kiểm tra php -i | grep pdovà nhận thấy dòng này:

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

Nhưng, trong /etc/my.cnf của tôi, tập tin sock thực sự nằm trong /var/run/mysqld/mysqld.sock.

Vì vậy, tôi đã mở php.ini của mình và đặt giá trị cho pdo_mysql.default_socket:

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

Sau đó, tôi khởi động lại apache và kiểm tra php -i | grep pdo:

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

Điều đó đã sửa nó cho tôi.


Đây là cách khắc phục hiệu quả với tôi, vấn đề là tôi đã cài đặt hai phiên bản mysql và loại bỏ một phiên bản, thay đổi 127.0.0.1 không hoạt động hoặc thêm sock trong cấu hình, cảm ơn! @dcarrith
Luis

2
Điều này giúp tôi tìm ra vấn đề của mình - đó là tôi đang sử dụng php gói OSX, không phải là nhị phân MAMP php. Vì vậy, hãy chắc chắn rằng bạn đang sử dụng đúng phiên bản php trỏ đến php.ini chính xác, v.v ... Xác định "doh!" chốc lát.
chuồn chuồn

43

Câu trả lời từ @stuyam đã giải quyết vấn đề "Không có tệp hoặc thư mục như vậy" đối với tôi

Câu trả lời ngắn: Thay đổi "máy chủ" trong tệp /app/config/database.php từ "localhost" thành "127.0.0.1"

Nhưng sau đó tôi đã có một lỗi "Kết nối bị từ chối". Nếu bất cứ ai có cùng một vấn đề, giải pháp của tôi cho việc này là cập nhật tệp app / config / local / database.php để cổng là 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
Trong trường hợp của tôi, nó đã được 'port' => '33060'nhưng câu trả lời này đã đưa tôi đến đó!
mopo922

26

Nếu bạn đang sử dụng Laravel Homestead, hãy đảm bảo bạn đang gọi các lệnh trên máy chủ.

homestead ssh

Sau đó, chỉ cần cd vào thư mục bên phải và bắn lệnh của bạn ở đó.


2
Điều này đã làm việc, tôi đã chạy lệnh từ máy tính của tôi thay vì ssh vào VM trước và chạy lệnh ở đó.
cmac

Tôi luôn quên bước này. Heh. 1. source ~/.zshrc2. homestead up --provision3.homestead ssh
Marcel

1
vagrant sshtrong trường hợp của tôi
Marcos Curvello

22

Trong trường hợp của tôi, tôi không có vấn đề gì cả, chỉ quên khởi động dịch vụ mysql ...

sudo service mysqld start

19

Tùy chọn kích hoạt người dùng Mamp Cho phép truy cập mạng vào MYSQL

nhập mô tả hình ảnh ở đây


18

Thêm đường dẫn mysql.sock trong tệp tin cơ sở dữ liệu như ví dụ dưới đây

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

Mẫu

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

18

Nó hoạt động sau khi tôi thay đổi từ DB_HOST=localhostthành DB_HOST=127.0.0.1.env file


2
Điều này đã làm việc, bạn đã đúng. Bạn có ý tưởng nào giải thích tại sao localhostnó không hoạt động không?
Hợp nhất

1
@Fusion nếu bạn đang chạy ứng dụng của mình trong một container, nó sẽ hiểu 'localhost' là container, 127.0.0.1 bảo nó sử dụng db của máy chủ
deathemaoh

Tôi cũng gặp vấn đề như vậy, không thể xóa bộ nhớ cache hoặc chạy phục vụ nghệ nhân
Tom Mwenda

17

Điều này là do PDO đối xử đặc biệt với máy chủ lưu trữ "localhost":

Lưu ý: Chỉ Unix: Khi tên máy chủ được đặt thành "localhost", thì kết nối đến máy chủ được thực hiện thông qua một ổ cắm tên miền. Nếu PDO_MYSQL được biên dịch theo libmysqlclient thì vị trí của tệp socket là tại libmysqlclient được biên dịch tại vị trí. Nếu PDO_MYSQL được biên dịch dựa trên mysql và một ổ cắm mặc định có thể được đặt thông qua cài đặt pdo_mysql.default_socket.

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

Thay đổi localhost thành 127.0.0.1 sẽ "ép buộc" việc sử dụng TCP.

Lưu ý: mysqli_connect đang hoạt động tốt với localhost.


12

Dựa trên câu trả lời từ @dcarrith ...

Thay vì chỉnh sửa các tệp cấu hình, tôi đã tạo một bí danh ở vị trí mà PHP đang tìm kiếm kết nối với mysql.sock thực. ( nguồn )

Chỉ cần chạy hai lệnh này (không cần khởi động lại):

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

11

Bước 1

Tìm đường dẫn đến unix_socket của bạn, để làm điều đó chỉ cần chạy netstat -ln | grep mysql

Bạn sẽ nhận được một cái gì đó như thế này

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

Bước 2

Đi mà và thêm nó vào bạn unix_socket param

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

Hy vọng nó giúp !!


8

Tôi đang chạy trên MAMP Pro và gặp vấn đề tương tự khi cố gắng di chuyển (tạo bảng db). Đã thử một vài trong số những đề xuất được đề cập là tốt nhưng không làm điều đó cho tôi.

Vì vậy, chỉ đơn giản (sau một giờ googling), tôi đã thêm hai thứ vào /config/database.php.

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

Hoạt động tốt bây giờ!


4

Kiểm tra cổng của bạn một cách cẩn thận. Trong trường hợp của tôi, đó là 8889 và tôi đang sử dụng 8888. thay đổi "DB_HOST" từ "localhost" thành "127.0.0.1" và ngược lại


Tuyệt vời, cảm ơn bạn, cổng của tôi là 3306 nhưng cổng thực sự của tôi là 8889
David

4

Tôi gặp vấn đề này khi tôi đang chạy ứng dụng của mình bằng cách sử dụng các container docker.

Giải pháp được đặt tên của thùng chứa dịch vụ MySQL mà tôi đang sử dụng docker_compose.ymltrên DB_HOST. Trong trường hợp của tôi, đó là db:

DB_HOST=db

Hy vọng nó giúp.


2

Kể từ Laravel 5, tên người dùng và mật khẩu cơ sở dữ liệu đi vào tệp .env tồn tại trong thư mục dự án, vd

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

Như bạn có thể thấy các biến môi trường này đang ghi đè các chuỗi 'giả mạo' ở đây để thay đổi chúng không có tác dụng:

    '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,
    ],

Thêm thông tin tại đây https://mattstauffer.co/blog/laravel-5.0-envir-detection-and-en môi-biến


2

Tôi gặp vấn đề này khi chạy PHPUnit trong Elixir / Gulp và Homestead với tư cách là môi trường Vagrant của tôi.

Trong trường hợp của tôi, tôi đã chỉnh sửa file .env từ DB_HOST=localhostđến DB_HOST=192.168.10.10nơi 192.168.10.10là IP của máy chủ Vagrant / Homestead tôi.


2

Cố gắng kết nối với localhost:

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

Cố gắng kết nối với 127.0.0.1:

SQLSTATE[HY000] [2002] Connection refused

OK, chỉ cần nhận xét / xóa cài đặt sau khỏi my.cnf (trên OS X 10.5 /opt/local/etc/mysqlxx/my.cnf:) để có được:

[mysqld]
# skip-networking

Tất nhiên, dừng và khởi động MySQL Server.


2

Tôi gặp vấn đề tương tự khi truy cập trang web Drupal của tôi. Tôi đã sửa nó bằng cách mở dòng lệnh và khởi động lại máy chủ hoặc dịch vụ MySQL của tôi:

service mysqld restart

Điều này nên làm việc. Nếu không, hãy khởi động lại máy chủ web cục bộ của bạn:

service httpd restart

Thế là đủ. Hy vọng nó cũng hoạt động cho các môi trường khác. Lưu ý rằng các lệnh này thường yêu cầu đặc quyền siêu người dùng.


1

Nếu bạn đang sử dụng Homestead Homestead, đây là cài đặt

(bao gồm máy ảo-Vagrant)

.bash-hồ sơ

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

cơ sở dữ liệu.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,
    ],

Thiết bị đầu cuối

vm

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

1

Nếu bất cứ ai vẫn đang tìm kiếm câu trả lời, chỉ cần kiểm tra tệp .env của bạn. Vì một số lý do, laravel tạo một tệp .env.example, vì vậy tất cả các câu trả lời này không phù hợp với tôi. Tôi đã sửa vấn đề đổi tên .env.example thành .env


Không có câu trả lời đúng duy nhất cho câu hỏi này vì có nhiều lỗi có thể được thực hiện. Đây là một trong số đó, vì không thể sao chép tệp .env sang máy chủ từ xa. Vì vậy, đáng để kiểm tra tệp .env trên máy chủ nơi bạn đang cố chạy truy vấn để đảm bảo rằng cả hai đều tồn tại và chứa thông tin cần thiết để tạo kết nối.
petercoles

1

Điều này xảy ra với tôi vì MySQL không chạy. MySQL đã không khởi động được vì tôi bị thiếu một /usr/local/etc/my.cnf.d/thư mục.

Điều này đã được yêu cầu bởi /usr/local/etc/my.cnftệp cấu hình của tôi dưới dạng toàn cầu bao gồm ( include /usr/local/etc/my.cnf.d/*.cnf).

Chạy mkdir /usr/local/etc/my.cnf.d, và sau đó bắt đầu MySQL, đã khắc phục sự cố.


1

Trong trường hợp của tôi, tôi đang chạy php artisan di chuyển trên thiết bị đầu cuối mac của tôi, khi tôi cần ssh vào vagrant và chạy nó từ đó. Hy vọng rằng sẽ giúp ai đó đau đầu.


1

Tôi gặp vấn đề tương tự khi sử dụng Docker và tên dịch vụ MySQL dbtrong tệp docker_compose.yml:

Tôi đã thêm vào như sau trong .envtập tin:

DB_HOST=db

bạn cũng nên đảm bảo rằng máy chủ của bạn có thể phát hiện được từ ứng dụng php.

Đó là bởi vì PHP đã không tìm ra máy chủ nào sẽ sử dụng để kết nối.


0

Khi sử dụng VirtualMachine, hãy đảm bảo bạn ssh vào máy đó và điều hướng đến thư mục Ứng dụng của bạn và gọi lệnh di chuyển nghệ nhân php từ đó.


0

Trong trường hợp có thể, tôi chỉ đơn giản là sử dụng

vagrant up

thay vì

homestead up

cho thiết lập ấu trùng giả của tôi bằng cách sử dụng homestead. Tôi cho rằng điều này có nghĩa là trang web đang được phục vụ, nhưng máy chủ MySQL chưa từng khởi động. Khi tôi sử dụng lệnh sau để khởi chạy hộp vagrant của mình, lỗi đã biến mất.


0

Tất cả những câu trả lời này có vẻ như rất nặng nề ...

Tôi vừa tạo một .envtập tin; đã chỉnh sửa bootstrap/app.phptập tin của tôi và không ghi chú dòng sau ...

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

Hy vọng điều này sẽ giúp ai đó


0

Đối với bất kỳ ai đang cố gắng tạo một kết nối db mới không phải trên laravel nhưng tình cờ tìm thấy câu trả lời để chạy PDO từ Terminal. Điều này sẽ giúp ích cho bạn. Và bạn có thể cấu trúc lại nó để làm việc tốt nhất cho bạn.

<?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

} 

hy vọng nó giúp!


0

Trong trường hợp của tôi, tôi phải xóa thư mục bootstrap / cache và thử lại.

Cenario của tôi là sau khi di chuyển máy chủ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.