Odmowa dostępu dla użytkownika „root” @ „localhost” podczas próby nadania uprawnień. Jak nadać uprawnienia?

166

Spojrzałem na wiele podobnych pytań, więc pokazuję, że sprawdziłem podstawy. Chociaż oczywiście nie oznacza to, że nie przegapiłem czegoś całkowicie oczywistego. :-)

Moje pytanie brzmi: dlaczego odmówiono mi dostępu użytkownikowi z uprawnieniami do tego, co próbuję zrobić i gdzie już wpisałem hasło i uzyskałem dostęp? (Ze względu na kompletność próbowałem wpisać nieprawidłowe hasło, aby upewnić się, że klient MySQL odmówi mi dostępu przy uruchomieniu programu).

Tło:

Zalogowany do powłoki maszyny z serwerem MySQL przez ssh, loguję się jako root:

[myname@host ~]$ mysql -u root -p -hlocalhost
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 62396
Server version: 5.5.18-log MySQL Community Server (GPL)

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

mysql> 

Niesamowite. Czytanie odpowiedzi na podobne pytania sugeruje, że powinienem upewnić się, że uprawnienia są aktualne z tym, co znajduje się w tabelach dotacji

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

mysql> 

Następnie upewnij się, że jestem tym, kim myślę, że jestem:

mysql> SELECT user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

... i naprawdę naprawdę upewnić się:

mysql> SELECT current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> 

Na razie w porządku. Jakie mam przywileje?

mysql> SHOW GRANTS FOR 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                                                                                                                                                                                                                                                                                                                        |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '[OBSCURED]' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

To trochę trudne do odczytania, więc spróbujmy w ten sposób (zobaczysz również, że istnieje użytkownik `` root '' niebędący lokalnym hostem):

mysql> SELECT * FROM mysql.user WHERE User='root'\G
*************************** 1. row ***************************
                 Host: localhost
                 User: root
             Password: *[OBSCURED]
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
          Reload_priv: Y
        Shutdown_priv: Y
         Process_priv: Y
            File_priv: Y
           Grant_priv: Y
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
         Show_db_priv: Y
           Super_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
         Execute_priv: Y
      Repl_slave_priv: Y
     Repl_client_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: Y
     Create_user_priv: Y
           Event_priv: Y
         Trigger_priv: Y
             ssl_type: 
           ssl_cipher: 
          x509_issuer: 
         x509_subject: 
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0
*************************** 2. row ***************************
                 Host: [HOSTNAME].com
                 User: root
             Password: *[OBSCURED]
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
          Reload_priv: Y
        Shutdown_priv: Y
         Process_priv: Y
            File_priv: Y
           Grant_priv: Y
      References_priv: Y
           Index_priv: Y
           Alter_priv: Y
         Show_db_priv: Y
           Super_priv: Y
Create_tmp_table_priv: Y
     Lock_tables_priv: Y
         Execute_priv: Y
      Repl_slave_priv: Y
     Repl_client_priv: Y
     Create_view_priv: Y
       Show_view_priv: Y
  Create_routine_priv: Y
   Alter_routine_priv: Y
     Create_user_priv: Y
           Event_priv: Y
         Trigger_priv: Y
             ssl_type: 
           ssl_cipher: 
          x509_issuer: 
         x509_subject: 
        max_questions: 0
          max_updates: 0
      max_connections: 0
 max_user_connections: 0
 2 rows in set (0.00 sec)

Niesamowite! MySQL myśli, że jestem root @ localhost, a root @ localhost ma wszystkie te przywileje. Oznacza to, że powinienem móc robić, co chcę, prawda?

mysql> GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

Jak mogłem schrzanić coś tak podstawowego?

Nota boczna: dla każdego, kto chce zasugerować, że nie mam użytkownika o nazwie root ze wszystkimi uprawnieniami, to świetnie i rozważę zrobienie czegoś, gdy będę mógł nadać innemu użytkownikowi pewne uprawnienia.

Dziękuję Ci!

Steven Scotten
źródło
2
Doświadczam tego samego zdalnie (i wybierz * FROM mysql.user, gdzie user = 'root' i host = '%' pokazuje te same uprawnienia co twoje). JEDNAK DZIAŁA NA LOCALHOST, mimo że wiersz w mysql.user z host = '%' jest identyczny z wierszem z host = 'localhost' poza tym polem. Używam wersji 5.0.45 w systemie Windows Server 2003. Z wdzięcznością przyjmuję wszystkie odpowiedzi!
Richard Fawcett
3
+1 za tak zorganizowane pytanie!
Dewsworld
1
upewnij się, że masz otwarte cmd, uruchamiając jako administrator
Lijo
1
Miałem tylko spację między -phasłem a hasłem. Wiem, że to głupie, ale może komuś pomóc.
Vinay W

