Dostęp root do MySQL ze wszystkich hostów

152

Zainstalowałem serwer MySQL na zdalnym komputerze Ubuntu. W tabeli rootdefiniujemy użytkownika w mysql.usernastępujący sposób:

mysql> SELECT host, user, password FROM user WHERE user = 'root';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| localhost        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ip-10-48-110-188 | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| 127.0.0.1        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ::1              | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

Mam dostęp z użytkownikiem rootz tego samego interfejsu wiersza poleceń maszyny zdalnej przy użyciu standardowego mysqlklienta. Teraz chcę zezwolić na dostęp do roota z każdego hosta w Internecie , więc spróbowałem dodać następujący wiersz (jest to dokładny duplikat pierwszego wiersza z poprzedniego zrzutu, z wyjątkiem hostkolumny):

mysql> SELECT host, user, password FROM user WHERE host = '%';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| %                | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

Ale mój klient na moim osobistym komputerze nadal mi mówi (zasłoniłem adres IP serwera):

Błąd SQL (2003): nie można połączyć się z serwerem MySQL na '46 .xxx '(10061)

Nie mogę stwierdzić, czy jest to błąd uwierzytelniania, czy błąd sieci. Na firewallu serwera włączyłem port 3306 / TCP dla 0.0.0.0/0 i to jest dla mnie ok ...

lorenzo-s
źródło
czy możesz telnetować się do maszyny na porcie 3306
mihaisimi
3
najprawdopodobniej demon MySQL nie nasłuchuje na 46.xxx, ale tylko na hoście lokalnym. Szukaj bind-addressw my.cnf
Maxim Krizhanovsky
1
Tak więc świat + pies ma teraz skrót twojego hasła roota, wiedzę, że root jest dostępny z dowolnego hosta w Internecie i pierwszy bajt twojego adresu IP. Myślisz, że nie jest to tylko mały kawałek dotyczące?
Eggyal
możliwy duplikat Włącz zdalne połączenie MySQL
użytkownik

Odpowiedzi:

362

Proces ten składa się z dwóch etapów:

a) Przyznaj uprawnienia. Jako użytkownik root wykonaj następujące czynności, zastępując 'password'aktualne hasło roota:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';

b) powiąż ze wszystkimi adresami:

Najłatwiejszym sposobem jest wykomentowanie linii w my.cnfpliku:

#bind-address = 127.0.0.1 

i zrestartuj mysql

service mysql restart

Domyślnie wiąże się tylko z localhost, ale jeśli skomentujesz wiersz, będzie on wiązał się ze wszystkimi znalezionymi interfejsami. Skomentowanie wiersza jest równoważne z bind-address=*.

Aby sprawdzić, gdzie usługa mysql została powiązana, wykonaj jako root:

netstat -tupan | grep mysql

Aktualizacja dla Ubuntu 16:

Plik konfiguracyjny to (teraz)

/etc/mysql/mysql.conf.d/mysqld.cnf 

(przynajmniej na standardowym Ubuntu 16)

hovanessyan
źródło
5
Ok, problemem był adres wiążący. Dziękuję Ci. @Darhazer Też dziękuję :)
lorenzo-s
2
Aby sprawdzić aktualne dotacje: `` POKAŻ DOTACJE DLA 'root' @ '%';
robsch
5
Aby również zezwolić root @% na nadawanie uprawnień innym użytkownikom, natychmiast po kroku (a) wykonaj: PRZYZNANIE UŻYCIA NA *. * DO 'root' @ '%' Z OPCJĄ GRANT;
Caleb
1
Plik konfiguracyjny to (teraz) /etc/mysql/mysql.conf.d/mysqld.cnf (przynajmniej na standardowym Ubuntu 16)
jgp
2
Po prostu musiałem to zrobić, aby móc zdalnie połączyć się z serwerem:USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';
Sviderskiy Dmitriy
35

Uruchom następujące zapytanie:

