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)

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ć.


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.


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

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.


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

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


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!!


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.


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!

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.


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 mysql@5.7przez 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).


ERROR! The server quit without updating PID fileZnowu to samo .
awebartisan

W moim przypadku właśnie zainstalowałem mysql@5.7 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.


4

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


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 root@127.0.0.1.



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' : ''
    }
}

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.


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;

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.


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?


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

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=

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.


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.


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.


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

Może być pomocna.


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ę.


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.


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.