MySQL ERROR 1045 (28000): Odmowa dostępu dla użytkownika „rachunek” @ „localhost” (przy użyciu hasła: TAK)

429

Po pierwsze pozwól mi wspomnieć, że przejrzałem wiele sugerowanych pytań i nie znalazłem żadnej stosownej odpowiedzi. Oto co robię.

Jestem połączony z moją instancją Amazon EC2. Mogę zalogować się do katalogu głównego MySQL za pomocą tego polecenia:

mysql -u root -p

Następnie utworzyłem nowy rachunek użytkownika z hostem%

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

Przyznał wszystkie uprawnienia do rachunku użytkownika:

grant all privileges on *.* to 'bill'@'%' with grant option;

Następnie wychodzę z konta roota i próbuję zalogować się za pomocą rachunku:

mysql -u bill -p

wpisałem poprawne hasło i otrzymałem ten błąd:

BŁĄD 1045 (28000): Odmowa dostępu dla użytkownika „rachunek” @ „localhost” (przy użyciu hasła: TAK)

Ali
źródło
34
Prawda FLUSH PRIVILEGES?
eggyal
6
Okej, próbowałem tego bez powodzenia. Wszelkie inne sugestie proszę.
Ali,
1
Z jakiej wersji serwera korzystasz? Widziałem, jak 5.1 dziwnie się z tym zachowuje.
Poodlehat
2
Zdarzyło mi się to podczas instalacji Magento i popełniłem znacznie głupszy błąd. Wprowadzenie „mysql -u magento -p magento” wymagało podania hasła i zamiast hasła domyślnego wprowadzałem hasło roota.
AmirHd
2
@authentictech niestety, żadne z sugerowanych rozwiązań nie działało dla mnie w momencie, gdy pytanie zostało opublikowane. Proszę zobaczyć moją własną odpowiedź, która pomogła mi wyjść z tej sytuacji. Dlatego nie zaznaczyłem żadnego z nich jako odpowiedzi. Prawdopodobnie mogę oznaczyć odpowiedź o najwyższym rankingu jako odpowiedź.
Ali

Odpowiedzi:

441

Prawdopodobnie masz anonimowego użytkownika ''@'localhost'lub''@'127.0.0.1' .

Zgodnie z instrukcją :

Gdy możliwe jest wiele dopasowań, serwer musi określić, którego z nich użyć. Rozwiązuje ten problem w następujący sposób: (...)

  • Gdy klient próbuje się połączyć, serwer przegląda wiersze [tabeli mysql.user] w posortowanej kolejności.
  • Serwer używa pierwszego wiersza pasującego do nazwy hosta klienta i nazwy użytkownika.

(...) Serwer stosuje reguły sortowania, które najpierw porządkują wiersze z najbardziej konkretnymi wartościami hosta . Dosłowne nazwy hostów [takie jak „localhost”] i adresy IP są najbardziej szczegółowe.

Dlatego taki anonimowy użytkownik „maskowałby” każdego innego użytkownika, takiego jak '[any_username]'@'%'podczas łączenia się localhost.

'bill'@'localhost'pasuje 'bill'@'%', ale pasuje (np.)''@'localhost' przed rękami.

Zalecanym rozwiązaniem jest usunięcie tego anonimowego użytkownika (i tak zwykle jest to dobre rozwiązanie).


Poniższe zmiany są w większości nieistotne dla głównego pytania. Mają one jedynie odpowiedzieć na niektóre pytania zadane w innych komentarzach w tym wątku.

Edytuj 1

Uwierzytelnianie za 'bill'@'%'pośrednictwem gniazda.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
    Witamy na monitorze MySQL (...)

    mysql> WYBIERZ użytkownika, hosta z mysql.user;
    + ------ + ----------- +
    | użytkownik | host |
    + ------ + ----------- +
    | rachunek | % |
    | root | 127.0.0.1 |
    | root | :: 1 |
    | root | localhost |
    + ------ + ----------- +
    4 rzędy w zestawie (0,00 s)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | USER () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | rachunek @% |
    + ---------------- + ---------------- +
    1 rząd w zestawie (0,02 s)

    mysql> POKAŻ ZMIENNE PODOBNE do 'skip_networking';
    + ----------------- + ------- +
    | Zmienna nazwa | Wartość |
    + ----------------- + ------- +
    | skip_networking | ON |
    + ----------------- + ------- +
    1 rząd w zestawie (0,00 s)

Edytuj 2

Dokładnie taka sama konfiguracja, z wyjątkiem ponownej aktywacji sieci i teraz tworzę anonimowego użytkownika ''@'localhost'.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
    Witamy na monitorze MySQL (...)

    mysql> CREATE USER '' @ 'localhost' IDENTIFIED BY 'anotherpass';
    Zapytanie OK, dotyczy 0 wierszy (0,00 s)

    mysql> Pa

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        --socket = / tmp / mysql-5.5.sock
    BŁĄD 1045 (28000): Odmowa dostępu dla użytkownika „rachunek” @ „localhost” (przy użyciu hasła: TAK)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -h127.0.0.1 --protocol = TCP
    BŁĄD 1045 (28000): Odmowa dostępu dla użytkownika „rachunek” @ „localhost” (przy użyciu hasła: TAK)
    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
        -hlocalhost --protocol = TCP
    BŁĄD 1045 (28000): Odmowa dostępu dla użytkownika „rachunek” @ „localhost” (przy użyciu hasła: TAK)

