소켓 '/tmp/mysql.sock을 통해 로컬 MySQL 서버에 연결할 수 없습니다.


126

테스트 도구 모음 중에 로컬 MySQL 서버에 연결하려고하면 다음 오류와 함께 실패합니다.

OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)")

그러나 명령 줄 mysql프로그램 을 실행하여 항상 MySQL에 연결할 수 있습니다. A ps aux | grep mysql는 서버가 실행 중임 stat /tmp/mysql.sock을 나타내고 소켓이 있는지 확인합니다. 또한 except해당 예외의 절 에서 디버거를 열면 정확히 동일한 매개 변수로 안정적으로 연결할 수 있습니다.

이 문제는 상당히 안정적으로 재현되지만 100 %로 보이지는 않습니다. 블루 문에서 매번 테스트 스위트가 실제로이 오류없이 실행되기 때문입니다. 실행하려고 할 때 sudo dtruss재생산되지 않았습니다.

모든 클라이언트 코드는 Python으로되어 있지만 그게 얼마나 관련이 있는지 알 수는 없습니다.

호스트를 사용하도록 전환 127.0.0.1하면 오류가 발생합니다.

DatabaseError: Can't connect to MySQL server on '127.0.0.1' (61)

1
동시 연결이 많은 데이터베이스를 어떻게 든 공격 할 수 있습니까? max_connectionsMySQL conf 파일을 늘려보십시오 .
dgel

2
수행 mysql -h 127.0.0.1명령 줄에서 작업을? mysql 서버가 실제로 TCP 포트에서 수신하고 있는지 잘 모르겠습니다.
Eli

1
사용중인 MySQL 버전에 맞는 Python MySQL 클라이언트 라이브러리 버전이 있습니까? 또한 mysql -h localhost안정적으로 작동합니까?
Old Pro

2
MySQL은 오류 로그에 아무것도 기록합니까? 또한 /tmp/mysql.sock 및 mysql 데이터 디렉토리에 대한 파일 권한을 확인하십시오. 테스트 스위트를 루트 (sudo)로 실행하는 경우에도 오류가 발생합니까?
Erik Cederstrand

2
이러한 제안 중 상당수는 아래의 답변에서 참조 하는 공식 MySQL 참조 매뉴얼에 포함되어 있습니다. 이러한 제안 중 한두 가지를 시도하는 것보다 MySQL 참조 매뉴얼 제안을 체계적으로 살펴 보는 것이 시간을 더 잘 활용하는 것입니다.
jtoberon 2013 년

답변:


152
sudo /usr/local/mysql/support-files/mysql.server start 

이것은 나를 위해 일했습니다. 그러나 이것이 작동하지 않으면 mysqld가 실행 중인지 확인하고 연결을 시도하십시오.


1
나는 2 주 이상을 보냈고 (농담조차 아님) 마침내 연결될 수있는 가장 가까운 시간입니다. 그러나 그것은 'starting mysql'에 붙어 있습니다. ..... 그러나 감사합니다, 좋은 포스트!
L. Klotz

2
sudo : /usr/local/mysql/support-files/mysql.server : 명령을 찾을 수 없습니다. 왜?
Syam Pillai 2016

1
왜 sudo 뒤에 콜론이 있습니까? 경로가 있는지 확인
Pratyay

또는 mysql이 homebrew와 함께 설치된 경우 : sudo /usr/local/Cellar/mysql/<version>/support-files/mysql.server start
Majoren

1
PID 파일 (/var/lib/mysql/Saranshs-MacBook-Pro.local.pid)을 업데이트하지 않고 서버가 종료됩니다.
saran3h

90

MySQL 매뉴얼의 관련 섹션은 여기에 있습니다 . 거기에 나열된 디버깅 단계를 통해 시작하겠습니다.

또한 localhost와 127.0.0.1은이 컨텍스트에서 동일하지 않습니다.

  • host가로 설정되면 localhost소켓 또는 파이프가 사용됩니다.
  • 호스트가 다음으로 설정된 경우 127.0.0.1 되면 클라이언트는 강제로 TCP / IP를 사용합니다.

