Cảnh báo: mysql_connect (): [2002] Không có tệp hoặc thư mục như vậy (cố gắng kết nối qua unix: ///tmp/mysql.sock) trong


246

Tôi đang cố gắng kết nối với MySQL DB của mình với Terminal trên Apple (Với PHP).

Hôm qua nó hoạt động tốt, và bây giờ tôi đột nhiên nhận được lỗi trong tiêu đề.

Kịch bản hoạt động khi tôi sử dụng trình duyệt của mình để chạy nó (tôi đã cài đặt XAMPP), nhưng Terminal từ chối kết nối với DB.

Đây là tệp mà tôi bao gồm để kết nối (tập lệnh hoạt động khi tôi không bao gồm tệp này, nhưng sau đó nó không kết nối với DB):

<?php
    mysql_connect("localhost", "root", "") or die(mysql_error());
    mysql_select_db("FNB1C_data") or die(mysql_error());
?>

Điều đó sẽ làm việc, vì nó hoạt động với trình duyệt của tôi.

Lệnh tôi sử dụng tại Terminal là php scriptname.php.

Câu trả lời:


415

Vì một số lý do, mysql trên OS X nhận được vị trí của tệp socket yêu cầu hơi sai, nhưng may mắn là giải pháp này đơn giản như thiết lập một liên kết tượng trưng.

Bạn có thể có một ổ cắm (xuất hiện dưới dạng tệp có độ dài bằng 0) dưới dạng /tmp/mysql.sockhoặc /var/mysql/mysql.sock, nhưng một hoặc nhiều ứng dụng đang tìm kiếm ở vị trí khác cho nó. Tìm hiểu với lệnh này:

ls -l /tmp/mysql.sock /var/mysql/mysql.sock

Thay vì di chuyển ổ cắm, chỉnh sửa tệp cấu hình và phải nhớ giữ các tệp đã chỉnh sửa cục bộ và tránh xa các máy chủ có đường dẫn chính xác, chỉ cần tạo một liên kết tượng trưng để máy Mac của bạn tìm thấy ổ cắm cần thiết, ngay cả khi nó tìm sai vị trí !

Nếu bạn có /tmp/mysql.socknhưng không /var/mysql/mysql.sockthì ...

cd /var 
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /tmp/mysql.sock mysql.sock

Nếu bạn có /var/mysql/mysql.socknhưng không /tmp/mysql.sockthì ...

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

Bạn sẽ cần quyền để tạo thư mục và liên kết, vì vậy chỉ cần tiền tố các lệnh ở trên với sudo nếu cần thiết.


Câu trả lời tốt. Sửa chữa làm việc cho tôi. Bạn có biết tại sao nó có thể hoạt động một lần và sau đó không hoạt động trở lại? Tôi đã có vấn đề tương tự.
Nicole

16
Điều này là khá hack. Tôi thực sự khuyên bạn nên trả lời câu trả lời của @luismreis xung quanh lối tắt ẩn đó của MySQL.
MattiSG

2
Không làm việc cho tôi ... Tôi không có bất kỳ tập tin nào trong số đó. Nhưng câu trả lời của luismreis đã có hiệu quả!
Gregoire

4
Đây không phải là "hacky". Đây là cách chính xác để làm cho localhostổ cắm hoạt động và có thể rất quan trọng nếu bạn không muốn có thêm chi phí từ việc gửi các gói đến bộ định tuyến trước khi cơ sở dữ liệu được truy cập.
Kebman

1
Đường dẫn trên Ubuntu 10.04 của tôi không chính xác. Tôi đã phải làm điều này: cd /tmpvà sau đó : sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock.
franzlorenzon

370

Tôi cũng có lỗi này, nhưng chỉ có thể sửa nó thông qua gợi ý ở đây .

Để tóm tắt, sử dụng:

127.0.0.1

Thay vì:

localhost

Lý do là "localhost" là một tên đặc biệt cho trình điều khiển MySQL khiến nó sử dụng ổ cắm UNIX để kết nối với MySQL thay vì ổ cắm TCP.


1
Nếu điều này hoạt động, sau đó kiểm tra hoststệp của bạn , nó có thể bị thiếu hoặc bị rối
Fabrizio

3
cũng có thể tốt để đề cập: Khi sử dụng MAMP như tôi, bạn phải bỏ chọn hộp "Chỉ cho phép truy cập cục bộ"
bán súp

Giải pháp này làm cho thêm chi phí khi gói được gửi bởi bộ định tuyến trước. Thường không phải là một vấn đề lớn trong khi thử nghiệm, nhưng nó có thể trở thành một vấn đề với các gói dữ liệu lớn.
Kebman

3
@Fabrizio Không, nó không liên quan. Khi bạn sử dụng localhost làm tên, mysql sẽ sử dụng ổ cắm Unix thay vì được xử lý thông qua mục nhập tệp (ví dụ: mysql.sock), không phải là Inet one, bất kể localhost có được khai báo trong / etc / hosts hay không. Tuy nhiên, khi bạn sử dụng một địa chỉ IP thay thế, thậm chí là 127.0.0.1, bạn buộc mysql phải mở một ổ cắm Inet.
Fran Marzoa

1
Có phải điều này sau đó, ngụ ý rằng tất cả các khoản tài trợ bạn đã cung cấp trên db db cho 'người dùng'% 'localhost' sẽ bị phá vỡ?
Bạch tuộc

24

Tôi đã có cùng một vấn đề và đây là cách tôi khắc phục nó:

Tôi đã có cái này và nó không hoạt động:

$con = mysql_connect('localhost', 'root', '1234');

Tôi đã làm điều này và nó đã làm việc:

$con = mysql_connect(':/Applications/MAMP/tmp/mysql/mysql.sock', 'root', '1234');

Thay vì sử dụng máy chủ mysql, tôi đã kết nối trực tiếp với Ổ cắm Unix. Đã làm cho tôi.


Đây là giải pháp duy nhất làm việc cho tôi. Tôi không có /var/mysql/mysql.sock. Và tôi không có /tmp/mysql.sock.
JeffB6688

Bạn đã thử 127.0.0.1 thay vì localhost chưa?
Mantisse

21

Ổ cắm MySQL được đặt, nói chung, trong /tmp/mysql.sockhoặc /var/mysql/mysql.sock, nhưng có lẽ PHP nhìn không đúng chỗ.

  1. Kiểm tra ổ cắm của bạn ở đâu với:

     sudo /usr/libexec/locate.updatedb
  2. Khi cập nhật kết thúc:

     locate mysql.sock
  3. Sau đó xác định vị trí php.ini của bạn:

     php -i | grep php.ini

    điều này sẽ tạo ra một cái gì đó như:

     Configuration File (php.ini) Path => /opt/local/etc/php54
     Loaded Configuration File => /opt/local/etc/php54/php.ini
  4. Chỉnh sửa php.ini của bạn

     sudo vim /opt/local/etc/php54/php.ini
  5. Thay đổi dòng:

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

    trong đó /tmp/mysql.sock là đường dẫn đến ổ cắm của bạn.

  6. Lưu các sửa đổi của bạn và thoát ESC + SHIFT: x

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

     sudo apachectl stop
     sudo apachectl start

Tôi không có php.ini; Tôi chỉ có một php.ini.default, vì vậy có vẻ như cách giải quyết ở đây là cần thiết: apple.stackexchange.com/questions/65802/ , Tuy nhiên, nó không hoạt động với tôi.
dùng124384

@ user124384 Cài đặt của bạn có thể bị hỏng: đổi tên php.ini.defaultthành php.ini.
danh từ

Apache có thể được khởi động lại bằng một dòng duy nhất:sudo apachectl restart
fbiazi

11

Tôi đang sử dụng XAMPP trên Mac OS X và giải pháp của Brian Lowe ở trên đã hoạt động với một sửa đổi nhỏ .

Tệp mysql.sock thực sự nằm trong thư mục "/ Ứng dụng / xampp / xamppfiles / var / mysql /". Vì vậy, đã phải liên kết nó lên cả trong / tmp và / var / mysql. Tôi đã không kiểm tra cái nào được sử dụng bởi dòng lệnh PHP, nhưng điều này đã khắc phục, vì vậy tôi rất vui :-)

