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

311

Ich kann anscheinend keinen einfachen Benutzer, den ich gelöscht habe, neu erstellen, selbst nicht als Root in MySQL.

Mein Fall: Benutzer 'jack' gab es schon einmal, 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 ausführe, z. B. 'jimmy', 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' als gültigen Benutzer für diese Installation von MySQL neu zu erstellen?

Siehe Beispiel unten. (Natürlich gab es ursprünglich viel Zeit zwischen der Schaffung 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)
Russ Bateman
quelle

Antworten:

233

Versuchen Sie es mit einem FLUSH PRIVILEGES;. Dieser MySQL-Fehlerbeitrag zu diesem Fehlercode scheint in einem ähnlichen Fall wie dem Ihren nach dem Löschen von Privs einen gewissen Erfolg zu melden. 

QuantumMechanic
quelle
13
Ich hatte diesen Vorschlag gefunden und früher ohne Erfolg versucht, aber vielleicht stimmte etwas anderes nicht. Als ich es gerade noch einmal versuchte und dann die Situation mit einem anderen Benutzer neu erstellte, stellte ich fest, dass dies tatsächlich den Trick tat. Natürlich lautete die formelle Antwort heute "nicht dumm sein" und REVOKE und DROP USER verwenden, um es richtig zu machen. Ich bin allen drei Antworten verpflichtet (diese ist zufällig diejenige, die mich aus meiner gegenwärtigen Situation gerettet hat).
Russ Bateman
13
Es ist 2016, MySQL ist auf Version 14.14 und es ist immer noch kaputt.
ivo Welch
4
Ich musste den Benutzer zuerst gemäß der Antwort von @ tver3305 löschen.
Shautieh
9
Ich sehe das gleiche Problem mit 10.1.21, aber "Flush-Berechtigungen" machten keinen Unterschied. Ich lasse den Benutzer fallen, spüle und erstelle dann, was mit "FEHLER 1396 (HY000) in Zeile 7: Operation CREATE USER fehlgeschlagen für ..." fehlschlägt. Ich wünschte, ich könnte mysql / mariadb dazu bringen, ein wenig auf diesen Fehler einzugehen, wie WARUM er fehlgeschlagen ist.
David M. Karr
3
Ich habe den Fehler auch dann erhalten, wenn ich versuche, den Benutzer ebenfalls zu löschen. "Flush-Berechtigungen" haben bei mir nicht funktioniert. Nach einigen Recherchen habe ich die Lösung gefunden, indem ich den gesamten Zugriff widerrufen und den Benutzer gelöscht habe. Ich glaube nicht , Spülvorgang
Rathish
545

Ja, dieser Fehler ist da. Ich habe jedoch eine kleine Problemumgehung gefunden.

  • Angenommen, der Benutzer ist dort, lassen Sie den Benutzer fallen
  • Nach dem Löschen des Benutzers müssen die MySQL-Berechtigungen gelöscht werden
  • Erstellen Sie nun den Benutzer.

Das sollte es lösen. Angenommen, wir möchten den Benutzer admin @ localhost erstellen, sind dies die folgenden Befehle:

Benutzer admin @ localhost löschen;
Flush-Berechtigungen;
Erstellen Sie den Benutzer admin @ localhost, der durch ' admins_password ' gekennzeichnet ist.

Prost

tver3305
quelle
58
Flush-Privilegien allein haben bei mir nicht funktioniert. Das Löschen des Benutzers hat alles behoben. Vielen Dank.
Jake
3
Auch für mich. Ich musste den Benutzer zuerst fallen lassen.
kgiannakakis
3
Die @ QuantumMechanic-Lösung hat bei mir nicht funktioniert, aber Drop und Flush haben funktioniert.
Kochfelder
In meinem Fall war es enogh, nur Benutzer zu löschen, ohne Berechtigungen zu löschen.
Scadge
Dies war ein RIESIGER Lebensretter - wie bei @Jake über dem Schlüsselteil war der Drop-User mit dem localhost-Teil
Kellyfj
46

Dieser Fehler befindet sich seit 2007 auf bugs.mysql.com und dieser Thread ist hauptsächlich nur ein Papagei all dieser falschen Antworten bis vor einem Jahr.

Gemäß der MySQL - Dokumentation, Befehle wie CREATE USER, GRANT, REVOKEund DROP USERbenötigt keinen nachfolgenden FLUSH PRIVILEGESBefehl. Es ist ziemlich klar warum, wenn man die Dokumente liest. Dies liegt daran, dass durch direktes Ändern der MySQL-Tabellen die Informationen nicht erneut in den Speicher geladen werden. Die Fülle an Lösungen für diesen Fehler behauptet jedoch, dass dies FLUSH PRIVILEGESdie Antwort ist.

