ERREUR 1396 (HY000): l'opération CREATE USER a échoué pour «jack» @ «localhost»

311

Il semble que je ne puisse pas 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 cela dans ce tableau. Si j'exécute cette commande pour un autre nom d'utilisateur aléatoire, disons «jimmy», cela fonctionne très bien (tout comme il l'a fait à l'origine pour «jack»).

Qu'est-ce que j'ai 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 l'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)
Russ Bateman
la source

Réponses:

233

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 avoir purgé les privilèges. 

QuantumMechanic
la source
13
J'avais trouvé cette suggestion et je l'avais essayée plus tôt sans succès, mais peut-être que quelque chose d'autre n'allait pas. En essayant à nouveau, puis en recréant la situation avec un autre utilisateur, j'ai trouvé que cela faisait en fait l'affaire. Bien sûr, la réponse officielle aujourd'hui était de "ne pas être stupide" et d'utiliser REVOKE et DROP USER pour le faire correctement. Je suis redevable aux trois réponses (celle-ci se trouve être celle qui m'a sauvé de ma situation actuelle).
Russ Bateman
13
Nous sommes en 2016, mysql est en v14.14 et il est toujours cassé.
ivo Welch
4
J'ai d'abord dû laisser tomber l'utilisateur selon la réponse @ tver3305.
Shautieh
9
Je vois le même problème avec 10.1.21, mais les "privilèges de vidage" n'ont fait aucune différence. Je laisse tomber l'utilisateur, vider, puis créer, ce qui échoue avec "ERREUR 1396 (HY000) à la ligne 7: l'opération CREATE USER a échoué pour ...". J'aimerais pouvoir demander à mysql / mariadb de développer un peu cette erreur, comme POURQUOI elle a échoué.
David M. Karr
3
J'ai eu l'erreur même lorsque j'essaie de supprimer l'utilisateur également, les privilèges de vidage n'ont pas fonctionné pour moi, après avoir fait un peu de recherche, j'ai trouvé la solution en révoquant tous les accès et en supprimant l'utilisateur, je ne pense pas , l'opération de vidage
Rathish
545

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

  • Supposons 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
  • Créez maintenant l'utilisateur.

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

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

À votre santé

tver3305
la source
58
Les privilèges de vidage seuls n'ont pas fonctionné pour moi. laisser tomber l'utilisateur a tout résolu. Merci.
Jake
3
Pareil pour moi. J'ai dû d'abord abandonner l'utilisateur.
kgiannakakis
3
La solution @QuantumMechanic n'a pas fonctionné pour moi, mais la suppression puis le rinçage l'ont fait.
plaques de cuisson
Dans mon cas, la simple suppression de l'utilisateur était enogh, sans privilèges de vidage.
Scadge
C'était un ÉNORME sauveur de vie - comme avec @Jake ci-dessus, la partie clé était l'utilisateur drop avec la partie localhost
kellyfj
46

Ce bug est présent sur bugs.mysql.com depuis 2007 et ce fil n'est principalement qu'un perroquet de toutes ces mauvaises réponses, même il y a un an.

Selon la documentation de MySQL, commandes telles que CREATE USER, GRANT, REVOKEet DROP USERne nécessitent pas une ultérieure FLUSH PRIVILEGEScommande. Il est assez clair pourquoi, si l'on lit les documents. C'est parce que la modification directe des tables MySQL ne recharge pas les informations en mémoire; pourtant, la pléthore de solutions à cette revendication de bug FLUSH PRIVILEGESest la réponse.

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

13.7.1.2. Syntaxe de DROP USER

...

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 USERtel que 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:

Utilisateur DROP USER;

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

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

Il est clair pour moi que lorsqu'il essaie de supprimer l'utilisateur à%, il émet un message d'erreur et se ferme. Le suivant CREATE USERsur localhost échouera car l'utilisateur localhost n'a jamais été supprimé. Il ne semble pas nécessaire de perdre du temps à fouiller les tables de subventions à la recherche de fantômes, comme l'a suggéré une affiche.

Je vois 7 votes pour:

DROP USER 'jack @ localhost'; // supprimer complètement le compte

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

En fait, il semble y avoir un vrai bug qui génère le même message d'erreur, mais cela a à voir avec le premier utilisateur créé (après une nouvelle installation du serveur mysql). Si ce bogue a été corrigé, je ne sais pas; mais je ne me souviens pas que cela se soit produit récemment et je suis à la version 5.5.27 pour le moment.

user1969061
la source
8
Êtes-vous un rédacteur de documents MySQL?
Pacerier
Ce fut la réponse pour moi. Mariadb a hérité de ce bogue.
zerpsed
Pourquoi n'est-ce pas la réponse acceptée: /. Quoi qu'il en soit, merci @ user1969061. Cela a certainement fonctionné pour moi dansmariadb-server-5.5.60-1.el7_5.x86_64
han solo le
36

Si vous utilisez une DELETEinstruction sur la mysql.usertable pour tenter de supprimer un utilisateur, puis essayez de rétablir l'utilisateur avec CREATE USER, vous obtiendrez une 1396erreur. Débarrassez-vous de cette erreur en exécutantDROP USER 'username'@'host';

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

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

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

(Sortez de cette situation en courant DROP USER)

DROP USER 'jack'@'localhost';

(Je suppose que FLUSH PRIVILEGEScela ne peut pas faire de mal, mais laissez d'abord tomber l'utilisateur.)

Anthony Rutledge
la source
24

Vous ne devez pas supprimer manuellement les utilisateurs de cette façon. MySQL a une REVOKEsyntaxe pour supprimer les privilèges et les DROP USERsupprimer:

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

Il vaut mieux utiliser les outils fournis plutôt que de nettoyer en arrière-plan.

Marc B
la source
2
C'était la vraie réponse, mais pas au problème que je rencontrais (qui a été créé par ma stupidité). Merci beaucoup de m'avoir remis au clair!
Russ Bateman
@Marc, Alors , pourquoi ont-ils même inventé flush privilegesen premier lieu? Les documents de MySQL officiels font parler de choses comme delete from user where user = 'jack'; et flush privileges. Pourquoi dites-vous qu'ils ne font pas partie des outils fournis?
Pacerier
1
Comme le souligne @ user1969061, 'jack@localhost'devrait probablement être 'jack'@'localhost'ici.
jochen
11

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

罗俊峰
la source
1
Les privilèges de vidage seuls n'ont pas fonctionné jusqu'à ce que je supprime l'utilisateur. Merci.
Brandon Fitzpatrick
10

essayez de delete from mysql.db where user = 'jack'créer un utilisateur

a1ex07
la source
1
Cela m'a aidé à comprendre comment j'avais corrompu mon installation. Merci beaucoup.
Russ Bateman
Lisez la suite du commentaire de Fely. Il y a plus de tables impliquées.
Prisonnier 13
6

Dans MySQL 5.6, l'utilisation 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.

Joilson Cardoso
la source
5
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';
TonyWu
la source
5

Vérifiez si

'utilisateur'@'%'

ou

'utilisateur' @ 'localhost'

Inês Gomes
la source
4

Si vous voulez supprimer un utilisateur avec SQL, vous devez supprimer les données associées dans ces tableaux: columns_priv, db, procs_priv, tables_priv. Ensuite, exécutezflush privileges;

fely
la source
Bonne réponse!! Votre réponse expose le problème des «coulisses» quant à ce qui se passe réellement plutôt que simplement «Utilisez ce patch et vous êtes prêt à partir». J'aime les deux types de réponses inclus tous ensemble afin que je puisse le comprendre de la soupe aux noix. Maintenant, je sais combien de travail il est nécessaire de le faire de cette façon si vous voulez le faire correctement - et cela renforce encore la raison pour laquelle on devrait utiliser les méthodes décrites par d'autres. Impressionnant! Bien que de nombreuses réponses ci-dessus aient été bonnes, je vous donne mon vote car je sais ce que c'est que d'être un nouveau venu sur ce site. Ils rendent très difficile d'aider les autres lorsque vous êtes nouveau.
Prisonnier 13
Cela devrait être une autre réponse acceptée. J'utilise mysql 5.5 et DROP USER IF EXISTS n'est pas encore disponible, je dois donc utiliser la syntaxe utilisateur DELETE FROM (je dois d'abord tester l'existence de l'utilisateur). La suppression de la table utilisateur seule n'a pas fonctionné. FLUSH PRIVILEGES non plus. Vous devez supprimer des autres tableaux ci-dessus.
alds
4

Curieusement, le plan de travail MySQL l'a résolu pour moi. Dans l'onglet Administration -> Utilisateurs et privilèges, l'utilisateur a été répertorié avec une erreur. L'utilisation de l'option de suppression a résolu le problème.

juettemann
la source
3

Un simple travail autour de cette question. Comme la commande "supprimer" supprime uniquement l'enregistrement utilisateur dans la table "utilisateur" de la base de données "mysql", nous pourrions l'ajouter à nouveau puis supprimer complètement l'utilisateur. Ensuite, vous pouvez créer un utilisateur du 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 le tableau, 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: parfois, vous pouvez rencontrer des problèmes lors de l'insertion, modifiez simplement les données pour les faire fonctionner.

Étape 3. Supprimez l'utilisateur.

drop user username;

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

Jason Mao
la source
Essayez DESCRIBE <tablename>
Prisoner 13
2

Cet article MySQL ERROR 1045 (28000): Accès refusé à l'utilisateur 'bill' @ 'localhost' (en utilisant le mot de passe: OUI) est utile. Parfois, il existe un utilisateur anonyme '' @ 'localhost' ou '' @ '127.0.0.1'. Donc, pour résoudre le problème,

  1. supprimez d'abord l'utilisateur dont la «création d'utilisateur» a échoué.

  2. Créez un nouvel utilisateur.

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

  4. Privilèges de vidage.

user_19
la source
Merci pour cela. J'ai oublié d'exécuter mysql_secure_installation qui a supprimé l'utilisateur anonyme.
ablackhat
2

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

CREATE USER 'jimmy'@'localhost' IDENTIFIED BY 'test123';
UPDATE mysql.user SET USER='jack' WHERE USER='jimmy';
Litière
la source
0

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

irfan habib
la source
0

Je sais que c'est vieux, mais comme c'est le premier résultat dans Google, j'ai pensé que je devrais ajouter ma solution. Dans mon cas, la suppression de l'utilisateur a bien fonctionné, mais sa recréation m'a donné "ERREUR 2013 (HY000): connexion perdue au serveur MySQL pendant la requête" et "ERREUR 2006 (HY000): le serveur MySQL est parti". J'ai essayé les privilèges de vidage -> supprimer la solution utilisateur, mais j'ai toujours eu la même erreur.

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

vik
la source
0

J'ai récemment eu cette erreur.

Ce qui a fonctionné pour moi, c'est de vérifier dans le plan de travail mysql 'Users and Privileges' et de réaliser que l'utilisateur existait toujours.

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

dmena
la source
0

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

Redémarrez le serveur:

# mysql.server restart

Faites ensuite votre CREATE USERcommande.

emallove
la source
Ce n'est pas utile. L'erreur s'est produite CREATEaprès DELETE.
waqasgard
0

J'ai rencontré ce problème aujourd'hui et je l'ai résolu en procédant comme suit:

1) insérer manuellement cet utilisateur perturbateur fournissant la valeur des champs obligatoires dans mysql.user

mysql> insert into user(Host, User, Password, ssl_type) 
   values ('localhost', 'jack', 'jack', 'ANY');

2)