Edytuj 3

Taka sama sytuacja jak w edycji 2, teraz podając hasło anonimowego użytkownika.

    root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
    Witamy na monitorze MySQL (...)

    mysql> SELECT USER (), CURRENT_USER ();
    + ---------------- + ---------------- +
    | USER () | CURRENT_USER () |
    + ---------------- + ---------------- +
    | bill @ localhost | @localhost |
    + ---------------- + ---------------- +
    1 rząd w zestawie (0,01 s)

Wniosek 1, z edycji 1: Można uwierzytelnić się 'bill'@'%'przez gniazdo.

Wniosek 2, z edycji 2: To, czy łączy się przez TCP, czy przez gniazdo, nie ma wpływu na proces uwierzytelniania (z wyjątkiem tego, że nie można się połączyć jak nikt inny, ale 'something'@'localhost'przez gniazdo, oczywiście).

Wniosek 3, z edycji 3: Mimo że podałem -ubill, uzyskałem dostęp jako anonimowy użytkownik. Wynika to z „zasad sortowania” zalecanych powyżej. Zauważ, że w większości domyślnych instalacji istnieje anonimowy użytkownik bez hasła (i powinien zostać zabezpieczony / usunięty).

RandomSeed
źródło
9
Dla każdego, kto zastanawia się, dlaczego „bill” @ „localhost” pasuje do „@ @ localhost”, tak jak ja, pusty ciąg znaków skutecznie działa na dziką kartę w algorytmie uwierzytelniania MySQL.
Dziekan lub
2
@Sanja Zachowaj szczególną ostrożność przy tym obejściu. Możliwe, że zezwalasz na anonimowy dostęp do bazy danych z dowolnego miejsca. W razie wątpliwości wolę usunąć użytkownika.
RandomSeed
7
@RandomSeed Dziękujemy za ten komentarz! Prawdopodobnie powinienem po prostu usunąć anonimowego użytkownika. PS Znalazłem dev.mysql.com/doc/refman/5.1/en/default-privileges.html , który mówi, że użytkownicy na pewno można usunąć: DROP USER ''@'localhost';. Nie są potrzebne do jakiegoś specjalnego celu.
Alex
1
Upuściłem anonimowego użytkownika, ale nadal nie działało. Potem stwierdziłem, że muszę wydać również „UPRAWNIENIA PODŁOGOWE”. Warto też o tym wspomnieć.
Neeme Praks
2
Oto odpowiedź! Dlaczego nie pojawia się to pogrubionymi dużymi literami w każdym podręczniku mysql. USUŃ ANONIMOWEGO UŻYTKOWNIKA LUB BĘDZIE ZABIĆ WSZYSTKIE PRÓBY, ABY ZALOGOWAĆ SIĘ Z LOKALIZACJI!
Siergiej
140

Próbować:

~$ mysql -u root -p
Enter Password:

mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;
Edgar Aviles
źródło
10
Jest to dość niebezpieczne, jeśli ktoś włamie się na twoje konto mysql w rachunku @ localhost, będzie miał nieskończony dostęp do wszystkich baz danych twojego serwera mysql.
Adonis K. Kakoulidis
2
Whehey Musiałem napisać cytat wokół mojego użytkownika „moja nazwa użytkownika ”@'myhost.static.myip.com ', a potem zadziałało.
bendecko
To działa dla mnie, ale obawiam się, że dałem zbyt wiele przywilejów użytkownikowi
Csaba Toth
1
@CsabaZrobiłeś to, ponownie zmniejsz uprawnienia, dopóki użytkownik nie będzie miał tego, czego potrzebuje i nic więcej.
jwenting
... a co zrobić, jeśli to daje ci „Odmowa dostępu dla użytkownika„ root ”@„ localhost ”(przy użyciu hasła: TAK)?
Grunion Shaftoe
75

Kiedy uciekłeś

mysql -u bill -p

i dostałem ten błąd

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

mysqld oczekuje, że połączysz się jako bill@localhost

Spróbuj utworzyć bill@localhost

CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;

Jeśli chcesz połączyć się zdalnie, musisz podać nazwę DNS, publiczny adres IP lub 127.0.0.1 za pomocą protokołu TCP / IP:

mysql -u bill -p -hmydb@mydomain.com
mysql -u bill -p -h10.1.2.30
mysql -u bill -p -h127.0.0.1 --protocol=TCP

Po zalogowaniu uruchom to

SELECT USER(),CURRENT_USER();

USER () informuje o próbie uwierzytelnienia w MySQL

CURRENT_USER () informuje o tym, w jaki sposób możesz uwierzytelnić się w MySQL z tabeli mysql.user

To da ci lepszy wgląd w to, jak i dlaczego wolno ci logować się do mysql. Dlaczego ten pogląd jest ważny? Ma to związek z protokołem zamawiania autoryzacji użytkownika.

Oto przykład: utworzę anonimowego użytkownika na moim pulpicie MySQL

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
7 rows in set (0.00 sec)

