Ponieważ spędziłem trochę czasu próbując rozwiązać ten problem i zawsze wracałem na tę stronę, szukając tego błędu, zostawię tutaj swoje rozwiązanie z nadzieją, że ktoś zaoszczędzi czas, który straciłem. Chociaż w moim przypadku używam raczej mariadb niż MySql, nadal możesz być w stanie dostosować to rozwiązanie do swoich potrzeb.
Mój problem
jest taki sam, ale moja konfiguracja jest nieco inna (mariadb zamiast mysql):
Zainstalowany mariadb z homebrew
$ brew install mariadb
Uruchomiono demona
$ brew services start mariadb
Próbowałem się połączyć i otrzymałem powyższy błąd
$ mysql -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
Moje rozwiązanie
dowiedz się, które my.cnf
pliki są używane przez mysql
(zgodnie z sugestią w tym komentarzu ):
$ mysql --verbose --help | grep my.cnf
/usr/local/etc/my.cnf ~/.my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
sprawdź, gdzie jest uruchomiony plik gniazda Unix (prawie tak, jak opisano tutaj ):
$ netstat -ln | grep mariadb
.... /usr/local/mariadb/data/mariadb.sock
(możesz chcieć grep mysql
zamiast mariadb)
Dodaj znaleziony plik gniazda ~/.my.cnf
(w razie potrzeby utwórz plik) (zakładając, że ~/.my.cnf
został wymieniony podczas uruchamiania polecenia mysql --verbose ...
-command z góry):
[client]
socket = /usr/local/mariadb/data/mariadb.sock
Zrestartuj swój mariadb:
$ brew services restart mariadb
Po tym mogłem uruchomić mysql i otrzymałem:
$ mysql -uroot
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
Więc zamiast tego uruchamiam polecenie z uprawnieniami superużytkownika i po wprowadzeniu hasła otrzymałem:
$ sudo mysql -uroot
MariaDB [(none)]>
Uwagi:
Nie jestem do końca pewien co do grup, w których musisz dodać gniazdo, najpierw miałem go [klient-serwer], ale potem doszedłem do wniosku, że [klient] powinien wystarczyć. Więc zmieniłem to i nadal działa.
Podczas uruchamiania mariadb_config | grep socket
otrzymuję:
--socket [/tmp/mysql.sock]
co jest nieco zagmatwane, ponieważ wydaje się, że /usr/local/mariadb/data/mariadb.sock
jest to rzeczywiste miejsce (przynajmniej na moim komputerze)
Zastanawiam się, gdzie mogę tak skonfigurować, /usr/local/mariadb/data/mariadb.sock
aby faktycznie był, /tmp/mysql.sock
więc mogę użyć ustawień domyślnych zamiast edytować moje .my.cnf
(ale jestem teraz zbyt zmęczony, aby to rozgryźć ...)
W pewnym momencie zrobiłem też rzeczy wymienione w innych odpowiedziach, zanim to wymyśliłem.