mysql> select * from user where User = 'jack';
   1 row in set (0.00 sec)

3) A.

mysql> drop user jack;
Query OK, 0 rows affected (0.00 sec)

B. mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

C. mysql> create user 'jack' identified by 'jack';
Query OK, 0 rows affected (0.00 sec)

D. mysql> select Host, User, Password, ssl_type  from user where User = 'jack';
+-----------+-----------+-------------------------------------------+----------+
| Host      | User      | Password                                  | ssl_type |
+-----------+-----------+-------------------------------------------+----------+
| localhost | jack      | jack                                      | ANY      |
| %         | jack      | *45BB7035F11303D8F09B2877A00D2510DCE4D758 |          |
+-----------+-----------+-------------------------------------------+----------+
2 rows in set (0.00 sec)

4) A.

mysql> delete from user 
 where User = 'nyse_user' and 
       Host = 'localhost' and 
       Password ='nyse';
Query OK, 1 row affected (0.00 sec)

B.

mysql> select Host, User, Password, ssl_type  from user where User = 'jack';
+------+-----------+-------------------------------------------+----------+
| Host | User      | Password                                  | ssl_type |
+------+-----------+-------------------------------------------+----------+
| %    | jack      | *45BB7035F11303D8F09B2877A00D2510DCE4D758 |          |
+------+-----------+-------------------------------------------+----------+
1 row in set (0.00 sec)

