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)
Russ Bateman
źródło

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. 

QuantumMechanic
źródło
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

tver3305
źródło
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.

użytkownik1969061
źródło
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.)

Anthony Rutledge
źródło
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.

Marc B.
źródło
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!

罗俊峰
źródło
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

a1ex07
źródło
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.

Joilson Cardoso
źródło
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
źródło
5

Sprawdź, czy jest

'użytkownik'@'%'

lub

„użytkownik” @ „localhost”

Inês Gomes
źródło
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;

fely
źródło
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.

juettemann
źródło
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.

Jason Mao
źródło
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ń.

użytkownik_19
źródło
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';
Śmieci
źródło
0

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

irfan habib
źródło
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!

Vik
źródło
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.

dmena
źródło
0

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

Uruchom ponownie serwer:

# mysql.server restart

Następnie wykonaj CREATE USERpolecenie.

emallove
źródło
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.

monika mendiratta
źródło
-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.

Richard Abonyi
źródło
-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.

PyDevSRS
źródło