Nie można połączyć się z lokalnym serwerem MySQL przez gniazdo '/tmp/mysql.sock

126

Kiedy próbowałem połączyć się z lokalnym serwerem MySQL podczas mojego zestawu testów, kończy się to niepowodzeniem z błędem:

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

Jednak zawsze mogę połączyć się z MySQL, uruchamiając mysqlprogram wiersza poleceń . A ps aux | grep mysqlpokazuje, że serwer jest uruchomiony, a stat /tmp/mysql.sock potwierdza, że ​​gniazdo istnieje. Ponadto, jeśli otworzę debugger w exceptklauzuli tego wyjątku, będę w stanie niezawodnie połączyć się z dokładnie tymi samymi parametrami.

Ten problem odtwarza się dość niezawodnie, jednak nie wydaje się, aby był w 100%, ponieważ co raz na niebieskim księżycu mój zestaw testowy w rzeczywistości działa bez tego błędu. Kiedy próbowałem z sudo dtrussnim biegać , nie rozmnażałem się.

Cały kod klienta jest w Pythonie, chociaż nie wiem, jakie to ma znaczenie.

Przełączenie do korzystania z hosta 127.0.0.1powoduje błąd:

DatabaseError: Can't connect to MySQL server on '127.0.0.1' (61)
Alex Gaynor
źródło
1
Czy to możliwe, że w jakiś sposób trafiasz do bazy danych z wieloma równoczesnymi połączeniami? Może spróbuj zwiększyć max_connectionsswój plik konfiguracyjny MySQL?
dgel
2
czyni mysql -h 127.0.0.1pracę z linii poleceń? Nie jestem pewien, czy Twój serwer mysql faktycznie nasłuchuje na porcie TCP.
Eli
1
Czy na pewno masz odpowiednie wersje bibliotek klienta Python MySQL dla swojej wersji MySQL? Czy mysql -h localhostdziała niezawodnie?
Old Pro
2
Czy MySQL zapisuje cokolwiek w dzienniku błędów? Sprawdź także uprawnienia do plików w /tmp/mysql.sock i katalogu danych mysql. Czy błędy występują również, jeśli uruchomisz zestaw testów jako root (sudo)?
Erik Cederstrand
2
Wiele z tych sugestii jest opisanych w oficjalnej instrukcji obsługi MySQL, do której odwołuję się w mojej odpowiedzi poniżej. Lepiej jest wykorzystać czas, aby systematycznie przeglądać sugestie podręcznika MySQL, zamiast wypróbowywać tylko jedną lub dwie z tych sugestii.
jtoberon

Odpowiedzi:

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

To zadziałało dla mnie. Jeśli jednak to nie zadziała, upewnij się, że mysqld działa i spróbuj się połączyć.

Pratyay
źródło
1
Spędziłem ponad 2 tygodnie (nawet nie żartowałem) i to jest najbliżej, aby wreszcie móc się połączyć. Jednak utknęło na „uruchamianiu mysql” ..... Ale dzięki, fajny post!
L. Klotz
2
sudo: /usr/local/mysql/support-files/mysql.server: nie znaleziono polecenia. czemu?
Syam Pillai
1
Dlaczego dwukropek po sudo? Sprawdź, czy ścieżka istnieje
Pratyay
Lub, jeśli mysql został zainstalowany z homebrew: sudo /usr/local/Cellar/mysql/<version>/support-files/mysql.server start
Majoren
1
Serwer zakończył pracę bez aktualizacji pliku PID (/var/lib/mysql/Saranshs-MacBook-Pro.local.pid).
saran3h
90

Odpowiednia sekcja podręcznika MySQL znajduje się tutaj . Zacząłbym od wykonania wymienionych tam kroków debugowania.

Pamiętaj też, że localhost i 127.0.0.1 to nie to samo w tym kontekście:

  • Jeśli host jest ustawiony na localhost , używane jest gniazdo lub potok.
  • Jeśli host jest ustawiony na 127.0.0.1, klient jest zmuszony do korzystania z protokołu TCP / IP.

Na przykład możesz sprawdzić, czy twoja baza danych nasłuchuje połączeń TCP vi netstat -nlp . Wydaje się prawdopodobne, że nasłuchuje połączeń TCP, ponieważ mówisz, że mysql -h 127.0.0.1działa dobrze. Aby sprawdzić, czy możesz połączyć się z bazą danych za pośrednictwem gniazd, użyjmysql -h localhost .

