programing

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

sourcetip 2022. 10. 8. 16:42
반응형

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

테스트 스위트 중에 로컬 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%는 아닌 것 같습니다. 왜냐하면 거의 모든 테스트 스위트가 실제로 이 오류에 도달하지 않고 실행되기 때문입니다.가가 with with with with with with with with와 함께 때sudo dtruss재현되지 않았다.

클라이언트 코드는 모두 Python으로 되어 있습니다만, 그것이 어떻게 관련되어 있는지 알 수 없습니다.

127.0.0.1에러가 발생합니다.

DatabaseError: Can't connect to MySQL server on '127.0.0.1' (61)
sudo /usr/local/mysql/support-files/mysql.server start 

이건 나한테 효과가 있었어.단, 이 방법으로 동작하지 않으면 mysqld가 실행 중인지 확인하고 연결을 시도합니다.

MySQL 매뉴얼의 관련 섹션은 여기에 있습니다.먼저 여기에 나와 있는 디버깅 단계를 살펴보겠습니다.

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

  • 가 「 「 」로 되어 있는 .localhost소켓 또는 파이프를 사용합니다.
  • 가 「 「 」로 되어 있는 .127.0.0.1TCP/IP를 사용합니다.

가 TCP vi를 할 수 .netstat -nlp하고 있는 것이것은, 「IS」TCP라고 입니다.mysql -h 127.0.0.1정상적으로 동작합니다.할 수 하려면 , 「」를 합니다.mysql -h localhost

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

MySQL Server 는는는는는 는는는 。처음으로먼저서버를실행한 후 실행 실행 서버를 실행합니다.mysql..

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

MySQL과 함께 미리 구성된 MAMP와 같은 스택 매니저가 표준이 아닌 장소에 설치되어 있을 때 이러한 현상이 발생하는 것을 본 적이 있습니다.

당신의 터미널 런에서

mysql_config --socket

Sock 파일에 대한 경로를 제공합니다. 이 경로를 사용하여 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 서버의 인스턴스가 설치되어 있는 경우 잘못된 인스턴스에 접속하고 있을 수 있습니다.

나는 단지방금 바꿨어요를 바꾸었다.HOST부터에서localhost로.127.0.0.1그리고 fine 작동합니다.정상적으로 동작합니다.

# 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': '',
},
...

저는 mysql 서버가 실행되고 있지 않았습니다.그래서 mysql 서버를 기동했습니다.

mysql.server start

그리고나서

mysql_secure_installation

서버의 보안을 유지하기 위해 이제 MySQL 서버를 방문할 수 있습니다.

mysql -u root -p

또는

sudo mysql -u root -p

설치 환경에 따라 다릅니다.

mac OSx에서 daemon mysql이 손실되었지만 private/var에서 example의 다른 경로에 있는 경우 다음 명령을 수행합니다.

1)

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

2) mysql 접속을 재기동합니다.

mysql -u username -p -h host databasename

마리애드브에게도 효과가 있다.

터미널에서 아래 cmd를 실행합니다.

/usr/local/bin/mysqld_safe

여기에 이미지 설명 입력

그런 다음 시스템을 다시 시작하여 활성화합니다.됐다!!

몇 가지 솔루션을 시도했지만 성공하지 못한 후 다음과 같은 이점이 있었습니다.

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

사람들 5.7에서 8.0에 홈 브류를 통해 업그레이드하기 위해, 이 오류 업그레이드를 완전하지 않아 발생할 가능성이 높다.통해 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)이 다시 작동합니다.

lsof 명령을 사용하여 mysql 프로세스에서 열려 있는 파일 수를 확인합니다.

열려 있는 파일 제한을 늘린 후 다시 실행하십시오.

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

  1. 잘못된 mysql 잠금 솔루션:올바른 mysql 소켓을 다음 순서로 찾아야 합니다.

mysqladmin -p variables | grep 소켓

다음 db 연결 코드에 입력합니다.

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

/tmp/syslog.grep에서 반환된 값입니다.

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

mysqladmin -p variables | grep port

그리고 코드:

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

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

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

나는 이 일에 대해 두 가지 교묘한 추측이 있다.

추측 #1

할 수 없는 수 ./tmp/mysql.sock 데이터베이스를때 보통 MySQL의 합니다./var/lib/mysql에 mysql로 root@localhost , OS 세션에 할 필요가 /tmp확인하다/tmp 있습니다. sudo 파일을 수 하십시오./tmp.

추측 #2

접근127.0.0.1주의를 기울이지 않으면 혼동을 일으킬 수 있습니다. ★★★★★★★★★★★★★★★★★★?

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

이게 당신에게 무엇을 주나요?

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

이러한 함수가 같은 값으로 반환될 경우 예상대로 연결 및 인증됩니다.하는 사용자 를 해야 할 수 .root@127.0.0.1.

