Włącz zdalne połączenie MySQL: BŁĄD 1045 (28000): Odmowa dostępu dla użytkownika

136

MySQL 5.1.31 działający w systemie Windows XP.

Z lokalnego serwera MySQL (192.168.233.142) mogę połączyć się jako root w następujący sposób:

>mysql --host=192.168.233.142 --user=root --password=redacted

Ze zdalnego komputera (192.168.233.163) widzę, że port mysql jest otwarty:

# telnet 192.168.233.142 3306
Trying 192.168.233.142...
Connected to 192.168.233.142 (192.168.233.142).

Ale kiedy próbuję połączyć się z mysql ze zdalnego komputera, otrzymuję:

# mysql --host=192.168.233.142 --user=root --password=redacted
ERROR 1045 (28000): Access denied for user 'root'@'192.168.233.163' (using password: YES)

Mam tylko 2 wpisy w mysql.user:

Host         User     Password
--------------------------------------
localhost    root     *blahblahblah
%            root     [same as above]

Co jeszcze muszę zrobić, aby umożliwić zdalny dostęp?

EDYTOWAĆ

Jak zasugerował Paulo poniżej, próbowałem zastąpić wpis mysql.user dla% wpisem specyficznym dla adresu IP, więc moja tabela użytkowników wygląda teraz następująco:

Host             User     Password
------------------------------------------
localhost        root     *blahblahblah
192.168.233.163  root     [same as above]

Następnie ponownie uruchomiłem maszynę, ale problem nadal występuje.

Mike Chamberlain
źródło

Odpowiedzi:

211

Musisz umieścić to jako root:

GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'IP' IDENTIFIED BY 'PASSWORD' with grant option;

;

gdzie IP to adres IP, do którego chcesz zezwolić na dostęp, NAZWA UŻYTKOWNIKA to użytkownik, którego używasz do łączenia, a HASŁO to odpowiednie hasło.

Jeśli chcesz zezwolić na dostęp z dowolnego adresu IP, po prostu wstaw %zamiast swojego adresu IP

a następnie wystarczy umieścić

FLUSH PRIVILEGES;

Lub zrestartuj serwer mysql i to wszystko.

Octavio
źródło
Czy można to zrobić bez lokalnego klienta mysql?
cmcginty
jak usunąć uprawnienia z określonego adresu IP?
Umair Ayub
4
stackoverflow.com/a/21151255/470749 też mi pomógł, ponieważ wydaje mi się, że moje ustawienie adresu powiązania wymagało zakomentowania. Przyznanie uprawnień zdalnych nie wystarczyło, aby działał.
Ryan
8
Nie wyjaśniono w odpowiedzi, ale zastąp PASSWORDje hasłem do konta. Wypróbowałem powyższą zmianę tylko USERNAMEi IPnie zadziałało, dopóki się nie zmieniłem PASSWORD.
Richard Parnaby-King
Po wykonaniu tej czynności postępuj zgodnie z tym, co zostało powiedziane w następującej odpowiedzi: stackoverflow.com/a/21151255/445438
budhajeewa
85

Otrzymywałem ten sam błąd po przyznaniu zdalnego dostępu, dopóki nie zrobiłem tego:

Z /etc/mysql/my.cnf

W nowszych wersjach mysql lokalizacja pliku to /etc/mysql/mysql.conf.d/mysqld.cnf

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1

(skomentuj tę linię bind-address = 127.0.0.1:)

Następnie biegnij service mysql restart.

żuchwy
źródło
6
Lub zmień go na bind-address = 0.0.0.0
lolski
2
Samo komentowanie bind-addressnie działało dla mnie. Albo bind-address = 0.0.0.0czy bind-address = <server_ip>prace.
chhantyal
58

Domyślnie w serwerze MySQL dostęp zdalny jest wyłączony. Proces zapewniania zdalnego dostępu użytkownikowi to.

  1. Przejdź do mojego folderu bin sql lub dodaj go do PATH
  2. Zaloguj się jako root przez mysql -uroot -proot(lub jakiekolwiek inne hasło roota).
  3. Po sukcesie otrzymasz mysql>
  4. Zapewnij dostęp do wszystkich dla tego użytkownika.

