Połączenia zdalne Mysql Ubuntu

96

Z jakiegoś powodu nie mogłem połączyć się zdalnie z moim serwerem MySQL. Próbowałem wszystkiego i nadal otrzymuję błędy.

root@server1:/home/administrator# mysql -u monty -p -h www.ganganadores.cl
Enter password:
ERROR 1045 (28000): Access denied for user 'monty'@'server1.ganganadores.cl' (using password: YES)

Teraz próbowałem biegać

 GRANT ALL ON *.* to monty@localhost IDENTIFIED BY 'XXXXX'; 
 GRANT ALL ON *.* to monty@'%' IDENTIFIED BY 'XXXXXX';` 

i nadal nic! Co robię źle?

EDIT : my.cnfskomentował bind ip.

Cristian Eduardo Lehuede Lyon
źródło
jakiej wersji MySQL używasz?
Steve
Wersja serwera: 5.5.29-0ubuntu0.12.10.1 (Ubuntu)
Cristian Eduardo Lehuede Lyon
co zwraca to polecenie? ubuntu ~ $ sudo lsof -i -P | grep: 3306
apesa

Odpowiedzi:

346

Aby wystawić MySQL na cokolwiek innego niż localhost, będziesz musiał mieć następujący wiersz

Dla mysql w wersji 5.6 i starszych

odkomentowane /etc/mysql/my.cnfi przypisane do adresu IP twojego komputera, a nie sprzężenie zwrotne

Dla mysql w wersji 5.7 i nowszych

odkomentowane /etc/mysql/mysql.conf.d/mysqld.cnfi przypisane do adresu IP twojego komputera, a nie sprzężenie zwrotne

#Replace xxx with your IP Address 
bind-address        = xxx.xxx.xxx.xxx

Lub dodaj, bind-address = 0.0.0.0jeśli nie chcesz określać adresu IP

Następnie zatrzymaj i uruchom ponownie MySQL z nowym wpisem my.cnf. Po uruchomieniu przejdź do terminala i wprowadź następujące polecenie.

lsof -i -P | grep :3306

To powinno wyglądać mniej więcej tak z Twoim rzeczywistym adresem IP w xxx

mysqld  1046  mysql  10u  IPv4  5203  0t0  TCP  xxx.xxx.xxx.xxx:3306 (LISTEN)

Jeśli powyższe oświadczenie zwróci się poprawnie, będziesz mógł akceptować użytkowników zdalnych. Jednak aby zdalny użytkownik mógł łączyć się z odpowiednimi uprawnieniami, musisz mieć tego użytkownika utworzonego zarówno w localhost, jak i '%', jak w.

CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypass';
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';

następnie,

GRANT ALL ON *.* TO 'myuser'@'localhost';
GRANT ALL ON *.* TO 'myuser'@'%';

i w końcu,

FLUSH PRIVILEGES; 
EXIT;

Jeśli nie masz utworzonego tego samego użytkownika, co powyżej, logując się lokalnie możesz odziedziczyć podstawowe uprawnienia lokalnego hosta i mieć problemy z dostępem. Jeśli chcesz ograniczyć dostęp, jaki ma myuser, musisz przeczytać składnię instrukcji GRANT TUTAJ. Jeśli przejdziesz przez to wszystko i nadal masz problemy, napisz dodatkowe informacje o błędach i odpowiednie wiersze my.cnf.

UWAGA: Jeśli lsof nie zwróci lub nie zostanie znaleziony, możesz zainstalować go TUTAJ na podstawie swojej dystrybucji Linuksa. Nie potrzebujesz lsof, aby wszystko działało, ale jest niezwykle przydatne, gdy rzeczy nie działają zgodnie z oczekiwaniami.

apesa
źródło
1
Dzięki, mimo że wykonałem te kroki poprawnie za pierwszym razem, zrobiłem je ponownie, gdy publikowałeś i działałem jak marzenie!
Cristian Eduardo Lehuede Lyon
14
Dla każdego, kto boryka się z problemem lsof -i -P | grep :3306, to nie zadziałało, ale połączenie zdalne nadal działa dobrze bez tego potwierdzenia, zignoruj, jeśli nie widzisz odpowiedniego wyjścia.
Mike S,
@Mike Slutsky Dzięki za notatkę, zredagowałem odpowiedź. Możesz zainstalować lsof, jeśli nie jest jeszcze zainstalowany.
apesa
2
FWIW na wielu systemach sudo lsof -i -Pbędzie znacznie bardziej użyteczne niż lsof -i -P(zakładając, że jesteś zalogowany jako użytkownik nieuprzywilejowany).
Dan Passaro
2
lsof -i -P | grep :3306nic nie zwraca!
Green
39

Dodaj kilka punktów do doskonałego postu apesa:

1) Możesz użyć poniższego polecenia, aby sprawdzić adres IP, którego nasłuchuje serwer mysql

netstat -nlt | grep 3306

sample result:

tcp 0  0  xxx.xxx.xxx.xxx:3306  0.0.0.0:*   LISTEN

2) Użyj, FLUSH PRIVILEGESaby wymusić załadowanie tabel grantów, jeśli z jakiegoś powodu zmiany nie zaczną obowiązywać natychmiast

GRANT ALL ON *.* TO 'user'@'localhost' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
GRANT ALL ON *.* TO 'user'@'%' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
FLUSH PRIVILEGES; 
EXIT;

user == użytkownik, którego używasz do łączenia się z mysql ex.root
passwd == hasło, którego używasz do łączenia się z mysql

3) Jeśli zapora sieciowa netfilter jest włączona ( sudo ufw enable) na serwerze mysql, wykonaj następujące czynności, aby otworzyć port 3306 do zdalnego dostępu:

sudo ufw allow 3306

sprawdź status za pomocą

sudo ufw status

4) Po ustanowieniu zdalnego połączenia można je zweryfikować na komputerze klienckim lub serwerze za pomocą poleceń

netstat -an | grep 3306
netstat -an | grep -i established
Jonathan L.
źródło
3
To uratowało mi cały dzień! Dzięki za sudo ufw status!!
Riddhiman Adib
netstat -nlt | grep 3306zwraca puste
João Pimentel Ferreira
@ João Pimentel Ferreira upewnij się, że mysql jest uruchomiony jako pierwszy, użyj polecenia „/etc/init.d/mysql status”, aby zweryfikować
Jonathan L
8

MySQL nasłuchuje tylko hosta lokalnego, jeśli chcemy włączyć do niego zdalny dostęp to musimy dokonać pewnych zmian w pliku my.cnf:

sudo nano /etc/mysql/my.cnf

Musimy skomentować bind-address i skip-external-locking lines:

#bind-address = 127.0.0.1
# skip-external-locking

Po wprowadzeniu tych zmian musimy zrestartować usługę mysql:

sudo service mysql restart
Vinh Lee
źródło
1
koniecznie komentujskip-external-locking
calebeaires
1
Nie skomentowałem pominięcia zewnętrznego blokowania i nadal działa.
Marcia Ong
Musiałem to zmienić w /etc/mysql/mysql.conf.d
Bartando
moja jest ta lokalizacja:sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Lester
1

Jeśli testujesz w systemie Windows, nie zapomnij otworzyć portu 3306.

marw
źródło
Ach, jesteś geniuszem, jest to BARDZO ważne, jeśli używasz podsystemu Windows dla Linuksa, musisz otworzyć port 3306 dla ruchu przychodzącego przez zaporę systemu Windows i żadna z powyższych rzeczy, aby sprawdzić, czy MySQL nasłuchuje pracy z podsystem
Brian Leishman,
1

Używasz Ubuntu 12 (dość starego)

Najpierw otwórz plik /etc/mysql/mysql.conf.d/mysqld.cnf ( /etc/mysql/my.cnf w Ubuntu 14.04 i wcześniejszych wersjach

W [mysqld] Locate the Line, bind-address = 127.0.0.1 I zmień to na bind-address = 0.0.0.0 lub skomentuj

Następnie uruchom ponownie serwer Ubuntu MysQL systemctl restart mysql.service

Teraz Ubuntu Server umożliwi zdalny dostęp do serwera MySQL, ale nadal musisz skonfigurować użytkowników MySQL, aby umożliwić dostęp z dowolnego hosta.

Użytkownik musi mieć 'username'@'%'wszystkie wymagane uprawnienia

Aby upewnić się, że serwer MySQL nasłuchuje na wszystkich interfejsach, uruchom polecenie netstat w następujący sposób.

netstat -tulnp | grep mysql

Mam nadzieję, że to zadziała!

Gaurav Singh
źródło