ОШИБКА 1396 (HY000): сбой операции CREATE USER для 'jack' @ 'localhost'

238

Кажется, я не могу воссоздать простого пользователя, которого я удалил, даже как root в MySQL.

Мой случай: пользовательский "jack" существовал раньше, но я удалил его из mysql.user, чтобы его воссоздать. Я не вижу пережитков этого в этой таблице. Если я выполню эту команду для какого-то другого случайного имени пользователя, скажем, "jimmy", он отлично работает (как это первоначально делалось для "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)
Теги:
mysql-management

19 ответов

179
Лучший ответ

Попробуйте выполнить FLUSH PRIVILEGES. Это сообщение об ошибке MySQL в этом коде ошибки сообщает о некотором успехе в случае, аналогичном вашему, после промывки привилегий.

  • 13
    Я нашел это предложение и попробовал его раньше, но безуспешно, но, возможно, что-то еще было не так. Попробовав это сейчас, затем воссоздав ситуацию с другим пользователем, я обнаружил, что это действительно помогло. Конечно, сегодня формальным ответом было «не быть глупым» и использовать REVOKE и DROP USER, чтобы сделать это правильно. Я в долгу перед всеми тремя ответами (именно этот, как раз тот, который вытащил меня из моего нынешнего затруднения).
  • 11
    Это 2016, mysql на v14.14, и он все еще не работает.
Показать ещё 4 комментария
397

Да, эта ошибка существует. Однако я нашел небольшое обходное решение.

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

Это должно решить. Предполагая, что мы хотим создать user admin @localhost, это были бы команды:

drop user admin@localhost;
flush privileges;
create user admin@localhost identified by 'admins_password'

Приветствия

  • 51
    Одни только флеш-привилегии не сработали. падение пользователя исправило все. Благодарю.
  • 5
    то же самое - имхо это должен быть ответ
Показать ещё 9 комментариев
39

Этот баг сидит на bugs.mysql.com с 2007 года, и этот поток в основном просто распутывает все эти неправильные ответы даже до года назад.

Согласно документации MySQL, команды типа CREATE USER, GRANT, REVOKE и DROP USER не требуют последующей команды FLUSH PRIVILEGES. Понятно, почему, если читать документы. Это потому, что изменение таблиц MySQL напрямую не перезагружает информацию в память; однако множество решений этой ошибки утверждают, что FLUSH PRIVILEGES является ответом.

Это тоже не может быть ошибкой. Это заговор документации - документы меняются в одном критическом месте от версии к версии.

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

...

Пользователь 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'@'%'; # wrong

На самом деле существует реальная ошибка, которая генерирует одно и то же сообщение об ошибке, но она связана с первым созданным пользователем (после установки нового сервера mysql). Исправлена ​​ли эта ошибка, я не знаю; но я не помню, что это произошло в последнее время, и я в настоящее время готов к версии 5.5.27.

  • 6
    Вы писатель MySQL док?
  • 0
    Это был ответ для меня. Мариадб унаследовал эту ошибку.
24

Если вы используете оператор 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 не может повредить, но, безусловно, сначала отбросить пользователя.)

20

Вы не должны вручную удалять пользователей таким образом. У MySQL есть REVOKE синтаксис для удаления привилегий и DROP USER для их удаления:

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

Лучше всего использовать предоставленные инструменты, а не обманывать в фоновом режиме.

  • 2
    Это был настоящий ответ, но не на проблему, которая у меня была (которая была создана моей глупостью). Большое спасибо за то, что выправили меня!
  • 0
    @Marc, Тогда почему они вообще изобрели flush privileges ? Официальный MySQL документы действительно говорить о вещах , как delete from user where user = 'jack'; , delete from user where user = 'jack'; и flush privileges . Почему вы говорите, что они не являются частью предоставленных инструментов?
Показать ещё 1 комментарий
11

Отбросьте пользователя, сбросьте привилегии; затем создайте пользователя. Он работает!

  • 1
    Одна только очистка привилегий не работала, пока я не удалил пользователя. Благодарю.
7

попробуйте delete from mysql.db where user = 'jack', а затем создайте пользователя

  • 0
    Это помогло мне понять, как я повредил мою установку. Большое спасибо.
  • 0
    Читайте дальше вплоть до комментария Фели. Есть больше таблиц.
6

