BŁĄD 1396 (HY000): Operacja UTWÓRZ UŻYTKOWNIKA nie powiodła się dla „jack” @ „localhost”


311

Wydaje mi się, że nie mogę odtworzyć prostego użytkownika, który usunąłem, nawet jako root w MySQL.

Mój przypadek: użytkownik „jack” istniał wcześniej, ale usunąłem go z mysql.user, aby go odtworzyć. Nie widzę w tym śladu. Jeśli wykonam to polecenie dla innej losowej nazwy użytkownika, powiedzmy „Jimmy”, zadziała to dobrze (tak jak pierwotnie dla „Jacka”).

Co zrobiłem, aby zepsuć użytkownika „jack” i jak mogę cofnąć to uszkodzenie, aby ponownie utworzyć „jack” jako prawidłowego użytkownika dla tej instalacji MySQL?

Zobacz przykład poniżej. (Oczywiście początkowo istniało dużo czasu między stworzeniem „Jacka” a jego usunięciem).

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)

Odpowiedzi:


233

Spróbuj zrobić FLUSH PRIVILEGES;. Ten post o błędzie MySQL dotyczący tego kodu błędu wydaje się informować o sukcesie w przypadku podobnym do twojego po wyczyszczeniu priva. 


13
Znalazłem tę sugestię i wypróbowałem ją wcześniej bez powodzenia, ale być może coś innego było nie tak. Próbując to teraz jeszcze raz, a następnie odtwarzając sytuację z innym użytkownikiem, odkryłem, że to naprawdę załatwiło sprawę. Oczywiście formalna odpowiedź brzmiała: „nie być głupcem” i użyć REVOKE i DROP USER, aby zrobić to dobrze. Jestem wdzięczny wszystkim trzem odpowiedziom (ta okazuje się być tą, która wyciągnęła mnie z mojego obecnego położenia).
Russ Bateman,

13
Jest 2016, mysql jest w wersji 14.14 i wciąż jest zepsuty.
ivo Welch,

4
Najpierw musiałem upuścić użytkownika zgodnie z odpowiedzią @ tver3305.
Shautieh

9
Widzę ten sam problem z 10.1.21, ale „przywileje opróżniania” nie miały znaczenia. Upuszczam użytkownika, opróżniam, a następnie tworzę, co kończy się niepowodzeniem „BŁĄD 1396 (HY000) w linii 7: Operacja UTWÓRZ UŻYTKOWNIKA nie powiodła się dla ...”. Żałuję, że nie mogłem zmusić mysql / mariadb do nieco rozwinięcia tego błędu, tak jak DLACZEGO nie udało się.
David M. Karr

3
Wystąpił błąd, nawet gdy próbuję upuścić użytkownika, „przywileje opróżniania” nie działały dla mnie, po przeprowadzeniu drobnych badań znalazłem rozwiązanie, cofając dostęp i upuszczając użytkownika, nie sądzę , operacja spłukiwania pomoże w podobnych przypadkach, swoje szczegółowe wyjaśnienie zamieściłem
Rathish

545

tak, ten błąd istnieje. Znalazłem jednak małe obejście.

  • Załóżmy, że użytkownik tam jest, więc upuść użytkownika
  • Po usunięciu użytkownika konieczne jest opróżnienie uprawnień mysql
  • Teraz utwórz użytkownika.

To powinno to rozwiązać. Zakładając, że chcemy utworzyć użytkownika admin @ localhost, będą to następujące polecenia:

upuść użytkownika admin @ localhost;
przywilejów;
utwórz użytkownika admin @ localhost identyfikowany przez ' admins_password '

Twoje zdrowie


58
Same uprawnienia do koloru nie działały dla mnie. upuszczenie użytkownika naprawiło wszystko. Dzięki.
Jake

3
Dla mnie to samo. Najpierw musiałem upuścić użytkownika.
kgiannakakis

3
@QuantumMechanic rozwiązanie nie działało dla mnie, ale upuszczenie, a potem flush.
płyty grzejne

W moim przypadku po prostu upuszczenie użytkownika było enogh, bez opróżniania uprawnień.
Scadge

To było OGROMNE uratowanie życia - jak w przypadku @Jake powyżej kluczowym elementem był użytkownik drop z częścią localhost
kellyfj