예를 들어 데이터베이스가 TCP 연결 vi를 수신하고 있는지 확인할 수 있습니다 netstat -nlp. TCP 연결을 듣고있는 것 같습니다.mysql -h 127.0.0.1잘 작동 . 소켓을 통해 데이터베이스에 연결할 수 있는지 확인하려면 mysql -h localhost.

이 방법 중 어느 것도 도움이되지 않으면 MySQL 구성에 대한 자세한 내용, 연결을 인스턴스화하는 방법 등에 대한 자세한 내용을 게시해야합니다.


일반적으로 확립 된 진단 절차를 따르는 것이 좋지만 질문 (및 절차)을 읽으면 절차를 따 랐음을 알 수 있으며 이것이 MySQL 서버에 문제가 아니라고 판단한 것입니다. 소켓을 통한 다른 모든 액세스 (파이썬의 다른 액세스 포함)가 잘 작동하기 때문에 이것은 파이썬 클라이언트와 특별히 관련된 것입니다.
Old Pro

1
이 얼마나 이상한 반대표. 몇 가지 이유로 확립 된 프로 시저를 게시했습니다. (1) 다른 사람들이 확립 된 프로 시저의 일부만 게시했으며 디버깅에 대해 체계적인 것이 더 낫습니다. (2) localhost와 127.0.0.1에 대해 약간의 혼란이있는 것 같았습니다. ) 같은 "로컬 mysql 서버에 연결할 수 없습니다"증상을 가진 다른 사람들은이 질문을 우연히 발견 할 것입니다. 나는 그것이 파이썬 클라이언트 일 가능성이 높다는 것을 알고 있습니다. 이것이 제가 더 많은 정보를 요청한 이유입니다.
jtoberon 2013 년

4
+1 ssh 터널 ( localhost호스트로 사용) 을 통해 mysql에 연결하려고하면이 오류가 발생했습니다 . 127.0.0.1수정하도록 변경 했습니다.
krock

기록을 위해, 이것은 "소켓 '/tmp/mysql.sock'을 통해 로컬 MySQL 서버에 연결할 수 없습니다"라는 내 문제를 해결했습니다.
proinsias 2016 년

감사! 도커 maridb 컨테이너에 연결하려고 시도하는 동안이 수정 사항이 저에게 효과적이었습니다.
Lucian Oprea

86

나에게 문제는 내가 mysql 서버를 실행하지 않았다는 것이었다. 먼저 서버를 실행 한 다음 실행 mysql합니다.

$ mysql.server start
$ mysql -h localhost -u root -p

28

내 개발자가 비표준 위치에 설치된 MySQL로 미리 구성된 MAMP와 같은 스택 관리자가 설치되어있을 때 내 가게에서 이런 일이 발생하는 것을 보았습니다.

터미널에서 실행

mysql_config --socket

양말 파일에 대한 경로를 제공합니다. 그 경로를 취하고 DATABASES HOST 매개 변수에서 사용하십시오.

당신이해야 할 일은 당신의

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'test',
        'PASSWORD': 'test',
        'HOST': '/Applications/MAMP/tmp/mysql/mysql.sock',
        'PORT': '',
    },
}

노트

또한 which mysql_config컴퓨터에 여러 개의 mysql 서버 인스턴스가 설치된 경우 에도 실행 하면 잘못된 인스턴스에 연결될 수 있습니다.


양말 파일이 없으면 어떻게합니까?
AlxVallejo

다른 쌍을 사시겠습니까? j / k는 mysql 서비스가 실행되고 있지 않음을 의미합니다. mysql 시작 / 다시 시작
Francis

6
제 경우에는 HOST를 "localhost"에서 "127.0.0.1"로 변경하면 문제가 해결되었습니다.
lucaswxp 2015 년