В MySQL 5.6 с помощью Drop user userid; не работает. Используйте: Drop user 'userid'@'localhost'; и/или Drop user 'userid'@'%';. Таким образом, я смог удалить пользователя и восстановить его.

  • 1
    Это то, что сработало для меня.
3
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';
2

У меня была такая же ошибка. Но команда "FLUSH PRIVILEGES"; не помогло. Мне это понравилось:

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

Этот пост MySQL ERROR 1045 (28000): доступ, запрещенный для пользователя 'bill' @'localhost' (с использованием пароля: YES) полезен. Иногда есть анонимный пользователь '' @'localhost' или '' @'127.0.0.1'. Итак, чтобы решить проблему,

  • сначала отбросить пользователя, у которого "создать пользователя" не удалось.

  • Создайте нового пользователя.

  • Предоставьте новые привилегии новому пользователю.

  • Скрытые привилегии.

  • 0
    Спасибо за это. Я забыл запустить mysql_secure_installation, который удалил анонимного пользователя.
1

Простая работа по этой проблеме. Поскольку команда "удалить" удаляет только пользовательскую запись в "пользовательской" таблице базы данных "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;

Теперь вы можете создать пользователя с тем же именем.

  • 0
    Попробуйте описать <имя таблицы>
1

Если вы хотите удалить пользователя с помощью sql, вам необходимо удалить связанные данные в следующих таблицах: columns_priv, db, procs_priv, tables_priv. Затем выполните flush privileges;

  • 0
    Хороший ответ!! Ваш ответ раскрывает проблему «за кулисами» относительно того, что происходит на самом деле, а не просто «Используйте этот патч, и все готово». Мне нравятся оба типа ответов, все вместе, так что я могу понять это от супа до орехов. Теперь я знаю, сколько работы нужно сделать таким образом, если вы собираетесь делать это правильно - и это еще раз подтверждает, почему следует использовать методы, описанные другими. Потрясающие! Хотя многие из приведенных выше ответов были хорошими, я отдаю вам свой голос, потому что знаю, что значит быть новичком на этом сайте. Они делают очень трудно помогать другим, когда вы новичок.
  • 0
    Это должен быть альтернативный принятый ответ. Я использую mysql 5.5 и DROP USER, если EXISTS еще не доступен, поэтому я должен использовать синтаксис пользователя DELETE FROM (сначала я должен проверить существование пользователя). Удаление только из пользовательской таблицы не сработало. И не сделал FLUSH PRIVILEGES. Вы должны удалить из других таблиц выше.
0

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

Перезагрузите сервер:

# mysql.server restart

Затем выполните команду CREATE USER.

  • 0
    Это не полезно Ошибка произошла на CREATE после DELETE .
0

Недавно я получил эту ошибку.

Что сработало для меня, так это проверка работоспособности mysql "Пользователи и привилегии", и все еще существовал пользователь.

После удаления оттуда я смог воссоздать пользователя.

0

Я знаю, что это старо, но поскольку это первый результат в Google, я решил, что должен добавить свое решение. В моем случае отказ от работы работал нормально, но воссоздание пользователя дало мне "ERROR 2013 (HY000):" Потерянное соединение с сервером MySQL во время запроса "и" ОШИБКА 2006 (HY000): сервер MySQL ушел ". Я попробовал привилегии flush → удалить пользовательское решение, но все равно имел ту же ошибку.

В моем случае ошибка произошла из-за обновления mysql от 5.1 → 5.6. Просмотр журналов ошибок, я заметил, что он сказал, чтобы запустить mysql_upgrade. Сделал ли это и мой созданный пользовательский отчет работу отлично!

0

Сервер MySQL работает с параметром -skip-grant-tables, поэтому он не может выполнить этот оператор

-3

Я также столкнулся с той же проблемой, после нескольких поисков я нашел решение, которое сработало для меня. Надеюсь, это поможет вам. Поскольку вы уже создали пользователей, попробуйте сделать 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 ИДЕНТИФИЦИРОВАН от 'hello';

Теперь новый пользователь создан. Если вы хотите предоставить весь доступ, введите

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

Теперь вы можете выйти из MySQL, набрав \q. Теперь снова войдите через

mysql -u newusername -p, затем нажмите Enter. Вы можете видеть все.

Надеюсь, что это поможет.

-3

Просто удалите связанные с пользователем данные из mysql.db(возможно, из других таблиц), затем заново создайте оба.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню