Accesso negato per l'utente 'root' @ 'localhost' durante il tentativo di concedere privilegi. Come concedo i privilegi?


166

Ho esaminato una serie di domande simili e quindi sto dimostrando di aver controllato le basi. Anche se, ovviamente, ciò non significa che non mi sia perso qualcosa di totalmente ovvio. :-)

La mia domanda è: perché mi viene negato l'accesso a un utente con i privilegi di fare ciò che sto cercando di fare e dove ho già digitato la password e mi è stato concesso l'accesso? (Per completezza, ho provato a digitare la password sbagliata solo per assicurarmi che il client MySQL mi negasse l'accesso all'avvio del programma.)

Sfondo:

Effettuato l'accesso alla shell della macchina che esegue il server MySQL tramite ssh, accedo come 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> 

Eccezionale. La mia lettura delle risposte a domande simili suggerisce che dovrei assicurarmi che i privilegi siano aggiornati con quanto riportato nelle tabelle delle sovvenzioni

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

mysql> 

Quindi assicurati di essere quello che penso di essere:

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

... e assicurati davvero :

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

mysql> 

Fin qui tutto bene. Ora quali privilegi ho?

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)

Ora è un po 'difficile da leggere, quindi proviamo in questo modo (vedrai anche che esiste un utente' root 'non localhost):

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)

Eccezionale! MySQL pensa che io sia root @ localhost e root @ localhost abbia tutti quei privilegi. Ciò significa che dovrei essere in grado di fare quello che voglio, giusto?

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)

Come avrei potuto rovinare qualcosa di così semplice?

Nota a margine: per chiunque voglia suggerire che non ho un utente di nome root con tutti i privilegi, è fantastico e qualcosa che prenderò in considerazione una volta che posso dare ad un altro utente alcuni privilegi.

Grazie!


2
Sto vivendo lo stesso da remoto (e seleziona * FROM mysql.user dove user = 'root' e host = '%' mostra gli stessi privilegi del tuo). Tuttavia, funziona su LOCALHOST anche se la riga in mysql.user con host = '%' è identica alla riga con host = 'localhost' a parte quel campo. Sto eseguendo 5.0.45 su Windows Server 2003. Tutte le risposte sono state accettate con gratitudine!
Richard Fawcett,

3
+1 per una domanda così organizzata!
Dewsworld,

1
assicurati di aver aperto cmd eseguendo come amministratore
Lijo

1
Ho appena avuto uno spazio tra -pe la password. So che è sciocco ma potrebbe aiutare qualcuno.
Vinay W,

Risposte:


57

Si noti come l'output di

SHOW GRANTS FOR 'root'@'localhost';

non ha detto "TUTTI I PRIVILEGI", ma ha dovuto precisare ciò che ha root @ localhost.

CONCESSIONE DI TUTTI I PRIVILEGI fallirà, perché un utente non può concedere ciò che non ha e il server sembra pensare che qualcosa non sia qui ...

Cosa manca allora?

Sul mio sistema, ottengo questo:

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)

Ci sono anche nuove tabelle in 5.5, come mysql.proxies_user: assicurati di averle.

Quando si installa una nuovissima istanza del server mysql, lo script di installazione creerà tutte le tabelle mysql. * Con la struttura appropriata.

Quando esegui l'aggiornamento da una versione precedente, assicurati di utilizzare la procedura di aggiornamento corretta (mysql_upgrade), che aggiungerà le tabelle / colonne mancanti.

È solo un'ipotesi, ma sembra che mysql_upgrade non sia stato fatto per questa istanza, causando il comportamento visto.


7
Queste sono informazioni utili, ma come posso risolvere il problema?
agosto

2
@augurar, Run mysql_upgrade
Marc Alff,

Oppure, controlla se hai un altro utente con "TUTTI I PRIVILEGI" e passa a quello e modifica i privilegi dell'host locale. Per esempio, avevo tutti i privilegi su root@127.0.0.1 e il root @ localhost no.
Carabus Manuel,

