MySQL 生产环境迁移至 YashanDB 数据库深度体验
前言
首届 YashanDB「迁移体验官」开放后,陆续收到「体验官」们的投稿,小崖在此把优秀的投稿文章分享给大家~今天分享的用户文章是《MySQL 生产环境迁移至 YashanDB 数据库深度体验》(作者:呆呆的私房菜),满满干货,不要错过!
号外!新的征文活动已开启,戳一戳下方图片即可跳转活动链接,最高可获千元大奖!
作为崖山数据库产品发布的第一批体验体验官,有幸被邀请参与崖山迁移平台(YashanDB Migration Platform,YMP)产品的体验活动,所以有了这篇文章。本次迁移计划将 MySQL 数据迁移到 YashanDB 数据库中,并在迁移过程中遇到的问题及其对产品的体验输出自己的使用感受和产品建议,也希望国产数据库能做得越来越棒!
01 产品相关
1.1 产品介绍
崖山迁移平台(YashanDB Migration Platform,下文以 YMP 代称)是 YashanDB 提供的数据库迁移产品,支持异构 RDBMS 与 YashanDB 之间进行迁移评估、离线迁移、数据校验的能力。YMP 提供可视化服务,用户只需通过简单的界面操作,即可完成从评估到迁移整个流程的执行与监控,实现低门槛、低成本、高效率的异构数据库迁移。
YMP 是一款具备【精准评估】、【SQL 自动转换】、【评估迁移无缝对接】、【对象一键迁移】、【数据高 i 性能迁移】、【数据校验】、【一站式服务】这 7 个核心特性的工具,能够解决迁移兼容性与工作量评估、异构数据库元数据迁移以及数据快速迁移的问题。
1.2 产品架构
YMP 的总体架构如下:

1.3 产品规格
1.3.1 数据库版本支持

1.3.2 数据类型支持

02 YMP 安装
YMP 工具官方提供的部署文档如下:
YMP 工具部署的步骤简单,需要关注的是 YMP 工具的业务存储库选择问题。目前 YMP 支持默认内置库和自定义内置库两种接入方式:
1)默认内置库:安装 YMP 工具时默认安装 YashanDB 作为内置库;
2)自定义内置库:使用外部的 YashanDB 数据库作为 YMP 的业务库使用。
2.1 环境说明

2.2 执行安装
下载链接:https://download.yashandb.com/download
上传软件包 Yashan Migration Platform 23.2.1(Linux X86)到/tmp 下边
2.3 访问 YMP
浏览器访问:http://xx.xx.xx.xx/#/login,初始化用户名密码:admin/admin
2.3.1 YMP 登录界面

2.3.2 YMP 迁移流程
YMP 迁移流程如下图所示,主要包含创建任务、迁移评估、迁移配置、离线迁移、数据初始化和一致性校验这 6 个流程。

03 YMP 数据迁移
注:由于本次迁移采用的是正式环境数据,所以下列内容关于正式数据的用户名和表名等都做了打码和脱敏。
3.1 创建数据源

3.2 创建任务

3.3 迁移评估

3.4 迁移配置

3.5 离线迁移

3.6 校验初始化

3.7 一致性校验

04 YMP 迁移问题记录
本章记录 YMP 实际迁移中遇到的问题,部分问题由于数据保密要求不做展示,故提供问题复现测试用例供参考。
4.1 YMP 使用注意点
4.1.1 多个迁移任务中不能有同名的 schema
问题现象:新建迁移任务提示被 XX 迁移任务评估占用。

原因分析:新建的迁移任务与 YMP 平台现有的迁移任务中存在同名的 schema。
解决方案:删除原有的已经完成的迁移任务,再新建新的迁移任务。
4.1.2 迁移评估需要完全兼容才能进行下一步
问题现象:【迁移评估】流程执行后,存在部分不兼容对象,无法进行下一步操作。

原因分析:YMP 设定的逻辑是兼容达到 100%,才能进行下一步操作。
解决方案:根据实际情况进行不兼容对象处理,可以在线改造 SQL 或者忽略该不兼容对象后,完成后执行【刷新报告】,兼容度达到 100%后可以进行下一步操作。
4.1.3 迁移评估不兼容的对象仅支持在线修改
问题现象: 不兼容 SQL 提示表不存在,改造 SQL 后在 YMP 内置库执行创建表操作,【刷新报告】之后还是提示表不存在。