@lucaswxp : 내 경우에는 내가 도메인 이름으로 localhost를 변경해야
Anshul 슈라

19

난 그냥 변경 HOST에서 localhost127.0.0.1하고 그것을 잘 작동합니다 :

# settings.py of Django project
...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': '127.0.0.1',
        'PORT': '',
},
...

4
변경 한 파일과 위치를 아는 것이 좋을 것입니다
Empi

1
에서 settings.py프로젝트.
Sirbito X

11

Mac OSx에서 mysql 데몬을 잃었지만 private / var의 예를 위해 다른 경로에있는 경우 다음 명령을 수행하십시오.

1)

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

2) 다음을 사용하여 mysql에 대한 연결을 다시 시작하십시오.

mysql -u username -p -h host databasename

mariadb에서도 작동합니다.


9

터미널에서 아래 cmd를 실행하십시오.

/ usr / local / mysql / bin / mysqld_safe

여기에 이미지 설명 입력

그런 다음 시스템을 다시 시작하여 적용하십시오. 효과가있다!!


1
이것은 Mojave로 업그레이드 된 High Sierra를 실행하는 iMac에서 저에게 효과적이었습니다. 무슨 일이 있었는지 mysql.sock 파일이 tmp에 있었고 업그레이드시 삭제되었습니다. MySQL을 시작할 때 소켓이 자동으로 생성되므로 위와 같이 MySQL이 종료되었는지 확인한 다음 안전 모드에서 시작하면됩니다. mysql.sock 파일이 마술처럼 나타납니다.
David

8

lsof 명령을 사용하여 mysql 프로세스에 대해 열린 파일 수를 확인합니다.

열린 파일 제한을 늘리고 다시 실행하십시오.


나는 전에도 이것에 부딪 쳤고, 당신은 당신의 .cnf 파일을 통해 이것을 할 수 없습니다. 실제로 ulimit클라이언트와 서버가 열 수있는 열린 파일의 수를 늘려야 할 수도 있습니다 . 최신 버전의 우분투를 사용하는 경우 / etc / init에서 mysql upstart 스크립트를 편집해야 할 수 있지만 .cnf 파일에서 할 수 있기를 바랍니다.
언더런

8

이러한 솔루션 중 몇 가지를 시도했지만 성공하지 못한 후 이것이 저에게 효과적이었습니다.

  1. 시스템 재시작
  2. mysql.server 시작
  3. 성공!

7

다음 문제 중 하나 일 수 있습니다.

  1. 잘못된 mysql 잠금. 해결책 : 올바른 mysql 소켓을 찾아야합니다.

mysqladmin -p 변수 | grep 소켓

그런 다음 db 연결 코드에 넣으십시오.

pymysql.connect(db='db', user='user', passwd='pwd', unix_socket="/tmp/mysql.sock")

/tmp/mysql.sock은 grep에서 반환됩니다.

2. 잘못된 mysql 포트 솔루션 : 올바른 mysql 포트를 찾아야합니다.

mysqladmin -p variables | grep port

그런 다음 코드에서 :

pymysql.connect(db='db', user='user', passwd='pwd', host='localhost', port=3306)

3306은 grep에서 반환 된 포트입니다.

첫 번째 옵션이 문제를 해결할 것이라고 생각합니다.


6

homebrew를 통해 5.7에서 8.0으로 업그레이드 한 사람들에게이 오류는 업그레이드가 완료되지 않았기 때문에 발생할 수 있습니다. 제 경우 mysql.server start에는 다음과 같은 오류가 발생했습니다.

오류! PID 파일을 업데이트하지 않고 서버가 종료되었습니다.

그런 다음을 통해 로그 파일을 cat /usr/local/var/mysql/YOURS.err | tail -n 50확인하고 다음을 발견했습니다.

InnoDB : 충돌 후 업그레이드는 지원되지 않습니다.

같은 보트에있는 경우 먼저 mysql@5.7홈브류를 통해 설치 하고 서버를 중지 한 다음 8.0 시스템을 다시 시작하십시오.