use mysql;

update user set host='%' where host='localhost'

UWAGA: Nie zalecane do użytku produkcyjnego.

Babu James
źródło
2
To nie jest idealne rozwiązanie. To może zadziałać. U mnie wystąpił błąd: ERROR 1062 (23000): zduplikowany wpis „% -root” dla klucza „PRIMARY”
Scriptlabs
2
@Scriptlabs, prawdopodobnie istnieje więcej niż jeden wpis w tabeli użytkowników z hostem „localhost”. I więcej niż jeden wiersz z katalogiem głównym, w tym root.localhost, root.127.0.0.1, root.:1. Dlatego lepiej jest dodać oddzielnego użytkownika niż aktualizować, dlatego odrzucam tę odpowiedź.
Mike Purcell
4
nie jest PRIVILEGES FLUSH; również potrzebne zaraz potem?
Nom1fan
1
to działa dla mnie. Spróbuj tego. update mysql.user set host='%' where user='root'
nur zazin
7

Czasami

bind-address = 127.0.0.1

Powinien być

bind-address = *

user2839051
źródło
7

MYSQL 8.0 - otwórz klienta wiersza poleceń mysql
PRZYZNAJ WSZYSTKIE UPRAWNIENIA NA *. * TO 'root' @ 'localhost';
użyj mysql
UPDATE mysql.user SET host = '%' WHERE user = 'root';
Uruchom ponownie usługę mysql

user10580057
źródło
4

MariaDB działająca na Raspbian - plik zawierający adres powiązania jest trudny do zlokalizowania. MariaDB ma kilka niezbyt pomocnych informacji na ten temat.

użyłem

# sudo grep -R bind-address /etc 

zlokalizować, gdzie jest to cholerstwo.

Musiałem także ustawić uprawnienia i hosty w mysql, jak wszyscy powyżej wskazali.

A także dobrze się bawiłem, otwierając port 3306 do zdalnych połączeń z moim Raspberry Pi - w końcu użyłem iptables-persistent .

Teraz wszystko działa świetnie.

Wielki Zank
źródło
1

jeśli masz wiele sieci podłączonych do twojego systemu operacyjnego, musisz określić jedną z tych sieci w bind-addres z pliku my.conf. przykład:

[mysqld]
bind-address = 127.100.10.234

ten adres IP pochodzi z konfiguracji ethX.

felipe cardenas
źródło
1
Dodaj więcej szczegółów. W jakim pliku lub strukturze musi się to odbywać? Podaj bardziej szczegółowe informacje o konfiguracji ethX.
BPS
1

W moim przypadku problemem było ustawienie „bind-address”. Komentując to ustawienie w my.cnftak nie pomaga, bo w moim przypadku mysql ustawić domyślną do 127.0.0.1 z jakiegoś powodu.

Aby sprawdzić, jakiego ustawienia obecnie używa MySql, otwórz wiersz poleceń w swoim lokalnym oknie:

mysql -h localhost -u myname -pmypass mydb

Odczytaj aktualne ustawienie:

Show variables where variable_name like "bind%"

Powinieneś zobaczyć 0.0.0.0 tutaj, jeśli chcesz zezwolić na dostęp ze wszystkich hostów. Jeśli tak nie jest, edytuj swój /etc/mysql/my.cnfadres wiązania i ustaw go w sekcji [mysqld]:

bind-address=0.0.0.0

Na koniec zrestartuj serwer MySql, aby wybrać nowe ustawienie:

sudo service mysql restart

Spróbuj ponownie i sprawdź, czy wybrano nowe ustawienie.

mam komputer
źródło
-2

mysql_update jest tym, czego potrzebujesz.

Nie wiem, dlaczego ktokolwiek miałby stosować bardziej złożone sposoby naprawienia tego problemu, skoro MySql łaskawie zbudował narzędzie, które już to robi ...

Kieran Foot
źródło