Jeśli nic z tego nie pomaga, prawdopodobnie musisz opublikować więcej szczegółów na temat konfiguracji MySQL, dokładnego sposobu tworzenia wystąpienia połączenia itp.

jtoberon
źródło
Chociaż ogólnie przestrzeganie ustalonych procedur diagnostycznych jest dobrym pomysłem, jeśli przeczytasz pytanie (i procedury), zobaczysz, że procedury zostały zastosowane i stwierdzisz, że nie jest to problem z serwerem MySQL. Jest to szczególnie związane z klientem Pythona, ponieważ każdy inny dostęp przez gniazdo działa dobrze, w tym inny dostęp z Pythona.
Old Pro
1
Co za dziwne głosowanie. Opublikowałem ustaloną procedurę z kilku powodów: (1) inne osoby publikowały tylko część ustalonej procedury i lepiej jest być systematycznym w debugowaniu, (2) wydawało się, że jest trochę nieporozumień co do hosta lokalnego w porównaniu z 127.0.0.1 i (3 ) inne osoby z tym samym symptomem „Nie można połączyć się z lokalnym serwerem mysql” prawdopodobnie natkną się na to pytanie. Zdaję sobie sprawę, że prawdopodobnie jest to klient Pythona, dlatego poprosiłem o więcej informacji, np. O sposobie tworzenia instancji połączenia.
jtoberon
4
+1 Otrzymałem ten błąd podczas próby połączenia się z mysql przez tunel ssh (używając localhostjako hosta). Zmiana, aby 127.0.0.1to naprawić.
krock
Dla przypomnienia, rozwiązało to mój problem: „Nie można połączyć się z lokalnym serwerem MySQL przez gniazdo '/tmp/mysql.sock'”.
proinsias
Dzięki! zadziałało dla mnie ta poprawka podczas próby połączenia się z kontenerem docker maridb.
Lucian Oprea
86

Dla mnie problem polegał na tym, że nie korzystałem z serwera mysql. Najpierw uruchom serwer, a następnie wykonaj mysql.

$ mysql.server start
$ mysql -h localhost -u root -p
yask
źródło
28

Widziałem to w moim sklepie, kiedy moi deweloperzy mają zainstalowany menedżer stosu, taki jak MAMP, który jest wstępnie skonfigurowany z MySQL zainstalowanym w niestandardowym miejscu.

na twoim terminalu run

mysql_config --socket

to da ci ścieżkę do pliku skarpety. wybierz tę ścieżkę i użyj jej w parametrze DATABASES HOST.

Musisz tylko wskazać

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

UWAGA

uruchom również, which mysql_configjeśli w jakiś sposób masz wiele instancji serwera mysql zainstalowanych na komputerze, możesz łączyć się z niewłaściwym.

Francis Yaconiello
źródło
Co jeśli brakuje twojego pliku skarpety?
AlxVallejo
kupić kolejną parę? j / k, co oznacza, że ​​usługa mysql nie działa. uruchom / zrestartuj mysql
Francis Yaconiello
6
W moim przypadku zmiana HOST z „localhost” na „127.0.0.1” rozwiązała problem.
lucaswxp
@lucaswxp: W moim przypadku muszę zmienić localhost z nazwą domeny
Anshul Mishra
19

Właśnie zmieniłem HOSTfrom localhostna 127.0.0.1i działa dobrze:

# 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': '',
},
...
Sirbito X
źródło
4
Byłoby miło wiedzieć, który plik zmieniłeś i gdzie się znajduje
Empi
1
W settings.pyprojekcie.
Sirbito X
11

Kiedy, jeśli zgubisz demona mysql w systemie Mac OSx, ale jest on obecny w innej ścieżce, na przykład w prywatnym / var, wykonaj następujące polecenie

1)

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

2) zrestartuj połączenie z mysql za pomocą:

mysql -u username -p -h host databasename

działa również dla mariadb

aurny2420289
źródło
9

Uruchom poniższy cmd w terminalu

/ usr / local / mysql / bin / mysqld_safe

wprowadź opis obrazu tutaj

Następnie uruchom ponownie urządzenie, aby odniosło skutek. To działa!!