46

Ten błąd pojawia się na stronie bugs.mysql.com od 2007 roku, a ten wątek jest głównie papugowaniem wszystkich tych błędnych odpowiedzi nawet jeszcze rok temu.

Zgodnie z dokumentacją MySQL polecenia podoba CREATE USER, GRANT, REVOKE, i DROP USERnie wymagają późniejszego FLUSH PRIVILEGESpolecenia. Jest całkiem jasne, dlaczego, jeśli ktoś czyta dokumenty. Jest tak, ponieważ bezpośrednia modyfikacja tabel MySQL nie powoduje ponownego załadowania informacji do pamięci; ale mnóstwo rozwiązań tego błędu twierdzi, że FLUSH PRIVILEGESjest to odpowiedź.

To też może nie być błąd. Jest to spisek dokumentacyjny - dokumenty różnią się w jednym kluczowym miejscu w zależności od wersji.

13.7.1.2. Składnia DROP USER

...

DROP USER użytkownik [, użytkownik] ...

...

DROP USER „jeffrey” @ „localhost”;

Jeśli podasz tylko część nazwy użytkownika dla nazwy konta, używana jest część nazwy hosta „%”.

DROP USERtak jak w MySQL 5.0.0 usuwa tylko konta, które nie mają uprawnień. W MySQL 5.0.2 został zmodyfikowany, aby usunąć również uprawnienia do konta. Oznacza to, że procedura usuwania konta zależy od wersji MySQL.

Począwszy od MySQL 5.0.2, możesz usunąć konto i jego uprawnienia w następujący sposób:

Użytkownik DROP USER;

Instrukcja usuwa wiersze uprawnień dla konta ze wszystkich tabel grantu.

Ten błąd pojawia się tylko wtedy, gdy to robię DROP USER user; jak sugeruje dokument, ale MySQL nie traktuje „%” jako symbolu wieloznacznego w sposób, który upuściłby wszystkich użytkowników na wszystkich hostach. W końcu nie jest tak dzikie. Lub może się zdarzyć, że czasami działa, gdy usuwa użytkownika hosta lokalnego, a następnie próbuje usunąć ten na%.

Jest dla mnie jasne, że kiedy próbuje usunąć użytkownika na%, wyświetla komunikat o błędzie i kończy pracę. Kolejne CREATE USERna localhost zakończy się niepowodzeniem, ponieważ użytkownik localhost nigdy nie został usunięty. Wydaje się, że nie trzeba marnować czasu na szukanie duchów w tabelach grantów, jak sugerował jeden plakat.

Widzę 7 głosów za:

DROP USER „jack @ localhost”; // całkowicie usuń konto

Co jest interpretowane jako DROP USER 'jack@localhost'@'%';# źle

Wydaje się, że istnieje prawdziwy błąd, który generuje ten sam komunikat o błędzie, ale ma to związek z usunięciem pierwszego utworzonego użytkownika (po nowej instalacji serwera mysql). Czy ten błąd został naprawiony, nie wiem; ale nie przypominam sobie, żeby to się ostatnio działo i jestem teraz w wersji 5.5.27.


8
Czy jesteś pisarzem MySQL?
Pacerier

To była dla mnie odpowiedź. Mariadb odziedziczył ten błąd.
zerpsed

Dlaczego nie jest to akceptowana odpowiedź:. W każdym razie dziękuję @ user1969061. To z pewnością pracował dla mniemariadb-server-5.5.60-1.el7_5.x86_64
Han Solo

36

Jeśli użyjesz DELETEinstrukcji z mysql.usertabeli, aby usunąć użytkownika, a następnie spróbujesz przywrócić go ponownie CREATE USER, pojawi się 1396błąd. Pozbądź się tego błędu, uruchamiającDROP USER 'username'@'host';

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

(Otrzymasz 1396 błędów, jeśli spróbujesz odtworzyć Jacka)

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

(Wyjdź z tej sytuacji, uruchamiając DROP USER)

DROP USER 'jack'@'localhost';

(Przypuszczam, że FLUSH PRIVILEGESnie może zranić, ale zdecydowanie najpierw upuść użytkownika.)


24