sudo su
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /tmp/mysql.sock
mkdir /var/mysql
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /var/mysql/mysql.sock

1
ty - Tôi đã tìm kiếm vài ngày để tìm giải pháp và đây là giải pháp cuối cùng đã làm mọi thứ trở nên đúng đắn! =) XAMPP trên OS X cũng vậy
ljubiccica

10

Mac OS X EL Capitan + MAMP Pro Làm điều này

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

Sau đó làm điều này

cd /tmp
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

Hy vọng điều này sẽ giúp bạn tiết kiệm thời gian.


Đó là liên kết mysql.docktrong /tmpđó đã giải quyết nó. Cảm ơn!
Mohammed J. Razem

6

Lý do là php không thể tìm thấy đường dẫn chính xác mysql.sock.

Hãy chắc chắn rằng mysql của bạn đang chạy đầu tiên.

Sau đó, vui lòng xác nhận rằng đường dẫn nào là mysql.sock vị, ví dụ:/tmp/mysql.sock

sau đó thêm chuỗi đường dẫn này vào php.ini:

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

Cuối cùng, khởi động lại Apache.


6

Khi bạn gặp phải vấn đề sau:

Lỗi ném PHP "Cảnh báo: mysql_connect () http: //feft.mysql-connect : 2002 Không có tệp hoặc thư mục như vậy (cố gắng kết nối qua unix: ///tmp/mysql.sock)"