brew install mysql@5.7

/usr/local/opt/mysql@5.7/bin/mysql.server start
/usr/local/opt/mysql@5.7/bin/mysql.server stop

그때,

mysql.server start

그러면 MySQL (8.0)이 다시 작동합니다.


나는 ERROR! The server quit without updating PID file다시 똑같다 .
awebartisan

제 경우에는 방금 mysql@5.7을 설치하고 최신 버전을 제거했습니다. 모든 것이 시작되었습니다. 삭제 된 데이터베이스가 없습니다.
Andrew Luca 19

4

나는 얼마 전에 이와 같은 행동을 본 것 같지만 세부 사항을 기억할 수 없습니다.
우리의 경우 문제는 testrunner가 예를 들어 settings.py 또는 일부 __init__.py에서 모듈을 가져 와서 필요한 첫 번째 데이터베이스 상호 작용과 관련된 데이터베이스 연결을 초기화하는 순간이었습니다. 더 많은 정보를 파헤쳐 보겠습니다.하지만 이미 귀하의 경우에 종을 울릴 수 있습니다.


4

이 있는지 당신의 / etc / hosts 파일을 확인 127.0.0.1 localhost그것과 그것을 잘 작동합니다


놀랍게도 (존중하게) 이것은 나를 위해 정렬했습니다.이를 확인했을 때 webdav Mavericks를 설정하려고 할 때 localhost를 다시 할당 한 파일을 포함하여 내 호스트 파일에 추가 (완전히 왜곡 된) 줄이 추가되었음을 발견했습니다.
rob_was_taken

4

나는 이것에 대해 두 가지 은밀한 추측이 있습니다.

형상 # 1

/tmp/mysql.sock파일 에 액세스 할 수없는 가능성을 조사 하십시오. MySQL 데이터베이스를 설정할 때 일반적으로 소켓 파일 사이트를 /var/lib/mysql. mysql에 다음과 같이 로그인하면root@localhost OS 세션에서 /tmp폴더에 액세스해야 합니다. /tmpOS에서 올바른 액세스 권한이 있는지 확인하십시오 . 또한 sudo 사용자가 항상 /tmp.

형상 # 2

127.0.0.1주의를 기울이지 않으면 mysql을 통해 액세스 하면 혼란이 발생할 수 있습니다. 어떻게?

명령 줄에서를 사용하여 MySQL에 연결하는 경우 127.0.0.1TCP / IP 프로토콜을 지정해야 할 수 있습니다.

mysql -uroot -p -h127.0.0.1 --protocol=tcp

또는 DNS 이름을 시도하십시오

mysql -uroot -p -hDNSNAME

이렇게하면로 로그인을 우회 root@localhost하지만root@'127.0.0.1' 정의 .

다음에 MySQL에 연결할 때 다음을 실행하십시오.

SELECT USER(),CURRENT_USER();

이것은 당신에게 무엇을 제공합니까?

  • 사용자() 는 MySQL에서 인증을 시도한 방법을보고합니다.
  • CURRENT_USER () 는 MySQL에서 인증이 허용 된 방법을보고합니다.

이러한 함수가 동일한 값으로 반환되면 예상대로 연결하고 인증하는 것입니다. 값이 다른 경우 해당 사용자를 만들어야 할 수 있습니다 root@127.0.0.1.



3

아래와 같은 오류가 발생하면 :

django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

그런 다음 mysqld.sock 파일 위치를 찾아 "HOST"에 추가하십시오.

Linux에서 xampp를 사용하는 것처럼 mysqld.sock파일이 다른 위치에 있습니다. 그래서 ' /var/run/mysqld/mysqld.sock'에 대해 작동하지 않습니다.

DATABASES = {

    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'asd',
        'USER' : 'root',
        'PASSWORD' : '',
        'HOST' : '/opt/lampp/var/mysql/mysql.sock',
        'PORT' : ''
    }
}

2

