写点什么

MySQL 备份文件导入 GreatSQL MGR 环境为什么出现大量报错?

作者:GreatSQL
  • 2025-04-11
    福建
  • 本文字数:3242 字

    阅读完需:约 11 分钟

MySQL 备份文件导入 GreatSQL MGR 环境为什么出现大量报错?

1. 问题信息

1.1 问题描述

客户计划将数据库由 MySQL 迁移到 GreatSQL,为客户安装好 3 节点 GreatSQL MGR 环境后,客户将使用 mysqldump 从 MySQL8 中导出的数据导入到 GreatSQL 中,导入过程中,出现大量报错信息 ERROR 3098 (HY000): The table does not comply with the requirements by an external plugin.


客户问:备份文件能正常导入 MySQL 数据库,为什么导入 GreatSQL 会有这么多报错信息?


我回复客户:MGR 环境有一些使用限制,我先检查下导入数据。

2. 问题分析及处理

MGR 要求表是 InnoDB 类型 ,首先检查了表的存储引擎。

2.1 检查存储引擎

greatsql> SELECT TABLE_TYPE,ENGINE,count(*) FROMinformation_schema.tables WHERE table_schema='jcdb' GROUP BY TABLE_TYPE,ENGINE;+------------+--------+----------+| TABLE_TYPE | ENGINE | count(*) |+------------+--------+----------+| BASE TABLE | InnoDB |     1355 || BASE TABLE | MyISAM |        1 || BASE TABLE | MEMORY |        1 || VIEW       | NULL   |        3 |+------------+--------+----------+4 rows in set (0.02 sec)
复制代码


检查发现导入的数据存在 MyISAM 和 MEMORY 存储引擎。在 MGR 环境,能创建非 InnoDB 存储引擎的表,但插入数据时会报错。


greatsql> CREATE TABLE t0(id int primary key) ENGINE=MEMORY;Query OK, 0 rows affected (0.03 sec)
greatsql> INSERT INTO t0 SELECT 1;ERROR 3098 (HY000): The table does not comply with the requirements by an external plugin.
复制代码

2.2 表主键检查

MGR 要求表有主键,检查数据库中的表,是不是都有主键。检查发现有一部分表没有设置主键。


greatsql> SELECT count(table_name)FROM information_schema.tables WHERE table_schema = 'jcdb' AND table_name NOT IN (    SELECT table_name     FROM information_schema.table_constraints     WHERE constraint_type = 'PRIMARY KEY');+-------------------+| count(table_name) |+-------------------+|                67 |+-------------------+1 row in set (0.10 sec)
复制代码

2.3 问题处理

1、对于非 InnoDB 存储引擎的表,修改建表语句,将存储引擎修改为 InnoDB


$ grep MyISAM jcdb.sql ) ENGINE = MyISAM AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '系统日志表' ROW_FORMAT = DYNAMIC;$ sed -i 's/ENGINE = MyISAM/ENGINE = InnoDB/g' jcdb.sql$ grep MyISAM jcsh.sql 
复制代码


