MySQL 연결이 작동하지 않음 : 2002 해당 파일 또는 디렉토리가 없습니다.


106

WordPress를 설정하려고합니다. Apache와 MySQL이 실행 중이고 계정과 데이터베이스가 모두 설정되었습니다. 간단한 연결을 시도했습니다.

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

그리고 나는 항상 이것을 얻습니다.

오류 : 2002-해당 파일 또는 디렉터리가 없습니다.

어떤 파일이나 디렉토리에 대해 이야기 할 수 있습니까?

저는 내장 Apache를 사용하는 OS X Snow Leopard를 사용하고 있습니다. x86_64 dmg를 사용하여 MySQL을 설치했습니다.

업데이트 : 소켓이 /tmp/mysql.sock에 있다는 것을 알았으므로 php.ini에서 잘못된 경로의 모든 발생을 그로 대체했습니다.


2
/etc/init.d/mysql start데비안 기반 배포판에있는 경우 출력을 붙여 넣으십시오 . 실패하면 /etc/my.cnf파일에서 올바른 mysql 소켓 파일 경로를 확인 하십시오.
sepehr

4
"localhost"대신 "127.0.0.1"을 사용하여 XAMPP로 OS X에서 동일한 문제를 해결했습니다.
Giuseppe Urso

답변:


97

Linux를 사용하는 경우 : mysql.sock 파일의 경로가 잘못되었습니다. 이것은 일반적으로 (LAMPP) XAMPP를 사용하고 있고 /tmp/mysql.sock에 없기 때문입니다.

php.ini 파일을 열고 다음 줄을 찾습니다.

mysql.default_socket

그리고 그것을 만드십시오

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

5
확실하지 않은 경우 소켓의 새 경로로 /var/lib/mysql/mysql.sock을 시도하십시오.
Jay

1
흠. 아마도 그들은 Leopard 또는 Tiger를 의미했을 것입니다. 어쨌든 WordPress로 재미있게 보내십시오!
Alec Gorge

3
mysqli로 연결하는 경우 mysqli.default_socket = /path/to/mysql.sock을 설정해야 할 수도 있습니다
2011

2
스톡 MySQL 설치의 기본 소켓 위치는 /tmp/mysql.sock입니다.
Jonathon Hill

4
"호스트 이름 localhost는 특별한 의미를 가지고 있습니다. Unix 도메인 소켓 사용에 바인딩되어 있습니다. 호스트 이름 localhost를 사용하여 TCP / IP 연결을 열 수 없습니다. 대신 127.0.0.1을 사용해야합니다." - php.net/manual/en/mysqli.quickstart.connections.php . 따라서 기본적으로 작동을 허용하는 Unix 도메인 소켓에 연결하는 것이 작동하지 않고 localhostTCP / IP가 작동하므로 TCP / IP 주소로 변경 127.0.0.1하면 작동합니다.
Edward

154

비슷한 문제가 있었고 mysql 127.0.0.1대신 localhost.

이것은 아마도 호스트 설정에 문제가 있음을 의미하지만이 빠른 수정은 지금 당장 진행 중입니다.


2
귀중한 시간을 절약 해 주셨습니다.
uchamp 2013

2
호스트 파일을 확인하고 code127.0.0.1 localhost 행을 찾았습니다 code. 그래서 localhost를 통한 연결이 작동하지 않는 이유가 궁금합니다. 누군가 나를 깨달을 수 있다면 나는 행복 할 것입니다.
ola

2
php.ini의 mysql.default_socket이 잘못 되었기 때문입니다. "php -i | grep mysql.default_socket"실행
Jonah

1
이것은 나를 위해 일했으며, homebrew를 통해 설치된 mysql 5.7이있는 el Capitan에 있습니다. WP 설치를 시도하고 있었는데 "localhost"를 "127.0.0.1"로 변경했을 때 연결할 수있었습니다.
dgig

