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

原创
04/11 10:06
阅读数 21

* GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。

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(*) FROM
information_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 keyENGINE=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 NOTIN (
    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> SHOWvariablesLIKE'%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> CREATETABLE t01(idint) ;
ERROR 3750 (HY000): Unable to createorchange a tablewithout a primary keywhen the systemvariable'sql_require_primary_key'is set. Add a primary keyto the tableor unset this variableto avoid this message. Note that tableswithout a primary key can cause performance problems inrow-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> CREATETABLE auto_1 (c1 VARCHAR(50), c2 INT);
Query OK, 0 rows affected (0.26 sec)

greatsql> SHOWCREATETABLE auto_1\G;
*************************** 1. row ***************************
       Table: auto_1
CreateTableCREATETABLE`auto_1` (
`my_row_id`bigintunsignedNOTNULL AUTO_INCREMENT /*!80023 INVISIBLE */,
`c1`varchar(50DEFAULTNULL,
`c2`intDEFAULTNULL,
  PRIMARY KEY (`my_row_id`)
ENGINE=InnoDBDEFAULTCHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1rowinset (0.00 sec)

ERROR
Noquery specified

greatsql> INSERTINTO  auto_1(c1,c2) VALUES('aaa',1);
Query OK, 1 row affected (0.04 sec)

greatsql> INSERTINTO 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=TABLE和  relay_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


Enjoy GreatSQL :)

<往 期 推 荐>
MySQL下200GB大表备份,利用传输表空间解决停服发版表备份问题
事务处理对持久统计信息自动收集的影响
dbops 助力 GreatSQL 单机架构安装部署

《用三分钟学会一个MySQL知识》

<关于 Great SQL >

GreatSQL数据库是一款开源免费数据库,可在普通硬件上满足金融级应用场景,具有高可用、高性能、高兼容、高安全等特性,可作为MySQL或Percona Server for MySQL的理想可选替换。

💻社区官网:  https://greatsql.cn/ 
Gitee   https://gitee.com/GreatSQL/GreatSQL
GitHub  https://github.com/GreatSQL/

🆙BiliBili  : https://space.bilibili.com/1363850082

(对文章有疑问或见解可去社区官网提出哦~)

加入 微信交流群
加入 QQ交流群
想看更多技术好文,点个" 在看" 吧!

本文分享自微信公众号 - GreatSQL社区(GreatSQL)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部