§ 从MySQL迁移/升级到GreatSQL


本文介绍如何从MySQL迁移/升级到GreatSQL数据库。

§ 1. 为什么要迁移/升级

GreatSQL相对于MySQL社区版有着众多优秀特性,包括且不仅限以下:

特性 GreatSQL 8.0.32-24 MySQL 8.0.32
开源
ACID完整性
MVCC特性
支持行锁
Crash自动修复
表分区(Partitioning)
视图(Views)
子查询(Subqueries)
触发器(Triggers)
存储过程(Stored Procedures)
外键(Foreign Keys)
窗口函数(Window Functions)
通用表表达式CTE
地理信息(GIS)
基于GTID的复制
组复制(MGR)
MyRocks引擎
SQL兼容扩展 1.数据类型扩展
2.SQL语法扩展
共超过20个扩展新特性
MGR提升 1.地理标签
2.仲裁节点
3.读写节点绑定VIP
4.快速单主模式
5.智能选主机制
6.全新流控算法
性能提升 1.InnoDB并行查询
2.并行load data
安全提升 1.国密支持
2.备份加密
3.审计日志入库

§ 2. 迁移/升级前准备

首先下载GreatSQL 8.0版本安装包,推荐选择最新的GreatSQL 8.0.32-24版本 (opens new window),至于选择RPM还是二进制包看具体情况及个人喜好。

本文选用二进制包方式安装。

正式迁移/升级之前,务必做好数据备份,可以采用以下几种方式:

  1. 停机维护,复制当前的数据库目录,做一个全量物理备份,这种方式恢复起来最快。
  2. 利用mysqldump/xtrabackup等备份工具,执行一个全量备份。
  3. 利用主从复制或MGR,在其中一个节点执行备份,或者令某个节点临时下线/退出,作为备用节点。

接下来,要区分本次迁移/升级属于以下哪种情况:

  1. 从MySQL 5.7直接一次性迁移+升级到GreatSQL 8.0.32。
  2. 从MySQL 8.0.32及以下版本迁移/升级到GreatSQL 8.0.32。
  3. 从MySQL 5.6及更低版本迁移+升级到GreatSQL 8.0.32,则应该先逐次升级大版本,例如5.5=>5.6,5.6=>5.7最新版本,而后再一次性升级到GreatSQL 8.0.32。

如果是前两种,直接参考文档:GreatSQL 5.7升级到8.0 的方法进行迁移/升级即可,过程是完全一样的。

本文重点说说第三种场景。

§ 3. 迁移过程

GreatSQL数据库是不支持直接原地(in-place)降级的,因此需要采用 逻辑备份+导入 的方式完成迁移。

如果是直接在MySQL 8.0.33及以上版本的datadir下,指定GreatSQL 8.0.32-24版本的mysqld二进制文件启动,则可能会报告类似下面的错误:

[ERROR] [MY-012530] [InnoDB] Unknown redo log format (5). Please follow the instructions at http://dev.mysql.com/doc/refman/8.0/en/ upgrading-downgrading.html.
[ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error.
[ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
[ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
[ERROR] [MY-010119] [Server] Aborting
1
2
3
4
5

即便用xtrabackup工具物理备份的文件恢复后,也是无法启动的,也会报告类似上面的错误信息。

因此,只有一种方法,那就是 逻辑备份+导入

首先,用 mysqldump 备份全部数据:

$ mysqldump -S/data/MySQL/mysql.sock -A --triggers --routines --events > /backup/MySQL/fullbackup-`date +'%Y%m%d'`.sql
1

将备份文件copy到GreatSQL版本环境中,并执行导入即可,导入过程中可能会报错,加上 -f 选项并忽略这些错误就好(高版本中有些表在低版本中不存在,略过)。

$ mysql -S/data/GreatSQL/mysql.sock -f < /backup/MySQL/fullbackup-`date +'%Y%m%d'`.sql

#可能会报告类似下面的错误信息,忽略即可
...
ERROR 3723 (HY000) at line 543: The table 'replication_group_configuration_version' may not be created in the reserved tablespace 'mysql'.
ERROR 1146 (42S02) at line 554: Table 'mysql.replication_group_configuration_version' doesn't exist
ERROR 1146 (42S02) at line 555: Table 'mysql.replication_group_configuration_version' doesn't exist
ERROR 1146 (42S02) at line 556: Table 'mysql.replication_group_configuration_version' doesn't exist
ERROR 1146 (42S02) at line 557: Table 'mysql.replication_group_configuration_version' doesn't exist
ERROR 3723 (HY000) at line 567: The table 'replication_group_member_actions' may not be created in the reserved tablespace 'mysql'.
ERROR 1146 (42S02) at line 583: Table 'mysql.replication_group_member_actions' doesn't exist
ERROR 1146 (42S02) at line 584: Table 'mysql.replication_group_member_actions' doesn't exist
ERROR 1146 (42S02) at line 585: Table 'mysql.replication_group_member_actions' doesn't exist
ERROR 1146 (42S02) at line 586: Table 'mysql.replication_group_member_actions' doesn't exist
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

如果数据量较大的话,逻辑备份+导入过程耗时较久,要有心理准备。

参考文档

§ 问题反馈

§ 联系我们

扫码关注微信公众号

greatsql-wx