예전에도 이런 행동을 본 것 같은데 자세한 건 기억이 안 나네요.
" " " " " " " " " " " " " " " " " " " 。py_init_ 입니다.py의 모듈 Import에 의해 요구되는 첫 번째 데이터베이스 상호작용과 관련된 데이터베이스 접속을 초기화하는 순간이었습니다.★★★★★★★★★★★★★★★★★★★★★★★★★★. 하지만 벌써 당신 사건을 떠올릴지도 몰라요.

에 /etc/hosts가 있는지 합니다.127.0.0.1 localhost 될 거예요.

다음과 같은 오류가 발생할 경우:

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

그런 다음 mysqld.sock 파일 위치를 찾아 "HOST"에 추가합니다.

를 사용하는 에서 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' : ''
    }
}

알고 보니mysqld가 실행을 정지했습니다(Mac OSX에서 실행 중지되었습니다.이치노

보니, 나는 그 사실을 알게 되었다.mysqld는 주로 다음 링크 때문에 실행되지 않았습니다.http://dev.mysql.com/doc/refman/5.6/en/can-not-connect-to-server.html

첫 번째 힌트 주목!

먼저 모든 프로세스 ID를 검색하여 모든 mysql 인스턴스를 삭제해야 했습니다.

ps aux | grep mysql

그리고 그들을 죽인다:

-9 {pid} 종료

그 후, 다음과 같이 입력합니다.

mysql.server 시작

나한테는 통했어

my.cnf 설정이 올바르지 않은 경우 mysql이 최대 접속 수에 도달하지 않았거나 자주 발생하는 부트루프 같은 것이 없는지 확인합니다.

ps aux | grep mysql을 사용하여 PID가 변경되었는지 확인합니다.

온라인상에서 너무 오랫동안 찾아봐서 기고하지 않았어.명령줄에서 mysql 프롬프트를 입력하려고 하면 다음 메시지가 계속 표시됩니다.

오류 2002(HY000):소켓 '/tmp/mysql'을 통해 로컬 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;

소켓은 /tmp에 있습니다.Unix 시스템에서는 /tmp의 모드와 소유권에 의해 문제가 발생할 수 있습니다.단, mysql connexion을 정상적으로 사용할 수 있다고 알려주신다면 시스템상에는 문제가 없을 것 같습니다.프라이머리 체크는 mysql.sock을 보다 중립적인 디렉토리로 재배치하는 것입니다.

문제가 랜덤하게 발생하고 있는 것(혹은 매번 발생하고 있는 것은 아님)에 의해서, 서버의 문제일 가능성이 있다고 생각할 수 있습니다.

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

  • /tmp가 비어 있습니까?

  • iotop당신이 문제를 만났을 때 뭔가 잘못된 것을 보여줍니까?

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

도움이 될 거야

Homebrew를 통해 설치했다면

brew services start mysql

'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

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=

저는 mysqld가 시작되어 명령줄 mysql이 정상적으로 동작할 수 있다고 확신합니다.단, httpd 서버가 문제를 나타내고 있습니다(소켓 경유로 mysql에 접속할 수 없습니다).

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

마지막으로 mysqld 서비스를 service mysqld start로 시작하면 문제(selinux 권한 문제)가 발생하고 selinux 문제를 수정하여 service mysqld start로 mysqld를 시작하면 httpd 연결 문제가 사라집니다.그러나 mysqld_safe&를 사용하여 mysqld를 시작하면 mysqld를 실행할 수 있습니다.(클라이언트는 정상적으로 동작할 수 있습니다).그러나 httpd에 접속하면 아직 문제가 발생합니다.

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

/etc/mysql/my.cnf

표준 소켓의 위치를 확인합니다.다음과 같은 라인입니다.

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

셸의 에일리어스를 만듭니다.

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

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

그냥 도망가려고 해 봐.mysqld.

이게 맥에서는 안 되는 거였어요.그래도 안 되면 로 가보세요./usr/local/var/mysql/<your_name>.err자세한 에러 로그를 표시합니다.

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

  • 뛰었다sudo find / -name my.cnf
  • 파일이 발견된 위치:/usr/local/etc/my.cnf

잠시 동작하다가 에러가 재발.Homebrew 버전의 MySQL을 제거하고 여기서 직접 .dmg 파일을 설치했습니다.

그때 이후로 행복하게 연결되고 있습니다.

내 경우 파일을 편집한 것이 도움이 되었다./etc/mysql/mysql.conf.d/mysqld.cnf행을 바꿉니다.

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

와 함께

socket      = /tmp/mysql.sock

그리고 나서 서버를 다시 시작했는데 정상적으로 작동했어요.재밌는 건 아까처럼 다시 연결해서 다시 시작해도 계속 작동한다는 거예요.

언급URL : https://stackoverflow.com/questions/16325607/cant-connect-to-local-mysql-server-through-socket-tmp-mysql-sock

반응형