原因分析:【迁移评估】中不兼容的对象,不支持直接在内置库中进行直接修改后跳过不兼容错误。在“刷新报告”之后,手动新增的内置库内容会自动被删除掉。
解决方案:YMP 平台上在线更新不兼容对象的 SQL 语句后,执行【验证并保存】操作。

4.1.5 YMP 内置库版本必须大于或等于目标端数据库版本

4.1.6 数据迁移失败不支持手动修复状态
问题现象:【离线迁移】流程中针对部分数据迁移失败的数据,无法手动修复状态。

原因分析:YMP 暂不支持手动修复数据迁移失败的状态。
解决方案:查看迁移失败问题详情后,在内置库处理对应失败问题,执行【迁移重试】后完成迁移。

4.2 YMP 迁移兼容问题
4.2.1 auto_increment 替换问题
问题现象:YashanDB 建表语句中使用 auto_increment 关键字执行失败。

原因分析:YashanDB 不支持 auto_increment 自增语法。
解决方案:YashanDB 创建 SEQUENCE 的方式来兼容 MySQL 的 auto_increment 语法。
问题复现:
4.2.2 varchar 字符类型单位问题
问题现象:YMP 工具迁移过程中出现字符长度超出。

原因分析:YashanDB 的 varchar 数据类型单位默认是 byte
解决方案:使用 varchar(N char)的方式来兼容 MySQL varchar 语法。
问题复现:
4.2.3 数据库保留字问题
问题现象:不兼容 SQL 改造过程中,执行建表语句遇到关键字冲突问题。

原因分析:建表过程中有个字段名为 LEVEL,是 YashanDB 的保留字,所以报错了。
解决方案:将该字段名用双引号引起来可以规避。
问题复现:
4.2.4 字面量查询问题
问题现象:YMP 迁移过程中不兼容语句提示“implict table"报错。

原因分析:MySQL 数据库支持简写的字面量查询方式,YashanDB 数据库需要使用 DUAL 伪表做查询。
解决方案:使用 DUAL 做伪表即可规避。

4.2.5 索引键长度超过上限
问题现象:YMP 迁移评估不兼容对象提示索引字符长度超出。

原因分析:查看组合索引的 3 个字段长度,(500CHAR+500CHAR+500CHAR)*4=6000bytes,刚好等于 6000bytes 的上限。
解决方案:根据实际情况调整组合索引字段长度。


4.2.6 纯数字的字段名转换报错
问题现象: YMP 元数据迁移过程中出现纯数字的字段名无法设置非空约束报错。

原因分析:YMP 针对这种特殊字段名无法直接做转换。
解决方案:将纯数字的字段名加上双引号后,执行【验证并保存】可规避。

4.2.7 GIS 数据类型暂不支持转换
问题现象:YMP 元数据迁移过程中空间数据类型的表无法正常转换。

原因分析:YMP 暂不支持自动转换空间数据类型。
解决方案:YashanDB 具备 GIS 能力,可以用 ST_GEOMETRY 类型进行兼容。

4.2.8 空格字符迁移遇到 NULL 问题
问题现象:YashanDB 数据库非空约束插入空字符会出现报错。

原因分析:MySQL 非空约束允许插入空字符,但是 YashanDB 不支持,因此会出现报错。
解决方案:先删除表的非空约束,把数据导入完成。

4.2.9 字段重复索引问题
问题现象:YMP 元数据迁移过程中提示字段重复索引问题。

原因分析:MySQL 支持在主键索引列再创建普通索引。YashanDB 不支持该功能。
解决方案:暂时先忽略该索引,观察迁移到 YashanDB 后的 SQL 执行计划和效率,再根据实际情况创建索引。
05 迁移小结
YMP 迁移工具部署简单,操作界面简洁美观,操作流程清晰明了,小白也可以轻松上手;
迁移过程透明化,从评估到迁移整个流程都提供了详细的报告供下载;
产品功能上还存在优化空间,地理空间类型迁移能力也较薄弱;
YMP 目前仅支持全量迁移,暂不支持在线迁移或实时同步等功能;
总体而言,YMP 的迁移体验还是蛮不错的。优秀的产品总是在各式各样的应用场景不断迭代后诞生,希望 YMP 产品能够不断优化迭代,做的越来越好!YashanDB 加油!国产数据库加油!
评论