ПОМИЛКА 1396 (HY000): Операція CREATE USER не вдалася до 'jack' @ 'localhost'


311

Здається, я не в змозі створити простого користувача, якого я видалив, навіть як root в MySQL.

Мій випадок: користувач 'jack' існував раніше, але я видалив його з mysql.user, щоб відтворити його. Я не бачу жодних слідів цього в цій таблиці. Якщо я виконую цю команду для якогось іншого, випадкового імені користувача, скажімо, "jimmy", воно працює добре (так, як це було спочатку для "jack").

Що я зробив для пошкодження користувача «jack» і як я можу скасувати цю пошкодження, щоб відновити «jack» як дійсного користувача для цієї установки MySQL?

Дивіться приклад нижче. (Звичайно, спочатку було багато часу між створенням "джека" та його зняттям.)

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)

Відповіді:


233

Спробуйте зробити FLUSH PRIVILEGES;. Ця повідомлення про помилку MySQL у цьому коді помилки повідомляє про певний успіх у випадку, подібному до вашого після промивання приватних даних. 


13
Я знайшов цю пропозицію і спробував її раніше без успіху, але, можливо, щось інше було не так. Спробувавши це лише зараз, потім знову створивши ситуацію з іншим користувачем, я виявив, що це насправді зробило трюк. Звичайно, сьогодні формальною відповіддю було "не бути дурним" і використовувати REVOKE та DROP USER, щоб зробити це правильно. Я вдячний усім трьома відповідями (ця, що трапляється, є тією, яка визволила мене з мого теперішнього затруднення).
Russ Bateman

13
Настає 2016 рік, mysql знаходиться в v14.14, і він все ще зламаний.
ivo Welch

4
Спершу мені потрібно було скинути користувача відповідно до @ tver3305 відповіді.
Shautieh

9
Я бачу ту саму проблему і з 10.1.21, але "привілей змивання" не змінився. Я скидаю користувача, підмиваю, а потім створюю, що не вдається "ERROR 1396 (HY000) у рядку 7: Операція CREATE USER не вдалася до ...". Я б хотів, щоб я міг отримати mysql / mariadb, щоб трохи детальніше розглянути цю помилку, як ЧОМУ вона не вдалася.
Девід М. Карр

3
У мене з’явилася помилка, навіть коли я намагаюся відмовитись від користувача, 'флеш привілеї' не спрацювали для мене, після невеликого дослідження я знайшов рішення, скасувавши весь доступ і відмовившись від користувача, я не думаю, що так , операція змивання допоможе в подібних випадках, я поділився своїм детальним поясненням на цій сторінці rathishkumar.in/2018/10/…
Rathish

545

так, ця помилка є. Однак я знайшов невелике вирішення.

  • Припустимо, що користувач присутній, тому киньте його
  • Після видалення користувача необхідно змити привілеї mysql
  • Тепер створіть користувача.

Це повинно це вирішити. Якщо припустити, що ми хочемо створити користувача admin @ localhost, це такі команди:

вимкнути користувача admin @ localhost;
флеш-пільги;
створити користувача адміністратора @ localhost, ідентифікованого ' admins_password '

Ура


58
Тільки привілеї змивання не працювали для мене. випадаючи користувач все виправляв. Дякую.
Джейк

3
Те саме для мене. Мені спочатку довелося скинути користувача.
kgiannakakis

3
@QuantumMechanic рішення не працювало для мене, але краплі потім промивання зробили.
варильні панелі

У моєму випадку просто випадання користувача було enogh, не змиваючи привілеїв.
Скад

Це було ВЕЛИЧЕЗНЕ рятування життя - як і у @Jake над ключовою частиною був користувач, який користувався краплею, з локальною частиною
kellyfj

46

Ця помилка сидить на bugs.mysql.com з 2007 року, і ця тема в основному є лише передумовою всіх тих неправильних відповідей ще до року тому.

Згідно з документацією MySQL, команди типу CREATE USER, GRANT, REVOKEі DROP USERне вимагають подальшої FLUSH PRIVILEGESкоманди. Цілком зрозуміло, чому, якщо читати документи. Це тому, що зміна таблиць MySQL безпосередньо не завантажує інформацію в пам'ять; але безліч рішень цієї помилки стверджують, що FLUSH PRIVILEGESце відповідь.

Це також може не бути помилкою. Це документальна змова - документи різняться в одному критичному місці від версії до версії.

13.7.1.2. DROP USER Синтаксис

...

DROP USER користувач [, користувач] ...

...

ДРОП КОРИСТУВАЧ "jeffrey" @ "localhost";

Якщо ви вказали лише частину імені користувача імені облікового запису, використовується частина імені хоста '%'.

DROP USERяк присутній у MySQL 5.0.0, видаляє лише акаунти, які не мають привілеїв. У MySQL 5.0.2 він також був змінений для видалення привілеїв облікового запису. Це означає, що процедура видалення облікового запису залежить від вашої версії MySQL.

Станом на MySQL 5.0.2 ви можете видалити обліковий запис та його привілеї наступним чином:

Користувач DROP USER;

Виписка видаляє рядки привілеїв для облікового запису з усіх таблиць грантів.

Єдиний раз, коли я отримую цю помилку, коли це роблю DROP USER user; як док пропонує, але MySQL не трактує "%" як підстановку таким чином, щоб відмовити всіх користувачів у всіх хостах. Адже це не так дико. Або, можливо, іноді це працює, коли він видаляє користувача localhost, а потім намагається видалити одного на%.

Мені зрозуміло, що коли він намагається видалити користувача на%, він видає повідомлення про помилку і закриває. Подальше CREATE USERв localhost не вдасться, оскільки користувач localhost ніколи не був видалений. Здається, не потрібно витрачати час на копання в таблицях грантів, шукаючи привидів, як запропонував один плакат.

Я бачу 7 голосів за:

DROP USER 'jack @ localhost'; // повністю видалити обліковий запис

Що трактується як DROP USER 'jack@localhost'@'%';# неправильно

Насправді, здається, є справжня помилка, яка генерує те саме повідомлення про помилку, але це стосується того, як перший скинутий користувач (після встановлення нового сервера mysql) випадає. Чи виправлена ​​ця помилка, я не знаю; але я не пригадую, щоб це відбувалося останнім часом, і я зараз до версії 5.5.27.


8
Ви письменник-доктор MySQL?
Pacerier

Це була відповідь для мене. Mariadb успадкувала цю помилку.
zerpsed

Чому це не прийнята відповідь: /. У будь-якому випадку, дякую @ user1969061. Це, безумовно, працювало для мене вmariadb-server-5.5.60-1.el7_5.x86_64
соло

36

Якщо ви використовуєте DELETEвислів на mysql.userтаблиці для спроби видалити користувача, а потім спробуйте відновити користувача CREATE USER, ви отримаєте 1396помилку. Позбудьтесь цієї помилки, запустившиDROP USER 'username'@'host';

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

(Якщо ви спробуєте знову створити гніздо, ви отримаєте 1396 помилок)

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

(Вийдіть із цієї ситуації, бігаючи DROP USER)

DROP USER 'jack'@'localhost';

(Я думаю, FLUSH PRIVILEGESце не може зашкодити, але, безумовно, спочатку відмовте користувача.)


24

Ви не повинні видаляти користувачів вручну таким чином. У MySQL є REVOKEсинтаксис для видалення привілеїв та DROP USERдля їх видалення:

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

Найкраще використовувати надані інструменти, а не розмовляти на задньому плані.


2
Це була справжня відповідь, але не на проблему, яку я мав (яка була створена моєю дурістю). Дуже дякую за те, що ви мене встановили прямо!
Russ Bateman

@Marc, Тоді чому вони взагалі вигадали flush privileges? Офіційні документи MySQL робити розмови про речі , як delete from user where user = 'jack'; і flush privileges. Чому ви кажете, що вони не є частиною наданих інструментів?
Pacerier

1
Як зазначає @ user1969061, 'jack@localhost'мабуть, 'jack'@'localhost'тут.
червня

11

Видаліть користувача, очистіть привілеї; потім створіть користувача. Це працює!


1
Один лише привілей на промивання не працював, поки я не скинув користувача. Дякую.
Брендон Фіцпатрік

10

спробуйте, delete from mysql.db where user = 'jack'а потім створіть користувача


1
Це було корисно, щоб допомогти мені зрозуміти, як я зіпсував інсталяцію. Дуже дякую.
Russ Bateman

Читайте далі до коментаря Фелі. Задіяно більше таблиць.
В’язень 13

6

У MySQL 5.6 використання Drop user userid;не працює. Використання: Drop user 'userid'@'localhost';та / або Drop user 'userid'@'%';. Таким чином я зміг скинути користувача та відтворити його.


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

5

Перевірте, чи є

'користувач' @ '%'

або

'користувач' @ 'localhost'


4

Якщо ви хочете видалити користувача з SQL, вам потрібно видалити відповідні дані в цих таблицях: columns_priv, db, procs_priv, tables_priv. Потім виконатиflush privileges;


Приємна відповідь !! Ваша відповідь розкриває питання "поза кадром" щодо того, що відбувається насправді, а не просто "Використовуйте цей патч, і ви готові йти". Мені подобається, що обидва типи відповідей включали всі разом, щоб я міг зрозуміти це від супу до горіхів. Тепер я знаю, скільки потрібно зробити це таким чином, якщо ви збираєтеся це зробити правильно - і це ще більше підкріплює, чому слід використовувати методи, окреслені іншими. Дивовижно! Хоча багато відповідей вище були хорошими, я даю вам свій голос, тому що я знаю, що таке бути новачком на цьому веб-сайті. Вони дуже важко допомагати іншим, коли ти новачок.
В'язень 13