2、对于没有主键的表通过设置系统变量``sql_generate_invisible_primary_key =on` 解决


从 8.0.30 开始,当sql_generate_invisible_primary_key=ON时 ,创建 InnoDB 表时,如果没有显式指定主键的情况下,GreatSQL 支持生成不可见主键,即 GreatSQL 服务会自动添加一个生成的不可见主键(GIPK)到表中。


另外:从 8.0.13 开始,新增sql_require_primary_key参数(建议全局设置选项 sql_require_primary_key=ON),其默认值为 OFF,设置为 ON 时,建表时需要显示指定主键。


-- 主键相关的参数greatsql> SHOW variables LIKE '%primary%';+------------------------------------+-------+| Variable_name                      | Value |+------------------------------------+-------+| sql_generate_invisible_primary_key | OFF   || sql_require_primary_key            | OFF   |+------------------------------------+-------+2 rows in set (0.00 sec)
greatsql> SET sql_require_primary_key=on;Query OK, 0 rows affected (0.00 sec)
greatsql> CREATE TABLE t01(id int) ;ERROR 3750 (HY000): Unable to create or change a table without a primary key, when the system variable 'sql_require_primary_key' is set. Add a primary key to the table or unset this variable to avoid this message. Note that tables without a primary key can cause performance problems in row-based replication, so please consult your DBA before changing this setting.
greatsql> SET sql_require_primary_key=OFF;
greatsql> SET sql_generate_invisible_primary_key=ON;Query OK, 0 rows affected (0.00 sec)
greatsql> CREATE TABLE auto_1 (c1 VARCHAR(50), c2 INT);Query OK, 0 rows affected (0.26 sec)
greatsql> SHOW CREATE TABLE auto_1\G;*************************** 1. row *************************** Table: auto_1Create Table: CREATE TABLE `auto_1` ( `my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */, `c1` varchar(50) DEFAULT NULL, `c2` int DEFAULT NULL, PRIMARY KEY (`my_row_id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci1 row in set (0.00 sec)
ERROR: No query specified
greatsql> INSERT INTO auto_1(c1,c2) VALUES('aaa',1);Query OK, 1 row affected (0.04 sec)
greatsql> INSERT INTO auto_1(c1,c2) VALUES('aabb',10);Query OK, 1 row affected (0.03 sec)
greatsql> SELECT * FROM auto_1;+------+------+| c1 | c2 |+------+------+| aaa | 1 || aabb | 10 |+------+------+2 rows in set (0.00 sec)-- 默认情况下,SELECT 的时候不会显示不可见主键
复制代码


将 mysqldump 文件的非 InnoDB 存储引擎表修改为 InnoDB 存储引擎,并且设置sql_generate_invisible_primary_key=ON后,重新导入数据,数据可以正常导入到新的数据库中。

3.MGR 使用限制

3.1 MGR 基础要求

1、InnoDB Storage Engine.


表必须使用 InnoDB 存储引擎。


2、Primary Keys.


每个表必须有一个已定义的主键,或与主键等价的非空唯一键。


3、Network Performance.


网络延迟和网络带宽都会影响组复制的性能和稳定性。

3.2 MGR 数据库实例配置要求

运行 MGR 的实例必须满足以下要求:


1、Unique Server Identifier.


同一个复制组,server_id唯一


2、Binary Log Active.


打开 log_bin: 启用二进制日志,MySQL 8.0 默认设置


3、Replica Updates


设置log_replica_updates=ON (from MySQL 8.0.26) or log_slave_updates=ON(before MySQL 8.0.26)MySQL 8.0 默认设置


4、Binary Log Row Format.


二进制日志行格式为 row 模式: binlog_format=row MySQL 8.0 默认设置


5、Binary Log Checksums Off


关闭二进制日志校验和:


binlog_checksum=NONE,MySQL 8.0.20


binlog_checksum=CRC32,MySQL 8.0.21+ 默认设置


6、Global Transaction Identifiers On


开启全局事务标识符: 设置gtid_mode=ONenforce_gtid_consistency=ON


7、Replication Information Repositories


复制信息存储库设置: 设置master_info_repository=TABLErelay_log_info_repository=TABLE,这个设置在 MySQL 8 是默认设置。


8、Transaction Write Set Extraction


事务写集提取transaction_write_set_extraction=XXHASH64在 MySQL 中 从 MySQL 8.0.26 开始,这个设置是默认的。


9、Default Table Encryption


默认表加密:default_table_encryption=OFF,在所有组成员上设置相同的值。默认值为 OFF


10、 Lower Case Table Names


表名大小写设置:lower_case_table_names=1,表名不区分大小写,对所有组成员使用相同的值。 不同的平台有不同的默认值


  • Default Value (macOS)=2

  • Default Value (Unix)=0

  • Default Value (Windows)=1


11、Binary Log Dependency Tracking


binlog_transaction_dependency_tracking=WRITESET


12、Multithreaded Appliers


启用多线程复制,组复制成员可以配置为 多线程复制,使事务可以并行应用。从 MySQL 8.0.27 开始,所有的副本都是 默认配置为多线程。

4.参考文章

  • https://greatsql.cn/docs/8.0.32-26/11-faq/5-faq-others.html

  • https://dev.mysql.com/doc/refman/8.0/en/group-replication-requirements.html

  • https://dev.mysql.com/doc/refman/8.0/en/create-table-gipks.html

发布于: 刚刚阅读数: 4
用户头像

GreatSQL

关注

GreatSQL社区 2023-01-31 加入

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。 社区:https://greatsql.cn/ Gitee: https://gitee.com/GreatSQL/GreatSQL

评论

发布
暂无评论
MySQL备份文件导入GreatSQL MGR环境为什么出现大量报错?_GreatSQL_InfoQ写作社区