【问题标题】:How to fix ERROR 1726 (HY000): Storage engine 'MyISAM' does not support system tables. in Mysql 8.0 after CREATE USER如何修复 ERROR 1726 (HY000):存储引擎“MyISAM”不支持系统表。在 CREATE USER 之后的 Mysql 8.0
【发布时间】:2019-06-14 23:48:32
【问题描述】:

我安装了 Debian Stretch 和新安装的 Mysql 8.0(配置尚未更改)。当我尝试使用以下方式创建新用户时:

mysql> CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'xyz';

我得到了以下信息:

ERROR 1726 (HY000):存储引擎“MyISAM”不支持系统 表。 [mysql.db]

关于问题可能是什么的任何建议?

谢谢

【问题讨论】:

    标签: mysql-8.0 createuser


    【解决方案1】:

    您或许应该考虑离开 MyISAM。 InnoDB 是 MySQL 自 5.6 以来的默认引擎,MySQL 8.0 将是最后一个对其提供有限支持的版本。

    您可以在this Percona blog post阅读详细信息

    【讨论】:

    • 升级后是否运行了升级脚本?它应该已将系统表更改为 InnoDB。
    • 它是全新安装,没有数据迁移。我刚刚加载了一个数据库(来自 5.6 的转储),其中所有表都在 InnoDB 中并尝试创建新用户。
    • 是整个数据库的转储还是您自己的模式?如果是整个数据库,转储中的系统表可能会覆盖安装中的系统表。
    • 这是自己的架构。我注意到系统表确实在 MyISAM 中。我通过重新安装 Mysql 对问题进行了排序。重新安装后表是 InnoDB,我成功创建了用户并加载了相同的数据库转储。我不能说究竟是什么将系统表更改为 MyISAM。第一次尝试的唯一变化是加载失败,因为 ROW_FORMAT=FIXED 由少数自己的表在转储中(使用 sed -ie 's/ROW_FORMAT=FIXED//g' 排序)。
    【解决方案2】:

    正如@Mae 下面建议的那样,请确保在执行任何这些步骤之前停止服务器。

    正如@Sarel 建议的那样,这个解决方案执行了我在下面执行的所有步骤,但使用 MySQL 的方式可能是最安全的。

    mysqld --upgrade=FORCE
    

    https://dev.mysql.com/doc/refman/8.0/en/server-options.html#option_mysqld_upgrade

    服务器升级数据字典、Performance Schema 和 INFORMATION_SCHEMA

    谢谢@Sarel!

    我之前的帖子供历史参考:

    我已经将数据库备份恢复到我的新开发 MySQL 8 系统中,并且没有考虑并覆盖了 MySQL 数据库表。修复起来并不难,只是稍微修改了一段时间,这就是修复它的原因。

    alter table mysql.db ENGINE=InnoDB;
    alter table mysql.columns_priv ENGINE=InnoDB;
    

    之后,我就可以毫无问题地创建用户了。

    密钥在错误消息中。

    ERROR 1726 (HY000): Storage engine 'MyISAM' does not support system tables. [mysql.db]
    

    所以我知道 mysql.db 是 MyISAM 并且需要其他东西,所以我将其更改为 InnoDB。

    希望对某人有所帮助!

    如果您的 MySQL 数据库是错误的类型,则可以使用,或者其他替代方法是初始化您的数据库

    mysqld --initialize
    

    这将重新创建这一切。如果您可以在这样做之前转储 SQL,那总是最好的。

    【讨论】:

    • 要小心。您最终可能会看到“无法从 mysql.db 加载。表可能已损坏”
    • 我刚刚得到了 mysql.db 表的“损坏”状态。 :(关于如何解决这个问题的任何想法?
    • 同样的问题,有人修复了吗?
    • 如果您的 mysql 数据库已损坏,您可以随时使用 mysqld --initialize 重新创建它
    • 要修复损坏的数据库错误,请参阅下面的答案。
    【解决方案3】:

    在全新安装 MySQl 8.0 然后重新加载旧的 (v 5.7) 转储文件后,我遇到了同样的问题。 解决方案是删除并重新安装 MySQL,这次从 5.7 MySQL 创建了一个新的转储文件,其中仅包含我自己的表,不包括系统表,并将它们导入 v 8.0 MySQL。一切都完美无缺。

    【讨论】:

      【解决方案4】:

      不同的解决方案: 我有一个 MySQL 5.7 中所有数据库的 MySQL 转储,包括 mysql 表。导入整个转储文件夹(包括这个 mysql 表)后,我得到了这个错误。 在完全重新安装 MySQL 8.0.21 并从转储文件夹中删除 mysql 表后,一切都按预期工作。

      【讨论】:

      • mysql 是数据库,而不是表。
      【解决方案5】:

      不要运行 alter table 来强制将 mysql.db 更改为 innodb。您最终会遇到不同的错误,例如“无法从 mysql.db 加载”。该表可能已损坏'。如果您确实这样做了,以下内容也将解决此问题。

      我将转储从 5.7 恢复到新的 8.0 服务器,然后遇到了这个问题。

      要修复它,请停止 mysql 服务,然后运行此命令以使 mysql 8 升级内部架构:

      mysqld --upgrade=FORCE
      

      您可以查看日志以查看其进度以及是否有任何错误。

      【讨论】:

      • 我喜欢这个答案,我从未见过这个选项。哪个版本的 MySQL 发布的?
      • 没有线索。我只在其他网站上看到过一次提及它,但没有关于它是否有效的报告。就我而言,它确实有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 2012-10-09
      • 2011-12-23
      • 2015-03-08
      • 2011-07-27
      相关资源
      最近更新 更多