ОШИБКА 1396 (HY000): сбой операции CREATE USER для 'jack' @ 'localhost' - PullRequest
265 голосов
/ 05 апреля 2011

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

Мой случай: пользователь 'jack' существовал и раньше, но я удалил его из mysql.userчтобы воссоздать его.Я не вижу следов этого в этой таблице.Если я выполню эту команду для какого-то другого случайного имени пользователя, скажем, «jimmy», она будет работать нормально (так же, как это первоначально делалось для «jack»).

Что я сделал, чтобы испортить пользователя «jack» и какМогу ли я отменить это повреждение, чтобы воссоздать 'jack' в качестве действительного пользователя для этой установки MySQL?

См. пример ниже.(Конечно, первоначально, было много времени между созданием «jack» и его удалением.)

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)

Ответы [ 20 ]

478 голосов
/ 13 июня 2011

да, эта ошибка есть. Однако я нашел небольшой обходной путь.

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

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

drop user admin@localhost;
flush privileges;
create user admin@localhost identified by '<i>admins_password</i>'

Приветствия

198 голосов
/ 05 апреля 2011

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

41 голосов
/ 11 января 2013

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

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

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

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

...

Пользователь DROP USER [, user] ...

...

DROP USER 'jeffrey' @ 'localhost';

Если вы указываете только часть имени пользователя в имени учетной записи, используется часть имени хоста в «%».

DROP USER, как представлено в MySQL 5.0.0, удаляет только те учетные записи, которые не имеют привилегий.В MySQL 5.0.2 он также был изменен для удаления привилегий учетной записи.Это означает, что процедура удаления учетной записи зависит от вашей версии MySQL.

Начиная с MySQL 5.0.2, вы можете удалить учетную запись и ее привилегии следующим образом:

DROP USER user;

Оператор удаляет привилегиистроки для учетной записи из всех таблиц предоставления.

Единственный раз, когда я получаю эту ошибку, это когда я делаю DROP USER user;как подсказывает документ, но MySQL не рассматривает «%» как подстановочный знак, который отбрасывает всех пользователей на всех хостах.Это не так дико в конце концов.Или, может быть, это иногда работает, когда он удаляет пользователя localhost, а затем пытается удалить его в%.

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

Я вижу 7 голосов за:

УБРАТЬ ПОЛЬЗОВАТЕЛЯ 'jack @ localhost';// полностью удаляем учетную запись

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

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

34 голосов
/ 05 июля 2015

Если вы используете оператор 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 голосов
/ 05 апреля 2011

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

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

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

12 голосов
/ 15 марта 2012

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

10 голосов
/ 05 апреля 2011

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

6 голосов
/ 18 июня 2017

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

5 голосов
/ 07 января 2013
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 голосов
/ 03 января 2012

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

...