Prashanth Sams
źródło
1
To zadziałało dla mnie na iMacu z systemem High Sierra, który został uaktualniony do Mojave. Musiało się wydarzyć, że plik mysql.sock znajdował się w tmp i został usunięty podczas aktualizacji. Ponieważ gniazdo jest tworzone automatycznie podczas uruchamiania MySQL, wystarczy upewnić się, że MySQL jest zamknięty, a następnie uruchomić go w trybie awaryjnym, jak powyżej. Plik mysql.sock pojawia się magicznie.
David,
8

Sprawdź liczbę otwartych plików dla procesu mysql za pomocą polecenia lsof.

Zwiększ limit otwartych plików i uruchom ponownie.

hsen
źródło
Miałem już z tym problem i nie możesz tego zrobić po prostu za pośrednictwem pliku .cnf. być może trzeba będzie ulimitzwiększyć liczbę otwartych plików, które klient i serwer mogą otworzyć. jeśli korzystasz z najnowszej wersji Ubuntu, może to wymagać edycji skryptu startowego mysql w / etc / init, ale miejmy nadzieję, że możesz to zrobić w pliku .cnf.
podjechał
8

Po wypróbowaniu kilku z tych rozwiązań bez powodzenia, oto co zadziałało:

  1. Uruchom ponownie system
  2. mysql.server start
  3. Sukces!
Mark Lohr
źródło
7

Może to być jeden z następujących problemów.

  1. Nieprawidłowa blokada mysql. rozwiązanie: musisz znaleźć prawidłowe gniazdo mysql przez,

mysqladmin -p zmienne | gniazdo grep

a następnie umieść go w kodzie połączenia bazy danych:

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

/tmp/mysql.sock jest zwracanym przez grep

2.Nieprawidłowe rozwiązanie portu mysql: Musisz znaleźć prawidłowy port mysql:

mysqladmin -p variables | grep port

a następnie w swoim kodzie:

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

3306 to port zwrócony przez grep

Myślę, że pierwsza opcja rozwiąże twój problem.

Chamith Malinda
źródło
6

Dla tych, którzy zaktualizowali z 5.7 do 8.0 przez homebrew, ten błąd jest prawdopodobnie spowodowany tym, że aktualizacja nie została ukończona. W moim przypadku mysql.server startdostałem następujący błąd:

BŁĄD! Serwer zakończył pracę bez aktualizacji pliku PID

Następnie sprawdziłem plik dziennika za pośrednictwem cat /usr/local/var/mysql/YOURS.err | tail -n 50i znalazłem:

InnoDB: Aktualizacja po awarii nie jest obsługiwana.

Jeśli jesteś na tej samej łodzi, najpierw zainstaluj [email protected]przez homebrew, zatrzymaj serwer, a następnie ponownie uruchom system 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

Następnie,

mysql.server start

Spowoduje to ponowne uruchomienie MySQL (8.0).

Blaszard
źródło
ERROR! The server quit without updating PID fileZnowu to samo .
awebartisan
W moim przypadku właśnie zainstalowałem [email protected] i usunąłem najnowszy. Wszystko się zaczęło. Żadna baza danych nie została usunięta.
Andrew Luca
4

Myślę, że widziałem to samo zachowanie jakiś czas temu, ale nie pamiętam szczegółów.
W naszym przypadku problem polegał na tym, że testrunner inicjuje połączenia z bazą danych w stosunku do pierwszej wymaganej interakcji z bazą danych, na przykład przez import modułu w settings.py lub jakiś __init__.py. Spróbuję znaleźć więcej informacji, ale to może już zadzwonić do Twojej sprawy.

Jaskółka oknówka
źródło
4

Upewnij się, że plik / etc / hosts zawiera plik 127.0.0.1 localhosti powinien działać dobrze

hd1
źródło
O dziwo (z szacunkiem) to posortowało to dla mnie - sprawdzając to, odkryłem, że podczas próby skonfigurowania webdav Mavericks dodał kilka dodatkowych (całkowicie zniekształconych) wierszy do mojego pliku hosta - w tym jeden, który ponownie przypisał localhost.
rob_was_taken,
4

Mam na ten temat dwa podstępne przypuszczenia

KONJEKTURA 1

Sprawdź, czy nie możesz uzyskać dostępu do /tmp/mysql.sockpliku. Kiedy konfiguruję bazy danych MySQL, zwykle pozwalam na umieszczenie witryny z plikiem gniazda /var/lib/mysql. Jeśli logujesz się do mysql as root@localhost, Twoja sesja systemu operacyjnego wymaga dostępu do /tmpfolderu. Upewnij się, że /tmpmasz odpowiednie prawa dostępu w systemie operacyjnym. Upewnij się również, że użytkownik sudo zawsze może wczytać plik /tmp.

