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 veut pas dire que je n’ai pas oublié quelque chose de tout à fait évident. :-)
Ma question est la suivante: pourquoi l'accès est-il refusé à 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 saisir un mot de passe incorrect pour vérifier 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 tables de subventions.
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql>
Ensuite, assurez-vous que je suis qui je pense:
mysql> SELECT user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
... et vraiment vraiment assurez-vous:
mysql> SELECT current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
mysql>
Jusqu'ici tout va bien. Maintenant, quels sont mes privilèges?
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 aussi qu'il y a 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 très bien et c'est quelque chose que je envisagerai de faire une fois que je pourrai donner certains privilèges à un autre utilisateur.
Je vous remercie!
Notez comment la sortie de
SHOW GRANTS FOR 'root'@'localhost';
n'a pas dit 'TOUS PRIVILÈGES' mais a dû préciser ce que root @ localhost a.
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, je reçois 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 existe également de nouvelles tables dans la version 5.5, telles que 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, ce qui permettra d'ajouter les tables/colonnes manquantes.
C'est une supposition, mais il semble que mysql_upgrade n'ait pas été fait pour cette instance, ce qui a provoqué le comportement observé.
J'ai également eu le même problème avec cela, mais sous 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é dans ici , ici , ici , et ici , non 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 des éléments, de créer et d'ajouter des utilisateurs, mais en ce qui concerne GRANT, je suis foutu. L'erreur d'accès refusé est de nouveau affichée.
J'ai réussi à résoudre ce problème en corrigeant les privilèges à l'aide de la commande suivante sur le répertoire bin/du serveur MySQL, comme indiqué dans ici :
C:\MySQL Server 5.5\bin> mysql_upgrade
Ensuite, le problème a disparu. J'espère que cette solution fonctionnera également sous Linux, puisque MySQL fournit généralement la même commande à la fois sous Linux et Windows.
Cela peut se produire lorsque vous essayez d'octroyer tous les privilèges de toutes les tables à un autre utilisateur, car la table mysql.users est considérée comme interdite pour un utilisateur autre que root.
Ce qui suit devrait cependant fonctionner:
GRANT ALL PRIVILEGES ON `%`.* TO '[user]'@'[hostname]' IDENTIFIED BY '[password]' WITH GRANT OPTION;
Notez que nous utilisons `%`. * Au lieu de *. *
Cela m'est arrivé lorsque j'ai essayé d'installer une version de 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 savais pas que les fichiers de/var/lib/mysql étaient toujours de l'ancienne version (avec des différences telles que expliqué par Marc Alff - merci!)
J'aurais pu faire une mysql_upgrade, mais comme je voulais recommencer à zéro, je l'ai fait:
# su - mysql
$ rm -rf /var/lib/mysql/*
$ mysql_install_db
# /etc/init.d/mysql start
Puis définissez le mot de passe root (/ usr/bin/mysqladmin -u mot de passe root) et tout fonctionnera comme prévu avec les commandes GRANT ...
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'
Cela a été causé par une erreur utilisateur agaçante, c’est-à-dire que je n’ai pas sélectionné de base de données. Après avoir émis SE nombase cela a bien fonctionné.
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 des 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 recevez est le suivant: 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 exemple. GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER
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 certains fichiers d'options.
Lisez ceci DOC pour comprendre comment attribuer et gérer les mots de passe des comptes.
Vérifiez également si l’autorisation sur le dossier /var/lib/mysql/mysql
est 711 ou non.
Sur Debian ( Wheezy , 7.8) avec MySQL 5.5.40, j'ai trouvé que SELECT * FROM mysql.user WHERE User='root'\G
montrait les champs Event_priv
et 'Trigger_priv` étaient présent mais pas réglé sur Y.
Lancer mysql_upgrade
(avec ou sans --force
) ne faisait aucune différence; Je devais faire un manuel:
update user set Event_priv = 'Y',Trigger_priv = 'Y' where user = 'root'
Enfin, je pourrais utiliser:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION
… Puis l’utilisez plus précisément sur une base de données individuelle/un compte utilisateur.
Taper SHOW GRANTS FOR 'root'@'localhost';
m’a montré un mot de passe caché. Je me suis donc connecté à mysql de ce système en utilisant HeidiSQL sur un autre système (en utilisant root
comme nom d’utilisateur et le mot de passe correspondant) et en tapantGRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'thepassword' WITH GRANT OPTION;
et cela a fonctionné quand je suis retourné au système et connecté en utilisantmysql -uroot -pthepassword;
Je cours à cela quand j'ai essayé d'ajouter des privilèges à performance_schema, qui est un bogue mysql http://bugs.mysql.com/bug.php?id=44898 (solution de contournement pour ajouter --single-transaction ).
Pour ceux qui tombent encore sur ce point comme moi, il convient de vérifier que la tentative GRANT
n'existe pas déjà:
SHOW GRANTS FOR username;
Dans mon cas, l'erreur n'était pas réellement due à une erreur d'autorisation, mais parce que le GRANT
existait déjà.
J'ai eu le même problème et il a fallu beaucoup de lecture SO messages et de la documentation de Google. J'ai finalement trouvé ceci dans le FAQ sur le cloud SQL :
Google Cloud SQL ne prend pas en charge les privilèges SUPER, ce qui signifie que les instructions
GRANT ALL PRIVILEGES
ne fonctionneront pas. Comme alternative, vous pouvez utiliserGRANT ALL ON `%`.*