Dies kann auch nicht einmal ein Fehler sein. Es handelt sich um eine Dokumentationsverschwörung - Dokumente variieren an einer kritischen Stelle von Version zu Version.

13.7.1.2. DROP USER Syntax

...

DROP USER Benutzer [, Benutzer] ...

...

DROP USER 'jeffrey' @ 'localhost';

Wenn Sie nur den Benutzernamen-Teil des Kontonamens angeben, wird ein Hostnamen-Teil von '%' verwendet.

DROP USERWie in MySQL 5.0.0 vorhanden, werden nur Konten entfernt, die keine Berechtigungen haben. In MySQL 5.0.2 wurde es geändert, um auch Kontoberechtigungen zu entfernen. Dies bedeutet, dass das Verfahren 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 Benutzer;

Die Anweisung entfernt Berechtigungszeilen für das Konto aus allen Grant-Tabellen.

Das einzige Mal, wenn ich diesen Fehler erhalte, ist, wenn ich es tue DROP USER user; Wie das Dokument vorschlägt, behandelt MySQL das '%' jedoch nicht als Platzhalter, sodass alle Benutzer auf allen Hosts gelöscht werden. Es ist doch nicht so wild. Oder es kann sein, dass es manchmal funktioniert, wenn der localhost-Benutzer gelöscht wird und dann versucht wird, den bei% zu löschen.

Mir ist klar, dass beim Versuch, den Benutzer bei% zu löschen, eine Fehlermeldung ausgegeben und beendet wird. Das anschließende CREATE USERbei localhost schlägt fehl, da der localhost-Benutzer nie gelöscht wurde. Es scheint nicht nötig zu sein, Zeit damit zu verschwenden, in den Grant-Tabellen nach Geistern zu suchen, wie ein Poster vorschlug.

Ich sehe 7 Stimmen für:

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

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

Es scheint tatsächlich einen echten Fehler zu geben, der dieselbe Fehlermeldung generiert, aber er hat damit zu tun, dass der zuerst erstellte Benutzer (nach einer neuen MySQL-Server-Installation) gelöscht wird. Ob dieser Fehler behoben wurde, weiß ich nicht. aber ich erinnere mich nicht daran, dass dies in letzter Zeit passiert ist und ich bin zu diesem Zeitpunkt auf Version 5.5.27.

user1969061
quelle
8
Sind Sie ein MySQL-Dokumentschreiber?
Pacerier
Das war die Antwort für mich. Mariadb hat diesen Fehler geerbt.
Zerpsed
Warum ist dies nicht die akzeptierte Antwort: /. Wie auch immer, danke @ user1969061. Dies funktionierte sicherlich für mich inmariadb-server-5.5.60-1.el7_5.x86_64
han solo
36

Wenn Sie eine DELETEAnweisung in der mysql.userTabelle verwenden, um einen Benutzer zu entfernen, und dann versuchen, den Benutzer mit wiederherzustellen CREATE USER, wird eine 1396Fehlermeldung angezeigt. Beheben Sie diesen Fehler, indem Sie ausführenDROP USER 'username'@'host';

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

(Sie erhalten 1396 Fehler, wenn Sie versuchen, die Buchse neu zu erstellen.)

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

(Raus aus dieser Situation, indem du rennst DROP USER)

DROP USER 'jack'@'localhost';

(Ich nehme an, es FLUSH PRIVILEGESkann nicht schaden, aber lassen Sie den Benutzer definitiv zuerst fallen.)

Anthony Rutledge
quelle
24

Sie sollten Benutzer auf diese Weise nicht manuell löschen. MySQL verfügt über eine REVOKESyntax zum Entfernen und DROP USERLöschen von Berechtigungen :

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

Verwenden Sie am besten die bereitgestellten Tools, anstatt im Hintergrund herumzuspielen.

Marc B.
quelle
2
Dies war die eigentliche Antwort, aber nicht auf das Problem, das ich hatte (das durch meine Dummheit verursacht wurde). Vielen Dank, dass Sie mich gerade gestellt haben!
Russ Bateman
@Marc, dann , warum haben sie selbst erfinden flush privilegesin erster Linie? Die offizielle MySQL docs tun redet über Sachen wie delete from user where user = 'jack'; und flush privileges. Warum sagen Sie, dass sie nicht Teil der bereitgestellten Tools sind?
Pacerier
1
Wie @ user1969061 betont, 'jack@localhost'sollte wohl 'jack'@'localhost'hier sein.
Jochen
11