KONJEKTURA 2

Dostęp do mysql przez 127.0.0.1 może spowodować pewne zamieszanie, jeśli nie zwracasz na to uwagi. W jaki sposób?

Z wiersza poleceń, jeśli łączysz się z MySQL za pomocą 127.0.0.1, może być konieczne określenie protokołu TCP / IP.

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

lub wypróbuj nazwę DNS

mysql -uroot -p -hDNSNAME

Pominie to logowanie jako root@localhost, ale upewnij się, że root@'127.0.0.1'zdefiniowałeś.

Następnym razem, gdy łączysz się z MySQL, uruchom to:

SELECT USER(),CURRENT_USER();

Co ci to daje?

  • USER () informuje o próbie uwierzytelnienia w MySQL
  • CURRENT_USER () raportuje, w jaki sposób zezwolono Ci na uwierzytelnienie w MySQL

Jeśli te funkcje zwracają te same wartości, łączysz się i uwierzytelniasz zgodnie z oczekiwaniami. Jeśli wartości są różne, może być konieczne utworzenie odpowiedniego użytkownika [email protected].

RolandoMySQLDBA
źródło
3

jeśli pojawi się błąd jak poniżej:

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

Następnie znajdź lokalizację swojego pliku mysqld.sock i dodaj go do „HOSTA”.

Tak jak używam Xampp w systemie Linux, więc mój mysqld.sockplik znajduje się w innej lokalizacji. więc to nie działa dla ' /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' : ''
    }
}
Shyam
źródło
2

Sprawdź, czy Twój mysql nie osiągnął maksymalnej liczby połączeń lub nie znajduje się w jakiejś pętli rozruchowej, co zdarza się dość często, jeśli ustawienia w my.cnf są nieprawidłowe.

Użyj ps aux | grep mysql, aby sprawdzić, czy PID się zmienia.

Beiller
źródło
2

Zbyt długo rozglądałem się w Internecie, aby nie udzielać odpowiedzi. Po próbie wpisania znaku zachęty mysql z wiersza poleceń nadal otrzymywałem tę wiadomość:

BŁĄD 2002 (HY000): Nie można połączyć się z lokalnym serwerem MySQL przez gniazdo '/tmp/mysql.sock' (2)

Wynikało to z faktu, że mój lokalny serwer mysql już nie działał. Aby zrestartować serwer, przeszedłem do

shell> cd /user/local/bin

gdzie znajdował się mój mysql.server. Stąd po prostu wpisz:

shell> mysql.server start

Spowoduje to ponowne uruchomienie lokalnego serwera mysql.

W razie potrzeby możesz zresetować hasło roota.

mysql> UPDATE mysql.user SET Password=PASSWORD('MyNewPass')
->                   WHERE User='root';
mysql> FLUSH PRIVILEGES;
preynolds
źródło
2

Musiałem zabić wszystkie wystąpienia mysql, najpierw znajdując wszystkie identyfikatory procesów:

ps aux | grep mysql

A potem ich zabijając:

kill -9 {pid}

Następnie:

mysql.server start

Pracował dla mnie.

HomerPlata
źródło
1

Gniazdo znajduje się w / tmp. W systemie Unix, ze względu na tryby i prawa własności do / tmp, może to spowodować pewien problem. Ale jeśli powiesz nam, że MOŻESZ normalnie używać połączenia mysql, myślę, że nie jest to problem w Twoim systemie. Podstawowym sprawdzeniem powinno być przeniesienie mysql.sock do bardziej neutralnego katalogu.

Fakt, że problem występuje „losowo” (lub nie za każdym razem), pozwala mi pomyśleć, że może to być problem z serwerem.

  • Czy twój / tmp znajduje się na standardowym dysku, czy na egzotycznym montażu (jak w pamięci RAM)?

  • Czy twój / tmp jest pusty?

  • Czy iotoppokazuje ci coś nie tak, gdy napotkasz problem?

Koreth
źródło
0

Skonfiguruj połączenie DB w oknie dialogowym „Zarządzanie połączeniami DB”. Wybierz opcję „Standard (TCP / IP)” jako metodę połączenia.

Zobacz tę stronę, aby uzyskać więcej informacji http://dev.mysql.com/doc/workbench/en/wb-manage-db-connections.html