J'espère que cela t'aides.

monika mendiratta
la source
-2

Supprimez simplement les données liées à l'utilisateur de mysql.db (peut-être aussi d'autres tables), puis recréez les deux.

Richard Abonyi
la source
-2

J'avais également rencontré le même problème, après quelques recherches, j'ai trouvé une solution qui fonctionnait pour moi et j'espère que cela vous aidera. Comme vous avez déjà créé des utilisateurs, essayez maintenant de faire un FLUSH PRIVILEGESsur votre console Mysql. Ce problème est déjà dans le post de bogue MySql. Vous pouvez également vérifier celui-ci. Maintenant, après le rinçage, vous pouvez créer un nouvel utilisateur. suivez les étapes ci-dessous:

Step-1: Open terminal Ctrl+Alt+T
Step-2: mysql -u root -p  , it will ask for your MySQL password.

Vous pouvez maintenant voir la console Mysql.

Step-3: CREATE USER 'username'@'host' IDENTIFIED by 'PASSWORD';

Au lieu du nom d'utilisateur, vous pouvez mettre le nom d'utilisateur que vous souhaitez. Si vous exécutez Mysql sur votre machine locale, tapez "localhost" au lieu de l'hôte, sinon donnez le nom de votre serveur auquel vous souhaitez accéder.

Ex: CREATE USER smruti @ localhost IDENTIFIED by 'hello';

Maintenant, un nouvel utilisateur est créé. Si vous souhaitez accorder tous les accès, tapez

GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';

Vous pouvez maintenant quitter MySQL en tapant \q.Maintenant, connectez-vous à nouveau via

mysql -u newusername -p, puis appuyez sur Entrée. Vous pouvez tout voir.

J'espère que cela t'aides.

PyDevSRS
la source