Löschen Sie den Benutzer, löschen Sie die Berechtigungen. Erstellen Sie dann den Benutzer. Es funktioniert!

罗俊峰
quelle
1
Das Löschen von Berechtigungen allein funktionierte erst, als ich den Benutzer fallen ließ. Vielen Dank.
Brandon Fitzpatrick
10

Versuchen Sie delete from mysql.db where user = 'jack', einen Benutzer zu erstellen

a1ex07
quelle
1
Dies war hilfreich, um zu verstehen, wie ich meine Installation beschädigt hatte. Vielen Dank.
Russ Bateman
Lesen Sie weiter unten zu Felys Kommentar. Es sind mehr Tabellen beteiligt.
Gefangener 13.
6

In MySQL 5.6 Drop user userid;funktioniert die Verwendung nicht. Verwenden Sie: Drop user 'userid'@'localhost';und / oder Drop user 'userid'@'%';. Auf diese Weise konnte ich den Benutzer löschen und neu erstellen.

Joilson Cardoso
quelle
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
quelle
5

Überprüfen Sie, ob dies der Fall ist

'Benutzer'@'%'

oder

'user' @ 'localhost'

Inês Gomes
quelle
4

Wenn Sie einen Benutzer mit SQL löschen möchten, müssen Sie die entsprechenden Daten in diesen Tabellen löschen: columns_priv, db, procs_priv, tables_priv. Dann ausführenflush privileges;

fely
quelle
Gute Antwort!! Ihre Antwort enthüllt das Problem "hinter den Kulissen", was tatsächlich passiert, und nicht nur "Verwenden Sie diesen Patch und Sie können loslegen". Ich mag beide Arten von Antworten, die alle zusammen enthalten sind, damit ich sie von Suppe bis Nuss verstehen kann. Jetzt weiß ich, wie viel Arbeit es kostet, es so zu machen, wenn Sie es richtig machen - und das verstärkt weiter, warum man die von anderen beschriebenen Methoden anwenden sollte. Genial! Obwohl viele der oben genannten Antworten gut waren, gebe ich Ihnen meine Stimme, weil ich weiß, wie es ist, ein Neuling auf dieser Website zu sein. Sie machen es wirklich schwer, anderen zu helfen, wenn Sie neu sind.
Gefangener 13.
Dies sollte eine alternativ akzeptierte Antwort sein. Ich verwende MySQL 5.5 und DROP USER IF EXISTS ist noch nicht verfügbar, daher muss ich die Benutzersyntax DELETE FROM verwenden (ich muss zuerst die Existenz des Benutzers testen). Das Löschen aus der Benutzertabelle allein hat nicht funktioniert. FLUSH PRIVILEGES auch nicht. Sie müssen aus den anderen obigen Tabellen löschen.
Alds
4

Lustigerweise hat die MySQL-Workbench es für mich gelöst. Auf der Registerkarte Administration -> Benutzer und Berechtigungen wurde der Benutzer mit einem Fehler aufgelistet. Die Verwendung der Löschoption löste das Problem.

juettemann
quelle
3

Eine einfache Lösung für dieses Problem. Da der Befehl "Löschen" nur den Benutzerdatensatz in der Tabelle "Benutzer" der Datenbank "MySQL" entfernt, können wir ihn wieder hinzufügen und den Benutzer dann vollständig löschen. Dann könnten Sie einen Benutzer mit demselben Namen erstellen.

Schritt 1. Suchen Sie das Datensatzformat der Benutzertabelle in der MySQL-Datenbank

use mysql;
select * from user;

Schritt 2. Erstellen Sie gemäß den in Schritt 1 gezeigten Spalten einen Dummy-Datensatz mit dem Benutzernamen. Fügen Sie es in die Tabelle ein. Denken Sie beispielsweise daran, den "Benutzernamen" durch Ihren Benutzernamen zu ersetzen.

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');

Hinweis: Manchmal können beim Einfügen Probleme auftreten. Ändern Sie einfach die Daten, damit sie funktionieren.

Schritt 3. Löschen Sie den Benutzer.

drop user username;

Jetzt können Sie einen Benutzer mit demselben Namen erstellen.

Jason Mao
quelle
Versuchen Sie es mit DESCRIBE <Tabellenname>
Prisoner 13
2

