426 Stimmen

FEHLER 1396 (HY000): Operation CREATE USER für 'jack'@'localhost' fehlgeschlagen

Ich scheine nicht in der Lage zu sein, einen einfachen Benutzer, den ich gelöscht habe, neu zu erstellen, selbst als Root in MySQL.

Mein Fall: Der Benutzer "jack" existierte bereits, aber ich habe ihn aus mysql.user gelöscht, um ihn neu zu erstellen. Ich sehe keine Spuren davon in dieser Tabelle. Wenn ich diesen Befehl für einen anderen, zufälligen Benutzernamen, z. B. "jimmy", ausführe, funktioniert er einwandfrei (genau wie ursprünglich für "jack").

Was habe ich getan, um den Benutzer 'jack' zu beschädigen, und wie kann ich diese Beschädigung rückgängig machen, um 'jack' wieder als gültigen Benutzer für diese Installation von MySQL anzulegen?

Siehe nachstehendes Beispiel. (Natürlich lag ursprünglich viel Zeit zwischen der Erschaffung von "Jack" und seiner Entfernung).

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)

766voto

tver3305 Punkte 7594

Ja, dieser Fehler ist vorhanden. Allerdings habe ich eine kleine Abhilfe gefunden.

  • Annehmen, dass der Benutzer da ist, also den Benutzer fallen lassen
  • Nach dem Löschen des Benutzers müssen die mysql-Berechtigungen geleert werden
  • Erstellen Sie nun den Benutzer.

Das sollte das Problem lösen. Angenommen, wir wollen den Benutzer admin @ localhost erstellen, wären dies die Befehle:

drop user admin@localhost;
flush privileges;
create user admin@localhost identified by '_admins\_password_'

Prost

284voto

QuantumMechanic Punkte 13657

Versuchen Sie eine FLUSH PRIVILEGES; . Dieser MySQL-Bug-Post zu diesem Fehlercode scheint in einem ähnlichen Fall wie dem Ihren über einen gewissen Erfolg nach dem Spülen von Privs zu berichten.

63voto

user1969061 Punkte 551

Dieser Fehler ist seit 2007 auf bugs.mysql.com zu finden und dieser Thread ist hauptsächlich eine Wiederholung all der falschen Antworten, die bis vor einem Jahr gegeben wurden.

Laut der MySQL-Dokumentation können Befehle wie CREATE USER , GRANT , REVOKE y DROP USER erfordern keine anschließende FLUSH PRIVILEGES Befehl. Es ist ziemlich klar, warum, wenn man die Dokumentation liest. Es liegt daran, dass das direkte Ändern der MySQL-Tabellen die Informationen nicht in den Speicher zurücklädt; dennoch behaupten die zahlreichen Lösungen für diesen Fehler, dass FLUSH PRIVILEGES ist die Antwort.

Möglicherweise handelt es sich auch gar nicht um einen Fehler. Es handelt sich um eine Verschwörung der Dokumentation - die Dokumente unterscheiden sich an einer kritischen Stelle von Version zu Version.

13.7.1.2. DROP USER-Syntax

...

DROP USER user [, user] ...

...

DROP USER 'jeffrey'@'localhost';

Wenn Sie nur den Teil des Benutzernamens des Kontonamens angeben, wird der Teil des Hostnamens "%" verwendet.

DROP USER wie in MySQL 5.0.0 vorhanden, entfernt nur Konten, die keine Berechtigungen haben. In MySQL 5.0.2 wurde die Funktion so geändert, dass sie auch Kontorechte entfernt. Das bedeutet, dass die Vorgehensweise zum Entfernen eines Kontos von Ihrer MySQL-Version abhängt.

Ab MySQL 5.0.2 können Sie ein Konto und seine Berechtigungen wie folgt entfernen:

DROP USER user;

Die Anweisung entfernt die Berechtigungszeilen für das Konto aus allen Berechtigungstabellen.

Ich erhalte diesen Fehler nur, wenn ich DROP USER user wie die Dokumentation vorschlägt, aber MySQL behandelt das '%' nicht als Platzhalter in einer Weise, die alle Benutzer auf allen Hosts ausschließen würde. Es ist also doch nicht so wild. Oder es kann sein, dass es manchmal funktioniert, wenn es den Benutzer auf dem lokalen Host löscht und dann versucht, den Benutzer auf % zu löschen.

Mir ist klar, dass beim Versuch, den Benutzer bei % zu löschen, eine Fehlermeldung ausgegeben und der Vorgang abgebrochen wird. Nachfolgend CREATE USER auf localhost schlägt fehl, da der Benutzer localhost nie gelöscht wurde. Es scheint nicht nötig zu sein, Zeit mit der Suche nach Geistern in den Grant-Tabellen zu verschwenden, wie ein Poster vorgeschlagen hat.

Ich sehe 7 Stimmen für:

DROP USER 'jack@localhost'; // das Konto vollständig löschen

Dies wird interpretiert als DROP USER 'jack@localhost'@'%'; # falsch

Es scheint tatsächlich einen echten Fehler zu geben, der die gleiche Fehlermeldung erzeugt, aber es hat damit zu tun, dass der erste erstellte Benutzer (nach einer neuen Mysql-Server-Installation) gelöscht wird. Ob dieser Fehler behoben wurde, weiß ich nicht, aber ich kann mich nicht daran erinnern, dass dies in letzter Zeit passiert ist, und ich bin derzeit auf Version 5.5.27.

50voto

Anthony Rutledge Punkte 5794

Wenn Sie eine DELETE Erklärung zum mysql.user Tabelle, um einen Benutzer zu entfernen, und versuchen Sie dann, den Benutzer wiederherzustellen mit CREATE USER erhalten Sie eine 1396 Fehler. Beheben Sie diesen Fehler durch Ausführen von DROP USER 'username'@'host';

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

(Sie erhalten 1396 Fehler, wenn Sie versuchen, Jack neu zu erstellen)

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

(Um dieser Situation zu entgehen, führen Sie DROP USER )

DROP USER 'jack'@'localhost';

(Ich nehme an FLUSH PRIVILEGES kann nicht schaden, aber lassen Sie auf jeden Fall zuerst den Benutzer fallen).

26voto

Marc B Punkte 347897

Auf diese Weise sollten Sie keine Benutzer manuell löschen. MySQL hat REVOKE Syntax zum Entfernen von Privilegien und DROP USER um sie zu löschen:

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

Es ist besser, die zur Verfügung gestellten Werkzeuge zu verwenden, als im Hintergrund herumzupfuschen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X