mysql> grant all on *.* to x@'%';
Query OK, 0 rows affected (0.02 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
| lwdba   | %         |
| mywife  | %         |
| x       | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql> update mysql.user set user='' where user='x';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> select user,host from mysql.user;
+---------+-----------+
| user    | host      |
+---------+-----------+
|         | %         |
| lwdba   | %         |
| mywife  | %         |
| lwdba   | 127.0.0.1 |
| root    | 127.0.0.1 |
| lwdba   | localhost |
| root    | localhost |
| vanilla | localhost |
+---------+-----------+
8 rows in set (0.00 sec)

mysql>

OK, patrz, jak loguję się jako anonimowy użytkownik:

C:\MySQL_5.5.12>mysql -urol -Dtest -h127.0.0.1 --protocol=TCP
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.5.12-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select user(),current_user();
+---------------+----------------+
| user()        | current_user() |
+---------------+----------------+
| rol@localhost | @%             |
+---------------+----------------+
1 row in set (0.00 sec)

mysql>

Kolejność uwierzytelniania jest bardzo rygorystyczna. Sprawdza od najbardziej konkretnego do najmniejszego. O tym stylu uwierzytelniania pisałem w DBA StackExchange .

Nie zapomnij w razie potrzeby jawnie wywołać TCP jako protokół klienta mysql.

RolandoMySQLDBA
źródło
1
'bill'@'localhost'powinien pasować 'bill@%', prawda?
RandomSeed
@Tak porządek sortowania nie opiera się wyłącznie na kolumnie użytkownika mysql.user. MySQL sam w sobie nie dopasowuje znaków. O protokole zamawiania uwierzytelniania użytkowników pisałem w DBA StackExchange: dba.stackexchange.com/a/10897/877
RolandoMySQLDBA
@YaK Właśnie o tym wspomniałem SELECT USER(),CURRENT_USER();. Prawie nigdy nie widać anonimowych użytkowników z tych dwóch funkcji, z wyjątkiem naprawdę kiepskich konfiguracji.
RolandoMySQLDBA
1
Nigdy nie zakładałem, że porządek sortowania opiera się wyłącznie na mysql.user. W rzeczywistości, jeśli ponownie przeczytasz moją odpowiedź, zobaczysz, że powiedziałem (a właściwie instrukcja mówi), że kolejność sortowania jest hostnajpierw oparta na kolumnie. Dużo pisałeś o tym, jak sprawdzić swoje aktualne dane uwierzytelniające, ale widzę niewiele informacji na temat tego, dlaczego 'bill'@'localhost'nie mogę się zalogować 'bill'@'%', co jest dzisiejszym pytaniem AFAIK. OP ma prawdopodobnie słabą konfigurację, dlatego dostaje te błędy.
RandomSeed
2
--protocol=TCPbył kluczem. Dziękuję Ci bardzo!
lfx
22

Bardzo późno na to

Wypróbowałem wszystkie inne odpowiedzi i uruchomiłem wiele różnych wersji, mysql -u root -pale nigdy po prostu nie uruchomiłem


mysql -u root -p

I po prostu naciskając [ENTER]hasło.


Kiedy to zrobiłem, zadziałało. Mam nadzieję, że to komuś pomoże.

garrettmac
źródło
18

Powiązanym problemem w moim przypadku była próba połączenia za pomocą:

mysql -u mike -p mypass

Biała spacja JEST najwyraźniej dozwolona między -u # uname #, ale NIE między -p i # hasłem #

Dlatego potrzebne:

mysql -u mike -pmypass

W przeciwnym razie ze spacją między -p mypass mysql przyjmuje „mypass” jako nazwę db

mstram
źródło
1
lub: mysql -u nazwa_użytkownika -p - to powstrzymuje każdego od zobaczenia hasła, ponieważ spowoduje to usunięcie nowego wiersza i poproszenie o hasło bez wyświetlania go
świetna odpowiedź @mstram
Solanki
1
to rozwiązanie jest wygodne, jednak nie jest pewne, aby wpisać hasło, ale nie trzeba nadawać uprawnień i definiować innych elementów. Więc jeśli Mac Book jest zabezpieczony - takie podejście jest bardzo wygodne, tym bardziej użyłem go do importowania danych do aws ze sterownika dokera mysql.
dimpiax
17

Podczas pisania mysql -u root -płączysz się z serwerem mysql za pośrednictwem lokalnego gniazda unix.

Jednak udzielona dotacja 'bill'@'%' pasują tylko do połączeń TCP / IP.

Jeśli chcesz przyznać dostęp do lokalnego gniazda unix, musisz nadać uprawnienia „bill” @ „localhost”, co, co ciekawe, nie jest tym samym, co „bill ”@'127.0.0.1”

Możesz również połączyć się za pomocą protokołu TCP / IP z klientem wiersza polecenia mysql, aby dopasować uprawnienia, które już przyznałeś, np. Uruchomić mysql -u root -p -h 192.168.1.123lub dowolny lokalny adres IP posiadany przez urządzenie.

nos
źródło
„„ rachunek ”@„% ”pasuje tylko do połączeń TCP / IP” To jest źle. Wypróbuj na czystej (dziewiczej, natychmiast po wyjęciu z pudełka) instancji zskip-networking
RandomSeed
@YaK Nie mogę sprawić, by „użytkownik” @ „%” działał w takiej konfiguracji, co miałeś na myśli?
nos
Mógłbym połączyć się jako 'rachunek' @ '%' na wersji 5.0 bez sieci (stąd przez gniazdo). Jakiej wersji używasz? Spróbuję na wersji 5.5.
RandomSeed
Proszę zobaczyć moją zaktualizowaną odpowiedź. Byłem w stanie zalogować się 'bill'@'%'przez gniazdo w wersji 5.5.
RandomSeed
17

Jeśli zapomnisz hasła lub chcesz je zmienić, możesz wykonać następujące czynności:

1: zatrzymaj swój mysql

[root @ maomao ~] # service mysqld stop
Zatrzymywanie MySQL: [OK]

2: użyj „--skip-grant-tables”, aby zrestartować mysql

[root @ mcy400 ~] # mysqld_safe --skip-grant-tables
[root @ cy400 ~] # Uruchamianie demona mysqld z bazami danych z / var / lib / mysql

3: otwórz nowe okno i wprowadź root mysql -u

[root @ cy400 ~] # mysql -u root
Witamy na monitorze MySQL. Polecenia kończą się na; lub \ g.

4: zmień bazę danych użytkowników

mysql> użyj mysql
Odczytywanie informacji o tabeli w celu uzupełnienia nazw tabel i kolumn Możesz wyłączyć tę funkcję, aby uzyskać szybsze uruchomienie z -A Zmieniona baza danych

5: zmodyfikuj swoje hasło, nowe hasło należy wpisać w „()”

mysql> aktualizacja użytkownik ustaw hasło = hasło („root123”) gdzie użytkownik = „root”;
Zapytanie OK, dotyczy 3 wierszy (0,00 s)
Dopasowane wiersze: 3 Zmieniono: 3 Ostrzeżenia: 0

6: spłucz

mysql> uprawnienia do opróżniania;

7: wyjdź

mysql> quit
Bye

8: uruchom ponownie mysql

[root @ cy400 ~] # service mysqld restart;
Zatrzymywanie MySQL: [OK]
Uruchamianie MySQL: [OK]

Bingo! Możesz połączyć swoją bazę danych z nazwą użytkownika i nowym hasłem:

[root@cy400 ~]# mysql -u root -p <br>
Enter password: admin123 <br>
Welcome to the MySQL monitor.  Commands end with ; or \g. <br>
Your MySQL connection id is 2 <br>
Server version: 5.0.77 Source distribution <br>
Type 'help;' or '\h' for help. Type '\c' to clear the buffer. <br>
mysql> quit <br>
Bye
Li Yingjun
źródło
1
Pomogło mi to, ale na Macu, jeśli instalujesz z Homebrew, to jest mysql.server stop. W moim przypadku nie mogłem zaktualizować kolumny użytkownika, ponieważ jej nie ma; również nie można go utworzyć, ponieważ jest w trybie awaryjnym. Nie obchodzi mnie to, co robię teraz, ale naprawdę doceniam tę odpowiedź formatu z pokazanymi dokładnymi wejściami i wyjściami. dzięki!
szeitlin
Przepraszam, nigdy wcześniej nie korzystałem z Maca, więc nie mogę ci pomóc.
Li Yingjun
15

Zaoszczędź sobie z GŁÓWNEGO bólu głowy ... Twoim problemem może być brak cudzysłowów wokół hasła. Przynajmniej taka była moja sprawa, która mnie odstraszyła na 3 godziny.

[client]
user = myusername
password = "mypassword"   # <----------------------- VERY IMPORTANT (quotes)
host = localhost

http://dev.mysql.com/doc/refman/5.7/en/option-files.html

Wyszukaj „Oto typowy plik opcji użytkownika:” i zobacz podany tam przykład. Powodzenia i mam nadzieję zaoszczędzić komuś innemu czas.

mimoralea
źródło
1
Dziękuję Ci za to. Zmarnowałem na to pół dnia i głupie cytaty wokół hasła załatwiły sprawę!
guyfromfl
Ha ha. Zmarnowałem prawie tak samo, kiedy mi się przydarzyło. Cieszę się, że mogę pomóc.
mimoralea
12

Rozwiązaniem jest usunięcie anonimowego (dowolnego) użytkownika!

Ten sam problem napotkałem również na konfiguracji serwera przez kogoś innego. Zwykle nie wybieram utworzenia anonimowego użytkownika po zainstalowaniu MySQL, więc tego nie zauważyłem. Początkowo zalogowałem się jako użytkownik „root” i utworzyłem kilku „normalnych” użytkowników (czyli użytkowników z uprawnieniami tylko na dbs z ich nazwą użytkownika jako prefiksem), następnie wylogowałem się, a następnie sprawdziłem pierwszego normalnego użytkownika. Nie mogłem się zalogować. Ani przez phpMyAdmin, ani przez powłokę. Okazuje się, że winowajcą jest ten użytkownik „Dowolny”.

fevangelou
źródło
11

Miałem nieco podobny problem - przy pierwszej próbie wejścia do MySQL, ponieważ rootpowiedział mi, że odmówiono dostępu. Okazuje się, że zapomniałem użyćsudo ...

Jeśli więc nie uda ci się za rootpierwszym razem, spróbuj:

sudo mysql -u root -p

a następnie wprowadź hasło, to powinno działać.

David Refaeli
źródło
6

Najlepsze rozwiązanie, jakie znalazłem dla siebie, to.

mój użytkownik jest sonarem i za każdym razem, gdy próbuję połączyć się z bazą danych z zewnętrznego lub innego komputera, pojawia się błąd jako

ERROR 1045 (28000): Access denied for user 'sonar'@'localhost' (using password: YES)

Również, gdy próbuję tego z innej maszyny i za pośrednictwem zadania Jenkinsa, mój adres URL dostępu to

alm-lt-test.xyz.com

jeśli chcesz połączyć się zdalnie, możesz określić to na różne sposoby w następujący sposób:

mysql -u sonar -p -halm-lt-test.xyz.com
mysql -u sonar -p -h101.33.65.94
mysql -u sonar -p -h127.0.0.1 --protocol=TCP
mysql -u sonar -p -h172.27.59.54 --protocol=TCP

Aby uzyskać dostęp do tego adresu URL, wystarczy wykonać następujące zapytanie.

GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'alm-lt-test.xyz.com' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'127.0.0.1' IDENTIFIED BY 'sonar';
GRANT ALL ON sonar.* TO 'sonar'@'172.27.59.54' IDENTIFIED BY 'sonar';
Abhijeet Kamble
źródło
4

Okej, nie jestem pewien, ale prawdopodobnie jest to plik my.cnf w katalogu instalacyjnym mysql. Skomentuj ten wiersz, a problem może zostać rozwiązany.

bind-address = 127.0.0.1
Ali
źródło
1
Aby uzyskać więcej informacji, możesz również zobaczyć to wiki.bitnami.org/Components/MySQL
Ali
1
Jestem pewien, że nie o to chodzi. Jeśli tak, MySQL odrzuca połączenia z dowolnego hosta innego niż 127.0.0.1 i nie pojawi się błąd SQL „Odmowa dostępu”.
The Pellmeister
3

Chciałem tylko poinformować Cię o niecodziennej sytuacji, że otrzymałem ten sam błąd. Być może to pomoże komuś w przyszłości.

Opracowałem kilka podstawowych widoków, utworzonych w witrynie programistycznej i przeniosłem je na stronę produkcyjną. Później w tym tygodniu zmieniłem skrypt PHP i nagle pojawiły się błędy, że odmówiono dostępu użytkownikowi „local-web-user” @ „localhost”. Obiekt źródła danych nie zmienił się, więc skoncentrowałem się na użytkowniku bazy danych w MySQL, martwiąc się tymczasem ktoś włamał się na moją stronę. Na szczęście reszta witryny wydawała się nietknięta.

Później okazało się, że winowajcami byli poglądy. Nasze transfery obiektowe są wykonywane przy użyciu innego (i zdalnego: admin @ adres-ip) użytkownika niż lokalny użytkownik witryny. Widoki zostały utworzone przy użyciu „admin” @ „ip-address” jako definicji. Domyślnym zabezpieczeniem tworzenia widoku jest

SQL SECURITY DEFINER

Gdy lokalny użytkownik sieci próbuje użyć widoku, natrafia na brak uprawnień użytkownika definiującego do korzystania z tabel. Po zmianie zabezpieczeń na:

SQL SECURITY INVOKER

problem został rozwiązany. Rzeczywisty problem był zupełnie inny niż oczekiwano na podstawie komunikatu o błędzie.

Erik
źródło
1
Skończyło się to również źródłem mojego problemu - poglądem z brakującym „definierem”. Jednym szybkim sposobem, aby dowiedzieć się, czy tak się dzieje, jest próba wykonania zapytania do tej samej tabeli lub widoku jako root - jeśli tak, komunikat o błędzie zmienia się na znacznie bardziej opisowy „BŁĄD 1449 (HY000): Użytkownik określony jako Definicja nie istnieje ".
Joshua Davies,
3

To różnica między:

CREATE USER 'bill'@'%' IDENTIFIED BY 'passpass';

i

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

Sprawdź to:

mysql> select user,host from mysql.user;
+---------------+----------------------------+
| user          | host                       |
+---------------+----------------------------+
| bill          | %                          | <=== created by first
| root          | 127.0.0.1                  |
| root          | ::1                        |
| root          | localhost                  |
| bill          | localhost                  | <=== created by second
+---------------+----------------------------+

Komenda

mysql -u bill -p

dostęp niejawny do „rachunku” @ „localhost”, a NIE do „rachunku” @ „%”.

Brak uprawnień dla „rachunku” @ „localhost”

pojawia się błąd:

ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)