Odpowiedzi:

57

Zwróć uwagę, jak wynik

SHOW GRANTS FOR 'root'@'localhost';

nie powiedział „WSZYSTKIE PRZYWILEJE”, ale musiał przeliterować, co ma root @ localhost.

PRZYZNANIE WSZYSTKICH PRZYWILEJÓW nie powiedzie się, ponieważ użytkownik nie może przyznać tego, czego nie ma, a serwer wydaje się myśleć, że czegoś tu nie ma ...

Czego w takim razie brakuje?

W moim systemie otrzymuję to:

mysql> select version();
+------------+
| version()  |
+------------+
| 5.5.21-log |
+------------+
1 row in set (0.00 sec)

mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM mysql.user WHERE User='root' and Host='localhost'\G
*************************** 1. row ***************************
                  Host: localhost
                  User: root
              Password: 
           Select_priv: Y
           Insert_priv: Y
           Update_priv: Y
           Delete_priv: Y
           Create_priv: Y
             Drop_priv: Y
           Reload_priv: Y
         Shutdown_priv: Y
          Process_priv: Y
             File_priv: Y
            Grant_priv: Y
       References_priv: Y
            Index_priv: Y
            Alter_priv: Y
          Show_db_priv: Y
            Super_priv: Y
 Create_tmp_table_priv: Y
      Lock_tables_priv: Y
          Execute_priv: Y
       Repl_slave_priv: Y
      Repl_client_priv: Y
      Create_view_priv: Y
        Show_view_priv: Y
   Create_routine_priv: Y
    Alter_routine_priv: Y
      Create_user_priv: Y
            Event_priv: Y
          Trigger_priv: Y
Create_tablespace_priv: Y <----------------------------- new column in 5.5
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: <------------------------------- new column in 5.5
 authentication_string: <------------------------------- new column in 5.5
1 row in set (0.00 sec)

W 5.5 są też nowe tabele, takie jak mysql.proxies_user: upewnij się, że je masz.

Podczas instalowania zupełnie nowej instancji serwera mysql, skrypt instalacyjny utworzy wszystkie tabele mysql. * Z odpowiednią strukturą.

Podczas aktualizacji ze starej wersji upewnij się, że została użyta odpowiednia procedura aktualizacji (mysql_upgrade), która doda brakujące tabele / kolumny.

To tylko przypuszczenie, ale wydaje się, że mysql_upgrade nie został wykonany dla tej instancji, powodując zaobserwowane zachowanie.

Marc Alff
źródło
7
To przydatne informacje, ale jak rozwiązać problem?
augurar
2
@augurar, Uruchom mysql_upgrade
Marc Alff
Lub sprawdź, czy masz innego użytkownika z „WSZYSTKIMI PRZYWILEJAMI” i przełącz się na tego i zmień uprawnienia dla hosta lokalnego. Na przykład, miałem wszystkie uprawnienia na [email protected], a root @ localhost nie.
Carabus Manuel
72

Miałem z tym ten sam problem, ale w systemie Windows po aktualizacji do MySQL 5.5 z MySQL 5.1. Próbowałem już zmienić, utworzyć i zresetować hasło wspomniane tutaj , tutaj , tutaj i tutaj , bez pojęcia. Nadal pojawia się ten sam błąd:

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

Mogę łączyć się normalnie, wyświetlać wszystkie bazy danych, wybierać i wstawiać, tworzyć i dodawać użytkowników, ale jeśli chodzi o GRANT, to mam schrzaniony. Ten błąd odmowy dostępu pojawia się ponownie.

Udało mi się rozwiązać ten problem, naprawiając uprawnienia za pomocą następującego polecenia w katalogu bin / katalogu serwera MySQL, jak wspomniano tutaj :

C:\MySQL Server 5.5\bin> mysql_upgrade

Wtedy problem zniknął. Mam nadzieję, że to rozwiązanie działa również w systemie Linux, ponieważ zwykle MySQL zapewnia to samo polecenie zarówno w systemie Linux, jak i Windows.

