错误1396(HY000):“杰克” @“本地主机”的操作创建用户失败


310

我似乎无法重新创建一个已删除的简单用户,即使以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)

Answers:


233

尝试做一个FLUSH PRIVILEGES;关于该错误代码的此MySQL错误帖子似乎在刷新privs之后报告了与您类似的情况下的一些成功。 


13
我发现了这个建议,并较早地尝试了但没有成功,但是也许其他地方是错误的。现在再次尝试,然后与另一个用户重新创建情况,我发现这确实可以解决问题。当然,今天的正式答案是“不要傻”,并使用REVOKE和DROP USER正确地做。我对这三个答案都感激不尽(这恰好是使我摆脱当前困境的一个答案)。
Russ Bateman

13
是2016年,mysql版本是v14.14,现在仍然坏了。
ivo Welch 2015年

4
我首先需要根据@ tver3305答案删除用户。
Shautieh

9
我在10.1.21中看到了相同的问题,但是“刷新权限”没有任何区别。我放下用户,刷新,然后创建,该操作失败,并在第7行出现“错误1396(HY000):操作CREATE USER失败……”。我希望我可以让mysql / mariadb详细说明该错误,例如为什么会失败。
David M. Karr

3
即使我也尝试删除用户,我也收到错误消息,“刷新特权”对我不起作用,经过一些研究,我找到了通过撤消所有访问权并删除用户的解决方案,我认为不是,冲洗操作将在类似情况下提供帮助,我在此页面上分享了我的详细解释rathishkumar.in/2018/10/…–
Rathish

545

是的,这个错误在那里。但是,我发现了一个小的解决方法。

  • 假设用户在那里,因此删除该用户
  • 删除用户后,需要刷新mysql特权
  • 现在创建用户。

那应该解决。假设我们要创建用户admin @ localhost,将是以下命令:

删除用户admin @ localhost;
同花顺特权;
创建由“ admins_password ”
 标识的用户admin @ localhost

干杯


58
单凭冲洗特权对我不起作用。删除用户即可修复所有问题。谢谢。
2012年

3
我也是。我必须先删除用户。
kgiannakakis 2012年

3
@QuantumMechanic解决方案对我不起作用,但先滴然后冲洗就可以了。
滚刀

在我的情况下,仅删除用户就很糟糕,没有刷新权限。
Scadge 2014年

这是一个巨大的救星-就像@Jake上面的关键部分是本地用户部分的drop用户
kellyfj15

46

自2007年以来,此错误就一直位于bugs.mysql.com上,并且该线程主要只是所有错误答案的鹦鹉,直到一年前。

据MySQL文档,命令一样CREATE USERGRANTREVOKE,并且DROP USER不需要后续的FLUSH PRIVILEGES命令。很明显,为什么要阅读文档。这是因为直接更改MySQL表不会将信息重新加载到内存中。但是,针对该错误的众多解决方案声称FLUSH PRIVILEGES就是答案。

这甚至可能不是错误。这是文档的阴谋-不同版本的文档在一个关键的位置上有所不同。

13.7.1.2。删除用户语法

...

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用户然后尝试删除%1时有效。

对我来说很清楚,当它尝试删除%处的用户时,它将发出错误消息并退出。CREATE USER由于本地主机用户从未被删除,因此在本地主机的后续操作将失败。似乎没有必要浪费时间在赠款表上寻找幽灵,就像一个海报所暗示的那样。

我看到7票赞成:

删除用户'jack @ localhost'; //完全删除帐户

解释为DROP USER 'jack@localhost'@'%';#错误

实际上似乎确实有一个错误会生成相同的错误消息,但这与删除的第一个创建的用户(在安装了新的mysql服务器之后)有关。我不知道该错误是否已修复。但我不记得最近发生过这种情况,目前我的版本是5.5.27。


8
您是MySQL文档编写者吗?
和平者

这就是我的答案。Mariadb继承了此错误。
19:11的

为什么这不是公认的答案:/。无论如何,谢谢@ user1969061。这无疑为我工作中mariadb-server-5.5.60-1.el7_5.x86_64
韩独奏

36

如果您DELETEmysql.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'在这里。
jochen 2015年


10

尝试delete from mysql.db where user = 'jack'然后创建一个用户


1
这对帮助我了解如何损坏我的安装很有用。非常感谢你。
Russ Bateman

进一步阅读Fely的评论。涉及更多表。
囚犯


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


4

如果你想删除与SQL用户,你需要在这些表中删除相关数据:columns_privdbprocs_privtables_priv。然后执行flush privileges;


好答案!您的答案暴露出实际发生的“幕后”问题,而不仅仅是“使用此补丁程序,您就很好了”。我喜欢同时包含两种答案,因此我可以从汤到坚果都可以理解。现在,我知道如果您要正确执行此操作,将有多少工作-这进一步强调了为什么一个人应该使用其他人概述的方法。太棒了!尽管上面的许多答案都不错,但我还是给我投票,因为我知道成为该网站的新手会怎样。当您刚入门时,他们真的很难帮助别人。
囚犯

这应该是另一种可接受的答案。我正在使用mysql 5.5,并且DROP USER IF EXISTS尚不可用,因此我必须使用DELETE FROM用户语法(我必须首先测试用户的存在)。仅从用户表中删除是行不通的。冲洗特权也没有。您必须从上面的其他表中删除。
alds

3

有关此问题的简单解决方法。由于“删除”命令仅删除“ 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>
囚犯

3

有趣的是,MySQL工作台为我解决了它。在“管理”选项卡->“用户和特权”中,列出了该用户,但有错误。使用删除选项解决了该问题。



2

我有同样的错误。但是命令“冲洗特权”;没有帮助。我确实喜欢这样:

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


0

我知道这很旧,但是由于它是Google的第一个结果,所以我认为我应该添加解决方案。以我为例,删除用户可以正常工作,但是重新创建用户给我一个“错误2013(HY000):在查询过程中丢失与MySQL服务器的连接”和“错误2006(HY000):MySQL服务器已消失。” 我尝试了刷新特权->删除用户解决方案,但仍然遇到相同的错误。

在我的情况下,错误是由于MySQL从5.1-> 5.6升级所致。查看错误日志时,我注意到它说要运行mysql_upgrade。这样做了吗,我的create user语句运行正常!


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

希望这可以帮助。


-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。现在再次登录

mysql -u newusername -p,然后按Enter。您可以看到所有内容。

希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.