【问题标题】:ERROR 1396 (HY000): Operation CREATE USER failed for 'jack'@'localhost'错误 1396 (HY000): 'jack'@'localhost' 的操作 CREATE USER 失败
【发布时间】:2011-07-30 03:29:41
【问题描述】:

我似乎无法重新创建一个已删除的简单用户,即使是 MySQL 中的 root。

我的情况:用户 '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)

【问题讨论】:

标签: mysql mysql-management


【解决方案1】:

是的,这个错误就在那里。不过,我找到了一个小解决方法。

  • 假设用户在那里,所以删除用户
  • 删除用户后,需要刷新mysql权限
  • 现在创建用户。

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

删除用户 admin@localhost; 刷新特权; 创建由“admins_password”标识的用户 admin@localhost

干杯

【讨论】:

  • 单独刷新权限对我不起作用。删除用户修复了所有问题。谢谢。
  • 对我来说也一样。我必须先删除用户。
  • @QuantumMechanic 解决方案对我不起作用,但 drop 然后 flush 起作用了。
  • 在我的例子中,仅仅删除用户就足够了,没有刷新权限。
  • 只是想指出不管客户如何,这都能奏效,显然。我正在使用 SQLElectron,并且在 AWS RDS 中托管的 MySQL 中遇到了同样的错误。这解决了它。
【解决方案2】:

尝试使用FLUSH PRIVILEGES;This MySQL bug post on that error code 在刷新 privs 后似乎在与您类似的情况下报告了一些成功。

【讨论】:

  • 我发现了这个建议,并在早些时候尝试过,但没有成功,但也许还有其他问题。再次尝试,然后与另一个用户重新创建情况,我发现这确实起到了作用。当然,今天的正式回答是“不要傻”,使用 REVOKE 和 DROP USER 来做正确的事。我感谢所有三个答案(这个答案恰好是让我摆脱目前困境的答案)。
  • 现在是2016年,mysql是v14.14,还是坏了。
  • 我首先需要按照@tver3305 的回答删除用户。
  • 我在 10.1.21 中看到了同样的问题,但“刷新权限”没有任何区别。我删除了用户,刷新,然后创建,它在第 7 行失败并显示“错误 1396 (HY000):操作 CREATE USER 失败...”。我希望我能让 mysql/mariadb 详细说明那个错误,比如为什么它失败了。
  • 即使我尝试删除用户也出现错误,“刷新权限”对我不起作用,经过一番研究后,我通过撤销所有访问权限并删除用户,我不这么认为,flush操作在类似情况下会有帮助,我已经在本页分享了我的详细解释rathishkumar.in/2018/10/…
【解决方案3】:

这个错误自 2007 年以来一直存在于 bugs.mysql.com 上,而且这个帖子主要只是对一年前所有错误答案的模仿。

根据 MySQL 文档,CREATE USERGRANTREVOKEDROP USER 等命令不需要后续的 FLUSH PRIVILEGES 命令。如果阅读文档,原因就很清楚了。这是因为直接更改 MySQL 表不会将信息重新加载到内存中;然而,针对此错误的大量解决方案声称FLUSH PRIVILEGES 就是答案。

这甚至可能不是一个错误。这是一个文档阴谋 - 文档在一个关键位置因版本而异。

13.7.1.2。删除用户语法

...

删除用户用户 [, 用户] ...

...

删除用户'jeffrey'@'localhost';

如果您仅指定帐户名的用户名部分,则使用“%”的主机名部分。

DROP USER 出现在 MySQL 5.0.0 中,只删除没有权限的帐户。在 MySQL 5.0.2 中,它也被修改为删除帐户权限。这意味着删除帐户的过程取决于您的 MySQL 版本。

从 MySQL 5.0.2 开始,您可以按如下方式删除帐户及其权限:

DROP USER 用户;

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

我得到这个错误的唯一一次是当我做DROP USER user;就像文档建议的那样,但是 MySQL 不会将 '%' 视为通配符,从而会删除所有主机上的所有用户。毕竟不是那么狂野。或者,它有时会在删除 localhost 用户然后尝试删除位于 % 的用户时起作用。

我很清楚,当它试图在 % 处删除用户时,它会发出一条错误消息并退出。 localhost 的后续CREATE USER 将失败,因为从未删除 localhost 用户。似乎没有必要像一位海报所说的那样浪费时间在拨款表中寻找幽灵。

