Kết nối MySQL không hoạt động: 2002 Không có tệp hoặc thư mục nào như vậy


105

Tôi đang cố gắng thiết lập WordPress. Tôi có Apache và MySQL đang chạy, các tài khoản và cơ sở dữ liệu đều đã được thiết lập. Tôi đã cố gắng tạo một kết nối đơn giản:

<?php
    $conn = mysql_connect('localhost', 'USER', 'PASSWORD');
    if(!$conn) {
        echo 'Error: ' . mysql_errno() . ' - ' . mysql_error();
    }
?>

Và tôi luôn nhận được điều này:

Lỗi: 2002 - Không có tệp hoặc thư mục như vậy

Nó có thể nói về tệp hoặc thư mục nào?

Tôi đang sử dụng OS X Snow Leopard, sử dụng Apache tích hợp sẵn. Tôi đã cài đặt MySQL bằng cách sử dụng x86_64 dmg.

CẬP NHẬT: Tôi thấy rằng ổ cắm ở /tmp/mysql.sock, vì vậy Trong php.ini, tôi đã thay thế tất cả các lần xuất hiện của đường dẫn sai bằng đó.


2
vui lòng dán đầu ra /etc/init.d/mysql startnếu bạn đang sử dụng bản phân phối cơ sở debian. nếu không thành công, hãy kiểm tra /etc/my.cnftệp để biết đường dẫn tệp socket mysql chính xác.
sepehr

4
đã giải quyết vấn đề tương tự trên OS X với XAMPP bằng cách sử dụng "127.0.0.1" thay cho "localhost".
Giuseppe Urso

Câu trả lời:


96

Nếu bạn sử dụng Linux: đường dẫn đến tệp mysql.sock bị sai. Điều này thường là do bạn đang sử dụng (LAMPP) XAMPP và nó không có trong /tmp/mysql.sock

Mở tệp php.ini và tìm dòng này:

mysql.default_socket

Và làm cho nó

mysql.default_socket = /path/to/mysql.sock

5
nếu bạn không chắc chắn, hãy thử /var/lib/mysql/mysql.sock làm đường dẫn mới đến ổ cắm.
Jay

1
Hừ! Có thể họ muốn nói đến Leopard hoặc Tiger. Trong mọi trường hợp, hãy vui vẻ với WordPress!
Alec Gorge

3
Lưu ý rằng bạn có thể cần đặt mysqli.default_socket = /path/to/mysql.sock nếu kết nối với mysqli
razzed

2
Vị trí ổ cắm mặc định cho cài đặt MySQL cổ phiếu là /tmp/mysql.sock.
Jonathon Hill

4
"Tên máy chủ localhost có một ý nghĩa đặc biệt. Nó bị ràng buộc với việc sử dụng các ổ cắm miền Unix. Không thể mở kết nối TCP / IP bằng cách sử dụng tên máy chủ localhost mà bạn phải sử dụng 127.0.0.1 để thay thế." - php.net/manual/en/mysqli.quickstart.connections.php . Vì vậy, về cơ bản có điều gì đó không hoạt động với việc kết nối với các ổ cắm miền Unix cho phép localhosthoạt động và TCP / IP đang hoạt động nên việc thay đổi nó thành địa chỉ TCP / IP 127.0.0.1sẽ hoạt động.
Edward

154

Tôi đã gặp vấn đề tương tự và có thể giải quyết nó bằng cách giải quyết 127.0.0.1thay vì giải quyết mysql của tôi với localhost.

Điều này có thể có nghĩa là tôi đã gặp lỗi gì đó trong quá trình thiết lập máy chủ của mình, nhưng bản sửa lỗi nhanh này sẽ giúp tôi thực hiện ngay bây giờ.


2
bạn vừa tiết kiệm cho tôi một số thời gian quý báu.
uchamp

2
Tôi đã kiểm tra tệp máy chủ của mình và tìm thấy một dòng có code127.0.0.1 localhost code. Điều này khiến tôi tò mò tại sao kết nối qua localhost không hoạt động. Nếu ai đó có thể soi sáng cho tôi, tôi sẽ rất vui.
ola

2
Điều này là do mysql.default_socket trong php.ini sai. Chạy "php -i | grep mysql.default_socket"
Jonah

1
Điều này đã làm việc cho tôi, tôi đang cài đặt el Capitan w / mysql 5.7 thông qua homebrew. Tôi đang thử cài đặt WP và khi tôi thay đổi "localhost" thành "127.0.0.1", nó đã có thể kết nối.
dgig