72

Ho avuto anche lo stesso problema con questo, ma su Windows dopo l'aggiornamento a MySQL 5.5 da MySQL 5.1. Ho già provato a cambiare, creare e ripristinare la password menzionata qui , qui , qui e qui , senza alcun indizio. Ottengo ancora lo stesso errore:

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

Sono in grado di connettermi normalmente, mostrare tutti i database, selezionare e inserire, creare e aggiungere utenti, ma quando si tratta di GRANT, sono incasinato. L'errore di accesso negato viene nuovamente visualizzato.

Sono riuscito a risolvere questo problema correggendo i privilegi con il seguente comando sulla directory bin / server del server MySQL, come indicato qui :

C:\MySQL Server 5.5\bin> mysql_upgrade

Quindi, il problema è scomparso. Spero che questa soluzione funzioni anche su Linux poiché solitamente MySQL fornisce lo stesso comando sia su Linux che su Windows.


2
grazie .. in mac OS con mysql installato tramite homebrew esegui il seguente comandocd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
zoras

30
Se sei su un CentOs o hai installato MySQL tramite un gestore di pacchetti, questo è probabilmente il comando che dovresti eseguire: /usr/bin/mysql_upgrade -u root -pinserisci password e Bob's Your Uncle!
Zjoia,

Dopo aver combattuto qua e là con così tanti commenti, questo mi ha aiutato. Grazie mille
siddhusingh, il

So che è più vecchio ma questo mi ha aiutato molto e volevo aggiungere un altro commento per i futuri visitatori: se stai ricevendo ACCESS DENIED cercando di eseguire mysql_upgrade, prova invece a eseguirlo in questo modo: mysql_upgrade -p
blizz

2
Quello che ho scoperto è che se hai esportato database da MySQL <= 5.1 tramite mysqldump ... --all-databasese poi importato nel tuo MySQL> = 5.5, i tuoi utenti saranno stati sostituiti (ovviamente), ma rootavrai lo stesso problema di OP. E mysql_upgradenon funzionerà - devi aggiungere --forceflag, ad es mysql_upgrade -u root -p --force. Spero che aiuti qualcuno qui.
Gregregtsov,

62

Ciò può accadere quando si tenta di concedere tutti i privilegi su tutte le tabelle a un altro utente, poiché la tabella mysql.users è considerata non consentita per un utente diverso da root.

Tuttavia, dovrebbe funzionare quanto segue:

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

Nota che usiamo `%`. * Invece di *. *


28
Per favore, spiegalo. Perché '%'.*funziona ma no *.*?
Pacerier,

Questo è il modo giusto per farlo. Devi accedere a MySQL come root e quindi provare a concedere i privilegi.
Nav

Viene visualizzato l'errore Accesso 1044 negato :( aiutatemi per favore
Bhaumik Thakkar,

Grazie, stavo provando ad accedere a mysql da un'applicazione python usando pymysql. Viene visualizzato l'errore "Host non autorizzato a connettersi a questo server MariaDB", risolto aggiungendo un nuovo utente dato [qui] ( stackoverflow.com/questions/19101243/… ), quindi viene visualizzato un altro errore che dice "accesso negato per l'utente" e risolto con il tuo metodo.
Balraj Bains,

1
Se si utilizza '%'.*invece di `%`.*non funziona. È NECESSARIO utilizzare`%`.*
Rosario Russo

7

Questo è successo a me quando ho provato a installare una versione MySQL superiore rispetto a quella fornita con la distribuzione.

Ho cancellato la vecchia versione quindi ho installato quella nuova (rpm -e ... quindi rpm -i MySQL-server *) Ma non mi sono reso conto che i file in / var / lib / mysql erano ancora dalla versione precedente (con differenze come spiegato da Marc Alff - grazie!)

