如何将 MAIN mysql 数据库从 MyIsam 转换为 InnoDB

Posted

技术标签:

【中文标题】如何将 MAIN mysql 数据库从 MyIsam 转换为 InnoDB【英文标题】:How to convert MAIN mysql database to InnoDB from MyIsam 【发布时间】:2019-03-08 00:30:18 【问题描述】:

我正在尝试管理 mysql 组复制,但在操作用户和授权时发现了一个问题。主 mysql 数据库中的 10 个主 mysql 表是 MyIsam。所以我不能添加数据库或用户权限,因为它们失败并且不会复制。 主-主组复制需要一切 InnoDB。

ALTER TABLE 在常规自定义数据库/表上运行良好,但如何在主 mysql 数据库上解决此问题?

我试过了,但都失败了:

ALTER TABLE mysql.db ENGINE = InnoDB;
ALTER TABLE mysql.tables_priv ENGINE = InnoDB;
ALTER TABLE mysql.user ENGINE = InnoDB;

错误: 错误 1726 (HY000):存储引擎“InnoDB”不支持系统表。

另一个运行 CREATE USER 的错误...

[ERROR] 插件 group_replication 报告:'Table db 不使用 InnoDB 存储引擎。这与组复制不兼容'

ERROR 3098 (HY000): 表不符合外部插件 group_replication 的要求。

服务器版本:5.7.23-log MySQL Community Server

【问题讨论】:

我不确定这里有什么问题。复制应该可以在 MyISAM 和 InnoDB 引擎上正常工作...你是否在不同的 MySQL 版本之间使用复制? 三个盒子都是同一个版本。我根本不想使用 MyIsam。我想将它们更改为 InnoDB。如果我停止组复制,我可以添加新用户和权限,但是当复制在线时,这样做会出错。 我认为您正在尝试解决错误的问题。您无法更改系统表的引擎(如果可以的话,它不会对复制产生影响),它们由服务器固定和管理(如果您真的希望它们成为 InnoDB,请升级到 MySQL 8)。您应该问的问题(并详细说明您做了什么、您的配置以及究竟发生了什么/没有发生什么)是:“为什么我的 grant-statements 不会复制?” 在常规数据库上运行任何命令都可以正常复制。运行任何类型的 CREATE/GRANT/ALTER 调整 mysql 表并得到 [ERROR] Plugin group_replication 报告:'Table db 不使用 InnoDB 存储引擎。这与组复制不兼容' 这似乎已经修复了错误。我没有在日志中收到有关密码的错误,但这没有任何意义。我删除了验证密码插件... mysql> uninstall plugin validate_password; ...我现在可以撤销和创建用户并授予罚款,他们会复制。 【参考方案1】:

不要更改系统表的引擎

MySQL 尚未对代码进行足够的更改以允许 mysql.* 成为 MyISAM 以外的任何内容。 MySQL 8.0 通过将表(“数据字典”)转换为 InnoDB 表进行了更改,具有完全不同的结构和功能。

由于您在 5.7.23,距离 8.0.xx 仅一步(大)。考虑升级。

复制适用于 MyISAM 表,集群复制不能——Galera 和 Group Replication 以其他方式处理这些 MyISAM 表。请参阅有关GRANTCREATE USER 等的文档。不要使用UPDATEINSERT 来操作与登录相关的表。

(这个问题的作者似乎通过卸载插件解决了这个问题。)

【讨论】:

接受这个,因为这确实是最好的答案。

以上是关于如何将 MAIN mysql 数据库从 MyIsam 转换为 InnoDB的主要内容,如果未能解决你的问题,请参考以下文章

mysql索引数据结构

mysql索引数据结构

MySQL高级--03---存储引擎

尝试将 MYSQL 的表字段类型从 BLOB 更改为 JSON

MySQL | Xtrabackup 的简介

mysql-xtrbackup备份与恢复