Aryo
źródło
2
thanx .. w systemie Mac OS z mysql zainstalowanym przez homebrew uruchom następujące poleceniecd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
zoras
30
Jeśli korzystasz z CentOs lub zainstalowałeś MySQL za pośrednictwem menedżera pakietów, jest to prawdopodobnie polecenie, które powinieneś wykonać: /usr/bin/mysql_upgrade -u root -pwprowadź hasło i Twój wujek Boba!
Zjoia,
Po walce tu i tam z tyloma komentarzami, ten mi pomógł.
Wielkie
Wiem, że to jest starszy, ale to bardzo mi pomogło i chciałem dodać jeszcze jeden komentarz dla przyszłych użytkowników: jeśli jesteś coraz odmowa dostępu próbuje uruchomić mysql_upgrade, spróbuj uruchomić go w ten sposób zamiast: mysql_upgrade -p
Blizz
2
Odkryłem, że jeśli wyeksportowałeś bazy danych z MySQL <= 5.1 przez, mysqldump ... --all-databasesa następnie zaimportowałeś je do MySQL> = 5.5, twoi użytkownicy zostaną zastąpieni (oczywiście), ale twój rootbędzie miał ten sam problem co OP. I mysql_upgradenie zadziała - musisz dodać --forceflagę, tj mysql_upgrade -u root -p --force. Mam nadzieję, że to pomoże komuś tutaj.
gregoltsov
62

Może się to zdarzyć, gdy spróbujesz nadać wszystkie uprawnienia do wszystkich tabel innemu użytkownikowi, ponieważ tabela mysql.users jest uważana za niedostępną dla użytkownika innego niż root.

Poniższe jednak powinny działać:

GRANT ALL PRIVILEGES ON `%`.* TO '[user]'@'[hostname]' IDENTIFIED BY '[password]' WITH GRANT OPTION;

Zauważ, że używamy `%`. * Zamiast *. *

