Host „xxx.xx.xxx.xxx” nie może połączyć się z tym serwerem MySQL


667

To powinno być bardzo proste, ale nie mogę zmusić go do pracy przez całe moje życie.
Próbuję tylko połączyć się zdalnie z moim serwerem MySQL.

łączenie jako

mysql -u root -h localhost -p  

działa dobrze, ale próbuje

mysql -u root -h 'any ip address here' -p

kończy się błędem

ERROR 1130 (00000): Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL server

W mysql.usertabeli znajduje się dokładnie taki sam wpis dla użytkownika „root” z hostem „localhost”, jak inny z hostem „%”.

Jestem na granicy rozumu i nie mam pojęcia, jak postępować. Wszelkie pomysły są mile widziane.


Nie można zalogować się jako root w większości przypadków ze względów bezpieczeństwa.
AO_

Odpowiedzi:


816

Prawdopodobnie środek bezpieczeństwa. Możesz spróbować dodać nowe konto administratora:

mysql> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
    ->     WITH GRANT OPTION;
mysql> CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
    ->     WITH GRANT OPTION;

Chociaż, jak zauważyli Pascal i inni, nie jest dobrym pomysłem, aby użytkownik z takim dostępem miał dostęp do dowolnego adresu IP. Jeśli potrzebujesz użytkownika administracyjnego, użyj roota i pozostaw go na localhost. W przypadku każdej innej akcji określ dokładnie potrzebne uprawnienia i ogranicz dostępność użytkownika, jak sugeruje Pascal poniżej.

Edytować:

Z MySQL FAQ:

Jeśli nie możesz zrozumieć, dlaczego odmawiasz dostępu, usuń z tabeli użytkowników wszystkie wpisy, które mają wartości hosta zawierające symbole wieloznaczne (wpisy zawierające znaki „%” lub „_”). Bardzo częstym błędem jest wstawianie nowego wpisu za pomocą Host = '%' i User = 'some_user', sądząc, że pozwala to określić localhost do połączenia z tego samego komputera. Nie działa to dlatego, że domyślne uprawnienia obejmują wpis z Host = „localhost” i User = ''. Ponieważ ten wpis ma wartość Hosta „localhost”, która jest bardziej szczegółowa niż „%”, jest on używany zamiast nowego wpisu podczas łączenia się z localhost! Prawidłowa procedura polega na wstawieniu drugiego wpisu z Host = „localhost” i User = 'some_user', lub usunąć wpis za pomocą Host = „localhost” i User = ''. Po usunięciu wpisu pamiętaj o wydaniu instrukcji FLUSH PRIVILEGES, aby ponownie załadować tabele uprawnień. Patrz także punkt 5.4.4, „Kontrola dostępu, etap 1: weryfikacja połączenia”.


17
Dobrze złap Yannicka, jednak nie poleciłbym mu przyznania wszystkich uprawnień użytkownikowi innemu niż root. Być może zredukowany zestaw?
Corey Ballou,

3
Cóż, to rzeczywiście nie byłby dobry pomysł, ale zezwolenie „rootowi” na łączenie się ze wszystkich hostów jest dokładnie takie samo, ponieważ ma ten sam poziom uprawnień.
Yannick Motton

2
Myślę, że przegapiłeś mój punkt, Pascal. Chodzi o to, że użytkownik „root” ma już te prawa i chce, aby każdy ip uwierzytelniał się jako ten użytkownik. Więc jeśli naprawdę tego właśnie chce, domyślny przykład utworzenia nowego administratora (który ma dokładnie takie same uprawnienia) jest alternatywą dla tego, czego próbuje.
Yannick Motton

2
Zgadza się, Yannick, czytam szybko i usunę mój komentarz. Jednak, AFAIK, uprawnienia działają poprawnie w MySQL, więc: 1. może OP ręcznie zmodyfikował tabele uprawnień, a następnie musiałby opróżnić uprawnienia. 2. może nie używał właściwej składni grantu dla roota. Dodanie innego użytkownika administracyjnego może być obejściem, ale nie rozwiąże prawdziwego problemu IMHO.
Pascal Thivent

1
Czułem, że zapewnienie dostępu ze wszystkich hostów do roota nie było właściwym rozwiązaniem. Zamiast tego utworzyłem nowego użytkownika i przyznałem ograniczony zestaw uprawnień, zestaw, którego użyłem, jest opisany jako „DBManager” w MySQL Workbench. Zezwoliłem także na dostęp tylko z pewnej grupy hostów w mojej sieci lokalnej, szczególnie 192.168.0.%
Gustavo Guevara

271

