MySQL 备份文件导入 GreatSQL MGR 环境为什么出现大量报错?
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 检查存储引擎
检查发现导入的数据存在 MyISAM 和 MEMORY 存储引擎。在 MGR 环境,能创建非 InnoDB 存储引擎的表,但插入数据时会报错。
2.2 表主键检查
MGR 要求表有主键,检查数据库中的表,是不是都有主键。检查发现有一部分表没有设置主键。
2.3 问题处理
1、对于非 InnoDB 存储引擎的表,修改建表语句,将存储引擎修改为 InnoDB
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 时,建表时需要显示指定主键。
将 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=ON
和enforce_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
版权声明: 本文为 InfoQ 作者【GreatSQL】的原创文章。
原文链接:【http://xie.infoq.cn/article/fdfcdfa2dd6c8e7f0a25aeab4】。文章转载请联系作者。
评论