mysql이 최대 연결에 도달하지 않았는지 또는 my.cnf의 설정이 올바르지 않은 경우 자주 발생하는 일종의 부팅 루프에 있지 않은지 확인하십시오.

ps aux 사용 | grep mysql을 사용하여 PID가 변경되는지 확인하십시오.


2

기여하지 않기에는 너무 오래 온라인을 둘러 보았습니다. 명령 줄에서 mysql 프롬프트에 입력을 시도한 후에도 계속해서 다음 메시지를 받았습니다.

오류 2002 (HY000) : '/tmp/mysql.sock'소켓을 통해 로컬 MySQL 서버에 연결할 수 없습니다 (2).

이것은 내 로컬 mysql 서버가 더 이상 실행되지 않기 때문입니다. 서버를 다시 시작하기 위해 다음으로 이동했습니다.

shell> cd /user/local/bin

mysql.server가있는 곳. 여기에서 다음을 입력하십시오.

shell> mysql.server start

그러면 로컬 mysql 서버가 다시 시작됩니다.

필요한 경우 여기에서 루트 비밀번호를 재설정 할 수 있습니다.

mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass')
->                   WHERE User='root';
mysql> FLUSH PRIVILEGES;

2

먼저 모든 프로세스 ID를 찾아서 mysql의 모든 인스턴스를 제거해야했습니다.

ps aux | grep mysql

그리고 그들을 죽입니다.

kill -9 {pid}

그때:

mysql.server 시작

나를 위해 일했습니다.


1

소켓은 / tmp에 있습니다. Unix 시스템에서는 / tmp의 모드 및 소유권으로 인해 문제가 발생할 수 있습니다. 그러나 mysql 연결을 정상적으로 사용할 수 있다고 알려 주면 시스템에 문제가 없다고 생각합니다. 기본 검사는 mysql.sock을보다 중립적 인 디렉토리에 재배치하는 것입니다.

문제가 "무작위로"(또는 매번 발생하지 않음) 발생한다는 사실은 서버 문제 일 수 있다고 생각하게했습니다.

  • / tmp가 표준 디스크에 있습니까, 아니면 RAM과 같은 이국적인 마운트에 있습니까?

  • / tmp가 비어 있습니까?

  • 않습니다 iotop당신은 문제가 발생할 때 당신에게 뭔가 잘못 보여?


0

'DB 연결 관리'대화 상자에서 DB 연결을 구성하십시오. 연결 방법으로 '표준 (TCP / IP)'을 선택합니다.

자세한 내용은이 페이지를 참조하십시오. http://dev.mysql.com/doc/workbench/en/wb-manage-db-connections.html

이 다른 페이지 에 따르면 localhost를 지정하더라도 소켓 파일이 사용됩니다.

호스트 이름을 지정하지 않거나 특수 호스트 이름 localhost를 지정하는 경우 Unix 소켓 파일이 사용됩니다.

또한 다음 명령을 실행하여 서버를 확인하는 방법도 보여줍니다.

mysqld 프로세스가 실행 중이면 다음 명령을 시도하여 확인할 수 있습니다. 포트 번호 또는 Unix 소켓 파일 이름은 설정에서 다를 수 있습니다. host_ip는 서버가 실행중인 시스템의 IP 주소를 나타냅니다.

shell> mysqladmin version 
shell> mysqladmin variables 
shell> mysqladmin -h `hostname` version variables 
shell> mysqladmin -h `hostname` --port=3306 version 
shell> mysqladmin -h host_ip version 
shell> mysqladmin --protocol=SOCKET --socket=/tmp/mysql.sock version

0

ubuntu14.04에서는이 문제를 해결할 수 있습니다.

zack@zack:~/pycodes/python-scraping/chapter5$ **mysqladmin -p variables|grep socket**
Enter password: 
| socket                                            | ***/var/run/mysqld/mysqld.sock***                                                                                            |
zack@zack:~/pycodes/python-scraping/chapter5$***ln -s  /var/run/mysqld/mysqld.sock /tmp/mysql.sock***
zack@zack:~/pycodes/python-scraping/chapter5$ ll /tmp/mysql.sock 
lrwxrwxrwx 1 zack zack 27 11 29 13:08 /tmp/mysql.sock -> /var/run/mysqld/mysqld.sock=

