ОШИБКА 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 по этому коду ошибки, по- видимому, сообщает о некотором успехе в случае, аналогичном вашему после очистки привилегий. 

QuantumMechanic
источник
13
Я нашел это предложение и попробовал его раньше, но безуспешно, но, возможно, что-то еще было не так. Попробовав это сейчас, затем воссоздав ситуацию с другим пользователем, я обнаружил, что это действительно помогло. Конечно, сегодня формальным ответом было «не быть глупым» и использовать REVOKE и DROP USER, чтобы сделать это правильно. Я в долгу перед всеми тремя ответами (именно этот, как раз тот, который вытащил меня из моего нынешнего затруднения).
Расс Бейтман
13
Это 2016, mysql на v14.14, и он все еще не работает.
Иво Уэлч
4
Сначала мне нужно было удалить пользователя в соответствии с ответом @ tver3305.
Shautieh
9
Я вижу ту же проблему с 10.1.21, но "сброс привилегий" не имеет никакого значения. Я удаляю пользователя, сбрасываю и затем создаю, что приводит к ошибке «ОШИБКА 1396 (HY000) в строке 7: Операция CREATE USER не выполнена для ...». Хотел бы я, чтобы mysql / mariadb немного проработал эту ошибку, например, ПОЧЕМУ она не удалась.
Дэвид М. Карр
3
Я получаю сообщение об ошибке, даже когда пытаюсь удалить пользователя, «сброс привилегий» у меня не работает, после небольшого исследования я нашел решение, отозвав все права доступа и удалив пользователя, я так не думаю Операция сброса
Rathish
545

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

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

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

удалить пользователя admin @ localhost;
сбрасывать привилегии;
создать пользователя admin @ localhost, идентифицированного как ' admins_password '

ура

tver3305
источник
58
Одни только флеш-привилегии не сработали. сбросив пользователя все исправил. Спасибо.
Джейк
3
Мне то же. Я должен был сначала удалить пользователя.
kgiannakakis
3
Решение @QuantumMechanic не сработало для меня, но дроп-флеш сработало.
варенье
В моем случае просто удаление пользователя было достаточно, без очистки привилегий.
Scadge
Это было ОГРОМНОЕ спасение жизни - как в случае с @Jake выше ключевой частью был дроп-пользователь с частью localhost
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 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 не удастся, потому что пользователь localhost никогда не удалялся. Похоже, нет необходимости тратить время на копки в таблицах грантов в поисках призраков, как предложил один из авторов.

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

DROP USER 'jack @ localhost'; // полностью удаляем аккаунт

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

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

user1969061
источник
8
Вы писатель документов MySQL?
Pacerier
Это был ответ для меня. Мариадб унаследовал эту ошибку.
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
Это был реальный ответ, но не на проблему, которая у меня была (которая была создана моей глупостью). Большое спасибо за то, что выправили меня!
Расс Бейтман
@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'и создайте пользователя

a1ex07
источник
1
Это помогло мне понять, как я повредил мою установку. Большое спасибо.
Расс Бейтман
Читайте дальше вплоть до комментария Фели. Есть больше таблиц.
Заключенный 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';
TonyWu
источник
5

Проверьте, если есть

'Пользователь' @ '%'

или

«Пользователь» @ «локальный»

Инес Гомес
источник
4

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

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

Как ни странно, рабочая среда MySQL решила это за меня. На вкладке «Администрирование» -> «Пользователи и привилегии» пользователь был указан с ошибкой. Использование опции удаления решило проблему.

juettemann
источник
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 ERROR 1045 (28000): Доступ запрещен для пользователя 'bill' @ 'localhost' (используется пароль: YES) . Иногда есть анонимный пользователь '' @ 'localhost' или '' @ '127.0.0.1'. Итак, чтобы решить проблему,

  1. сначала удалите пользователя, чей «создать пользователя» не удалось.

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

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

  4. Сбросить привилегии.

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

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

CREATE USER 'jimmy'@'localhost' IDENTIFIED BY 'test123';
UPDATE mysql.user SET USER='jack' WHERE USER='jimmy';
Мусор
источник
0

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

Ирфан Хабиб
источник
0

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

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

вики
источник
0

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

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

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

dmena
источник
0

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

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

# mysql.server restart

Тогда сделай свою CREATE USERкоманду.

emallove
источник
Это не полезно Ошибка возникла CREATEпосле DELETE.
Вакасгард
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)

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)

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

Моника Мендиратта
источник
-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, ИДЕНТИФИЦИРОВАННОГО 'hello';

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

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

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

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

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

PyDevSRS
источник