rozwiązanie problemu:

CREATE USER 'bill'@'localhost' IDENTIFIED BY 'passpass';

grant all privileges on . to 'bill'@'localhost' with grant option;
Gerd
źródło
Instrukcja dotacji zwróciła błąd. Musiałem podać taką bazę danych: przyznaj wszystkie uprawnienia do newdb. * Do ....
LeBird,
3

Dzieje się tak również wtedy, gdy hasło zawiera niektóre znaki specjalne, takie jak @, $ itp. Aby uniknąć tej sytuacji, możesz zawrzeć hasło w pojedynczym cudzysłowie:

$ mysql -usomeuser -p's0mep@$$w0Rd'

Lub zamiast tego nie używaj hasła podczas wprowadzania. Pozostaw puste, a następnie wpisz, gdy terminal o to poprosi. To jest zalecany sposób.

$ mysql -usomeuser -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 191
Server version: 5.5.46-0ubuntu0.14.04.2 (Ubuntu)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
Pranit More
źródło
3
To może rzeczywiście być problem (jak dla mnie). Wszystkie moje hasła do dowolnego konta są generowane przy użyciu pwgen. Dzisiaj wygenerowałem nowy dla bazy danych MySQL i jej użytkownika. Niestety hasło zawierało ukośnik odwrotny „\”, którego nie zidentyfikowałem jako źródła błędów (nawet o tym nie pomyślałem). Szukałem godzinami rozwiązania. Po ustawieniu w rozpaczy hasła na „123” logowanie w końcu zadziałało. … Użytkownicy powinni zdawać sobie sprawę, że niektóre znaki specjalne mogą powodować problemy, ponieważ MySQL nie wyświetla żadnych ostrzeżeń dotyczących używania haseł, takich jak na przykład „daiy4ha4in7chooshuiphie \ Th * aew”.
Arvid
1
Miałem zamiar opublikować to jako odpowiedź, jeśli jeszcze się nie pokazało, to po prostu było zbyt daleko na liście, żebym mógł to zauważyć (więc podbijam +1)
Assimilater
3