GRANT ALL PRIVILEGES ON *.* TO 'username'@'IP' IDENTIFIED BY 'password';

Tutaj IP to adres IP, dla którego chcesz zezwolić na zdalny dostęp, jeśli umieścimy %dowolny adres IP, możesz uzyskać zdalny dostęp.

Przykład:

C:\Users\UserName> cd C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin

C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin>mysql -uroot -proot

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.27 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.25 sec)

To dla innego użytkownika.

mysql> GRANT ALL PRIVILEGES ON *.* TO 'testUser'@'%' IDENTIFIED BY 'testUser';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Mam nadzieję, że to pomoże

Ravi Kant
źródło
+1 za doskonałe szczegóły, naprawdę pomogło mi to zobaczyć, że 0 rows affectedto norma :) Również service mysqld restartpolecam na koniec. [ mysqldczasami jest po prostu mysql]
Nathan Dortman
# Uwaga: dla wersji 5.6+ użyj "grant all on ..." (bez uprawnień)
Nicke Manarin
21

Pomoc Paulo doprowadziła mnie do rozwiązania. Było to połączenie następujących elementów:

  • hasło zawierało znak dolara
  • Próbowałem połączyć się z powłoki Linuksa

Traktuje bash'a znak dolara jako szczególny znak dla ekspansji do zmiennej środowiskowej, więc musimy uciekać go odwrotnym ukośnikiem. Nawiasem mówiąc, nie musimy tego robić w przypadku, gdy znak dolara jest ostatnim znakiem hasła.

Na przykład, jeśli twoje hasło to „pas $ word”, z Linux bash musimy połączyć się w następujący sposób:

# mysql --host=192.168.233.142 --user=root --password=pas\$word
Mike Chamberlain
źródło
4
Oprócz powyższego sprawdź /etc/mysql/my.cnf i skomentuj bind-address = 127.0.0.1
Buminda
2
Alternatywnie można użyć pojedynczych cudzysłowów, aby zapobiec ekspansji $: mysql --host=192.168.233.142 --user=root --password='pas$word' stackoverflow.com/a/6697781/500942
jalanb
„$” w haśle. Bezcenny. Wielkie dzięki !!
Nagendra Kakarla
po chwili uderzenia głową o monitor natrafiłem na to i zadziałało. Mam ! i @ w moim haśle, zmienione hasło, opróżnione uprawnienia i wróciłem do tego. Dzięki!
AJM
9

Czy masz firewall? upewnij się, że port 3306 jest otwarty.

W systemie Windows domyślnie tworzone jest konto główne mysql, które może mieć dostęp tylko z lokalnego hosta, chyba że wybrałeś opcję włączenia dostępu ze zdalnych maszyn podczas instalacji.

tworzenie lub aktualizowanie żądanego użytkownika z „%” jako nazwą hosta.

przykład:

CREATE USER 'krish'@'%' IDENTIFIED BY 'password';
Vamsi Krishna B.
źródło
6
Serwer odpowiada „ERROR 1045 (28000): Odmowa dostępu dla”… jeśli blokada zapory sieciowej będzie miała limit czasu…
Paulo H.,
po prostu chciałem najpierw opublikować. mój zły
Vamsi Krishna B
@Krish - Wszystko, co zasugerowałeś, jest już uwzględnione w pytaniu
Mike Chamberlain
5
  1. Spróbuj flush privilegesponownie.

  2. Spróbuj ponownie uruchomić serwer, aby ponownie załadować granty.

  3. Spróbuj utworzyć użytkownika z hostem „192.168.233.163”. „%” nie zezwala na wszystko (to dziwne)

Paulo H.
źródło
Dzięki, próbowałem, ale bezskutecznie. Zaktualizowałem pytanie o Twoje sugestie.
Mike Chamberlain
4
Spróbuj utworzyć innego użytkownika i nie zapomnij ustawić wszystkich dotacji:CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass'; GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' WITH GRANT OPTION;
Paulo H.
4