5
"Tên máy chủ localhost có một ý nghĩa đặc biệt. Nó bị ràng buộc với việc sử dụng các ổ cắm miền Unix. Không thể mở kết nối TCP / IP bằng cách sử dụng tên máy chủ localhost mà bạn phải sử dụng 127.0.0.1 để thay thế." - php.net/manual/en/mysqli.quickstart.connections.php . Vì vậy, về cơ bản có điều gì đó không hoạt động với việc kết nối với các ổ cắm miền Unix cho phép localhosthoạt động và TCP / IP đang hoạt động nên việc thay đổi nó thành địa chỉ TCP / IP 127.0.0.1sẽ hoạt động.
Edward

39

Điều này dành cho Mac OS X với cài đặt gốc Apache HTTPcài đặt tùy chỉnh của MySQL .

Câu trả lời dựa trên phản hồi tuyệt vời của @ alec-gorge, nhưng vì tôi đã phải google một số thay đổi cụ thể để cấu hình nó trong cấu hình của mình, chủ yếu là dành riêng cho Mac OS X, tôi nghĩ rằng tôi sẽ thêm nó vào đây để hoàn thiện.

Bật hỗ trợ PHP5 cho Apache HTTP

Đảm bảo rằng hỗ trợ PHP5 được bật trong /etc/apache2/httpd.conf.

Chỉnh sửa tệp bằng sudo vi /etc/apache2/httpd.conf(nhập mật khẩu khi được hỏi) và bỏ ghi chú (xóa ;từ đầu) dòng để tải mô-đun php5_module .

LoadModule php5_module libexec/apache2/libphp5.so

Khởi động Apache HTTP bằng sudo apachectl start(hoặc restartnếu nó đã được khởi động và cần được khởi động lại để đọc lại tệp cấu hình).

Đảm bảo rằng /var/log/apache2/error_logcó một dòng cho bạn biết php5_module đã được bật - bạn sẽ thấy PHP/5.3.15(hoặc tương tự).

[notice] Apache/2.2.22 (Unix) DAV/2 PHP/5.3.15 with Suhosin-Patch configured -- resuming normal operations

Tra cứu tên tệp Socket

Khi MySQL được thiết lập và chạy (với ./bin/mysqld_safe) sẽ có các dòng gỡ lỗi được in ra bảng điều khiển cho bạn biết bạn có thể tìm thấy các tệp nhật ký ở đâu. Lưu ý tên máy chủ trong tên tệp - localhosttrong trường hợp của tôi - có thể khác đối với cấu hình của bạn.

Tệp sau đó Logging tolà quan trọng. Đó là nơi MySQL ghi lại công việc của nó.

130309 12:17:59 mysqld_safe Logging to '/Users/jacek/apps/mysql/data/localhost.err'.
130309 12:17:59 mysqld_safe Starting mysqld daemon with databases from /Users/jacek/apps/mysql/data

Mở localhost.errtệp (một lần nữa, tệp của bạn có thể được đặt tên khác), tức là tail -1 /Users/jacek/apps/mysql/data/localhost.errđể tìm ra tên tệp socket - nó phải là dòng cuối cùng.

$ tail -1 /Users/jacek/apps/mysql/data/localhost.err
Version: '5.5.27'  socket: '/tmp/mysql.sock'  port: 3306  MySQL Community Server (GPL)

Lưu ý socket:phần - đó là tệp socket bạn nên sử dụng php.ini.

Có một cách khác (một số người nói là một cách dễ dàng hơn) để xác định vị trí của tên tệp của socket bằng cách đăng nhập vào MySQL và chạy:

show variables like '%socket%';

Định cấu hình PHP5 với hỗ trợ MySQL - /etc/php.ini

Nói về php.ini ...

Trong /etcthư mục có tệp /etc/php.ini.default . Sao chép nó vào /etc/php.ini .

sudo cp /etc/php.ini.default /etc/php.ini

Mở /etc/php.inivà tìm kiếm mysql.default_socket .

sudo vi /etc/php.ini

Giá trị mặc định mysql.default_socket/var/mysql/mysql.sock. Bạn nên thay đổi nó thành giá trị bạn đã lưu ý trước đó - đó là /tmp/mysql.socktrong trường hợp của tôi.