Dla mnie ten problem był spowodowany nową funkcją MySQL 5.7.2: userwpisy są ignorowane, jeśli ich pluginpole jest puste.

Ustaw na np. mysql_native_passwordAby je ponownie włączyć:

UPDATE user SET plugin='mysql_native_password' WHERE user='foo';
FLUSH PRIVILEGES;

Zobacz informacje o wersji MySQL 5.7.2 w „Notach uwierzytelnienia”.

Z jakiegoś powodu (być może dlatego, że moje skróty hasła w wersji wcześniejszej niż 4.1 zostały usunięte), mysql_upgradeskrypt nie ustawił domyślnej wartości wtyczki.

Dowiedziałem się, zauważając następujący komunikat ostrzegawczy w /var/log/mysql/error.log:

[Ostrzeżenie] Wpis użytkownika „foo” @ „%” ma pustą wartość wtyczki. Użytkownik zostanie zignorowany i nikt nie będzie mógł zalogować się do tego użytkownika.

Publikuję tę odpowiedź tutaj, aby być może uratować kogoś przed wykorzystaniem tej samej absurdalnej ilości czasu na to, co ja.

maxelost
źródło
2

Nie jestem pewien, czy ktokolwiek uzna to za pomocne, ale napotkałem ten sam błąd i szukałem anonimowych użytkowników ... i nie było żadnych. Problem polegał na tym, że konto użytkownika było ustawione na „Wymagaj SSL” - co znalazłem w PHPMyAdmin, przechodząc do Kont użytkowników i klikając Edytuj uprawnienia użytkownika. Gdy tylko odznaczyłem tę opcję, wszystko działało zgodnie z oczekiwaniami!

Alan
źródło
2

Podsumowanie debugowania

  • Sprawdź błąd literowy: nazwa użytkownika lub hasło.
  • Sprawdź nazwę hosta i porównaj ją z nazwą hosta tabeli mysql.user.
  • Sprawdź, czy użytkownik istnieje, czy nie.
  • Sprawdź, czy host zawiera adres IP lub nazwę hosta.

Istnieje duża szansa, że ​​w pracy mogłeś napotkać ten problem wiele razy. Ten problem najczęściej pojawiał się w związku z niepoprawnym wprowadzeniem nazwy użytkownika lub hasła. Chociaż jest to jeden z powodów, istnieje wiele innych szans na uzyskanie tego problemu. Czasami wygląda to bardzo podobnie, ale gdy będziesz kopać głębiej, zdasz sobie sprawę z wielu czynników przyczyniających się do tego błędu. W tym poście szczegółowo wyjaśnione zostaną najczęstsze przyczyny i obejście tego problemu.

Możliwe przyczyny:

  • Przypadek 1: Błąd literówki: nazwa użytkownika lub hasło.

Jest to najczęstsza przyczyna tego błędu. Jeśli podałeś nieprawidłową nazwę użytkownika lub hasło, na pewno pojawi się ten błąd.

Rozwiązanie:

Rozwiązanie tego rodzaju błędu jest bardzo proste. Wystarczy wpisać poprawną nazwę użytkownika i hasło. Ten błąd zostanie rozwiązany. W przypadku zapomnienia hasła możesz zresetować nazwę użytkownika / hasło. Jeśli zapomnisz hasła do konta administratora / root, istnieje wiele sposobów resetowania / odzyskiwania hasła roota. Opublikuję kolejny post na temat resetowania hasła roota w przypadku, gdy zapomnisz hasło roota.

  • Przypadek 2: Dostęp z niewłaściwego hosta.

MySQL zapewnia oparte na hoście ograniczenia dostępu użytkownika jako funkcje bezpieczeństwa. W naszym środowisku produkcyjnym ograniczaliśmy żądanie dostępu tylko do serwerów aplikacji. Ta funkcja jest naprawdę pomocna w wielu scenariuszach produkcyjnych.

Rozwiązanie:

Gdy napotkasz tego typu problem, najpierw sprawdź, czy Twój host jest dozwolony, sprawdzając tabelę mysql.user. Jeśli nie jest zdefiniowany, możesz zaktualizować lub wstawić nowy rekord do tabeli mysql.user. Zasadniczo dostęp z poziomu komputera zdalnego jako użytkownik root jest wyłączony i nie jest to najlepsza praktyka ze względów bezpieczeństwa. Jeśli masz wymagania dotyczące dostępu do serwera z wielu komputerów, daj dostęp tylko do tych komputerów. Lepiej nie używać symboli wieloznacznych (%) i zapewnia uniwersalny dostęp. Pozwól mi zaktualizować tabelę mysql.user, teraz demouser może uzyskać dostęp do serwera MySQL z dowolnego hosta.

  • Przypadek 3: Użytkownik nie istnieje na serwerze.

Ten typ błędu występuje, gdy użytkownik, do którego próbujesz uzyskać dostęp, nie istnieje na serwerze MySQL.

