我似乎无法重新创建一个已删除的简单用户,即使是以MySQL中的root身份也是如此。为了重新创建它。我在那张桌子上看不到任何痕迹。如果我对其他随机用户名(例如“ jimmy”)执行此命令,则它可以正常工作(就像最初对“ 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)


#1 楼

尝试执行FLUSH PRIVILEGES;。关于该错误代码的此MySQL错误文章似乎在刷新privs之后报告了与您类似的情况下的某些成功。

评论


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

–罗斯·贝特曼
2011-4-5 17:05



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

– ivo Welch
2015年12月18日,0:20

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

– Shautieh
16-10-28在16:20

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

– David M. Karr
17 Mar 15 '17 at 20:08

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

–爱尔兰语
18-10-22在8:25

#2 楼

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


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

应该解决它。假设我们要创建用户admin @ localhost,则应使用以下命令:

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


干杯

评论


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

–杰克
2012年2月27日在17:35

我也是。我必须先删除用户。

– kgiannakakis
2012年5月10日上午10:21

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

–滚刀
2012年8月2日,0:23

就我而言,仅删除用户就足够了,而无需刷新特权。

– Scadge
14年7月16日在10:19

显然,只是想指出这项工作与客户无关。我正在使用SQLElectron,并在AWS RDS托管的MySQL中遇到相同的错误。这样就解决了。

– bupereira
20-09-29在14:13

#3 楼

自2007年以来,此错误就一直存在于bugs.mysql.com上,并且该线程主要只是直到一年前所有这些错误答案的模仿。

根据MySQL文档,类似CREATE USER的命令,GRANTREVOKEDROP USER不需要后续的FLUSH PRIVILEGES命令。很明显,为什么要读文档。这是因为直接更改MySQL表不会将信息重新加载到内存中。但是,针对该错误的大量解决方案都声称FLUSH PRIVILEGES是答案。这是一个文档阴谋-文档在各个版本中的一个关键位置有所不同。

13.7.1.2。 DROP USER语法

...


DROP USER用户[,用户] ...


.. 。


DROP USER'jeffrey'@'localhost';


如果仅指定帐户名中的用户名部分,则为主机名称部分使用'%'。

MySQL 5.0.0中存在的DROP USER仅删除没有特权的帐户。在MySQL 5.0.2中,已对其进行了修改以删除帐户特权。这意味着删除帐户的过程取决于您的MySQL版本。

从MySQL 5.0.2开始,您可以删除帐户及其特权,如下所示:

该语句从所有授权表中删除该帐户的特权行。

我唯一遇到此错误的时间是当我执行DROP USER user时;就像文档所建议的那样,但是MySQL不会以将所有主机上的所有用户都丢弃的方式将'%'视为通配符。毕竟不是那么疯狂。或者,它可能有时在删除localhost用户然后尝试删除%1的本地用户时起作用。

对我来说很清楚,当它尝试删除%处的用户时,它将发出错误消息并退出。由于从未删除本地用户,后续在本地的CREATE USER将失败。似乎没有必要浪费时间在赠款表上挖掘以寻找鬼魂,正如一位海报建议的那样。

我看到7票赞成: 'jack @ localhost'; //完全删除帐户与删除的第一个创建的用户(在安装新的mysql服务器之后)有关。我不知道该错误是否已修复。但我不记得最近发生过这种情况,目前我的版本是5.5.27。

评论


您是MySQL文档编写者吗?

–起搏器
15年1月14日在10:15

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

–切碎
18年9月11日13:43

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

–han独奏
19年7月3日在6:40



刚遇到MySQL 8.0.22上的问题,@ tver3305的解决方案对我有用。那个虫子现在已经是老城区了。

–诽谤
20/11/29在3:14

#4 楼

如果在DELETE表上使用mysql.user语句试图删除用户,然后尝试使用CREATE USER重新建立用户,则会收到1396错误。通过运行DROP USER 'username'@'host';

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


摆脱此错误(如果尝试重新创建插孔,将出现1396错误)。 br />
(通过运行DROP USER摆脱这种情况) )

#5 楼

您不应该以这种方式手动删除用户。 MySQL具有用于删除特权的REVOKE语法以及用于删除特权的DROP USER语法:

评论


这是真正的答案,但不是我遇到的问题(由我的愚蠢造成)。非常感谢您让我直率!

–罗斯·贝特曼
2011年4月5日在17:02

@Marc,然后,为什么他们甚至还发明了冲洗特权?官方的MySQL文档确实在谈论诸如从user删除的内容,其中user ='jack';和冲洗特权。您为什么说它们不属于所提供的工具?

–起搏器
2015年1月14日在10:18



正如@ user1969061指出的那样,此处的“ jack @ localhost”可能应该是“ jack” @“ localhost”。

– jochen
15年11月1日在18:20

#6 楼

删除用户,刷新特权;然后,创建用户。确实有效!

评论


在删除用户之前,仅刷新特权无效。谢谢。

–布兰登·菲茨帕特里克(Brandon Fitzpatrick)
2015年6月8日在18:07



#7 楼

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