5
"호스트 이름 localhost는 특별한 의미를 가지고 있습니다. Unix 도메인 소켓 사용에 바인딩되어 있습니다. 호스트 이름 localhost를 사용하여 TCP / IP 연결을 열 수 없습니다. 대신 127.0.0.1을 사용해야합니다." - php.net/manual/en/mysqli.quickstart.connections.php . 따라서 기본적으로 작동을 허용하는 Unix 도메인 소켓에 연결하는 것이 작동하지 않고 localhostTCP / IP가 작동하므로 TCP / IP 주소로 변경 127.0.0.1하면 작동합니다.
Edward

39

이것은 Apache HTTP기본 설치MySQL의 사용자 정의 설치 가있는 Mac OS X 용 입니다 .

대답은 @ alec-gorge의 탁월한 응답을 기반으로하지만 내 구성 (대부분 Mac OS X 특정 구성)에 구성하기 위해 몇 가지 특정 변경 사항을 Google에 검색해야했기 때문에 완전성을 위해 여기에 추가 할 것이라고 생각했습니다.

Apache HTTP에 대한 PHP5 지원 활성화

에서 PHP5 지원이 활성화되어 있는지 확인하십시오 /etc/apache2/httpd.conf.

php5_module 모듈 을로드 하려면 파일을 편집 sudo vi /etc/apache2/httpd.conf(요청시 암호 입력 ;)하고 줄의 주석을 제거 ( 시작 부분부터 제거 )합니다 .

LoadModule php5_module libexec/apache2/libphp5.so

Apache HTTP를 시작합니다 sudo apachectl start(또는 restart이미 시작되어 구성 파일을 다시 읽기 위해 다시 시작해야하는 경우).

/var/log/apache2/error_logphp5_module이 활성화되었음을 알려주는 줄이 있는지 확인하십시오 PHP/5.3.15.

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

소켓 파일 이름 조회

MySQL이 실행 중일 때 (와 함께 ./bin/mysqld_safe) 로그 파일을 찾을 수있는 위치를 알려주는 디버그 행이 콘솔에 인쇄되어야합니다. 파일 이름의 호스트 이름을 기록해 두십시오. localhost제 경우에는 구성에 따라 다를 수 있습니다.

뒤에 오는 파일 Logging to이 중요합니다. MySQL이 작업을 기록하는 곳입니다.

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

localhost.err파일을 엽니 다 (다시 말하지만, 이름이 다를 수 있음). 즉 tail -1 /Users/jacek/apps/mysql/data/localhost.err, 소켓 파일의 이름을 찾으려면 마지막 행이어야합니다.

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

.NET에서 socket:사용해야하는 소켓 파일 인 부분에 유의하십시오 php.ini.

MySQL에 로그인하고 실행하여 소켓의 파일 이름 위치를 결정하는 또 다른 방법 (일부는 더 쉬운 방법이라고 말합니다)이 있습니다.

show variables like '%socket%';

MySQL 지원으로 PHP5 구성-/etc/php.ini

php.ini라고하면 ...

에서 /etc디렉토리있다 /etc/php.ini.default 파일. /etc/php.ini에 복사하십시오 .

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

mysql.default_socket을 열고 /etc/php.ini찾습니다 .

sudo vi /etc/php.ini

기본값은 mysql.default_socket입니다 /var/mysql/mysql.sock. 이전에 기록한 값으로 변경해야합니다 /tmp/mysql.sock. 제 경우에는 그렇습니다.

/etc/php.ini소켓 파일의 이름을 반영 하도록 파일을 바꿉니다 .

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

최종 확인

Apache HTTP를 다시 시작하십시오.

sudo apachectl restart 

PHP5와 관련된 오류가 없는지 로그를 확인하십시오. 오류가 없다는 것은 끝났음을 의미하며 MySQL과 PHP5가 제대로 작동합니다. 축하합니다!


