ERROR 3098 (HY000): table 不符合外部插件的要求
ERROR 3098 (HY000): The table does not comply with the requirements by an external plugin
设置:
- master master master 中的三个mysql组复制节点。
- 一切正常。我可以添加 users/dbs 和 insert/update 数据。
- 每个节点都绑定到一个私有 IP 地址。
- 我创建了一个 bash 脚本来连接到 mysql 以删除用户。
- 使用脚本删除数据库效果很好。
问题:
以下命令不会运行。我可以创建用户和数据库并删除数据库,但不能删除用户。我无法判断它是复制问题还是特权问题。
- 从 mysql.user 用户='testme123' 中删除;
- 从 mysql.db 中删除用户='testme123';
- 如果存在则删除用户 'testme123';
第 1 行的错误 3098 (HY000):table 不符合外部插件的要求。
LOG: [ERROR] Plugin group_replication reported: 'Table 用户没有使用 InnoDB 存储引擎。这与组复制不兼容。
我通过本地 mysql 控制台也以 root 身份登录得到同样的错误。
问题(S):
- 什么可以阻止这种情况?
- 如何解决我缺少的问题?
如果您正在使用组复制(在 5.7 或 8.0 中),则必须通过 GRANT/DROP/CREATE USER/etc 命令而不是 INSERT/UPDATE/DELETE/etc.
进行所有用户身份验证
由于严重的技术困难,MyISAM 未在 Group Replication 中复制。
(以上评论也适用于 Galera / PXC。)
(警告:我所说的可能并不完全正确,但我认为这会让你远离麻烦,并解决手头的问题。)
在我的例子中,我在从单主模式 MySQL 复制组恢复备份时遇到了同样的错误。我在 mysqldump
cmd.
期间使用 --single-transaction
标志进行了备份
$ mysqldump -uroot -p<root_password> -h<host> --set-gtid-purged=OFF --single-transaction --all-databases --triggers --routines --events < dump.sql
在这里,查看 --single-transaction
标志的用法以了解它引起的问题。
$ mysqldump --help
...
--single-transaction
Creates a consistent snapshot by dumping all tables in a
single transaction. Works ONLY for tables stored in
storage engines which support multiversioning (currently
only InnoDB does); the dump is NOT guaranteed to be
consistent for other storage engines. While a
--single-transaction dump is in process, to ensure a
valid dump file (correct table contents and binary log
position), no other connection should use the following
statements: ALTER TABLE, DROP TABLE, RENAME TABLE,
TRUNCATE TABLE, as consistent snapshot is not isolated
from them. Option automatically turns off --lock-tables.
...
因此,在阅读了@RickJames 提供的建议后,我只是在备份期间从 mysqldump
cmd 中删除了 --single-transaction
标志,然后将其恢复到新的复制组。
Note: MySQL server version was 5.7.25
组复制要求之一是 - Every table that is to be replicated by the group must have a defined primary key, or primary key equivalent where the equivalent is a non-null unique key.
[link]
因此,如果您在不满足此条件的情况下使用 table,服务器将抛出此错误。使用带有主 ID 的 table。
设置:
- master master master 中的三个mysql组复制节点。
- 一切正常。我可以添加 users/dbs 和 insert/update 数据。
- 每个节点都绑定到一个私有 IP 地址。
- 我创建了一个 bash 脚本来连接到 mysql 以删除用户。
- 使用脚本删除数据库效果很好。
问题:
以下命令不会运行。我可以创建用户和数据库并删除数据库,但不能删除用户。我无法判断它是复制问题还是特权问题。
- 从 mysql.user 用户='testme123' 中删除;
- 从 mysql.db 中删除用户='testme123';
- 如果存在则删除用户 'testme123';
第 1 行的错误 3098 (HY000):table 不符合外部插件的要求。
LOG: [ERROR] Plugin group_replication reported: 'Table 用户没有使用 InnoDB 存储引擎。这与组复制不兼容。
我通过本地 mysql 控制台也以 root 身份登录得到同样的错误。
问题(S):
- 什么可以阻止这种情况?
- 如何解决我缺少的问题?
如果您正在使用组复制(在 5.7 或 8.0 中),则必须通过 GRANT/DROP/CREATE USER/etc 命令而不是 INSERT/UPDATE/DELETE/etc.
进行所有用户身份验证由于严重的技术困难,MyISAM 未在 Group Replication 中复制。
(以上评论也适用于 Galera / PXC。)
(警告:我所说的可能并不完全正确,但我认为这会让你远离麻烦,并解决手头的问题。)
在我的例子中,我在从单主模式 MySQL 复制组恢复备份时遇到了同样的错误。我在 mysqldump
cmd.
--single-transaction
标志进行了备份
$ mysqldump -uroot -p<root_password> -h<host> --set-gtid-purged=OFF --single-transaction --all-databases --triggers --routines --events < dump.sql
在这里,查看 --single-transaction
标志的用法以了解它引起的问题。
$ mysqldump --help
...
--single-transaction
Creates a consistent snapshot by dumping all tables in a
single transaction. Works ONLY for tables stored in
storage engines which support multiversioning (currently
only InnoDB does); the dump is NOT guaranteed to be
consistent for other storage engines. While a
--single-transaction dump is in process, to ensure a
valid dump file (correct table contents and binary log
position), no other connection should use the following
statements: ALTER TABLE, DROP TABLE, RENAME TABLE,
TRUNCATE TABLE, as consistent snapshot is not isolated
from them. Option automatically turns off --lock-tables.
...
因此,在阅读了@RickJames 提供的建议后,我只是在备份期间从 mysqldump
cmd 中删除了 --single-transaction
标志,然后将其恢复到新的复制组。
Note: MySQL server version was 5.7.25
组复制要求之一是 - Every table that is to be replicated by the group must have a defined primary key, or primary key equivalent where the equivalent is a non-null unique key.
[link]
因此,如果您在不满足此条件的情况下使用 table,服务器将抛出此错误。使用带有主 ID 的 table。