Nie można połączyć się z MySQL przy użyciu „localhost”, ale przy użyciu „127.0.0.1” jest w porządku?

12

Mój plik / etc / hosts wygląda następująco:

127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Podczas budowania serwera odkryłem, że chociaż mogę pomyślnie pingować localhost, w niektórych plikach konfiguracyjnych dla usług takich jak Postfix, Apache i Dovecot, musiałem podać 127.0.0.1zamiast localhost, aby działały.

Musiałem także zmienić pliki konfiguracyjne niektórych stron internetowych opartych na bazie danych, które localhostłączyły się z MySQL.

Próbowałem różnych modyfikacji hostspliku, ale nic, co do tej pory próbowałem, nie pomogło.

Na serwerze działa Ubuntu 12.04.02 LTS. Nie ma zainstalowanego selinux i powyższa sytuacja pozostaje nawet po ustawieniu domyślnych zasad IPtables na ich akceptację i opróżnianie.

Peter Snow
źródło

Odpowiedzi:

15

Jedną rzeczą, którą możesz sprawdzić jest (która wymaga zalogowania się do konsoli MySQL) - sprawdź, czy masz uprawnienia do logowania się rootprzez localhost.

mysql -h 127.0.0.1 -u root -p

- Po pomyślnym zalogowaniu -

mysql> select user,host from mysql.user;
+------+--------------------------------+
| user | host                           |
+------+--------------------------------+
| root | 127.0.0.1                      | 
| root | ::1                            |
| root | localhost                      | <-- Make sure you have a localhost entry for root
+------+--------------------------------+
3 rows in set (0.00 sec)

Po prostu go tam wyrzucam, na wszelki wypadek.

drawrockshard
źródło
Mam wrażenie, że jesteś na dobrej drodze. Zrobiłem to i widzę, że chociaż root i kilku innych użytkowników zostało utworzonych dla localhost, wszyscy użytkownicy utworzeni przez panel kontrolny hostingu dla użytkowników 127.0.0.1(z wyjątkiem jednego, który jest %). Myślę, że to prawdopodobnie ujawnia wystarczająco dużo, aby to naprawić, więc prawdopodobnie zaakceptuję twoją odpowiedź w krótkim czasie.
Peter Snow
dzięki za pomoc! Chciałbym dodać, że po zaktualizowaniu tabeli mysql.user wymagany jest restart serwera mysql, aby zmiana mogła zostać zastosowana.
brakovic10
Chociaż zaakceptowane, nie jest to zwykle (nigdy?) Problem dla mysql. Zamiast tego zobacz odpowiedź EEAA (mysql interpretuje localhostjako socketzamiast TCP).
ToolmakerSteve
8

Większość klientów MySQL ma dziwny fakt, że jeśli określisz host jako localhost, alias tego połączenia do gniazda zamiast połączenia TCP. Masz do wyboru albo trzymać się, 127.0.0.1albo, jeśli klient to obsługuje (podobnie jak plik binarny CLI mysql z --protocolflagą), zmuś go do używania TCP zamiast gniazda unix.

EEAA
źródło
Dzięki EEAA. Problem polega na tym, że takie rzeczy jak instalator Joomla zawodzą. Jeśli podasz podczas instalacji pole 127.0.0.1zamiast localhostnazwy hosta, spowoduje to pomyłkę ścieżek instalacji, co da mi inne błędy, ale określenie hosta lokalnego nie spowoduje połączenia z bazą danych! Co spowodowało tę sytuację? Dlaczego to mam?
Peter Snow
3
@PeterSnow Skonfiguruj gniazdo domeny Unix w konfiguracji MySQL.
Michael Hampton
Dzięki @MichaelHampton Szukałem przez ostatnie pół godziny i nie mogę znaleźć, jak to skonfigurować. Czy możesz wskazać mi artykuł lub podać jakiś pomysł? Muszę socket = /var/run/mysqld/mysqld.socksię my.cnfi plik jest istniejący, należąca do MySQL z uprawnieniami 777. Dzięki.
Peter Snow
@PeterSnow Czy zrestartowałeś mysqld po wprowadzeniu tej zmiany?
EEAA
Obecnie próbuję użyć go za pomocą skryptu instalacyjnego Joomla. Strona http prosi o nazwę hosta. Jeśli wybiorę, 127.0.0.1to działa (ale skrypt używa tego wpisu później i kończy się niepowodzeniem, ponieważ oczekuje nazwy możliwej do rozwiązania jak localhost), ale jeśli użyję, łączę się localhost, aby utworzyć bazę danych, nie powiedzie się.
Peter Snow
1

Możesz sprawdzić uprawnienia w ten sposób:

[learner@localhost ~]$ sudo netstat -npa | grep mysqld  
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      6284/mysqld         
unix  2      [ ACC ]     STREAM     LISTENING     233040 6284/mysqld         /var/lib/mysql/mysql.sock

Jeśli nasłuchuje na 0 0.0.0.0:*, oznacza to, że każdy może uzyskać dostęp do tego mysql.

możesz edytować powiązanie dla tego w pliku my.conf. W Linuksie domyślna ścieżka to:

[learner@localhost ~]$ sudo vi /etc/my.cnf

Dodaj te wiersze do pliku my.conf, aby zezwolić na ip, który chcesz.

bind-address = 127.0.0.1   
bind-address = 0.0.0.0
a_learner
źródło
Dziękuję a_learner za informację, chociaż już zaakceptowałem odpowiedź.
Peter Snow
0

PHP wciąż próbuje użyć domyślnej lokalizacji gniazda. Ten problem może pojawić się, jeśli folder MariaDB / MySQL został przeniesiony z / var / lib / mysql do innej lokalizacji. Aby rozwiązać problem, musisz zdefiniować lokalizację nowego gniazda w pliku /etc/php.ini .

mysqli.default_socket =/newDBLocation/mysql/mysql.sock
joelschmid
źródło
0

I rozwiązać ten problem poprzez utworzenie dowiązania, sudo ln -s /opt/lampp/var/mysql/mysql.sock /var/run/mysqld/mysqld.sock. Ale najpierw muszę utworzyć folder, /var/run/mysqld/ponieważ folder początkowo nie istniał.

saharul
źródło
-1

Potrzebujesz mysql.sock w / tmp

ln -s /var/lib/mysql/mysql.sock mysql.sock

po tym powinno działać dobrze.

William
źródło