경고 : mysql_connect () : [2002] 해당 파일 또는 디렉토리가 없습니다 (unix : ///tmp/mysql.sock을 통해 연결을 시도)


246

Apple의 터미널 (PHP 포함)을 사용하여 MySQL DB에 연결하려고합니다.

어제 잘 작동했지만 이제 제목에 갑자기 오류가 발생합니다.

스크립트는 브라우저를 사용하여 실행할 때 작동하지만 (XAMPP가 설치되어 있음) 터미널은 DB 연결을 거부합니다.

다음은 연결하기 위해 포함하는 파일입니다 (스크립트는 포함하지 않지만 작동하지만 DB에는 연결되지 않음).

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

브라우저에서 작동하기 때문에 작동합니다.

터미널에서 사용하는 명령은 php scriptname.php입니다.

답변:


415

어떤 이유로 OS X의 mysql은 필요한 소켓 파일의 위치가 약간 잘못되었지만, 해결책은 심볼릭 링크를 설정하는 것만 큼 간단합니다.

소켓이 (길이가 0 인 파일로 표시됨) /tmp/mysql.sock또는 /var/mysql/mysql.sock로있을 수 있지만 하나 이상의 앱이 다른 위치를 찾고 있습니다. 이 명령으로 알아보십시오.

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

소켓을 이동하고 구성 파일을 편집하는 대신 편집 된 파일을 로컬 및 경로가 올바른 서버와 멀리 떨어진 곳에 두어야합니다. 심볼릭 링크를 만들면 Mac이 잘못된 위치를 찾을 때도 필요한 소켓을 찾을 수 있습니다. !

당신이 가지고 /tmp/mysql.sock있지만 /var/mysql/mysql.sock그때가 없다면 ...

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

당신이 가지고 /var/mysql/mysql.sock있지만 /tmp/mysql.sock그때가 없다면 ...

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

디렉토리와 링크를 만들 수있는 권한이 필요하므로 필요한 경우 위 명령에 sudo를 접두어로 붙이십시오.


좋은 대답입니다. 고치는 나를 위해 일했다. 왜 한 번 작동했다가 다시 작동하지 않는지 알고 있습니까? 나는 같은 문제가 있었다.
니콜

16
이것은 다소 해키입니다. MySQL 숨겨진 바로 가기를 해결하기 위해 @luismreis의 답변을 권장합니다.
MattiSG

2
나를 위해 작동하지 않았다 ... 나는 그 파일 중 하나가 없습니다. 그러나 luismreis의 대답은 효과가있었습니다!
Gregoire

4
이것은 "해키"가 아닙니다. localhost소켓을 작동 시키는 올바른 방법 이며, 데이터베이스에 액세스하기 전에 라우터로 패킷을 전송하는 데 추가 오버 헤드를 원하지 않는 경우 중요 할 수 있습니다.
Kebman

1
내 우분투 10.04의 경로가 올바르지 않습니다. 나는 이것을해야했다. cd /tmp그리고 나서 : sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock.
franzlorenzon

371

나는 또한이 오류가 있었지만 여기 의 제안을 통해서만 해결할 수 있습니다. .

요약하면 다음을 사용하십시오.

127.0.0.1

대신에:

localhost

그 이유는 "localhost"는 MySQL 드라이버가 TCP 소켓 대신 UNIX 소켓을 사용하여 MySQL에 연결하도록하는 특수한 이름이기 때문입니다.


1
이 방법으로 문제가 해결되지 않으면 hosts파일 을 확인하십시오. 파일이 없거나 엉망 일 수 있습니다.
Fabrizio

3
또한 어쩌면 좋은 언급 : 나 같은 MAMP를 사용하는 경우이 상자의 선택을 취소해야한다 "로컬 액세스 허용"
soupdiver

이 솔루션은 라우터가 패킷을 먼저 보낼 때 추가 오버 헤드를 만듭니다. 일반적으로 테스트하는 동안 큰 문제는 아니지만 대량의 데이터 패킷에는 문제가 될 수 있습니다.
Kebman

3
@Fabrizio 아니요, 관련이 없습니다. localhost를 이름으로 사용하는 경우 mysql은 로컬 호스트가 / etc / hosts에 선언되었는지 여부에 관계없이 Inet이 아닌 파일 항목 (예 : mysql.sock)을 통해 처리되는 Unix 소켓을 대신 사용합니다. 그러나 127.0.0.1조차도 IP 주소를 대신 사용하면 mysql이 대신 Inet 소켓을 열도록합니다.
Fran Marzoa

1
그러면 MySQL 데이터베이스에서 'user'% 'localhost'에 제공 한 모든 보조금이 중단 될 것입니까?
Octopus

24

나는 같은 문제를 겪고 있었고 이것이 내가 고 쳤던 방법이다.

나는 이것을 가지고 작동하지 않았다 :

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

나는 이것을했고 그것이 효과가 있었다 :

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

mysql 서버를 사용하는 대신 Unix Socket에 직접 연결했습니다. 나를 위해 일했다.


이것은 나에게도 효과가있는 유일한 솔루션입니다. /var/mysql/mysql.sock이 없습니다. 그리고 /tmp/mysql.sock이 없습니다.
JeffB6688

localhost 대신 127.0.0.1을 시도 했습니까?
Mantisse

21

MySQL 소켓은 일반적으로 /tmp/mysql.sock또는 /var/mysql/mysql.sock에 있지만 PHP는 잘못된 위치에 있습니다.

  1. 소켓이 어디에 있는지 확인하십시오.

     sudo /usr/libexec/locate.updatedb
  2. updatedb가 종료 될 때 :

     locate mysql.sock
  3. 그런 다음 php.ini를 찾으십시오.

     php -i | grep php.ini

    이것은 다음과 같이 출력됩니다 :

     Configuration File (php.ini) Path => /opt/local/etc/php54
     Loaded Configuration File => /opt/local/etc/php54/php.ini
  4. php.ini 편집

     sudo vim /opt/local/etc/php54/php.ini
  5. 줄을 바꾸십시오 :

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

    여기서 /tmp/mysql.sock은 소켓의 경로입니다.

  6. 수정 사항을 저장하고 ESC + SHIFT를 종료하십시오. x

  7. 아파치 다시 시작

     sudo apachectl stop
     sudo apachectl start

php.ini가 없습니다. 나는 php.ini.default 만 가지고 있으므로 여기에 해결 방법이 필요한 것 같습니다 : apple.stackexchange.com/questions/65802/… 그러나, 그것은 나를 위해 작동하지 않았습니다.
user124384

@ user124384 설치가 손상되었을 php.ini.defaultphp.ini있습니다. 이름을로 변경하십시오 .
명사

Apache는 한 줄로 다시 시작할 수 있습니다.sudo apachectl restart
fbiazi

11

Mac OS X에서 XAMPP를 사용하고 있으며 위의 Brian Lowe 솔루션이 약간 수정되었습니다 .

mysql.sock 파일은 실제로 "/ Applications / xampp / xamppfiles / var / mysql /"폴더에 있습니다. 따라서 / tmp와 / var / mysql에서 모두 연결해야했습니다. PHP 명령 줄에서 어느 것이 사용되는지 확인하지 못했지만 이것이 수정되었으므로 행복합니다 :-)

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-해결책을 찾기 위해 며칠을 검색했는데 이것이 마침내 문제를 해결 한 것입니다! =) OS X에서도 XAMPP
ljubiccica