W moim przypadku próbowałem połączyć się ze zdalnym serwerem mysql na cent OS. Po przejściu przez wiele rozwiązań (przyznanie wszystkich uprawnień, usunięcie powiązań IP, włączenie sieci) problem nadal nie był rozwiązany.

Jak się okazało, patrząc na różne rozwiązania natknąłem się na iptables, co uświadomiło mi, że port mysql 3306 nie akceptuje połączeń.

Oto mała uwaga na temat tego, jak sprawdziłem i rozwiązałem ten problem.

  • Sprawdzanie, czy port akceptuje połączenia:

    telnet (adres IP serwera mysql) [nr portu]

  • Dodanie reguły tablicy IP, aby zezwolić na połączenia na porcie:

    iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j AKCEPTUJ

  • Nie polecałbym tego dla środowiska produkcyjnego, ale jeśli twoje iptables nie są poprawnie skonfigurowane, dodanie reguł może nadal nie rozwiązać problemu. W takim przypadku należy wykonać następujące czynności:

    usługa iptables zatrzymuje się

Mam nadzieję że to pomoże.

Kushal
źródło
3

jeśli używasz dynamicznego IP, po prostu przyznaj dostęp do 192.168.2.%, więc teraz nie musisz się martwić o przyznawanie dostępu do swojego adresu IP za każdym razem.

Nitin Jaiman
źródło
1

Miałem problemy ze zdalnym logowaniem do MYSQL dla mojej instancji Amazon EC2 Linux. Okazało się, że rozwiązaniem było upewnienie się, że moja grupa bezpieczeństwa zawiera regułę ruchu przychodzącego dla portu MySQL 3306, aby uwzględnić mój adres IP (lub 0.0.0.0/0 dla dowolnego miejsca). Natychmiast mogłem połączyć się zdalnie, jak tylko dodałem tę regułę.

Brendan Moore
źródło
1

Nowa lokalizacja pliku konfiguracyjnego mysql to

/etc/mysql/mysql.conf.d/mysqld.cnf
stackMonk
źródło
0

Sterownik MySQL ODBC 3.51 polega na tym, że znaki specjalne w haśle nie są obsługiwane.

„Ostrzeżenie - możesz mieć poważny ból głowy podczas korzystania z MySQL ODBC 3.51, jeśli hasło w poleceniu GRANT zawiera znaki specjalne, takie jak! @ # $% ^?. Sterownik MySQL ODBC 3.51 ODBC nie obsługuje tych znaków specjalnych w polu hasła. Jedyny komunikat o błędzie, jaki możesz otrzymać, to „Odmowa dostępu” (hasło: TAK) ”- z http://www.plaintutorials.com/install-and-create-mysql-odbc-connector-on-windows-7/

PiperKeith
źródło
0

Kombinacja użytkownika / hosta mogła zostać utworzona bez hasła.

Zakładałem, że podczas dodawania nowego hosta dla istniejącego użytkownika (przy użyciu aplikacji GUI) istniejące hasło będzie również używane dla nowej kombinacji użytkownik / host.

Mógłbym się zalogować

mysql -u username -p PASSWORD

lokalnie, ale nie z adresu IPADDRESS z

mysql -u --host=HOST -p PASSWORD

(Właściwie mógłbym zalogować się z IPADDRESS bez użycia hasła)

mysql -u --host=HOST

Ustawianie hasła umożliwiającego dostęp:

set password for '<USER>'@'<IPADDRESS>' = '<PASSWORD>';
andkrup
źródło
1
Dziękuję, spędziłem dużo czasu próbując połączyć się zdalnie z moim serwerem MySQL i ta linia bardzo pomogła. Podczas ustawiania hasła użytkownika pojawił się błąd, ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal numberktóry doprowadził mnie do tego artykułu: knowmysql.blogspot.com/2013/09/ ... Po wykonaniu tych czynności mogłem w końcu połączyć się z serwerem.
Andy Forceno