Rozwiązania:

Gdy napotkasz tego typu problem, po prostu sprawdź, czy użytkownik istnieje w tabeli mysql.user, czy nie. Jeśli rekord nie istnieje, użytkownik nie może uzyskać dostępu. Jeśli ten użytkownik wymaga dostępu, utwórz nowego użytkownika z tą nazwą użytkownika.

  • Przypadek 4: Mieszanka hostów numerycznych i opartych na nazwach.

Ważne punkty

  • Nie zaleca się używania symboli wieloznacznych podczas definiowania hosta użytkownika, spróbuj użyć dokładnej nazwy hosta.

  • Wyłącz logowanie roota ze zdalnego komputera.

  • Użyj koncepcji użytkownika proxy.

Istnieje kilka innych pojęć związanych z tym tematem, a szczegółowe omówienie tych tematów jest bardzo różnym zakresem tego artykułu. W nadchodzących artykułach zajmiemy się następującymi pokrewnymi tematami.

  • Co zrobić, jeśli zapomniałeś hasła roota na serwerze MySQL.
  • Problemy z uprawnieniami do dostępu do MySQL i tabele związane z użytkownikami.
  • Funkcje bezpieczeństwa MySQL z najlepszymi praktykami.

Mam nadzieję, że ten post pomoże ci naprawić kod błędu MySQL 1045 Odmowa dostępu dla użytkownika w MySQL.

Abhijit Jagtap
źródło
2

Mam nadzieję, że nie spowodowałeś więcej szkód, usuwając również użytkownika debian-sys-maint w mysql

Niech twój demon mysql działa normalnie. Uruchom klienta mysql, jak pokazano poniżej

mysql -u debian-sys-maint -p

W innym terminalu catplik /etc/mysql/debian.cnf. Ten plik zawiera hasło; wklej to hasło, gdy zostaniesz o to poproszony.

http://ubuntuforums.org/showthread.php?t=1836919

ysk
źródło
2

Odkryłem jeszcze inny przypadek, który pojawia się na powierzchni jako przypadek krawędzi; Mogę eksportować do systemu plików poprzez SELECT INTO .. ​​OUTFILE jako root, ale nie jako zwykły użytkownik. Chociaż może to być kwestia uprawnień, przyjrzałem się temu i nie widzę nic szczególnie oczywistego. Wszystko, co mogę powiedzieć, to to, że wykonanie zapytania jako zwykły użytkownik, który ma wszystkie uprawnienia do danej bazy danych, zwraca błąd odmowy dostępu, który doprowadził mnie do tego tematu. Kiedy znalazłem transkrypcję udanego użycia SELECT INTO… OUTFILE w starym projekcie, zauważyłem, że jestem zalogowany jako root. Rzeczywiście, kiedy zalogowałem się jako root, zapytanie przebiegło zgodnie z oczekiwaniami.

David A. Gray
źródło
1

Aktualizacja: w wersji 8.0.15 (być może w tej wersji)PASSWORD() funkcja nie działa.

Musisz:

  1. Najpierw upewnij się, że zatrzymałeś MySQL.
  2. Uruchom serwer w trybie awaryjnym z obejściem uprawnień: sudo mysqld_safe --skip-grant-tables
  3. Zaloguj sie: mysql -u root
  4. mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';
  5. mysql> FLUSH PRIVILEGES;
  6. mysql> exit;
  7. Zaloguj się jeszcze raz: mysql -u root
  8. mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';
Mohamed Jaleel Nazir
źródło
0

Po uruchomieniu mysql -u bill -p, localhostzostanie rozwiązany do OD, ponieważ jest 127.0.0.1 i w /etc/hostspliku, jako domyślny 127.0.0.1 localhostistnieje. Zatem mysql interpretuje cię jako coś, bill@localhostco nie jest przyznane bill@'%'. Dlatego rootw wyniku select host, user from mysql.user;zapytania istnieją 2 różne rekordy dla użytkownika .

Istnieją dwa sposoby rozwiązania tego problemu.

Jednym z nich jest określenie adresu IP, który nie jest rozwiązywany odwrotnie przez /etc/hostsplik podczas próby logowania. Na przykład adres IP serwera to 10.0.0.2. Po uruchomieniu polecenia mysql -u bill -p -h 10.0.0.2będziesz mógł się zalogować. Jeśli napiszesz select user();, dostaniesz [email protected]. Oczywiście, żadna nazwa domeny nie powinna być przetłumaczona na ten adres IP w twoim/etc/hosts pliku.

Po drugie, musisz przyznać dostęp do tej konkretnej nazwy domeny. Bo bill@localhostpowinieneś wywołać polecenie grant all privileges on *.* to bill@localhost identified by 'billpass';. W takim przypadku będziesz mógł zalogować się za pomocą polecenia mysql -u bill -p. Po zalogowaniu select user();polecenie zwracabill@localhost .

Ale to tylko dlatego, że próbujesz zalogować się do serwera mysql na tym samym hoście. Ze zdalnych hostów mysql zachowuje się zgodnie z oczekiwaniami, '%' pozwoli ci się zalogować.

Shnkc
źródło
0

Rozwiązałem to, usuwając stare wpisy „rachunków” błędnego użytkownika (jest to ważna część: zarówno z mysql.user, jak i mysql.db ), a następnie utworzyłem tego samego użytkownika jako smutnego wcześniej:

FLUSH PRIVILEGES;
CREATE USER bill@localhost IDENTIFIED BY 'passpass';
grant all privileges on *.* to bill@localhost with grant option;
FLUSH PRIVILEGES;

Pracował, użytkownik się łączy. Teraz usunę z niej niektóre wcześniejsze uprawnienia :)

dxvargas
źródło
0

Napotkałem ten sam błąd. Konfiguracja, która nie działała, wygląda następująco:

define("HOSTNAME", "localhost");
define("HOSTUSER", "van");
define("HOSTPASS", "helsing");
define("DBNAME", "crossbow");
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

Edytowana konfiguracja poniżej to ta, która sprawiła, że ​​działała. Zauważ różnicę?

define('HOSTNAME', 'localhost');
define('HOSTUSER', 'van');
define('HOSTPASS', 'helsing');
define('DBNAME', 'crossbow');
$connection = mysqli_connect(HOSTNAME, HOSTUSER, HOSTPASS);

Różnica polega na podwójnym cudzysłowie. Wydają się być dość znaczące w PHP w przeciwieństwie do Javy i mają wpływ, jeśli chodzi o ucieczkę znaków, konfigurowanie adresów URL, a teraz przekazywanie parametrów do funkcji. Są ładniejsze (wiem), ale zawsze używaj pojedynczych cudzysłowów tak często, jak to możliwe, w razie potrzeby można zagnieżdżać je w cudzysłowach.

Ten błąd pojawił się, gdy przetestowałem moją aplikację na komputerze z systemem Linux w przeciwieństwie do środowiska Windows.

Raymond Wachaga
źródło
0

Miałem podobne problemy, ponieważ moje hasło zawiera „;” char łamie moje hasło, kiedy je tworzę w pierwszej chwili. Ostrożnie z tym, jeśli może ci pomóc.

Genaut
źródło
0

Może to dotyczyć bardzo niewielu osób, ale proszę bardzo. Nie używaj wykrzyknika !w swoim haśle.

Zrobiłem i otrzymałem powyższy błąd przy użyciu MariaDB. Kiedy uprościłem to do samych cyfr i liter, zadziałało. Inne znaki, takie jak @i $działają dobrze - użyłem tych znaków u innego użytkownika w tej samej instancji.

Piąta odpowiedź pod tym adresem doprowadziła mnie do mojej poprawki.

Chiwda
źródło
0

W systemie Windows oto sposób rozwiązania:

BŁĄD 1045 (28000): Odmowa dostępu dla użytkownika „root” @ „localhost” (przy użyciu hasła: NIE)

  1. Odinstaluj mysql z panelu sterowania
  2. Usuń folder MySql z C:\Program Files,C:\Program Files (x86)iC:\ProgramData
  3. Zainstaluj mysql
Sanjay
źródło
Próbowałem wszystkich innych odpowiedzi, w końcu postanowiłem spróbować i zadziałało!
jasonoriordan
0

Może się to również zdarzyć, jeśli MySQL działa na systemie operacyjnym bez rozróżniania wielkości liter, takim jak Windows.

np. znalazłem, że próba połączenia z bazą danych przy użyciu tych poświadczeń nie powiodła się:

mysql> grant select on databaseV105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -p's3curepa5wrd' -h10.61.130.89 databaseV105

BŁĄD 1045 (28000): Odmowa dostępu dla użytkownika „specialuser ”@'10.0.1.113” (przy użyciu hasła: TAK)

Ale udało się:

mysql> grant select on databasev105.* to 'specialuser' identified by 's3curepa5wrd';

$ mysql -specialuser' -h10.300.300.400 databaseV105 -p

Wprowadź hasło:

kguest
źródło
0

Dzisiaj! Rozwiązanie dla :

MySQL ERROR 1045 (28000): Odmowa dostępu dla użytkownika „użytkownik” @ „localhost” (przy użyciu hasła: TAK);

Nowa instalacja lub aktualizacja Wampserver 3.2.0

Prawdopodobnie xampużywanie mariaDBjako domyślne jest dobre.

Wampserwer jest dostarczany z mariaDBi mysql, i instaluje się mariaDBdomyślnie na porcie 3306 i mysql na 3307, port czasem 3308.

Połącz się z mysql!

Podczas instalacji prosi o użycie mariaDBlub MySql, ale mariaDB jest domyślnie zaznaczone i nie można go zmienić, sprawdzić mysqlopcji i zainstalować.

po zakończeniu instalacji oba będą działały mariaDBna domyślnym porcie 3306 i mysqlna innym porcie 3307 lub 3308.

Kliknij prawym przyciskiem myszy wampserverikonę, w której powinien być uruchomiony, w prawym dolnym rogu, przejdź do narzędzi i sprawdź poprawny mysqlport do uruchamiania.

I dołącz to do połączenia z bazą danych tak samo jak folowng:

$host = 'localhost';
$db   = 'test';
$user = 'root';
$pass = '';
$charset = 'utf8mb4';
$port = '3308';//Port

$dsn = "mysql:host=$host;dbname=$db;port=$port;charset=$charset"; //Add in connection
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
try {
     $pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
     throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

Note : Używam pdo.

Zobacz tutaj po więcej: https://sourceforge.net/projects/wampserver/

Dlk
źródło
Proszę nie używać backsicków dla podkreślenia. Powinny być używane tylko do kodu. Słowa takie jak MySQL lub Wampserver nie są kodem.
Dharman