Zgodnie z tą inną stroną plik gniazda jest używany, nawet jeśli określono localhost.

Plik gniazda Unix jest używany, jeśli nie określisz nazwy hosta lub jeśli podasz specjalną nazwę hosta localhost.

Pokazuje również, jak sprawdzić na serwerze, uruchamiając następujące polecenia:

Jeśli proces mysqld jest uruchomiony, możesz to sprawdzić, wypróbowując następujące polecenia. Numer portu lub nazwa pliku gniazda Unix mogą być różne w twojej konfiguracji. host_ip reprezentuje adres IP maszyny, na której działa serwer.

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
Tylko ty
źródło
0

w systemie ubuntu14.04 możesz to zrobić, aby rozwiązać ten problem.

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=
ZackZang
źródło
0

Dla mnie jestem pewien, że mysqld jest uruchomiony, a mysql z linii poleceń może działać poprawnie. Ale serwer httpd pokazuje problem (nie może połączyć się z mysql przez gniazdo).

Uruchomiłem usługę z mysqld_safe &.

w końcu odkryłem, że kiedy uruchamiam usługę mysqld z usługą mysqld start, są problemy (problem z uprawnieniami selinux), a kiedy naprawiam problem z selinux i uruchamiam mysqld z „service mysqld start”, problem z połączeniem httpd znika. Ale kiedy uruchamiam mysqld z mysqld_safe &, mysqld może działać. (klient mysql może działać poprawnie). Ale nadal występuje problem podczas łączenia się z httpd.

Robin LI
źródło
0

Jeśli jest to związane z gniazdem, przeczytaj ten plik

/etc/mysql/my.cnf

i zobacz, jaka jest standardowa lokalizacja gniazda. To taka linia:

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

teraz utwórz alias dla swojej powłoki, taki jak:

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

W ten sposób nie potrzebujesz uprawnień roota.

MaxV
źródło
0

Po prostu spróbuj biec mysqld.

To właśnie nie działało dla mnie na Macu. Jeśli to nie zadziała, przejdź do, /usr/local/var/mysql/<your_name>.erraby wyświetlić szczegółowe dzienniki błędów.

eloone
źródło
0
# shell script ,ignore the first 
$ $(dirname `which mysql`)\/mysql.server start

Może być pomocna.

陈 也在 哦
źródło
To samo, co najbardziej gwiazdkowa odpowiedź `` sudo /usr/local/mysql/support-files/mysql.server start '', ale różne systemy operacyjne mogą mieć inną ścieżkę do `` mysql.server ''. Próbowałem więc napisać jedną linię poleceń, która może być przydatne w wielu systemach operacyjnych.
陈 也在 哦
0

Używając MacOS Mojave 10.14.6 dla MySQL 8.0.19 zainstalowanego przez Homebrew

  • Biegł sudo find / -name my.cnf
  • Plik znaleziony w /usr/local/etc/my.cnf

Pracowałem przez jakiś czas, po czym w końcu błąd powrócił. Odinstalowałem wersję MySQL Homebrew i zainstalowałem plik .dmg bezpośrednio z tego miejsca

Od tamtej pory szczęśliwie się łączę.

Cierpliwość Mpofu
źródło
0

W moim przypadku pomogła edycja pliku /etc/mysql/mysql.conf.d/mysqld.cnfi zamiana linii:

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

z

socket      = /tmp/mysql.sock

Następnie zrestartowałem serwer i działało dobrze. Zabawne jest to, że jeśli przywrócę linię tak, jak była wcześniej i ponownie uruchomię, nadal działała.

jav
źródło
0

Niedawno miałem podobny problem. Przeszedłem przez wiele odpowiedzi. Mam to działające, wykonując następujące kroki.

  1. zmień ścieżkę gniazda w /etc/my.cnf (ponieważ wielokrotnie otrzymywałem błąd z /tmp/mysql.sock) aby zmienić ścieżkę gniazda
  2. uruchom mysqld_safe, aby zrestartować serwer, ponieważ jest to zalecany sposób ponownego uruchomienia w przypadku błędów. odniesienie do mysqld_safe
Arjun KR
źródło
0

U mnie serwer mysql nie działał. Tak więc uruchomiłem serwer mysql za pośrednictwem

mysql.server start

następnie

mysql_secure_installation

aby zabezpieczyć serwer, a teraz mogę odwiedzić serwer MySQL za pośrednictwem

sudo mysql -uroot -p

sh6210
źródło