10

Mac OS X EL Capitan + MAMP Pro 이렇게하십시오

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

그런 다음이 작업을 수행

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

이것이 시간을 절약하기를 바랍니다.


그것을 해결 한 mysql.dock에서를 연결하고 /tmp있습니다. 감사!
Mohammed J. Razem

6

그 이유는 PHP가 올바른 경로를 찾을 수 없기 때문입니다 mysql.sock .

mysql이 먼저 실행되고 있는지 확인하십시오.

그런 다음 어느 경로가 mysql.sock 예 :/tmp/mysql.sock

그런 다음이 경로 문자열을 php.ini에 추가하십시오.

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

마지막으로 Apache를 다시 시작하십시오.


6

다음과 같은 문제가 발생하면

PHP 오류 발생 "경고 : mysql_connect () http : //function.mysql-connect : 2002 해당 파일 또는 디렉토리가 없습니다 (unix : ///tmp/mysql.sock을 통해 연결하려고 함)"

에 "mysql.default_socket"값 /etc/php.ini

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

그런 다음 서버 관리자에서 웹 서비스를 다시 시작하십시오.


이것은 나에게 가장 좋은 대답이었습니다-필자의 경우 MAMP를 사용하고 있는데 php.ini에 추가했습니다 : mysqli.default_socket = /Applications/MAMP/tmp/mysql/mysql.sock mysql.default_socket = / Applications / MAMP / tmp /mysql/mysql.sock
Adamski

3

어렴풋한 2002 소켓 오류 수정 – MySQL이 소켓을 배치하는 위치와 OSX가 생각하는 위치를 연결하고, MySQL은 / ​​tmp에 배치하고 OSX는 / var / mysql에서 소켓을 찾습니다. 소켓은 mysql 클라이언트를 허용하는 파일 유형입니다. / 서버 통신.

sudo mkdir /var/mysql

그리고

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

출처 : http://coolestguidesontheplanet.com/get-apache-mysql-php-phpmyadmin-working-osx-10-10-yosemite/


1

다른 해결책은 다음과 같이 php.ini 구성 파일에서 소켓 위치를 수정하는 것입니다.

pdo_mysql.default_socket=/tmp/mysql.sock

물론 심볼릭 링크도 작동하므로 원하는 링크를 변경할 수 있습니다.


1

포트를 사용하여 php53-mysql을 설치하면이 문제에 대한 해결책 인 다음 메시지가 반환됩니다.

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

Mountain Lion을 사용하고 있으며 macports를 사용하여 MySQL을 설치했습니다.
Sheric

1

나는 같은 문제가 있었다

[PDOException] SQLSTATE [HY000] [2002] 해당 파일 또는 디렉토리가 없습니다.

[ErrorException] 경고 : PDO :: __ construct () : [2002]… htdocs / Symfony / vendor / doctrine-dbal /에 해당 파일 또는 디렉토리가 없습니다 (unix : ///var/mysql/mysql.sock을 통해 연결하려고 함). lib / Doctrine / DBAL / Driver / PDOConnection.php

따라서 해결책은 양말 파일에 대한 심볼릭 링크를 만들어 문제를 해결하는 것입니다. 다음을 수행하여 해결하십시오.

$ sudo mkdir / private / var / mysql /

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

출처 : http://www.reecefowell.com/2012/07/21/symfony2-cli-does-not-connect-to-mysql-while-browser-works-fine/


외부 웹 사이트에 대한 링크가 아니라 여기에 답변을 게시하십시오.
ElmerCat

0

같은 오류가 발생했습니다. phpMyAdmin을 시작하기 전에 MySQL이 독립형 응용 프로그램으로 실행 중이었습니다.

방금 mysql을 중지했습니다. sudo / Applications / XAMPP / xamppfiles / xampp stop sudo / Applications / XAMPP / xamppfiles / xampp start를 중지하십시오.

잘 작동했습니다


0

방금이 문제가 있었지만 특정 페이지를로드 할 때만 나타났습니다 (다른 페이지는 정상적으로 작동했습니다). 와의 연결을 끊은 후 MySQL을 호출하는 것으로 나타났습니다 mysql_close(). 따라서 @brucenan이 말한 것처럼 : 호출 할 때 MySQL이 실행되고 있는지 확인하십시오 .


0

Apple 터미널에서 MAMP PHP의 별칭을 지정하면됩니다.

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

예: > phpmamp - v

이제 다음과 같은 것을 실행할 수 있습니다. > phpmamp scriptname.php

참고 : 이것은 현재 터미널 세션에만 적용됩니다.


0

MAMP를 사용할 수 있으므로 포트를 기본값 3306으로 변경하거나 database.php에서 127.0.0.1을 사용하십시오.

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

또는 기본 설정으로 :

$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

기본적으로 mySQL 클라이언트는 localhost의 루프백 주소 (127.0.0.1)에 연결하는 대신 소켓이라는 로컬 파일을 통해 연결을 시도합니다.

이 소켓 파일의 기본 위치는 최소한 OSX에서 /tmp/mysql.sock .

빠르고 효율적인 솔루션

올바른 소켓을 찾기 위해 OS를 속이는 심볼릭 링크를 만듭니다.

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

적절한 솔루션

startMysql.sh파일에 정의 된 소켓 경로를 변경하십시오 /Applications/MAMP/bin.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.