Nie powinieneś ręcznie usuwać użytkowników w ten sposób. MySQL ma REVOKEskładnię do usuwania uprawnień i DROP USERich usuwania:

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

Najlepiej jest korzystać z dostarczonych narzędzi zamiast przesuwać się w tle.


2
To była prawdziwa odpowiedź, ale nie na problem, który miałem (który został stworzony przez moją głupotę). Dziękuję bardzo za wyprostowanie mnie!
Russ Bateman,

@Marc, więc dlaczego w ogóle wymyślili flush privileges? Oficjalne docs MySQL zrobić mówić o takich rzeczach delete from user where user = 'jack'; i flush privileges. Dlaczego mówisz, że nie są one częścią dostarczonych narzędzi?
Pacerier

1
Jak wskazuje @ user1969061, 'jack@localhost'prawdopodobnie powinien 'jack'@'localhost'tu być .
jochen

11

Upuść użytkownika, opróżnij uprawnienia; następnie utwórz użytkownika. To działa!


1
Same uprawnienia do opróżniania nie działały, dopóki nie upuściłem użytkownika. Dzięki.
Brandon Fitzpatrick

10

spróbuj, delete from mysql.db where user = 'jack'a następnie utwórz użytkownika


1
Pomogło mi to zrozumieć, w jaki sposób uszkodziłem instalację. Dziękuję Ci bardzo.
Russ Bateman,

Przeczytaj dalej w komentarzu Fely. W grę wchodzi więcej tabel.
Więzień 13

6

W MySQL 5.6 korzystanie Drop user userid;nie działa. Użyj: Drop user 'userid'@'localhost';i / lub Drop user 'userid'@'%';. W ten sposób mogłem upuścić użytkownika i odtworzyć go.


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


4

Jeśli chcesz usunąć użytkownika z SQL, należy usunąć odpowiednie dane w tych tabelach: columns_priv, db, procs_priv, tables_priv. Następnie wykonajflush privileges;


Niezła odpowiedź!! Twoja odpowiedź ujawnia problem „za kulisami”, co się dzieje, a nie tylko „Użyj tej łatki i jesteś gotowy do pracy”. Lubię oba rodzaje odpowiedzi ujęte razem, dzięki czemu mogę zrozumieć od zupy do orzechów. Teraz wiem, ile pracy trzeba zrobić w ten sposób, jeśli zrobisz to dobrze - i to dodatkowo wzmacnia, dlaczego należy stosować metody przedstawione przez innych. Niesamowite! Chociaż wiele powyższych odpowiedzi było dobrych, oddaję wam głos, ponieważ wiem, jak to jest być nowicjuszem na tej stronie. Naprawdę utrudniają pomaganie innym, gdy jesteś nowy.
Więzień 13

To powinna być alternatywna akceptowana odpowiedź. Używam mysql 5.5 i DROP USER JEŚLI ISTNIEJE nie jest jeszcze dostępny, więc muszę użyć składni DELETE FROM użytkownika (najpierw muszę przetestować istnienie użytkownika). Samo usuwanie z tabeli użytkowników nie działało. FLUSH PRIVILEGES. Musisz usunąć z innych tabel powyżej.
alds

4

Co zabawne, warsztat MySQL rozwiązał to dla mnie. Na karcie Administracja -> Użytkownicy i uprawnienia użytkownik został wyświetlony z błędem. Korzystanie z opcji usuwania rozwiązało problem.


3

Proste obejście tego problemu. Ponieważ polecenie „usuń” usuwa tylko rekord użytkownika z tabeli „użytkownik” bazy danych „mysql”, możemy go dodać z powrotem, a następnie całkowicie usunąć użytkownika. Następnie możesz utworzyć użytkownika o tej samej nazwie.

Krok 1. znajdź format rekordu tabeli użytkowników w bazie danych mysql

use mysql;
select * from user;

Krok 2. Zgodnie z kolumnami pokazanymi w kroku 1 utwórz fikcyjny rekord z nazwą użytkownika. Wstaw go do tabeli, na przykład przypomnienie, aby zastąpić „nazwę użytkownika” swoją nazwą użytkownika.

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

Uwaga: czasami mogą wystąpić problemy z wstawieniem, wystarczy zmienić dane, aby działało.

Krok 3. Upuść użytkownika.