评论


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

–罗斯·贝特曼
2011年4月5日在17:03

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

–囚犯13
17-10-18在7:20

#8 楼

在MySQL 5.6中,无法使用Drop user userid;。使用:Drop user 'userid'@'localhost';和/或Drop user 'userid'@'%';。这样,我就可以删除用户并重新创建它。

#9 楼

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


#10 楼

检查是否


'user'@'%'





'user' @'localhost'


#11 楼

如果要使用sql删除用户,则需要删除以下表中的相关数据:columns_privdbprocs_privtables_priv。然后执行flush privileges;

评论


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

–囚犯13
17-10-18在1:23

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

–alds
18年7月11日在9:37

#12 楼

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

#13 楼

有关此问题的简单解决方法。由于“删除”命令仅删除“ mysql”数据库的“用户”表中的用户记录,因此我们可以将其添加回去,然后完全删除用户。然后您可以创建具有相同名称的用户。

步骤1.在mysql数据库中找到用户表的记录格式

use mysql;
select * from user;


步骤2。根据步骤1中显示的列,使用用户名创建一个虚拟记录。将其插入表中,例如,提醒您用用户名替换“用户名”。数据以使其正常工作。

步骤3.删除用户。

评论


尝试DESCRIBE

–囚犯13
17-10-18在1:21

#14 楼

这篇文章MySQL错误1045(28000):用户'bill'@'localhost'的访问被拒绝(使用密码:YES)很有用。有时,会有一个匿名用户“ @'localhost”或“ @'127.0.0.1”。因此,要解决该问题,


首先删除其“创建用户”失败的用户。
创建新用户。
授予新用户所需的特权。
刷新特权。


评论


谢谢你我忘记运行删除了匿名用户的mysql_secure_installation。

– ablackhat
17年8月21日在8:42

#15 楼

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

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


#16 楼

我遇到了与OP相同的问题,并且可接受的答案对我不起作用。在接受的答案的评论中,@ Rathish发布了一个对我有用的解决方案,我想引起人们的注意。
这里是链接:
https://www.rathishkumar.in/2018/ 10 / Error-1396-HY000-Operation-CREATE-DROP-USER-failed-for-user-host.html
Rathish的解决方案是撤销所有用户的访问权限:
REVOKE ALL ON *.* FROM 'user'@'host';
DROP USER 'user'@'host';
FLUSH PRIVILEGES;

还有益地指出,可以通过选择“用户”和“主机”来确定您是否有上次操作留下的残留用户来查询下表:
mysql.user: User accounts, global privileges, and other non-privilege columns
mysql.db: Database-level privileges
mysql.tables_priv: Table-level privileges
mysql.columns_priv: Column-level privileges
mysql.procs_priv: Stored procedure and function privileges
mysql.proxies_priv: Proxy-user privilege

!谢谢! />

#17 楼

MySQL服务器正在使用--skip-grant-tables选项运行,因此它无法执行此语句

#18 楼

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

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

#19 楼

我最近收到此错误。

对我有用的是在mysql工作台中检查“用户和特权”,并意识到用户仍然存在。

从那里删除它之后,我能够重新创建用户。

#20 楼

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

重新启动服务器:

# mysql.server restart

然后执行CREATE USER命令。

评论


这没有用。删除后在CREATE遇到错误。

– Waqasgard
18/12/13在10:09

#21 楼

我今天遇到了这个问题,并通过执行以下步骤解决了这个问题:

1)手动将麻烦的用户(提供必填字段的值)插入到mysql.user中, “ lang-sql prettyprint-override”> 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)A.

 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)
 


希望有帮助。

#22 楼

似乎需要为数据库创建用户并为创建的用户授予特权
->为数据库创建用户
CREATE  USER <'username'>@'%'IDENTIFIED BY <'password'>;

ex-创建用户'root'@'%'IDENTIFIED BY' root';
->授予特权
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON <db name>.* TO '<username>'@'%';

-授予mydb上的所有特权。*至'root'@'%';

#23 楼

只需从mysql.db中删除与用户相关的数据(也许也从其他表中删除),然后重新创建两者即可。

#24 楼

我也遇到了同样的问题,经过几次搜索,我找到了一个对我有用的解决方案。希望对您有所帮助。
由于您已经创建了用户,现在尝试在Mysql控制台上执行FLUSH PRIVILEGES
此问题已存在于MySql Bug中。您也可以检查此问题。现在刷新后,您可以创建一个新用户。可以看到Mysql控制台。
Step-1: Open terminal Ctrl+Alt+T
Step-2: mysql -u root -p  , it will ask for your MySQL password.

您可以输入所需的用户名来代替用户名。如果在本地计算机上运行Mysql,则键入“ localhost”而不是主机,否则输入您要访问的服务器名称。
例如:CREATE USER smruti @ localhost由'hello'标识;
现在创建新用户。如果要授予所有访问权限,请键入
GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost';
现在可以通过键入\q退出MySQL。现在再次通过
mysql -u newusername -p登录,然后按Enter。您可以看到所有内容。
希望对您有所帮助。