我看到 7 票赞成:

DROP USER 'jack@localhost'; // 彻底删除账号

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

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

【讨论】:

  • 你是 MySQL 文档作者吗?
  • 这就是我的答案。 Mariadb 继承了这个错误。
  • 为什么这不是公认的答案:/。无论如何,谢谢@user1969061。这在mariadb-server-5.5.60-1.el7_5.x86_64 对我来说当然有用
  • 刚刚在 MySQL 8.0.22 上遇到了这个问题,@tver3305 的解决方案对我有用。那个虫子现在已经是老镇长了。
【解决方案4】:

如果您在mysql.user 表上使用DELETE 语句来尝试删除用户,然后尝试使用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 不会受伤,但一定要先放弃用户。)

【讨论】:

  • 这为我解决了问题。我不小心使用了用户删除,而不是删除用户,flush privileges; 仍然无法修复它。
【解决方案5】:

您不应该以这种方式手动删除用户。 MySQL 有REVOKE 语法用于删除权限,DROP USER 用于删除它们:

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

最好使用提供的工具,而不是在后台乱搞。

【讨论】:

  • 这是真正的答案,但不是我遇到的问题(这是由我的愚蠢造成的)。非常感谢你让我直截了当!
  • @Marc,那么,他们为什么还要发明flush privileges? MySQL 官方文档 谈论诸如delete from user where user = 'jack';flush privileges 之类的东西。为什么说它们不是所提供工具的一部分?
  • 正如@user1969061 指出的那样,'jack@localhost' 应该在这里是'jack'@'localhost'
【解决方案6】:

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

【讨论】:

  • 在我删除用户之前,仅刷新权限不起作用。谢谢。
【解决方案7】:

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

【讨论】:

  • 这有助于我了解我是如何损坏我的安装的。非常感谢。
  • 进一步阅读 Fely 的评论。涉及的表更多。
【解决方案8】:

在 MySQL 5.6 中使用 Drop user userid; 不起作用。使用:Drop user 'userid'@'localhost'; 和/或Drop user 'userid'@'%';。通过这种方式,我能够删除用户并重新创建它。