Dieser Beitrag MySQL ERROR 1045 (28000): Zugriff für Benutzer 'bill' @ 'localhost' verweigert (mit Passwort: YES) ist nützlich. Manchmal gibt es einen anonymen Benutzer '' @ 'localhost' oder '' @ '127.0.0.1'. Um das Problem zu lösen,

  1. Löschen Sie zuerst den Benutzer, dessen 'Benutzer erstellen' fehlgeschlagen ist.

  2. Neuen Benutzer erstellen.

  3. Gewähren Sie dem neuen Benutzer die erforderlichen Berechtigungen.

  4. Berechtigungen spülen.

user_19
quelle
Danke dafür. Ich habe vergessen, mysql_secure_installation auszuführen, mit der der anonyme Benutzer gelöscht wurde.
Ablackhat
2

Ich hatte den gleichen Fehler. Aber befehle "FLUSH PRIVILEGES"; hat nicht geholfen. Das hat mir gefallen:

CREATE USER 'jimmy'@'localhost' IDENTIFIED BY 'test123';
UPDATE mysql.user SET USER='jack' WHERE USER='jimmy';
Wurf
quelle
0

Der MySQL-Server wird mit der Option --skip-grant-tables ausgeführt, sodass diese Anweisung nicht ausgeführt werden kann

irfan habib
quelle
0

Ich weiß, dass dies alt ist, aber da es das erste Ergebnis in Google ist, dachte ich, ich sollte meine Lösung hinzufügen. In meinem Fall funktionierte das Löschen des Benutzers einwandfrei, aber die Neuerstellung des Benutzers ergab "FEHLER 2013 (HY000): Verbindung zum MySQL-Server während der Abfrage verloren" und "FEHLER 2006 (HY000): MySQL-Server ist verschwunden". Ich habe die Flush-Berechtigungen -> Benutzerlösung löschen ausprobiert, hatte aber immer noch den gleichen Fehler.

In meinem Fall war der Fehler auf ein MySQL-Upgrade von 5.1 -> 5.6 zurückzuführen. Beim Anzeigen der Fehlerprotokolle wurde festgestellt, dass mysql_upgrade ausgeführt werden soll. Hat das funktioniert und meine Anweisung zum Erstellen eines Benutzers hat gut funktioniert!

vik
quelle
0

Ich habe kürzlich diesen Fehler erhalten.

Was für mich funktioniert hat, ist das Einchecken der MySQL-Workbench 'Benutzer und Berechtigungen' und das Erkennen, dass noch Benutzer vorhanden sind.

Nachdem ich es von dort gelöscht hatte, konnte ich den Benutzer neu erstellen.

dmena
quelle
0

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

Starten Sie den Server neu:

# mysql.server restart

Dann mach deinen CREATE USERBefehl.

emallove
quelle
Das ist nicht sinnvoll. Der Fehler wurde am CREATEnach festgestellt DELETE.
Waqasgard
0

Ich bin heute mit diesem Problem konfrontiert und habe es durch die folgenden Schritte behoben:

1) manuelles Einfügen des störenden Benutzers, der den Wert der Pflichtfelder angibt, in 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. 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)

Hoffe das hilft.

Monika Mendiratta
quelle
-2

Löschen Sie einfach die benutzerbezogenen Daten aus mysql.db (möglicherweise auch aus anderen Tabellen) und erstellen Sie beide neu.

Richard Abonyi
quelle
-2

Ich hatte auch das gleiche Problem, nach wenigen Suchen fand ich eine Lösung, die für mich funktionierte. Ich hoffe, es wird Ihnen helfen. Da Sie bereits Benutzer erstellt haben, versuchen Sie nun, eine FLUSH PRIVILEGESauf Ihrer MySQL-Konsole auszuführen. Dieses Problem ist bereits im MySql-Fehlerbeitrag enthalten. Sie können dies auch überprüfen. Jetzt können Sie nach dem Spülen einen neuen Benutzer erstellen. Befolgen Sie die folgenden Schritte:

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

Jetzt können Sie die MySQL-Konsole sehen.

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

Anstelle des Benutzernamens können Sie den gewünschten Benutzernamen eingeben. Wenn Sie MySQL auf Ihrem lokalen Computer ausführen , geben Sie "localhost" anstelle des Hosts ein. Andernfalls geben Sie Ihren Servernamen an, auf den Sie zugreifen möchten.

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

Jetzt wird ein neuer Benutzer erstellt. Wenn Sie allen Zugriff gewähren möchten, geben Sie ein

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

Jetzt können Sie MySQL beenden, indem Sie \q.Now erneut anmelden

mysql -u newusername -pDrücken Sie dann die Eingabetaste. Sie können alles sehen.

Hoffe das hilft.

PyDevSRS
quelle