Thay thế /etc/php.initệp để phản ánh tên của tệp socket:

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

Xác minh cuối cùng

Khởi động lại Apache HTTP.

sudo apachectl restart 

Kiểm tra nhật ký nếu không có lỗi liên quan đến PHP5. Không có lỗi có nghĩa là bạn đã hoàn tất và PHP5 với MySQL sẽ hoạt động tốt. Chúc mừng!


Câu trả lời này hữu ích
Vigneshwaran

Câu trả lời này là tào lao. Nó không liên quan gì đến câu hỏi đang được hỏi và về cơ bản chỉ là hướng dẫn về amp am (acos), điều này - nếu tốt - thậm chí còn lãng phí hơn nếu đặt ở đây chứ không phải ở nơi mà những người thực sự tìm kiếm thiết lập một amp trên macos đang xem xét. Về câu hỏi đang được hỏi: câu trả lời này không giải thích lý do tại sao lỗi xảy ra và tại sao php cố gắng kết nối qua socket thay vì tên máy thay thế, mặc dù điều đó được chuyển đến mysql_connect, đó là vấn đề thực tế của câu hỏi ban đầu chứ không phải là chung chung quan niệm sai lầm về cài đặt phần mềm.
ohcibi

@ohcibi Tôi đã viết "Tôi nghĩ rằng tôi sẽ thêm nó vào đây vì mục đích hoàn chỉnh." và nghĩ rằng thế là đủ (và với số phiếu ủng hộ, một số người thích nó). Tôi thích ý tưởng của bạn về việc làm cho câu trả lời dễ tìm hơn, nhưng không biết làm thế nào. Bạn có thể chia sẻ suy nghĩ của bạn và giúp tôi ... một lần nữa? Cảm ơn!
Jacek Laskowski

@JacekLaskowski nói chung: viết một bài đăng trên blog và nhận xét một liên kết đến nó với phản hồi được chấp nhận / ủng hộ nhiều nhất với cùng ý định bạn đã có ở đây ("thêm nó vì lợi ích của sự hoàn chỉnh"). Nhưng trong chính chủ đề này, tôi thậm chí không thấy lý do gì để đăng liên kết đó. OP nói rằng anh ấy đang sử dụng macOS nhưng vấn đề này không liên quan gì đến bất kỳ hệ điều hành nào ngoài cách diễn giải của mySQL localhost. Không ai tìm kiếm trợ giúp về cách thiết lập xamp trên macos sẽ đến đây bằng googling. Do đó tôi đã sử dụng thuật ngữ 'tào lao'. Chủ đề này không liên quan gì đến macos mà chỉ với mysql (thậm chí không phải php).
ohcibi

14

Đã giúp thay thế 'localhost' thành '127.0.0.1' trong tệp cấu hình (kết nối db)!


1
nhưng tại sao nó phải được giúp đỡ?
Enamul Hassan

"Thay thế 'localhost' thành '127.0.0.1'" hoặc 127.0.0.1 thành địa chỉ máy chủ MySQL thực, tức là u55151.mysql.someserver.eu.
user2812532

13

Khởi động lại máy chủ mysql có thể hữu ích. Trong trường hợp của tôi, việc khởi động lại máy chủ đã tiết kiệm rất nhiều thời gian.

service mysql restart

PS- sử dụng sudo service mysql restartcho người dùng không phải root.


2
Thật tuyệt khi giải pháp đơn giản thực sự hoạt động.
abalter

10

Đầu tiên, đảm bảo MySQL đang chạy. Lệnh: mysqld start

Nếu bạn vẫn không thể kết nối thì: /etc/my.cnf của bạn trông như thế nào? (hoặc /etc/msyql/my.cnf)

2 bài còn lại đúng ở chỗ bạn cần kiểm tra lại socket của mình vì 2002 là lỗi socket.

Một hướng dẫn tuyệt vời về cách thiết lập LAMP là: http://library.linode.com/lamp-guides/centos-5.3/index-print


Trình cài đặt không đặt tệp my.cnf, tuy nhiên có một tệp, tôi có /usr/local/mysql/mysql-test/include/default_my.cnfnên sao chép tệp đó dưới dạng my.cnf vào /etckhông?
mk12

có, nhưng bạn có thể thấy rằng bạn cần phải sửa đổi nó sau này.
Todd Moses

7