Це має бути альтернативна прийнята відповідь. Я використовую mysql 5.5 і DROP USER АКОГО Є ІНСТРУМЕНТИ, поки що недоступний, тому я повинен використовувати синтаксис DELETE FROM користувача (я маю спочатку перевірити існування користувача). Видалення з таблиці користувача не вийшло. НЕ ВПЛИВ ПРИВИЛЕГІЙ. Ви повинні видалити з інших таблиць вище.
alds

4

Як не дивно, робочий стіл MySQL вирішив це для мене. На вкладці Адміністрація -> Користувачі та привілеї, користувач був вказаний із помилкою. Використання опції видалення вирішило проблему.


3

Проста робота з цього питання. Оскільки команда "delete" видаляє лише запис користувача в таблиці "user" бази даних "mysql", ми можемо додати його назад, а потім повністю скинути користувача. Тоді ви можете створити користувача з тим самим іменем.

Крок 1. знайдіть формат запису таблиці користувачів у базі даних mysql

use mysql;
select * from user;

Крок 2. Відповідно до стовпців, показаних на кроці 1, створіть фіктивний запис із іменем користувача. Вставте його в таблицю, наприклад, нагадайте замінити "ім'я користувача" на ваше ім'я користувача.

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

Примітка. Іноді ви можете зіткнутися з проблемами при вставці, просто змініть дані, щоб вони працювали.

Крок 3. Видаліть користувача.

drop user username;

Тепер ви можете створити користувача з таким самим іменем.


Спробуйте DESCRIBE <tablename>
В'язень 13

2

Ця публікація MySQL ПОМИЛКА 1045 (28000): Користувачам заборонено доступ до 'bill' @ 'localhost' (з використанням пароля: ТАК) . Іноді є анонімний користувач '' @ 'localhost' або '' @ '127.0.0.1'. Отже, щоб вирішити проблему,

  1. спочатку скиньте користувача, чий "створити користувача" не вдалося.

  2. Створіть нового користувача.

  3. Надайте необхідні привілеї новому користувачеві.

  4. Промивання привілеїв.


Дякую за це Я забув запустити mysql_secure_installation, який видалив анонімного користувача.
ablackhat

2

У мене була така ж помилка. Але команда "ПЛАТИМ ПРИВИЛЕГИ;" не допомогло. Мені так було:

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

0

Сервер MySQL працює з параметром --skip-grant-table, тому він не може виконати цей оператор


0

Я знаю, що це давнє, але оскільки це перший результат у Google, я подумав, що слід додати своє рішення. У моєму випадку скасування користувача спрацювало нормально, але відтворення користувачеві дало мені "ПОМИЛКА 2013 (HY000): Втрачений зв’язок із сервером MySQL під час запиту" та "ПОМИЛКА 2006 (HY000): MySQL-сервер пішов". Я спробував привілеї flush -> drop user, але все ж мав ту саму помилку.

У моєму випадку помилка була пов’язана з оновленням mysql з 5.1 -> 5.6. Переглядаючи журнали помилок, я помітив, що він говорить про запуск mysql_upgrade. Це було, і моя заява про створення користувача працювала чудово!


0

Нещодавно я отримав цю помилку.

Що для мене працювало - це перевірити робочий стіл mysql «Користувачі та привілеї» та зрозуміти, що користувач все ще існує.

Видаливши його звідти, я зміг відтворити користувача.


0

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

Перезавантажте сервер:

# mysql.server restart

Потім виконайте свою CREATE USERкоманду.


Це не корисно. Помилка виникла CREATEпісля DELETE.
waqasgard

0

Я зіткнувся з цією проблемою сьогодні і вирішив її, виконавши наступні кроки:

1) вручну вставляючи цього занепокоєного користувача, надаючи значення обов’язкових полів у 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) А.

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) А.

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

Б.

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)

Сподіваюсь, це допомагає.


-2

Просто видаліть пов’язані з користувачем дані з mysql.db (можливо, і з інших таблиць), а потім відтворіть обидва.


-2

Я також стикався з тією ж проблемою, після кількох пошуків я знайшов рішення, яке працювало на мене. Сподіваюся, це допоможе вам. Як ви вже створили користувачів, тепер спробуйте зробити FLUSH PRIVILEGESна своїй консолі Mysql. Ця проблема вже є в повідомленні про помилку MySql. Ви також можете перевірити цю. Тепер, після промивання, ви можете створити нового користувача. виконайте нижче кроки:

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

Тепер ви можете побачити консоль Mysql.

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

Замість імені користувача можна поставити потрібне ім’я користувача. Якщо ви працюєте з Mysql на своїй локальній машині, введіть "localhost" замість хоста, інакше вкажіть ім'я вашого сервера, до якого ви хочете отримати доступ.

Наприклад: СТВОРИТИ КОРИСТУВАЧ smruti @ localhost IDENTIFIED 'привіт';

Зараз створено нового користувача. Якщо ви хочете надати весь доступ, тоді введіть

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

Тепер ви можете вийти з MySQL, ввівши. \qТепер ще раз увійдіть через

mysql -u newusername -p, потім натисніть клавішу Enter. Ви можете бачити все.

Сподіваюсь, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.