Set "mysql.default_socket" giá trị trong bạn /etc/php.iniđể

 "mysql.default_socket = /var/mysql/mysql.sock". 

Sau đó khởi động lại dịch vụ web trong quản trị máy chủ


Đây là câu trả lời tốt nhất cho tôi - trong trường hợp của tôi, tôi đang sử dụng MAMP, tôi đã thêm vào php.ini: mysqli.default_socket = /Appluggest/MAMP/tmp/mysql/mysql.sock mysql.default_socket = / Application / MAMP / tmp /mysql/mysql.sock
Adamski

3

Khắc phục lỗi ổ cắm 2002 lờ mờ - đang liên kết nơi MySQL đặt ổ cắm và nơi OSX nghĩ rằng nó phải xảy ra, MySQL đặt nó trong / tmp và OSX tìm kiếm nó trong / var / mysql socket là một loại tệp cho phép máy khách mysql / máy chủ liên lạc.

sudo mkdir /var/mysql

và sau đó

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

nguồn: http://coolestguidesontheplanet.com/get-apache-mysql-php-phpmyadmin-usiness-osx-10-10-yosemite/


1

Một giải pháp khác là sửa vị trí ổ cắm trong tệp cấu hình php.ini như sau:

pdo_mysql.default_socket=/tmp/mysql.sock

Tất nhiên, symlink cũng hoạt động, vì vậy đây là vấn đề ưu tiên mà bạn thay đổi.


1

Khi bạn cài đặt php53-mysql bằng cổng, nó sẽ trả về thông báo sau đây là giải pháp cho vấn đề này:

To use mysqlnd with a local MySQL server, edit /opt/local/etc/php53/php.ini
and set mysql.default_socket, mysqli.default_socket and
pdo_mysql.default_socket to the path to your MySQL server's socket file.

For mysql5, use /opt/local/var/run/mysql5/mysqld.sock
For mysql51, use /opt/local/var/run/mysql51/mysqld.sock
For mysql55, use /opt/local/var/run/mysql55/mysqld.sock
For mariadb, use /opt/local/var/run/mariadb/mysqld.sock
For percona, use /opt/local/var/run/percona/mysqld.sock

Tôi đang sử dụng Mountain Lion và đã cài đặt MySQL bằng macports.
Sheric

1

Tôi có những vấn đề giống nhau

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