drop user username;

Teraz możesz utworzyć użytkownika o tej samej nazwie.


Spróbuj DESCRIBE <nazwa_tablicy>
Więzień 13

2

Ten post MySQL ERROR 1045 (28000): Odmowa dostępu dla użytkownika „rachunek” @ „localhost” (przy użyciu hasła: TAK) jest przydatna. Czasami istnieje anonimowy użytkownik „@” localhost ”lub„ @ ”127.0.0.1”. Aby rozwiązać problem,

  1. najpierw upuść użytkownika, którego „tworzenie użytkownika” nie powiodło się.

  2. Utwórz nowego użytkownika.

  3. Nadaj wymagane uprawnienia nowemu użytkownikowi.

  4. Przywracanie uprawnień.


Dzięki za to. Zapomniałem uruchomić mysql_secure_installation, który usunął anonimowego użytkownika.
ablackhat

2

Miałem ten sam błąd. Ale wydaj polecenie „FLUSH PRIVILEGES;” nie pomogło Podobało mi się to:

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

0

Serwer MySQL działa z opcją --skip-grant-tables, więc nie może wykonać tej instrukcji


0

Wiem, że to stare, ale ponieważ jest to pierwszy wynik w Google, pomyślałem, że powinienem dodać moje rozwiązanie. W moim przypadku upuszczenie użytkownika działało dobrze, ale odtworzenie go dało mi komunikat „BŁĄD 2013 (HY000): Utracono połączenie z serwerem MySQL podczas zapytania” i „BŁĄD 2006 (HY000): Serwer MySQL zniknął”. Próbowałem przywilejów flush -> upuść rozwiązanie użytkownika, ale nadal miałem ten sam błąd.

W moim przypadku błąd był spowodowany aktualizacją MySQL z 5.1 -> 5.6. Przeglądając dzienniki błędów, zauważyłem, że powiedział, aby uruchomić mysql_upgrade. Czy to i moje oświadczenie użytkownika działało dobrze!


0

Niedawno dostałem ten błąd.

To, co zadziałało, to sprawdzenie w środowisku mysql „Użytkownicy i uprawnienia” i uświadomienie sobie, że użytkownik nadal istnieje.

Po usunięciu go stamtąd mogłem odtworzyć użytkownika.


0

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

Uruchom ponownie serwer:

# mysql.server restart

Następnie wykonaj CREATE USERpolecenie.


To nie jest przydatne. Błąd wystąpił CREATEpo DELETE.
waqasgard,

0

Napotkałem dzisiaj ten problem i rozwiązałem go, wykonując następujące czynności:

1) ręcznie wstawiając kłopotliwego użytkownika, podając wartość pól obowiązkowych 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)

Mam nadzieję że to pomoże.


-2

Wystarczy usunąć dane związane z użytkownikiem z mysql.db (być może również z innych tabel), a następnie odtworzyć oba.


-2

Zetknąłem się z tym samym problemem, po kilku poszukiwaniach znalazłem rozwiązanie, które dla mnie zadziałało. Ponieważ już utworzyłeś użytkowników, spróbuj teraz zrobić FLUSH PRIVILEGESna konsoli Mysql. Ten problem znajduje się już w poście o błędzie MySql. Możesz także to sprawdzić, a teraz po opróżnieniu możesz utworzyć nowego użytkownika. wykonaj poniższe kroki:

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

Teraz możesz zobaczyć konsolę MySQL.

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

Zamiast nazwy użytkownika możesz podać żądaną nazwę użytkownika. Jeśli używasz MySQL na komputerze lokalnym, wpisz „localhost” zamiast hosta, w przeciwnym razie podaj nazwę serwera, do którego chcesz uzyskać dostęp.

Przykład: UTWÓRZ UŻYTKOWNIKA smruti @ localhost ZIDENTYFIKOWANY przez 'hello';

Teraz tworzony jest nowy użytkownik. Jeśli chcesz dać wszystkim dostęp, wpisz

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

Teraz możesz wyjść z MySQL, wpisując. \qTeraz ponownie zaloguj się

mysql -u newusername -p, a następnie naciśnij klawisz Enter. Możesz zobaczyć wszystko.

Mam nadzieję że to pomoże.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.