web-dev-qa-db-fra.com

ERREUR 1396 (HY000): Echec de l'opération CREATE USER pour 'jack' @ 'localhost'

Il semble que je ne sois pas capable de recréer un utilisateur simple que j'ai supprimé, même en tant que root dans MySQL.

Mon cas: l'utilisateur 'jack' existait auparavant, mais je l'ai supprimé de mysql.user afin de le recréer. Je ne vois aucun vestige de ceci dans ce tableau. Si j'exécute cette commande pour un autre nom d'utilisateur aléatoire, dites «jimmy», cela fonctionnera bien (comme ce fut le cas à l'origine pour «jack»).

Qu'ai-je fait pour corrompre l'utilisateur 'jack' et comment puis-je annuler cette corruption afin de recréer 'jack' en tant qu'utilisateur valide pour cette installation de MySQL?

Voir exemple ci-dessous. (Bien sûr, à l'origine, il y avait beaucoup de temps entre la création de 'jack' et son retrait.)

mysql> CREATE USER 'jack'@'localhost' IDENTIFIED BY 'test123';
Query OK, 0 rows affected (0.00 sec)

mysql> select user,Host from user;
+------------------+-----------------+
| user             | Host            |
+------------------+-----------------+
| root             | 127.0.0.1       |
| debian-sys-maint | localhost       |
| jack             | localhost       |
| root             | localhost       |
| root             | russ-Elite-book |
+------------------+-----------------+
5 rows in set (0.00 sec)

mysql> delete from user where user = 'jack';
Query OK, 1 row affected (0.00 sec)

mysql> select user,Host from user;
+------------------+-----------------+
| user             | Host            |
+------------------+-----------------+
| root             | 127.0.0.1       |
| debian-sys-maint | localhost       |
| root             | localhost       |
| root             | russ-Elite-book |
+------------------+-----------------+
4 rows in set (0.00 sec)

mysql> CREATE USER 'jack'@'localhost' IDENTIFIED BY 'test123';
ERROR 1396 (HY000): Operation CREATE USER failed for 'jack'@'localhost'
mysql> CREATE USER 'jimmy'@'localhost' IDENTIFIED BY 'test123';
Query OK, 0 rows affected (0.00 sec)

mysql> select user,Host from user;
+------------------+-----------------+
| user             | Host            |
+------------------+-----------------+
| root             | 127.0.0.1       |
| debian-sys-maint | localhost       |
| jimmy            | localhost       |
| root             | localhost       |
| root             | russ-Elite-book |
+------------------+-----------------+
5 rows in set (0.00 sec)
242
Russ Bateman

Essayez de faire un FLUSH PRIVILEGES. Ce message de bogue MySQL sur ce code d'erreur semble signaler un certain succès dans un cas similaire au vôtre après le vidage de privs.

185
QuantumMechanic

oui ce bug est là. Cependant, j'ai trouvé une petite solution de contournement.

  • Supposer que l'utilisateur est là, alors laissez tomber l'utilisateur
  • Après avoir supprimé l'utilisateur, il est nécessaire de vider les privilèges mysql.
  • Maintenant, créez l'utilisateur.

Cela devrait le résoudre. En supposant que nous voulions créer l'utilisateur admin @ localhost, voici les commandes:

 supprimer l'utilisateur admin @ localhost; 
 privilèges de vidage; 
 créer l'utilisateur admin @ localhost identifié par 'admins_password'

À votre santé

452
tver3305

Ce bogue est sur bugs.mysql.com depuis 2007 et ce fil est principalement un récit de toutes ces mauvaises réponses, même il y a un an.

Selon la documentation de MySQL, les commandes telles que CREATE USER, GRANT, REVOKE et DROP USER ne nécessitent pas de commande FLUSH PRIVILEGES ultérieure. C'est assez clair pourquoi, si on lit la documentation. C'est parce que la modification directe des tables MySQL ne recharge pas les informations en mémoire; Pourtant, la pléthore de solutions à ce bogue prétend que FLUSH PRIVILEGES est la solution.

Cela aussi peut ne même pas être un bug. Il s’agit d’un complot de documentation - les documents varient d’un endroit à l’autre, d’une version à l’autre.

13.7.1.2. DROP USER Syntaxe

...

DROP USER utilisateur [ utilisateur] ...

...

DROP USER 'jeffrey' @ 'localhost';

Si vous spécifiez uniquement la partie nom d'utilisateur du nom de compte, une partie nom d'hôte de '%' est utilisée.

DROP USER tel qu'il est présent dans MySQL 5.0.0 supprime uniquement les comptes sans privilèges. Dans MySQL 5.0.2, il a été modifié pour supprimer également les privilèges de compte. Cela signifie que la procédure de suppression d'un compte dépend de votre version de MySQL. 

Depuis MySQL 5.0.2, vous pouvez supprimer un compte et ses privilèges comme suit:

DROP USER utilisateur;

L'instruction supprime les lignes de privilège pour le compte de toutes les tables d'attribution.

La seule fois où j'obtiens cette erreur, c'est quand je fais DROP USER user; comme le suggère la doc, mais MySQL ne traite pas le '%' comme un caractère générique qui ferait perdre tous les utilisateurs à tous les hôtes. Ce n'est pas si sauvage après tout. Ou bien, il se peut que cela fonctionne parfois lorsqu'il supprime l'utilisateur localhost puis tente de supprimer celui de%.

Il est clair pour moi que lorsqu'il tente de supprimer l'utilisateur en%, il génère un message d'erreur et se ferme. CREATE USER suivant sur localhost échouera car l'utilisateur localhost n'a jamais été supprimé. Il semble inutile de perdre du temps à fouiller dans les tables de subventions à la recherche de fantômes, comme l'a suggéré une affiche.

Je vois 7 votes pour:

DROP USER 'prise @ localhost'; // supprime complètement le compte

Ce qui est interprété comme DROP USER 'jack@localhost'@'%'; # faux

Il semble en fait exister un vrai bogue qui génère le même message d'erreur, mais il s'agit du premier utilisateur créé (après l'installation d'un nouveau serveur mysql). Si ce bogue a été corrigé, je ne sais pas. mais je ne me souviens pas de ce qui s'est passé récemment et je suis à la version 5.5.27 pour le moment.

40
user1969061

Si vous utilisez une instruction DELETE sur la table mysql.user pour tenter de supprimer un utilisateur, puis tentez de rétablir l'utilisateur avec CREATE USER, vous obtiendrez une erreur 1396. Éliminez cette erreur en exécutant DROP USER 'username'@'Host';

DELETE 
  FROM mysql.user 
 WHERE user = 'jack';

(Vous obtiendrez 1396 erreurs si vous essayez de recréer une prise)

CREATE USER 'jack'@'localhost' IDENTIFIED BY PASSWORD '*Fi47ytFF3CD5B14E7EjkjkkC1D3F8086A5C0-krn';

(Sortez de cette situation en exécutant DROP USER)

DROP USER 'jack'@'localhost';

(Je suppose que FLUSH PRIVILEGES ne peut pas faire de mal, mais laissez tomber l'utilisateur en premier.)

29
Anthony Rutledge

Vous ne devriez pas supprimer manuellement les utilisateurs de cette façon. MySQL a REVOKE syntaxe pour supprimer les privilèges et DROP USER pour les supprimer:

REVOKE priv1,priv2,priv3,etc... FROM 'jack@localhost'; // remove certain privileges
DROP USER 'jack@localhost'; // completely delete the account

Il est préférable d’utiliser les outils fournis plutôt que de passer à l’arrière-plan.

22
Marc B

Supprimez l'utilisateur, supprimez les privilèges; puis créez l'utilisateur. Ça marche!

11
罗俊峰

essayez delete from mysql.db where user = 'jack' puis créez un utilisateur

9
a1ex07

Dans MySQL 5.6, utiliser Drop user userid; ne fonctionne pas. Utilisez: Drop user 'userid'@'localhost'; et/ou Drop user 'userid'@'%';. De cette façon, j'ai pu supprimer l'utilisateur et le recréer.

6
Joilson Cardoso
two method 
one :
setp 1: drop user 'jack'@'localhost';
setp 2: create user 'jack'@localhost identified by 'ddd';

two:
setp 1: delete from user where user='jack'and Host='localhost';
setp 2: flush privileges;
setp 3: create user 'jack'@'localhost' identified by 'ddd';
4
TonyWu

Si vous souhaitez supprimer un utilisateur avec SQL, vous devez supprimer les données associées dans ces tables: columns_priv, db, procs_priv, tables_priv Puis exécutez flush privileges;

2
fely

Un simple travail sur cette question. Comme la commande "delete" ne supprime que l'enregistrement de l'utilisateur dans la table "user" de la base de données "mysql", nous pourrions le rajouter puis supprimer complètement l'utilisateur. Ensuite, vous pouvez créer un utilisateur avec le même nom.

Étape 1. Trouver le format d'enregistrement de la table utilisateur dans la base de données mysql

use mysql;
select * from user;

Étape 2. Selon les colonnes affichées à l'étape 1, créez un enregistrement factice avec le nom d'utilisateur. Insérez-le dans la table, par exemple, rappelez-vous de remplacer le "nom d'utilisateur" par votre nom d'utilisateur.

Insert into user value ('%','username','N','N','N','N','N',
'N','N','N','N','N','N','N','N','N','N','N','N','N','N','N',
'N','N','N','N','N','N','N','N','N','','','','','0','0','0',
'0','mysql_native_password',
'*52C5E3AC6BC5E2E0BFF86978BF62A1481AC79D58','N',
'2016-12-10 23:59:12',null,'N');

Remarque: vous pouvez parfois rencontrer des problèmes lors de l'insertion, il suffit de modifier les données pour que cela fonctionne.

Étape 3. Supprimez l'utilisateur.

drop user username;

Vous pouvez maintenant créer un utilisateur avec le même nom.

2
Jason Mao

This post MySQL ERROR 1045 (28000): L'accès est refusé pour l'utilisateur 'bill' @ 'localhost' (avec le mot de passe: YES) est utile. Parfois, il existe un utilisateur anonyme '' @ 'localhost' ou '' @ '127.0.0.1'. Donc, pour résoudre le problème, 

  1. d'abord déposer l'utilisateur dont le 'créer l'utilisateur' a échoué. 

  2. Créer un nouvel utilisateur. 

  3. Accordez les privilèges requis au nouvel utilisateur.

  4. Privilèges Flush.

2
user_19

J'ai eu la même erreur. Mais commande "FLUSH PRIVILEGES;" n'a pas aidé . J'ai fait comme ça:

CREATE USER 'jimmy'@'localhost' IDENTIFIED BY 'test123';
UPDATE mysql.user SET USER='jack' WHERE USER='jimmy';
2
Litter

J'ai récemment eu cette erreur. 

Ce qui a fonctionné pour moi, c’est de vérifier dans le mysql workbench «Utilisateurs et privilèges» et de réaliser que l’utilisateur existait toujours. 

Après l'avoir supprimé de là, j'ai pu recréer l'utilisateur.

0
dmena

mysql> DELETE FROM mysql.db WHERE user = 'jack'

Redémarrez le serveur:

# mysql.server restart

Ensuite, faites votre commande CREATE USER.

0
emallove

Vérifiez si est 

'utilisateur'@'%' 

ou 

'utilisateur' @ 'localhost'

0
Inês Gomes

Le serveur MySQL s'exécute avec l'option --skip-grant-tables, il ne peut donc pas exécuter cette instruction.

0
irfan habib

Je sais que c'est vieux, mais comme c'est le premier résultat dans Google, j'ai décidé d'ajouter ma solution. Dans mon cas, laisser tomber l'utilisateur fonctionnait bien, mais recréer l'utilisateur m'a donné l'ERREUR 2013 (HY000): Connexion perdue avec le serveur MySQL lors de l'interrogation »et« ERREUR 2006 (HY000): le serveur MySQL est parti » J'ai essayé les privilèges de vidage -> supprimer la solution utilisateur, mais j'avais toujours la même erreur.

Dans mon cas, l'erreur était due à une mise à jour de MySQL de 5.1 -> 5.6. En regardant les journaux d’erreur, j’ai remarqué qu’il était dit d’exécuter mysql_upgrade. Est-ce que cela et ma déclaration de création d'utilisateur ont bien fonctionné!

0
vik