Należy utworzyć new MySQL Useri przypisać uprawnienia jak poniżej w Query promptphpMyAdmin lub wierszu polecenia:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

CREATE USER 'username'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

Po wykonaniu wszystkich czterech zapytań powinien się połączyć username / password


5
Musiałem zrestartować mysql po wykonaniu powyższych kroków, aby to działało dla mnie.
tollbooth

Czy musisz utworzyć nazwę użytkownika @ localhost? Czy nie wystarczy, że utworzysz nazwę użytkownika @%? Mam na myśli to, że jeśli utworzysz nazwę użytkownika @%, nie będziesz mógł połączyć się z tym użytkownikiem z hosta lokalnego?
Sorin Postelnicu,

1
tak, utworzenie a @localhostmiałoby sens, gdyby uprawnienia były w jakiś sposób różne, ale tutaj są takie same i prawdopodobnie będzie bardziej mylące niż cokolwiek innego (np. zmiana hasła na jednym, nie zdając sobie sprawy z tego, że drugie istnieje, i że twój login może do niego trafić ).
Bratchley,

jako początkujący naprawdę mi pomógł
Muhammad Nayab

1
dziękuję rozwiązuje mój „SQLSTATE [HY000] [1130] Host„ DESKTOP-xxx.xx ”nie może połączyć się z tym serwerem MariaDB” w aplikacji laravel w kontenerze w systemie Windows
Zulqarnain

117

Mój komunikat o błędzie był podobny i powiedział „ Host XXX nie może połączyć się z tym serwerem MySQL ”, mimo że korzystałem z roota. Oto jak upewnić się, że root ma odpowiednie uprawnienia.

Moja konfiguracja :

  • Ubuntu 14.04 LTS
  • MySQL v5.5.37

Rozwiązanie

  1. Otwórz plik pod „etc / mysql / my.cnf”
  2. Sprawdź:

    • port (domyślnie jest to „port = 3306”)
    • bind-address (domyślnie jest to „bind-address = 127.0.0.1”; jeśli chcesz otworzyć dla wszystkich, po prostu skomentuj ten wiersz. Na przykład powiem, że rzeczywisty serwer jest na 10.1.1.7)
  3. Teraz uzyskaj dostęp do bazy danych MySQL na twoim rzeczywistym serwerze (powiedz, że twój zdalny adres to 123.123.123.123 na porcie 3306 jako użytkownik „root” i chcę zmienić uprawnienia do „bazy danych”. Pamiętaj, aby zmienić adres IP, port i nazwę bazy danych do twoich ustawień)

    mysql -u root -p
    Enter password: <enter password>
    mysql>GRANT ALL ON *.* to root@'123.123.123.123' IDENTIFIED BY 'put-your-password';
    mysql>FLUSH PRIVILEGES;
    mysql>exit
  4. usługa sudo mysqld restart

  5. Powinno być teraz możliwe zdalne połączenie z bazą danych. Na przykład używam MySQL Workbench i wpisuję „Nazwa hosta: 10.1.1.7”, „Port: 3306”, „Nazwa użytkownika: root”

1
Możesz pominąć use dataentrylinię (ponieważ większość osób nie utworzy tej bazy danych).
Jedidja

3
byłem w stanie to zrobić bez ponownego uruchamiania mysqlusługi na końcu
Ryan Tuck

5
FLUSH PRIVILEGESpowinien pozwolić ci nie wymagać ponownego uruchamiania.
Adam B

To działało dla mnie dla MySQL 5.5 na Windows 10 z FLUSH PRIVILEGES, bez ponownego uruchamiania usługi. W systemie Windows właściwości usługi powinny identyfikować plik my.ini użyty do konfiguracji (Właściwości | Ogólne | Ścieżka do pliku wykonywalnego)
FreeText

Zakładałem, że podając bind-address = "0.0.0.0" będzie nasłuchiwał na wszystkich interfejsach, a połączenia zdalne będą działać, ale się myliłem. Tak, netstat pokazał, że mysql nasłuchuje na 0.0.0.0 (wszystkie interfejsy), ale dostaję błąd w tytule pytania. Gdy całkowicie usunąłem linię adresu powiązania, zaczęła działać. Dziwne.
Henno

71

Musisz przyznać dostęp użytkownikowi z dowolnej nazwy hosta.

W ten sposób dodajesz nowe uprawnienia od phpmyadmin

Idź do uprawnień> Dodaj nowego użytkownika

wprowadź opis zdjęcia tutaj

Wybierz Dowolny host dla żądanej nazwy użytkownika

wprowadź opis zdjęcia tutaj


65

Po prostu wykonaj następujące czynności:

1a) Połącz się z mysql (przez localhost)

mysql -uroot -p

1b) Jeśli serwer myslq działa w Kubernetes (K8s) i jest dostępny za pośrednictwem NodePort

kubectl exec -it [pod-name] -- /bin/bash
mysql -uroot -p

2) Utwórz użytkownika

CREATE USER 'user'@'%' IDENTIFIED BY 'password';

3) Udziel uprawnień

 GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION;

4) Przywileje koloru

FLUSH PRIVILEGES;

4
BŁĄD 1045 (28000): Odmowa dostępu dla użytkownika „root” @ „localhost” (przy użyciu passwo TAK) Y
Gank

11
Powinien być *.* ?
sgarg 7.04.16

26

Wiadomość *Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL serverjest odpowiedzią z serwera MySQL na klienta MySQL. Zauważ, że zwraca adres IP, a nie nazwę hosta.

Jeśli próbujesz się połączyć, mysql -h<hostname> -u<somebody> -pa ten zwraca ten adres z adresem IP, serwer MySQL nie może wykonać wyszukiwania wstecznego na kliencie. Jest to krytyczne, ponieważ w ten sposób mapuje klienta MySQL na granty.

Upewnij się, że możesz zrobić nslookup <mysqlclient>z serwera MySQL. Jeśli to nie zadziała, nie ma wpisu na serwerze DNS. Alternatywnie możesz umieścić wpis w pliku HOSTS serwera MySQL ( <ipaddress> <fullyqualifiedhostname> <hostname><- Kolejność tutaj może mieć znaczenie).

Wpis w pliku hosta mojego serwera, umożliwiający wsteczne wyszukiwanie klienta MySQL, rozwiązał ten bardzo problem.


1
„to odpowiedź serwera MySQL na klienta MySQL”. Dziękuję, zastanawiałem się, skąd pochodzi błąd, moja maszyna lub serwer. Mam błąd „ERROR 1130 (HY000):” itp.
PJ Brunet

20

Prosta droga:

Grant All Privileges ON *.* to 'USER_NAME'@'%' Identified By 'YOUR_PASSWORD'; 

następnie

FLUSH PRIVILEGES;

gotowy!


co oznacza%?
dataviews

1
to jest jak wszystko. Możesz na przykład: WHERE CustomerName LIKE 'a%'- Znajduje wartości zaczynające się na „a”
user5510975

16

W przypadku ręcznej modyfikacji tabel grantu (za pomocą INSERT, UPDATE itp.) Należy wykonać FLUSH PRIVILEGESinstrukcję informującą serwer o ponownym załadowaniu tabel grantu.

PS: Nie polecam zezwalać żadnym hostom na łączenie się dla dowolnego użytkownika (szczególnie nie do rootużytku). Jeśli używasz mysql do aplikacji klient / serwer, preferuj adres podsieci. Jeśli używasz mysql z serwerem WWW lub serwerem aplikacji, użyj określonych adresów IP.


4

Wystarczy użyć interfejsu dostarczonego przez narzędzie GUI MySql (SQLyog):

Kliknij Menedżer użytkowników: wprowadź opis zdjęcia tutaj

Teraz, jeśli chcesz przyznać dostęp DLA KAŻDEGO INNEGO ZDALNEGO PC, po prostu upewnij się, że, tak jak na poniższym obrazku, wartością pola Host jest% (czyli symbol wieloznaczny)

wprowadź opis zdjęcia tutaj


4

Większość odpowiedzi tutaj pokazuje tworzenie użytkowników z dwiema wartościami hosta: jedną dla localhosti jedną dla %.

Pamiętaj, że oprócz wbudowanego użytkownika localhost, takiego jak root, nie musisz tego robić. Jeśli chcesz po prostu utworzyć nowego użytkownika, który będzie mógł logować się z dowolnego miejsca, możesz użyć

CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
GRANT <whatever privileges are appropriate> ON <relevant tables> TO myuser;

i będzie działać dobrze. (Jak wspomnieli inni, strasznym pomysłem jest przyznanie uprawnień administracyjnych użytkownikowi z dowolnej domeny).


3

najprostszym sposobem jest zalogowanie się do phpmyadmin przy użyciu konta root, tam jest baza danych mysql i wybierz tabelę użytkowników, tam edytuj konto root i w polu hosta dodaj% wild card. a następnie poprzez uprawnienia ssh flush

 FLUSH PRIVILEGES;

Pomogło mi to w połączeniu z tym: UDZIELENIE WSZYSTKICH UPRAWNIEŃ . DO 'root' @ '%' Z OPCJĄ DOTACJI;
Lanklaas,