[ErrorException] Cảnh báo: PDO :: __ construc (): [2002] Không có tệp hoặc thư mục như vậy (cố gắng kết nối qua unix: ///var/mysql/mysql.sock) trong Nott htdocs / Symfony / eller / doctrine-dbal / lib / Học thuyết / DBAL / Trình điều khiển / PDOConnection.php

Vì vậy, giải pháp là tạo một liên kết tượng trưng đến tệp sock để giải quyết vấn đề. Làm như sau để giải quyết nó:

$ sudo mkdir / private / var / mysql /

$ sudo ln -s /Appluggest/MAMP/tmp/mysql/mysql.sock /private/var/mysql/mysql.sock

nguồn: http://www.reecefowell.com/2012/07/21/symfony2-cli-does-not-connect-to-mysql-fter-browser-works-fine/


Đăng câu trả lời của bạn ở đây, thay vì một liên kết đến một trang web bên ngoài.
ElmerCat

0

Tôi đã nhận được các lỗi tương tự. Mysql đã chạy như một ứng dụng độc lập trước khi tôi khởi động phpMyAdmin.

Tôi vừa dừng mysql Sau đó sudo / Ứng dụng / XAMPP / xamppfiles / xampp dừng sudo / Ứng dụng / XAMPP / xamppfiles / xampp bắt đầu

Nó hoạt động tốt


0

Tôi chỉ gặp vấn đề này, nhưng nó chỉ xuất hiện khi tải một số trang nhất định (các trang khác hoạt động tốt). Hóa ra tôi đã thực hiện cuộc gọi tới MySQL sau khi tôi đóng kết nối mysql_close(). Vì vậy, như @brucenan đã nói: hãy chắc chắn rằng MySQL đang chạy khi bạn gọi nó .


0

Bạn có thể làm điều đó bằng cách đơn giản hóa bí danh MAMP php trên thiết bị đầu cuối của Apple:

alias phpmamp='/Applications/MAMP/bin/php/php7.0.0/bin/php'

Thí dụ: > phpmamp - v

Bây giờ bạn có thể chạy một cái gì đó như: > phpmamp scriptname.php

Lưu ý: Điều này sẽ chỉ được áp dụng cho phiên cuối cùng hiện tại.


0

Vì bạn có thể sử dụng MAMP, nên thay đổi Cổng của bạn thành 3306 mặc định hoặc sử dụng 127.0.0.1 trong cơ sở dữ liệu.php

$db['default'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',// leave it for port 3306
    'username' => 'yourUserhere',
    'password' => 'yourPassword',
    'database' => 'yourDatabase',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

Hoặc với cài đặt mặc định:

$db['default'] = array(
        'dsn'   => '',
        'hostname' => '127.0.0.1:8889',// leave it for port 8889
        'username' => 'yourUserhere',
        'password' => 'yourPassword',
        'database' => 'yourDatabase',
        'dbdriver' => 'mysqli',
        'dbprefix' => '',
        'pconnect' => FALSE,
        'db_debug' => (ENVIRONMENT !== 'production'),
        'cache_on' => FALSE,
        'cachedir' => '',
        'char_set' => 'utf8',
        'dbcollat' => 'utf8_general_ci',
        'swap_pre' => '',
        'encrypt' => FALSE,
        'compress' => FALSE,
        'stricton' => FALSE,
        'failover' => array(),
        'save_queries' => TRUE
    );

0

Máy khách myQuery theo mặc định cố gắng kết nối thông qua một tệp cục bộ được gọi là ổ cắm thay vì kết nối với địa chỉ loopback (127.0.0.1) cho localhost.

Vị trí mặc định của tệp ổ cắm này, ít nhất là trên OSX, là /tmp/mysql.sock.

GIẢI PHÁP NHANH CHÓNG, ÍT HƠN

Tạo một liên kết tượng trưng để đánh lừa hệ điều hành tìm ổ cắm chính xác.

ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp

GIẢI PHÁP SỞ HỮU

Thay đổi đường dẫn ổ cắm được xác định trong startMysql.shtệp trong /Applications/MAMP/bin.

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.