Avrei potuto fare un mysql_upgrade, ma come volevo iniziare da zero ho fatto:

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

Quindi imposta la password di root (/ usr / bin / mysqladmin -u password di root) e tutto ha funzionato come previsto con i comandi GRANT ...


Grazie, questo mi ha aiutato. Fortunatamente, non importava se cancellassi tutti i DB ...
Jarrod Mosen,

5

Fondamentalmente questo errore si verifica quando non è stata specificata una password, significa che è presente una password errata elencata in alcuni file di opzioni.

Leggi questo DOC su come assegnare e gestire le password agli account.

Inoltre, controlla se l'autorizzazione per la cartella /var/lib/mysql/mysql è 711 o meno.


Questo ha funzionato per me. Sembra che mysql non crei autorizzazioni per 'user' @ 'localhost'. Quindi ho dovuto creare quell'utente e assicurarmi che avesse una password.
Jerinaw,

Le autorizzazioni erano sbagliate! Sono stupito. Grazie mille per averlo pubblicato.
Adamo,

5

Ho avuto lo stesso problema, ovvero tutti i privilegi concessi per root:

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

... ma non è ancora possibile creare una tabella:

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

Bene, è stato causato da un fastidioso errore dell'utente, cioè non ho selezionato un database. Dopo aver rilasciato USE dbname ha funzionato bene.


5

Su Debian ( Wheezy , 7.8) con MySQL 5.5.40, ho scoperto che SELECT * FROM mysql.user WHERE User='root'\Gi Event_privcampi e 'Trigger_priv` erano presenti ma non impostati su Y.

Correre mysql_upgrade(con o senza --force) non ha fatto differenza; Avevo bisogno di fare un manuale:

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

Quindi finalmente potrei usare:

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

... e poi usalo più precisamente su un singolo database / account utente.


1
Questo ha risolto il problema anche per me, ma solo dopo aver scoperto che devi FLUSH PRIVILEGES; successivamente e accedere nuovamente per impostare l'opzione di concessione.
Hendrik,

5

Potresti essere arrivato a questa domanda con MySQL versione 8 installato (come me) e non hai trovato una risposta soddisfacente. Non è più possibile creare utenti come questo nella versione 8:

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

Il messaggio di errore piuttosto confuso che si ottiene è: ERROR 1410 (42000): You are not allowed to create a user with GRANT

Per creare utenti nella versione 8 devi farlo in due passaggi:

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

Naturalmente, se preferisci, puoi anche fornire un numero limitato di privilegi (anziché GRANT ALL PRIVILEGES), ad esGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER


3

La digitazione SHOW GRANTS FOR 'root'@'localhost';mi ha mostrato una password oscurata, quindi ho effettuato l'accesso a mysql di quel sistema usando HeidiSQL su un altro sistema (usando rootcome nome utente e password corrispondente) e ho digitato
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

e ha funzionato quando sono tornato al sistema e ho effettuato l'accesso utilizzando
mysql -uroot -pthepassword;



2

Ho avuto lo stesso problema e ho impiegato molto a leggere i post SO e la documentazione di Google. Alla fine l'ho trovato dalle Domande frequenti su Cloud SQL :

Google Cloud SQL non supporta i privilegi SUPER, il che significa che le GRANT ALL PRIVILEGESistruzioni non funzioneranno. In alternativa, puoi usareGRANT ALL ON `%`.*


1

Per coloro che ancora inciampano su questo come ho fatto io, vale la pena controllare per assicurarsi che il tentativo GRANTnon esiste già:

SHOW GRANTS FOR username;

Nel mio caso, l'errore non era in realtà dovuto a un errore di autorizzazione, ma perché GRANTesisteva già.


1

Una soluzione semplice che funziona sempre per me di fronte a errori mysql "access denied": use sudo.

sudo mysql -u root

Quindi esistono le autorizzazioni necessarie per i GRANTcomandi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.