2

Jeśli jest to ostatnia instalacja mysql, to zanim zmienisz cokolwiek innego, po prostu wykonaj to polecenie, a następnie spróbuj ponownie:

flush privileges;

To samo rozwiązuje problem dla mnie w Ubuntu 16.04, mysql 5.7.20. YMMV.


2

Po prostu znajdź lepszy sposób na to w panelu sterowania hostingu (tutaj używam DirectAdmin)

po prostu przejdź do DB serwera docelowego w panelu sterowania, w moim przypadku: zarządzanie MySQL -> wybierz DB -> znajdziesz: „Access Hosts”, po prostu dodaj tutaj swój zdalny host i już działa! wprowadź opis zdjęcia tutaj

Wydaje mi się, że istnieje podobna opcja na innych panelach C., takich jak plesk itp.

Mam nadzieję, że Ci również pomogło.


2

Cóż, nic z powyższej odpowiedzi nie działało dla mnie. Po wielu badaniach znalazłem rozwiązanie. Chociaż mogę się spóźnić, może to pomóc innym w przyszłości.

Zaloguj się do serwera SQL z terminala

 mysql -u root -p
 -- root password
GRANT ALL ON *.* to root@'XX.XXX.XXX.XX' IDENTIFIED BY 'password';

To powinno rozwiązać problem z uprawnieniami.

Przed rozwiązaniem błędu

Po rozwiązaniu problemu

Miłego kodowania !!


1

Cóż, co możesz zrobić, to po prostu otworzyć plik mysql.cfg i musisz zmienić adres Bind na to

adres powiązania = 127.0.0.1

a następnie zrestartuj mysql, a będziesz mógł podłączyć do tego serwer.

Spójrz, możesz mieć z tego pomysł.

to jest prawdziwe zol


3
Jest to związane, ale nie ten sam problem. Pierwotnie odebrany błąd wskazuje, że klient pomyślnie nawiązuje połączenie z serwerem MySQL, ale nie udaje mu się uwierzytelnić. Jeśli adres powiązania był ustawiony na 127.0.0.1, zamiast tego pojawiałby się błąd odmowy połączenia.
akson

Ale to jest adres, który pozwoli wszystkim hostom połączyć się z serwerem na?
Kishan Bheemajiyani

Ale udzielenie użytkownikowi całego pozwolenia nie będzie rozsądną opcją dla tego bcoz, jeśli masz użytkownika klienta i nie możesz utworzyć użytkownika z całym pozwoleniem, jakie byłoby rozwiązanie.
Kishan Bheemajiyani

1

Jeśli akurat działasz w systemie Windows; Prostym rozwiązaniem jest uruchomienie kreatora konfiguracji instancji serwera MySQL. Jest w twojej grupie MYSQL w menu Start. Na drugim z ostatniego ekranu kliknij pole „zezwól na dostęp roota ze zdalnych komputerów”.


1

Jeśli masz WAMP Server + Windows 10 i używasz go do programowania, kliknij prawym przyciskiem myszy ikonę Wamp => Wamp Settings=>Check Allow Virtual Hosts other than 127* wprowadź opis zdjęcia tutaj


0

Miałem również do czynienia z tym samym problemem. Rozwiązałem to w 2 minuty dla mnie po prostu biała lista ip przez cpanel

Załóżmy, że próbujesz połączyć bazę danych serwera B z serwerem A. Przejdź do serwera B Cpanel-> Remote MySQL-> wpisz adres IP serwera A i to wszystko.


0

Ta odpowiedź może pomóc komuś ...

Wszystkie te odpowiedzi nie pomogły, ale zdałem sobie sprawę, że zapomniałem sprawdzić jedną kluczową rzecz .. Port :)

Mam mysql działający w kontenerze dokującym działającym na innym porcie. Wskazałem na moją maszynę hosta na porcie 3306, na której działa serwer mysql. Mój kontener odsłania serwer na porcie 33060. Przez cały ten czas szukałem niewłaściwego serwera! doh!


0
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

ten błąd, ponieważ nie ma hasła do katalogu głównego, i może to wystąpić podczas próby połączenia z zewnątrz.


0

Rozwiązanie CPANEL

Idź do Cpanel, poszukaj Remote MySQL. Dodaj adres IP w polu wejściowym:

Host (dozwolony jest% symbol wieloznaczny)

Komentarz, aby pamiętać, co to jest adres IP. To było dla mnie.


0

Działa to dla każdego przyszłego zdalnego połączenia mysql!

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

Przejdź do wiersza rozpoczynającego się od dyrektywy bind-address. To powinno wyglądać tak:

    bind-address            = 0.0.0.0