Anuj Gupta
źródło
28
Proszę wyjaśnij to. Dlaczego '%'.*działa, ale nie *.*?
Pacerier,
To jest właściwy sposób, aby to zrobić. Musisz zalogować się do MySQL jako root, a następnie spróbować przyznać uprawnienia.
Nawigacja
Ja dostaję błąd 1044 odmowa dostępu :( help me please
Bhaumik Thakkar
Dzięki, próbowałem uzyskać dostęp do mysql z aplikacji Pythona przy użyciu pymysql. Pojawił się błąd mówiący „Host nie może połączyć się z tym serwerem MariaDB”, rozwiązałem ten problem przez dodanie nowego użytkownika podanego [tutaj] ( stackoverflow.com/questions/19101243/… ), a następnie pojawił się kolejny błąd z informacją „Odmowa dostępu dla użytkownika” i rozwiązałem go za pomocą Twojej metody.
Balraj Bains,
1
Jeśli używasz '%'.*zamiast `%`.*nie działa. Państwo musi użyć`%`.*
Rosario Russo
7

Zdarzyło mi się to, gdy próbowałem zainstalować wyższą wersję MySQL niż ta dostarczana z dystrybucją.

Usunąłem starą wersję, a następnie zainstalowałem nową (rpm -e ... następnie rpm -i MySQL-server *) Ale nie zdawałem sobie sprawy, że pliki w / var / lib / mysql nadal pochodzą ze starszej wersji (z różnicami jak wyjaśnił Marc Alff - dzięki!)

Mogłem zrobić mysql_upgrade, ale ponieważ chciałem zacząć od zera, zrobiłem:

# su - mysql
$ rm -rf /var/lib/mysql/*
$ mysql_install_db
# /etc/init.d/mysql start

Następnie ustaw hasło roota (/ usr / bin / mysqladmin -u hasło root) i wszystko działało zgodnie z oczekiwaniami z poleceniami GRANT ...

phil_w
źródło
Dzięki, to mi pomogło. Na szczęście nie miało znaczenia, czy zniszczyłem wszystkie DB ...
Jarrod Mosen,
5

Zasadniczo ten błąd pojawia się, gdy nie podałeś hasła, oznacza to, że masz niepoprawne hasło wymienione w jakimś pliku opcji.

Przeczytaj ten DOC, aby dowiedzieć się, jak przypisywać hasła do kont i zarządzać nimi.

Sprawdź także, czy uprawnienie do folderu /var/lib/mysql/mysql to 711, czy nie.

Mithun Sasidharan
źródło
To zadziałało dla mnie. Wygląda na to, że mysql nie tworzy uprawnień dla „user” @ „localhost”. Musiałem więc utworzyć tego użytkownika i upewnić się, że ma hasło.
Jerinaw,
Uprawnienia były nieprawidłowe! Jestem zdumiony. Dziękuję bardzo za opublikowanie tego.
Adam
5

Miałem ten sam problem czyli wszystkie uprawnienia nadane rootowi:

SHOW GRANTS FOR 'root'@'localhost'\G
*************************** 1. row ***************************
Grants for root@localhost: GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*[blabla]' WITH GRANT OPTION

... ale nadal nie można utworzyć tabeli:

 create table t3(id int, txt varchar(50), primary key(id));
ERROR 1142 (42000): CREATE command denied to user 'root'@'localhost' for table 't3'

Cóż, przyczyną był irytujący błąd użytkownika, tj. Nie wybrałem bazy danych. Po wydaniu USE dbname działało dobrze.

tzp
źródło
5

Na Debianie ( wheezy , 7,8) z MySQL 5.5.40, znalazłem SELECT * FROM mysql.user WHERE User='root'\Gwykazała, że Event_privi „Pola Trigger_priv` były obecne, ale nie ustawiony na Y.

Bieganie mysql_upgrade(z lub bez --force) nie robiło różnicy; Musiałem zrobić instrukcję:

update user set Event_priv = 'Y',Trigger_priv = 'Y' where user = 'root'

W końcu mogłem użyć:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION

… A następnie używaj go dokładniej na indywidualnej bazie danych / koncie użytkownika.

William Turrell
źródło
1
To rozwiązało również problem dla mnie, ale dopiero po tym, jak dowiedziałem się, że musisz SPŁUKAĆ PRZYWILEJE; następnie zaloguj się ponownie, aby ustawić opcję grantu.
Hendrik
5

Być może przyszedłeś do tego pytania z zainstalowanym MySQL w wersji 8 (tak jak ja) i nie znalazłeś satysfakcjonującej odpowiedzi. W wersji 8 nie można już tworzyć takich użytkowników:

GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]' WITH GRANT OPTION;

Dość mylący komunikat o błędzie, który otrzymujesz, to: ERROR 1410 (42000): You are not allowed to create a user with GRANT

Aby stworzyć użytkowników w wersji 8 musisz to zrobić w dwóch krokach:

CREATE USER 'steves'@'[hostname].com' IDENTIFIED BY '[OBSCURED]';
GRANT ALL PRIVILEGES ON *.* TO 'steves'@'[hostname].com' WITH GRANT OPTION;

Oczywiście, jeśli wolisz, możesz również podać ograniczoną liczbę uprawnień (zamiast GRANT ALL PRIVILEGES), npGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER

gloryfobia
źródło
3

Wpisywanie SHOW GRANTS FOR 'root'@'localhost';pokazało mi jakieś niejasne hasło, więc zalogowałem się do mysql tego systemu używając HeidiSQL na innym systemie (używając rootjako nazwy użytkownika i odpowiedniego hasła) i wpisałem
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

i zadziałało, kiedy wróciłem do systemu i zalogowałem się przy użyciu
mysql -uroot -pthepassword;

Nav
źródło
2

Uruchomiłem na tym, gdy próbowałem dodać uprawnienia do performance_schema, czyli błędu mysql http://bugs.mysql.com/bug.php?id=44898 (obejście dodania --single-transaction).

pevik
źródło
2

Miałem ten sam problem i zajęło mi to dużo czytania postów SO i dokumentacji Google. W końcu znalazłem to w FAQ Cloud SQL :

Google Cloud SQL nie obsługuje uprawnień SUPER, co oznacza, że GRANT ALL PRIVILEGESinstrukcje nie będą działać. Alternatywnie możesz użyćGRANT ALL ON `%`.*

kurdtpage
źródło
1

Dla tych, którzy nadal natkną się na to, tak jak ja, warto sprawdzić, czy próba GRANTnie istnieje:

SHOW GRANTS FOR username;

W moim przypadku błąd nie wynikał z faktu, że wystąpił błąd uprawnień, ale dlatego, że GRANTjuż istniał.

mopo922
źródło
1

Jedno proste rozwiązanie, które zawsze działa w przypadku błędów mysql „odmowa dostępu”: użyj sudo.

sudo mysql -u root

Wtedy istnieją niezbędne uprawnienia dla GRANTpoleceń.

suspectus
źródło