Không phải là nó giúp bạn nhiều, nhưng trong các phiên bản gần đây (và thậm chí ít gần đây hơn ) của MySQL, mã lỗi 2002 có nghĩa là "Không thể kết nối với máy chủ MySQL cục bộ thông qua socket [name-of-socket]", vì vậy điều đó có thể cho bạn biết nhiều thêm một chút.


1
Trên OSX 10.9.x với MySQL 5.5.38 được cài đặt từ nguồn, tôi đã gặp lỗi này. Mẹo này đúng: đó là sự cố ổ cắm mặc dù mysqli_connect_errno () và mysqli_connect_error ()) đã thông báo không tìm thấy tệp 2002. Tôi đã có thể giải quyết điều này bằng cách chỉnh sửa /etc/php.ini tôi và thiết lập mysql.default_socket VÀ mysqli.default_socket giá trị ổ cắm đúng (kể từ khi ứng dụng của tôi đã sử dụng mysqli cho các kết nối)
Ronnie

7

Mở rộng câu trả lời của Matthias D ở đây, tôi có thể giải quyết lỗi năm 2002 này trên cả MySQL và MariaDB bằng các đường dẫn chính xác bằng cách sử dụng các lệnh sau:

Đầu tiên, hãy lấy đường dẫn thực tế đến MySQL socket:

netstat -ln | grep -o -m 1 '/.*mysql.sock'

Sau đó lấy đường dẫn PHP :

php -r 'echo ini_get("mysql.default_socket") . "\n";'

Sử dụng đầu ra của hai lệnh này , liên kết chúng với nhau:

sudo ln -s /actualpath/mysql.sock /phppath/mysql.sock

Nếu điều đó trả về, No such file or directorybạn chỉ cần tạo đường dẫn đến PHP mysql.sock, ví dụ nếu đường dẫn của bạn là /var/mysql/mysql.sockbạn sẽ chạy:

sudo mkdir -p /var/mysql

Sau đó, thử lại lệnh sudo ln .


6

Tôi sẽ kiểm tra tệp php.ini của bạn và xác minh rằng mysql.default_socket được đặt chính xác và cũng xác minh rằng mysqld của bạn được định cấu hình đúng với tệp socket mà nó có thể truy cập. Mặc định điển hình là "/tmp/mysql.sock".


Ok, nó nói /var/mysql/mysql.sock, nhưng con đường đó không tồn tại.
mk12

6

Tôi cũng gặp sự cố này, sau đó tôi đã sửa đổi 'localhost' thành '127.0.0.1', nó hoạt động.


6

trong trường hợp của tôi, tôi gặp sự cố với mysqli_connect.
khi tôi muốn kết nối
mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error () trả lại cho tôi lỗi này "Không có tệp hoặc thư mục như vậy"

điều này làm việc cho tôi mysqli_connect('localhost:3306', 'myuser','mypassword')


Điều này làm việc tốt cho tôi; đó là thay đổi tôi cần để tải gói thống kê bóng đá Mỹ của Armchair Analysis vào cài đặt OS X local Mysql. Cảm ơn!
Michael Scott Cuthbert

rất vui khi nghe điều đó :)
masoud2011 22/09/2016

4

Lỗi 2002 có nghĩa là MySQL không thể kết nối với máy chủ cơ sở dữ liệu cục bộ thông qua tệp socket (ví dụ /tmp/mysql.sock:).

Để tìm ra tệp socket của bạn ở đâu, hãy chạy:

mysql_config --socket

sau đó kiểm tra kỹ xem ứng dụng của bạn có sử dụng đúng tệp ổ cắm Unix hay thay vào đó kết nối qua cổng TCP / IP.

Sau đó, kiểm tra lại xem PHP của bạn có thiết lập socket MySQL phù hợp hay không:

php -i | grep mysql.default_socket

và đảm bảo rằng tệp đó tồn tại .

Kiểm tra ổ cắm:

mysql --socket=/var/mysql/mysql.sock

Nếu ổ cắm Unix sai hoặc không tồn tại, bạn có thể liên kết biểu tượng nó, ví dụ:

ln -vs /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock

hoặc sửa tệp cấu hình của bạn (ví dụ php.ini).

Để kiểm tra kết nối PDO trực tiếp từ PHP, bạn có thể chạy:

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

Cũng kiểm tra cấu hình giữa Apache và CLI (giao diện dòng lệnh), vì cấu hình có thể khác nhau.