Zaloguj się do mysql jako terminal root

    mysql -u root -p
    -- root password

    CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

    CREATE USER 'username'@'%' IDENTIFIED BY 'password';

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

    FLUSH PRIVILEGES;

    EXIT;

w końcu Udziel temu komputerowi wyłącznego uprawnienia do zdalnego łączenia się z bazą danych za pomocą następującego polecenia.

    sudo ufw allow from remote_IP_address to any port 3306

-1

Przy małej szansie, że ktoś napotyka ten problem z SQLyog, zdarzyło się to:

Połączyłem się ze zdalną bazą danych (z poziomu SQLyog) i pracowałem przez kilka godzin. Potem opuściłem system na kilka minut, a potem wróciłem, aby kontynuować pracę - BŁĄD 1130 ! Nic, co próbowałem, nie zadziałało; Ponowne uruchomienie SQLyog nie naprawiło tego. Następnie zrestartowałem system - nadal nie działał.

Próbowałem więc połączyć się z terminalem - zadziałało. Następnie spróbowałem ponownie na SQLyog ... i zadziałało. Nie potrafię tego wyjaśnić inaczej niż „przypadkowe dziwactwo komputerowe”, ale myślę, że może komuś pomóc.


-1

jeśli próbujesz wykonać zapytanie mysql bez definiowania parametrów połączenia, pojawi się ten błąd.

Prawdopodobnie zapomniałeś zdefiniować parametry połączenia przed wykonaniem. sprawdziłeś to? (przepraszam, za słaby angielski)


-1

Problem: root @ localhost nie może połączyć się ze świeżą instalacją serwera mysql-community-server na openSUSE 42.2-1.150.x86_64. MySQL odmawia połączenia - kropka.

Rozwiązanie:

$ ls -l /var/lib/mysql/mysql/user.*
-rw-rw---- 1 mysql mysql     0 Apr 29 19:44 /var/lib/mysql/mysql/user.MYD
-rw-rw---- 1 mysql mysql  1024 Apr 29 19:44 /var/lib/mysql/mysql/user.MYI
-rw-rw---- 1 mysql mysql 10684 Apr 29 19:44 /var/lib/mysql/mysql/user.frm

Plik user.MYD ma rozmiar 0 (naprawdę?!). Skopiowałem wszystkie 3 pliki z innego działającego systemu.

$ /usr/sbin/rcmysql stop
$ cd /var/lib/mysql/mysql/
$ scp root@othersytem:/var/lib/mysql/mysql/user.* ./
$ /usr/sbin/rcmysql start
$ cd -
$ mysql -u root -p

Byłem w stanie się zalogować. Potem wystarczyło ponownie zastosować wszystkie uprawnienia do schematu. Ponadto, jeśli wyłączyłeś IPv6, włącz go ponownie tymczasowo, aby konto root @ :: 1 mogło również działać.


-1

Działa to dla DirectAdmin ;

  1. Idź do swojego DirectAdmin.
  2. Idź do swojego MySQL Management.
  3. Wybierz swój database.
  4. Pod Accesse Hostkartą znajduje się pole. Powinieneś wypełnić to pole przez xxx.xx.xxx.xx.
  5. Kliknij na Add Host.

Skończone. Teraz możesz uzyskać dostęp do tej bazy danych za pomocą your_database_username& your_database_password.
Tak prosty!


-3

Wszystkie odpowiedzi tutaj nie działały w moim przypadku, więc goszczę, że może to pomóc innym użytkownikom w przyszłości. Może to być również problemem w naszym kodzie, nie tylko w samym MySQL.

Jeśli używasz VB.NET

Zamiast tego kodu:

 Dim server As String = My.Settings.DB_Server
 Dim username As String = My.Settings.DB_Username
 Dim password As String = My.Settings.DB_Password
 Dim database As String = My.Settings.DB_Database

 MysqlConn.ConnectionString = "server=" & server & ";" _
 & "user id=" & username & ";" _
 & "password=" & password & ";" _
 & "database=" & database

 MysqlConn = New MySqlConnection()

Musisz przejść MysqlConn = New MySqlConnection()do pierwszej linii. Tak by było

 MysqlConn = New MySqlConnection()

 Dim server As String = My.Settings.DB_Server
 Dim username As String = My.Settings.DB_Username
 Dim password As String = My.Settings.DB_Password
 Dim database As String = My.Settings.DB_Database

 MysqlConn.ConnectionString = "server=" & server & ";" _
 & "user id=" & username & ";" _
 & "password=" & password & ";" _
 & "database=" & database
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.