이 답변하는 데 도움이
Vigneshwaran

이 대답은 쓰레기입니다. 그것은 질문되는 질문과 관련이 없으며 기본적으로 am (acos) amp 튜토리얼 일뿐입니다. 좋다면 여기에 넣으면 훨씬 더 낭비되고 실제로 앰프 스택을 설정하려는 사람들이있는 곳이 아닙니다. macOS가보고 있습니다. 질문과 관련하여 :이 답변은 오류가 발생하는 이유와 PHP가 대신 호스트 이름 대신 소켓을 통해 연결을 시도하는 이유에 대한 똥을 설명 하지 않습니다. 이는 원래 질문 mysql_connect실제 문제이며 일반 질문이 아닙니다. 소프트웨어 설치에 대한 오해.
ohcibi

@ohcibi "완벽 함을 위해 여기에 추가 할 생각"이라고 썼습니다 . 충분할 것이라고 생각했습니다 (그리고 몇 명의 사람들이 좋아하는 찬성 투표를 받았습니다). 대답을 더 쉽게 찾을 수 있다는 생각이 마음에 들지만 방법은 모르겠습니다. 당신의 생각을 공유하고 저를 다시 도와 주시겠습니까? 감사!
Jacek Laskowski

일반적으로 @JacekLaskowski : 블로그 게시물을 작성하고 여기에 있었던 것과 동일한 의도로 수락 된 / 가장 많이 찬성 된 응답에 대한 링크를 댓글로 작성합니다 ( "완전성을 위해 추가"). 그러나이 스레드에서 나는 그 링크를 게시 할 이유조차 보지 못했습니다. OP는 그가 macOS를 사용하고 있다고 말했지만이 문제는 어떤 운영 체제와도 전혀 관련이 없지만 mySQL의 localhost. macOS에서 xamp 설정에 대한 도움을 찾는 사람은 인터넷 검색을 통해 여기에 올 수 없습니다. 그래서 저는 '쓰레기'라는 용어를 사용했습니다. 이 스레드는 macos와는 전혀 관련이 없지만 mysql 과만 관련이 있습니다 (php도 아님).
ohcibi

14

구성 파일 (db 연결)에서 'localhost'를 '127.0.0.1'로 바꾸면 도움이되었습니다!


1
하지만 왜 도움을 받아야합니까?
Enamul Hassan

" 'localhost'를 '127.0.0.1'로 바꾸기"또는 127.0.0.1을 실제 MySQL 서버 주소 (예 : u55151.mysql.someserver.eu)로 변경합니다.
user2812532

13

mysql 서버를 다시 시작하면 도움이 될 수 있습니다. 제 경우에는 서버를 다시 시작하면 많은 시간이 절약되었습니다.

service mysql restart

PS- sudo service mysql restart루트가 아닌 사용자를위한 사용.


2
간단한 솔루션이 실제로 작동 할 때 너무 좋습니다.
abalter

10

먼저 MySQL이 실행 중인지 확인하십시오. 명령 : mysqld start

여전히 연결할 수없는 경우 : /etc/my.cnf는 어떻게 생겼습니까? (또는 /etc/msyql/my.cnf)

2002는 소켓 오류이기 때문에 소켓을 확인해야한다는 점에서 다른 2 개의 게시물은 정확합니다.

LAMP 설정에 대한 훌륭한 튜토리얼 : http://library.linode.com/lamp-guides/centos-5.3/index-print


설치 프로그램이 my.cnf 파일을 넣지 않았지만,이 파일 /usr/local/mysql/mysql-test/include/default_my.cnf을 my.cnf로 복사해야 /etc합니까?
mk12 2009

예,하지만 나중에 수정해야 할 수도 있습니다.
Todd Moses

7

그다지 도움이되지는 않지만 MySQL 의 최신 버전 (및 그보다 최신 버전 )에서 오류 코드 2002는 "[소켓 이름] 소켓을 통해 로컬 MySQL 서버에 연결할 수 없습니다"를 의미하므로이를 알 수 있습니다. 조금 더.


