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!
la source
-p
et le mot de passe. Je sais que c'est idiot mais peut aider quelqu'un.Réponses:
Remarquez comment la sortie de
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:
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é.
la source
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:
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 :
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.
la source
cd /usr/local/Cellar/mysql/5.5.25a/bin && mysql_upgrade
/usr/bin/mysql_upgrade -u root -p
entrez le mot de passe et Bob's Your Oncle!mysqldump ... --all-databases
et que vous les importez ensuite dans votre MySQL> = 5.5, vos utilisateurs auront été remplacés (bien sûr), mais vousroot
aurez le même problème que OP. Etmysql_upgrade
ne fonctionnera pas - vous devez ajouter un--force
drapeau, ce est à diremysql_upgrade -u root -p --force
. J'espère que cela aide quelqu'un ici.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:
Notez que nous utilisons `%`. * Au lieu de *. *
la source
'%'.*
marche mais pas*.*
?'%'.*
au lieu de`%`.*
ne fonctionne pas. Tu DEVEZ utiliser`%`.*
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:
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 ...
la source
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.la source
J'ai eu le même problème, c'est à dire tous les privilèges accordés pour root:
... mais toujours pas autorisé à créer une table:
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é.
la source
Sur Debian ( Wheezy , 7.8) avec MySQL 5.5.40, j'ai trouvé
SELECT * FROM mysql.user WHERE User='root'\G
que lesEvent_priv
champs 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.
la source
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:
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:
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
la source
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 utilisantroot
comme 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;
la source
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).
la source
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 :
la source
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
GRANT
n'existe pas déjà:Dans mon cas, l'erreur n'était pas en fait parce qu'il y avait une erreur d'autorisation, mais parce que le
GRANT
déjà existait.la source
Une solution simple qui fonctionne toujours pour moi face aux erreurs mysql "accès refusé": use
sudo
.Ensuite, les autorisations nécessaires existent pour les
GRANT
commandes.la source