0

저에게는 mysqld가 시작되고 명령 줄 mysql이 제대로 작동 할 수 있다고 확신합니다. 그러나 httpd 서버는 문제를 보여줍니다 (소켓을 통해 mysql에 연결할 수 없음).

mysqld_safe &로 서비스를 시작했습니다.

마지막으로 mysqld start 서비스로 mysqld 서비스를 시작하면 문제 (selinux 권한 문제)가 있으며, selinux 문제를 해결하고 "service mysqld start"로 mysqld를 시작하면 httpd 연결 문제가 사라집니다. 그러나 mysqld_safe &로 mysqld를 시작하면 mysqld가 작동 할 수 있습니다. (mysql 클라이언트가 제대로 작동 할 수 있습니다). 그러나 httpd와 연결할 때 여전히 문제가 있습니다.


0

소켓과 관련된 경우이 파일을 읽으십시오.

/etc/mysql/my.cnf

표준 소켓 위치가 무엇인지 확인하십시오. 다음과 같은 줄입니다.

socket = /var/run/mysqld/mysqld.sock

이제 다음과 같이 셸의 별칭을 만듭니다.

alias mysql="mysql --socket=/var/run/mysqld/mysqld.sock"

이렇게하면 루트 권한이 필요하지 않습니다.


0

단순히 실행하려고 mysqld .

이것은 Mac에서 나를 위해 작동하지 않는 것입니다. 작동하지 않으면 /usr/local/var/mysql/<your_name>.err자세한 오류 로그를 확인하십시오.


0
# shell script ,ignore the first 
$ $(dirname `which mysql`)\/mysql.server start

도움이 될 수 있습니다.


대부분의 스타 답변 'sudo /usr/local/mysql/support-files/mysql.server start'와 동일하지만 OS마다 'mysql.server'의 경로가 다를 수 있으므로 하나의 명령 줄을 작성하려고했습니다. 많은 OS에서 유용합니다.
陈也在哦

0

Homebrew를 통해 설치된 MySQL 8.0.19 용 MacOS Mojave 10.14.6 사용

  • sudo find / -name my.cnf
  • 파일을 찾았습니다. /usr/local/etc/my.cnf

한동안 작업 한 후 결국 오류가 반환되었습니다. MySQL의 Homebrew 버전을 제거하고 .dmg 파일을 여기

그 이후로 행복하게 연결되었습니다.


0

제 경우에는 파일을 편집 /etc/mysql/mysql.conf.d/mysqld.cnf하고 줄을 바꾸는 것이 도움이되었습니다 .

socket      = /var/run/mysqld/mysqld.sock

socket      = /tmp/mysql.sock

그런 다음 서버를 다시 시작했는데 제대로 작동했습니다. 재미있는 점은 이전과 같이 라인을 되돌리고 다시 시작해도 여전히 작동한다는 것입니다 ..


0

나는 최근에 비슷한 문제에 직면했습니다. 많은 답변을했습니다. 다음 단계에 따라 작동합니다.

  1. /etc/my.cnf에서 소켓 경로를 변경하십시오 (/tmp/mysql.sock 오류가 반복적으로 발생했기 때문에) 참조
  2. 오류 발생시 다시 시작하는 것이 권장되는 방법이므로 mysqld_safe를 실행하여 서버를 다시 시작하십시오. mysqld_safe에 대한 참조

0

저에게는 mysql 서버가 실행되지 않았습니다. 그래서 mysql 서버를 시작했습니다.

mysql.server start

그때

mysql_secure_installation

서버를 보호하기 위해 이제는 다음을 통해 MySQL 서버를 방문 할 수 있습니다.

sudo mysql -uroot -p

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