Có thể máy chủ đang chạy, nhưng bạn đang cố kết nối bằng cổng TCP / IP, đường ống có tên hoặc tệp ổ cắm Unix khác với cổng mà máy chủ đang lắng nghe. Để khắc phục điều đó, bạn cần gọi một chương trình khách (ví dụ: chỉ định --porttùy chọn) để chỉ ra số cổng thích hợp, hoặc tệp ổ cắm Unix hoặc đường ống được đặt tên thích hợp (ví dụ: --sockettùy chọn).

Xem: Khắc phục sự cố khi kết nối với MySQL


Các lệnh utils / khác có thể giúp theo dõi sự cố:

  • mysql --socket=$(php -r 'echo ini_get("mysql.default_socket");')
  • netstat -ln | grep mysql
  • php -r "phpinfo();" | grep mysql
  • php -i | grep mysql
  • Sử dụng XDebug với xdebug.show_exception_trace=1trongxdebug.ini
  • Trên OS X hãy thử sudo dtruss -fn mysqld, trên Linux gỡ lỗi vớistrace
  • Kiểm tra quyền trên Unix socket: stat $(mysql_config --socket)và nếu bạn có đủ dung lượng trống ( df -h).
  • Khởi động lại MySQL của bạn.
  • Kiểm tra net.core.somaxconn.

3

Đảm bảo rằng máy chủ cục bộ của bạn (MAMP, XAMPP, WAMP, v.v.) đang chạy.


Ngoài ra, nếu bạn đang sử dụng MAMP trên MacOS (hiển nhiên!), Bạn cũng gặp phải lỗi này nếu bạn truy cập trang web của mình ngay sau khi đánh thức máy Mac từ chế độ ngủ. Tất nhiên, giải pháp là chỉ cần đợi và thử lại. :-)
texelate

0

Tôi đã có một vấn đề tương tự.
Về cơ bản, vấn đề ở đây là có thể có hai trường hợp mysql đang chạy.
A) Một cái đang chạy tại /etc/init.d
B) Đèn đang được cài đặt tại / opt / lamp
Giải pháp:
Bước 1: - Tìm tất cả các phiên bản mysql đang chạy bằng dấu phẩy "find / | grep mysqld"
Bước 2: - Tắt các dịch vụ đang chạy tại /etc/init.d sử dụng dịch vụ mysql stop
Bước 3: - Khởi động lại các dịch vụ Đèn của bạn bằng cách sử dụng / opt / lamp / lamp restart

Bạn sẽ được tốt để đi :)


0

Trên máy Mac, trước khi thực hiện tất cả công việc khó khăn, chỉ cần kiểm tra cài đặt của bạn System Preferences > MySQL. Thường xuyên hơn không, tôi đã trải nghiệm nhóm gặp phải vấn đề này kể từ đó The MySQL Server Instance is stopped.

Nhấp vào Start MySQL Servernút, và điều kỳ diệu sẽ xảy ra.


0

Tôi đang sử dụng PHP-FPM hoặc nhiều phiên bản php trong máy chủ của tôi. Trong trường hợp của tôi, tôi cập nhật giá trị mysqli vì không có tham số socket mặc định của mysql:

mysqli.default_socket

đến :

mysql.default_socket = /path/to/mysql.sock

cảm ơn @Alec Gorge


0

Tôi đã từng gặp vấn đề tương tự. Ổ cắm của tôi cuối cùng đã được tìm thấy trong /tmp/mysql.sock. Sau đó, tôi đã thêm đường dẫn đó vào php.ini. Tôi tìm thấy ổ cắm ở đó từ việc kiểm tra trang "Trạng thái máy chủ" trong MySQL Workbench. Nếu socket của bạn không nằm trong /tmp/mysql.sock thì có lẽ MySQL Workbench có thể cho bạn biết nó ở đâu? (Đã cho phép bạn sử dụng MySQL Workbench ...)



0

Digital Ocean MySql 2002-no-such-file-or-directory

Thêm phần cuối của tệp này /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1

Khởi động lại MySql

service mysql restart


-1

Tôi cũng gặp vấn đề tương tự trên máy chủ Linux. Điều đã giúp tôi là lệnh ' sudo reboot ', được sử dụng để khởi động lại máy chủ Linux.


-2

kích hoạt và bắt đầu dịch vụ mariadb

sudo systemctl cho phép mariadb.service

sudo systemctl start mariadb.service

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.