Accès refusé pour l'utilisateur «root» @ «localhost» lors de la tentative d'octroi de privilèges. Comment accorder des privilèges?

166

J'ai examiné un certain nombre de questions similaires et je montre donc que j'ai vérifié les bases. Bien sûr, cela ne signifie pas que je n'ai pas manqué quelque chose de totalement évident. :-)

Ma question est la suivante: pourquoi me suis-je refusé l'accès à un utilisateur disposant des privilèges nécessaires pour faire ce que j'essaie de faire et pour lequel j'ai déjà saisi le mot de passe et obtenu l'accès? (Par souci d'exhaustivité, j'ai essayé de taper le mauvais mot de passe juste pour m'assurer que le client MySQL me refuserait l'accès au démarrage du programme.)

Contexte:

Connecté au shell de la machine exécutant le serveur MySQL via ssh, je me connecte en tant que 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> 

Impressionnant. Ma lecture des réponses à des questions similaires suggère que je devrais m'assurer que les privilèges sont à jour avec ce qui est dans les tableaux d'octroi.

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

mysql> 

Ensuite, assurez-vous que je suis qui je pense être:

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

... et assurez-vous vraiment que:

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

mysql> 

Jusqu'ici tout va bien. Maintenant, quels privilèges ai-je?

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)

Maintenant, c'est un peu difficile à lire, alors essayons de cette façon (vous verrez également qu'il existe un utilisateur `` 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)

Impressionnant! MySQL pense que je suis root @ localhost et root @ localhost a tous ces privilèges. Cela signifie que je devrais être capable de faire ce que je veux, non?

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)

Comment aurais-je pu foirer quelque chose d'aussi basique?

Note latérale: pour tous ceux qui veulent suggérer que je n'ai pas d'utilisateur nommé root avec tous les privilèges, c'est super et je vais envisager de faire une fois que je pourrai donner certains privilèges à un autre utilisateur.

Je vous remercie!

Steven Scotten
la source
2
Je vis la même chose à distance (et sélectionnez * FROM mysql.user où user = 'root' et host = '%' montre les mêmes privilèges que le vôtre). CEPENDANT, IL FONCTIONNE SUR LOCALHOST même si la ligne dans mysql.user avec host = '%' est identique à la ligne avec host = 'localhost' en dehors de ce champ. J'utilise la version 5.0.45 sur Windows Server 2003. Toutes les réponses sont acceptées avec gratitude!
Richard Fawcett
3
+1 pour une question aussi organisée!
Dewsworld
1
assurez-vous que vous avez ouvert cmd en exécutant en tant qu'administrateur
Lijo
1
Je viens d'avoir un espace entre -pet le mot de passe. Je sais que c'est idiot mais peut aider quelqu'un.
Vinay W

Réponses:

57

Remarquez comment la sortie de

SHOW GRANTS FOR 'root'@'localhost';

n'a pas dit «TOUS LES PRIVILÈGES» mais a dû préciser ce que root @ localhost avait.

GRANT ALL PRIVILEGES échouera, car un utilisateur ne peut pas accorder ce qu'il / elle n'a pas, et le serveur semble penser que quelque chose n'est pas là ...

Maintenant, qu'est-ce qui manque alors?

Sur mon système, j'obtiens ceci:

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)

Il y a aussi de nouvelles tables dans la version 5.5, comme mysql.proxies_user: assurez-vous de les avoir.

Lors de l'installation d'une toute nouvelle instance de serveur mysql, le script d'installation créera toutes les tables mysql. * Avec la structure appropriée.

Lors de la mise à niveau à partir d'une ancienne version, assurez-vous que la procédure de mise à niveau appropriée (mysql_upgrade) est utilisée, qui ajoutera les tables / colonnes manquantes.

Ce n'est qu'une supposition, mais il semble que mysql_upgrade n'a pas été fait pour cette instance, provoquant le comportement observé.

Marc Alff
la source
7
Ce sont des informations utiles, mais comment résoudre le problème?
augurar
2
@augurar, Run mysql_upgrade
Marc Alff
Ou, vérifiez si vous avez un autre utilisateur avec «TOUS LES PRIVILÈGES» et passez à celui-ci et changez les privilèges de l'hôte local. Par exemple, j'avais tous les privilèges sur [email protected] et le root @ localhost n'en avait pas.
Carabus Manuel
72

J'ai également eu le même problème avec cela mais sur Windows après la mise à niveau vers MySQL 5.5 à partir de MySQL 5.1. J'ai déjà essayé de changer, créer et réinitialiser le mot de passe mentionné ici , ici , ici et ici , aucun indice. Je reçois toujours la même erreur:

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

Je suis capable de me connecter normalement, d'afficher toutes les bases de données, de sélectionner et d'insérer, de créer et d'ajouter des utilisateurs, et mais en ce qui concerne GRANT, je suis foutu. L'erreur d'accès refusé apparaît à nouveau.

J'ai réussi à résoudre ce problème en corrigeant les privilèges par la commande suivante sur le répertoire bin / du serveur MySQL comme mentionné ici :

C:\MySQL Server 5.5\bin> mysql_upgrade

Ensuite, le problème a disparu. J'espère que cette solution fonctionne également sous Linux, car MySQL fournit généralement la même commande sous Linux et Windows.

Aryo
la source
2
merci .. sous mac OS avec mysql installé via homebrew, exécutez la commande suivantecd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
zoras
30
Si vous êtes sur un CentOs ou avez installé MySQL via un gestionnaire de paquets, c'est probablement la commande que vous devriez exécuter: /usr/bin/mysql_upgrade -u root -pentrez le mot de passe et Bob's Your Oncle!
Zjoia
Après m'être battu ici et là avec tant de commentaires, celui-ci m'a aidé. Merci beaucoup
siddhusingh
Je sais que c'est plus ancien mais cela m'a beaucoup aidé et je voulais ajouter un commentaire de plus pour les futurs visiteurs: si vous obtenez ACCESS DENIED en essayant d'exécuter mysql_upgrade, essayez de l'exécuter comme ceci à la place: mysql_upgrade -p
blizz
2
Ce que j'ai trouvé, c'est que si vous exportez des bases de données depuis MySQL <= 5.1 via mysqldump ... --all-databaseset que vous les importez ensuite dans votre MySQL> = 5.5, vos utilisateurs auront été remplacés (bien sûr), mais vous rootaurez le même problème que OP. Et mysql_upgradene fonctionnera pas - vous devez ajouter un --forcedrapeau, ce est à dire mysql_upgrade -u root -p --force. J'espère que cela aide quelqu'un ici.
gregoltsov
62

Cela peut se produire lorsque vous essayez d'accorder tous les privilèges sur toutes les tables à un autre utilisateur, car la table mysql.users est considérée comme interdite pour un utilisateur autre que root.

Cependant, ce qui suit devrait fonctionner:

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

Notez que nous utilisons `%`. * Au lieu de *. *

Anuj Gupta
la source
28
Veuillez expliquer ceci. Pourquoi ça '%'.*marche mais pas *.*?
Pacerier le
C'est la bonne façon de procéder. Vous devez vous connecter à MySQL en tant que root, puis essayer d'accorder des privilèges.
Nav
Je reçois un accès Erreur 1044 refusé:
Bhaumik Thakkar
Merci, essayait d'accéder à mysql à partir d'une application python en utilisant pymysql. Vous avez une erreur disant "L'hôte n'est pas autorisé à se connecter à ce serveur MariaDB", résolu cela en ajoutant un nouvel utilisateur donné [ici] ( stackoverflow.com/questions/19101243/… ), puis une autre erreur indiquant "accès refusé pour l'utilisateur" , et l'a résolu par votre méthode.
Balraj Bains le
1
Si vous utilisez '%'.*au lieu de `%`.*ne fonctionne pas. Tu DEVEZ utiliser`%`.*
Rosario Russo
7

Cela m'est arrivé lorsque j'ai essayé d'installer une version MySQL supérieure à celle fournie avec la distribution.

J'ai effacé l'ancienne version puis installé la nouvelle (rpm -e ... puis rpm -i MySQL-server *) Mais je ne me suis pas rendu compte que les fichiers dans / var / lib / mysql provenaient toujours de l'ancienne version (avec des différences comme expliqué par Marc Alff - merci!)

J'aurais pu faire un mysql_upgrade, mais comme je voulais repartir de zéro, j'ai fait:

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

Ensuite, définissez le mot de passe root (/ usr / bin / mysqladmin -u root password), et tout a fonctionné comme prévu avec les commandes GRANT ...

phil_w
la source
Merci, cela m'a aidé. Heureusement, il n'a pas d' importance si j'oblitérés tous les blocs de données ...
Jarrod Mosen
5

Fondamentalement, cette erreur survient lorsque vous n'avez pas spécifié de mot de passe, cela signifie que vous avez un mot de passe incorrect répertorié dans un fichier d'options.

Lisez ce DOC sur la compréhension de la façon d'attribuer et de gérer les mots de passe aux comptes.

Vérifiez également si l'autorisation sur le dossier /var/lib/mysql/mysql est 711 ou non.

Mithun Sasidharan
la source
Cela a fonctionné pour moi. Il semble que mysql ne crée pas d'autorisations pour 'user' @ 'localhost'. J'ai donc dû créer cet utilisateur et m'assurer qu'il avait un mot de passe.
Jerinaw
Les permissions étaient fausses! Je suis ébahi. Merci beaucoup d'avoir publié ça.
Adam le
5

J'ai eu le même problème, c'est à dire tous les privilèges accordés pour 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

... mais toujours pas autorisé à créer une table:

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

Eh bien, cela a été causé par une erreur utilisateur ennuyeuse, c'est-à-dire que je n'ai pas sélectionné de base de données. Après avoir émis USE dbname, cela a bien fonctionné.

tzp
la source
5

Sur Debian ( Wheezy , 7.8) avec MySQL 5.5.40, j'ai trouvé SELECT * FROM mysql.user WHERE User='root'\Gque les Event_privchamps et 'Trigger_priv` étaient présents mais pas définis sur Y.

Courir mysql_upgrade(avec ou sans --force) ne faisait aucune différence; J'avais besoin de faire un manuel:

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

Puis enfin je pourrais utiliser:

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

… Et ensuite l'utiliser plus précisément sur une base de données individuelle / un compte utilisateur.

William Turrell
la source
1
Cela a également résolu le problème pour moi, mais seulement après avoir découvert que vous devez RINCER LES PRIVILÈGES; ensuite et reconnectez-vous pour que l'option d'attribution soit définie.
Hendrik
5

Vous êtes peut-être venu à cette question avec MySQL version 8 installée (comme moi) et n'avez pas trouvé de réponse satisfaisante. Vous ne pouvez plus créer d'utilisateurs comme celui-ci dans la version 8:

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

Le message d'erreur plutôt déroutant que vous obtenez est: ERROR 1410 (42000): You are not allowed to create a user with GRANT

Pour créer des utilisateurs dans la version 8, vous devez le faire en deux étapes:

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

Bien sûr, si vous préférez, vous pouvez également fournir un nombre limité de privilèges (au lieu de GRANT ALL PRIVILEGES), par exempleGRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER

gloriphobie
la source
3

La saisie SHOW GRANTS FOR 'root'@'localhost';m'a montré un mot de passe obscurci, alors je me suis connecté à mysql de ce système en utilisant HeidiSQL sur un autre système (en utilisant rootcomme nom d'utilisateur et le mot de passe correspondant) et j'ai tapé
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;

et cela a fonctionné lorsque je suis retourné au système et que je me suis connecté en utilisant
mysql -uroot -pthepassword;

Nav
la source
2

Je cours là-dessus quand j'ai essayé d'ajouter des privilèges à performance_schema, qui est le bogue mysql http://bugs.mysql.com/bug.php?id=44898 (solution de contournement pour ajouter --single-transaction).

Pevik
la source
2

J'ai eu le même problème et il a fallu beaucoup de lecture des messages SO et de la documentation de Google. J'ai finalement trouvé ceci dans la FAQ Cloud SQL :

Google Cloud SQL ne prend pas en charge les privilèges SUPER, ce qui signifie que les GRANT ALL PRIVILEGESinstructions ne fonctionneront pas. Comme alternative, vous pouvez utiliserGRANT ALL ON `%`.*

kurdtpage
la source
1

Pour ceux qui trébuchent encore sur cela comme je l'ai fait, il vaut la peine de vérifier pour s'assurer que la tentative GRANTn'existe pas déjà:

SHOW GRANTS FOR username;

Dans mon cas, l'erreur n'était pas en fait parce qu'il y avait une erreur d'autorisation, mais parce que le GRANTdéjà existait.

mopo922
la source
1

Une solution simple qui fonctionne toujours pour moi face aux erreurs mysql "accès refusé": use sudo.

sudo mysql -u root

Ensuite, les autorisations nécessaires existent pour les GRANTcommandes.

suspectus
la source