【讨论】:

    【解决方案9】:

    检查是否是

    '用户'@'%'

    '用户'@'本地主机'

    【讨论】:

      【解决方案10】:
      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';
      

      【讨论】:

        【解决方案11】:

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

        【讨论】:

        • 很好的答案!您的回答暴露了“幕后”问题,即实际发生的事情,而不仅仅是“使用此补丁,一切顺利”。我喜欢将这两种类型的答案放在一起,所以我可以从汤到坚果都理解它。现在我知道,如果你要正确地做到这一点,这样做需要做多少工作——这进一步强化了为什么应该使用其他人概述的方法。惊人的!尽管上面的许多答案都很好,但我给你投票是因为我知道成为这个网站的新手是什么感觉。当您是新手时,他们很难帮助他人。
        • 这应该是一个可以接受的替代答案。我正在使用 mysql 5.5 并且 DROP USER IF EXISTS 尚不可用,因此我必须使用 DELETE FROM 用户语法(我必须先测试用户是否存在)。单独从用户表中删除是行不通的。 FLUSH PRIVILEGES 也没有。您必须从上面的其他表格中删除。
        【解决方案12】:

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

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

        【讨论】:

          【解决方案13】:

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

          步骤1.在mysql数据库中查找user表的记录格式

          use mysql;
          select * from user;
          

          Step 2. 根据step1显示的列,用用户名创建一个虚拟记录。将其插入表格中,例如提醒将“用户名”替换为您的用户名。

          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
          【解决方案14】:

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

          【讨论】:

            【解决方案15】:

            已解决 MySql 的 BUG:错误代码 1396

            • 每当您尝试运行创建用户的查询时,如下所示。 MySql> CREATE USER 'springstudent'@'localhost' IDENTIFIED BY 'springstudent'; 授予 * 上的所有特权。 * TO 'springstudent'@'localhost';
            • 但是当您尝试运行在所有权限内创建用户的查询时, 由于它创建的错误会在不显示用户的情况下提供特权
            • 由于这个问题,我们需要使用这个脚本来刷新权限 MySql> 删除用户'springstudent'@'localhost'; 刷新特权; 创建由“admins_password”标识的用户 admin@localhost
            • 删除用户后,需要刷新mysql权限
            • 然后再次创建用户

            搞定了.... 解决了....

            【讨论】:

              【解决方案16】:

              这个帖子MySQL ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)很有用。有时,有一个匿名用户 ''@'localhost' 或 ''@'127.0.0.1'。所以,要解决这个问题,

              1. 首先删除“创建用户”失败的用户。

              2. 创建新用户。

              3. 向新用户授予所需的权限。

              4. 刷新权限。

              【讨论】:

              • 谢谢。我忘记运行删除匿名用户的 mysql_secure_installation。
              【解决方案17】:

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

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

              希望这会有所帮助。

              【讨论】:

              • 为我工作。最佳答案,解释清楚!
              【解决方案18】:

              您似乎需要为您的数据库创建用户并为创建的用户授予权限

              -->为数据库创建用户

              CREATE  USER <'username'>@'%'IDENTIFIED BY <'password'>;
              

              ex - CREATE USER 'root'@'%'IDENTIFIED BY 'root';

              --> 授予权限

              FLUSH PRIVILEGES;
              GRANT ALL PRIVILEGES ON <db name>.* TO '<username>'@'%';
              

              ex- GRANT ALL PRIVILEGES ON mydb.* TO 'root'@'%';

              【讨论】:

                【解决方案19】:

                我遇到了与 OP 相同的问题,接受的答案对我不起作用。在接受答案的 cmets 中,@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
                

                谢谢!

                【讨论】:

                  【解决方案20】:

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

                  【讨论】:

                    【解决方案21】:

                    我知道这是旧的,但由于它是谷歌的第一个结果,我想我应该添加我的解决方案。在我的情况下,删除用户工作正常,但重新创建用户给了我“错误 2013 (HY000):在查询期间丢失与 MySQL 服务器的连接”和“错误 2006 (HY000):MySQL 服务器已消失。”我尝试了刷新权限 -> 删除用户解决方案,但仍然有同样的错误。

                    在我的情况下,错误是由于 mysql 从 5.1 -> 5.6 升级造成的。查看错误日志,我注意到它说运行 mysql_upgrade。这样做和我的创建用户语句工作正常!

                    【讨论】:

                      【解决方案22】:

                      我最近遇到了这个错误。

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

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

                      【讨论】:

                        【解决方案23】:

                        mysql&gt; DELETE FROM mysql.db WHERE user = 'jack'

                        重启服务器:

                        # mysql.server restart

                        然后执行CREATE USER 命令。

                        【讨论】:

                        • 这没用。在DELETE 之后的CREATE 上遇到错误。
                        【解决方案24】:

                        我遇到此错误的原因是我从 mysql.user 中显式删除,而不是从 mysql.db 中删除

                        事实证明,如果 create 中的用户名存在于 user 或 db 中,则会出现此错误。通过做来解决 从 mysql.user 中删除 User == 'user@bar'; 从 mysql.db 中删除 User == 'user@bar';

                        【讨论】:

                          【解决方案25】:

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

                          【讨论】:

                            【解决方案26】:

                            我也遇到了同样的问题,经过几次搜索后,我找到了一个适合我的解决方案。希望对您有所帮助。 由于您已经创建了用户,现在尝试在您的 Mysql 控制台上执行FLUSH PRIVILEGESThis issue is already in MySql bug post.这个也可以查看。现在刷完之后就可以新建用户了。 请按照以下步骤操作:

                            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" 而不是主机,否则请输入您要访问的服务器名称。

                            例如:CREATE USER smruti@localhost IDENTIFIED by 'hello';

                            现在新用户已创建。如果您想授予所有访问权限,请键入

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

                            现在你可以通过输入\q退出MySQL。现在再次登录

                            mysql -u newusername -p ,然后按 Enter。你可以看到一切。

                            希望这会有所帮助。

                            【讨论】:

                              猜你喜欢
                              • 2014-01-09
                              • 2015-03-08
                              • 1970-01-01
                              • 2020-05-23
                              • 2017-12-18
                              • 1970-01-01
                              • 2019-11-18
                              • 2013-09-05
                              相关资源
                              最近更新 更多