1
소스에서 MySQL 5.5.38이 설치된 OSX 10.9.x에서이 오류가 발생했습니다. 이 팁은 정확했습니다. mysqli_connect_errno () 및 mysqli_connect_error ())가 2002 파일을 찾을 수 없음 메시지를 말했지만 소켓 문제였습니다. /etc/php.ini를 편집하고 mysql.default_socket 및 mysqli.default_socket을 소켓 값으로 설정하여이 문제를 해결할 수있었습니다 (내 응용 프로그램이 연결에 mysqli를 사용했기 때문에)
Ronnie

7

여기 Matthias D의 답변을 확장 하면 다음 명령을 사용하여 정확한 경로로 MySQL과 MariaDB 모두 에서이 2002 오류 를 해결할 수 있습니다 .

먼저 MySQL 소켓 의 실제 경로 를 가져옵니다 .

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

그런 다음 PHP 경로를 얻습니다 .

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

이 두 명령출력을 사용하여 연결합니다.

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

그 결과가 반환 No such file or directory되면 PHP mysql.sock에 대한 경로를 생성해야합니다. 예를 들어 경로가 /var/mysql/mysql.sock다음과 같으면 다음을 실행합니다.

sudo mkdir -p /var/mysql

그런 다음 sudo ln 명령을 다시 시도 하십시오.


6

php.ini 파일을 확인하고 mysql.default_socket이 올바르게 설정되었는지 확인하고 mysqld가 액세스 할 수있는 소켓 파일로 올바르게 구성되었는지 확인합니다. 일반적인 기본값은 "/tmp/mysql.sock"입니다.


좋아요,라고하는데 /var/mysql/mysql.sock그 경로는 존재하지 않습니다.
mk12 2009

6

이 문제도 발생하여 'localhost'를 '127.0.0.1'로 수정했습니다.


6

제 경우에는 mysqli_connect에 문제가 있습니다. mysqli_connect_error ()
를 연결하고 싶을 때
mysqli_connect('localhost', 'myuser','mypassword')
"No such file or directory"라는 오류를 반환합니다.

이것은 나를 위해 일했다 mysqli_connect('localhost:3306', 'myuser','mypassword')


이것은 나를 위해 잘 작동했습니다. Armchair Analysis의 미식 축구 통계 패키지를 OS X 로컬 Mysql 설치에로드하는 데 필요한 변경 사항이었습니다. 감사!
마이클 스캇 커스버트

그 :) 듣고 기뻐
masoud2011

4

오류 2002는 MySQL이 소켓 파일 (예 :)을 통해 로컬 데이터베이스 서버에 연결할 수 없음을 의미합니다 /tmp/mysql.sock.

소켓 파일이 어디에 있는지 확인하려면 다음을 실행하십시오.

mysql_config --socket

그런 다음 응용 프로그램이 올바른 Unix 소켓 파일을 사용하는지 다시 확인하거나 대신 TCP / IP 포트를 통해 연결하십시오.

그런 다음 PHP에 올바른 MySQL 소켓 설정이 있는지 다시 확인하십시오.

php -i | grep mysql.default_socket

파일이 있는지 확인하십시오 .

소켓 테스트 :

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

Unix 소켓이 잘못되었거나 존재하지 않는 경우 심볼릭 링크 할 수 있습니다. 예를 들면 다음과 같습니다.

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

또는 구성 파일을 수정하십시오 (예 :) php.ini.

PHP에서 직접 PDO 연결 을 테스트하려면 다음을 실행할 수 있습니다.

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

구성이 다를 수 있으므로 Apache와 CLI (명령 줄 인터페이스) 간의 구성도 확인하십시오.

서버가 실행 중이지만 서버가 수신하는 것과 다른 TCP / IP 포트, 명명 된 파이프 또는 Unix 소켓 파일을 사용하여 연결하려고 할 수 있습니다. 수정하려면 클라이언트 프로그램 (예 : --port옵션 지정 ) 을 호출 하여 적절한 포트 번호를 나타내거나 적절한 명명 된 파이프 또는 Unix 소켓 파일 (예 : --socket옵션)을 표시해야합니다.

참조 : MySQL 연결 문제 해결


문제를 추적하는 데 도움이 될 수있는 기타 유틸리티 / 명령 :

  • mysql --socket=$(php -r 'echo ini_get("mysql.default_socket");')
  • netstat -ln | grep mysql
  • php -r "phpinfo();" | grep mysql
  • php -i | grep mysql
  • 에 사용 XDebug가 xdebug.show_exception_trace=1xdebug.ini
  • OS X try sudo dtruss -fn mysqld, Linux에서 디버그strace
  • Unix 소켓에 대한 권한을 확인 stat $(mysql_config --socket)하고 여유 공간이 충분한 지 확인하십시오 ( df -h).
  • MySQL을 다시 시작하십시오.
  • 확인하십시오 net.core.somaxconn.

3

로컬 서버 (MAMP, XAMPP, WAMP 등)가 실행 중인지 확인하십시오.


이 외에도 MacOS에서 MAMP를 사용하는 경우 (분명히!) Mac을 잠자기에서 깨운 직후 사이트에 액세스하면이 오류가 발생합니다. 물론 해결책은 기다렸다가 다시 시도하는 것입니다. :-)
texelate

0

비슷한 문제가있었습니다.
기본적으로 여기서 문제는 아마도 두 개의 mysql 인스턴스가 실행 중이라는 것입니다.
A) /etc/init.d에서 실행중인 하나
B) / opt / lamp에 설치된 램프
솔루션 :
1 단계 :-commnad "find / | grep mysqld"를 사용하여 모든 mysql 실행 인스턴스를 찾습니다
. 2 단계 :-에서 실행중인 서비스를 종료합니다. /etc/init.d using service mysql stop
3 단계 :-/ opt / lamp / lamp restart를 사용하여 램프 서비스를 다시 시작합니다.

당신은 가야합니다 :)


0

Mac에서는 모든 노력을하기 전에에서 설정을 확인하기 만하면됩니다 System Preferences > MySQL. .NET 이후로 팀이이 문제를 겪는 것을 자주 경험했습니다 The MySQL Server Instance is stopped.

Start MySQL Server버튼을 클릭하면 마법이 일어납니다.


0

내 서버에서 PHP-FPM 또는 여러 PHP 버전을 사용하고 있습니다. 내 경우에는 mysql 기본 소켓 매개 변수가 없기 때문에 mysqli 값을 업데이트합니다.

mysqli.default_socket

받는 사람 :

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

@Alec Gorge 덕분에


0

나는 같은 문제가 있었다. 내 소켓은 결국 /tmp/mysql.sock에서 발견되었습니다. 그런 다음 해당 경로를 php.ini에 추가했습니다. MySQL Workbench의 "서버 상태"페이지를 확인하여 소켓을 찾았습니다. 소켓이 /tmp/mysql.sock에 없으면 MySQL Workbench가 위치를 알려줄 수 있습니까? (MySQL Workbench를 사용하도록 허용했습니다 ...)



0

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

이 파일 끝 추가 /etc/mysql/my.cnf

[mysqld]
innodb_force_recovery = 1

MySql 다시 시작

service mysql restart


-1

Linux 서버에서도 동일한 문제가 발생했습니다. 나에게 도움이 된 것은 Linux 서버를 재부팅하는 데 사용되는 ' sudo reboot '명령입니다.


-2

mariadb 서비스 활성화 및 시작

sudo systemctl은 mariadb.service를 활성화합니다.

sudo systemctl start mariadb.service

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