MySQL 到 KingbaseES 数据库迁移最佳实践指南
MySQL 至 KingbaseES 数据库迁移涉及数据类型对齐、对象移植及应用适配。KingbaseES 提供部分 MySQL 原生兼容特性以降低工作量。迁移流程包括离线(KDTS)和在线(KFS)两种方式,需提前配置字符集、大小写敏感性及性能参数。实战中需注意数据一致性、存储过程兼容及性能优化,迁移后需进行功能验证与性能测试以确保系统稳定。

MySQL 至 KingbaseES 数据库迁移涉及数据类型对齐、对象移植及应用适配。KingbaseES 提供部分 MySQL 原生兼容特性以降低工作量。迁移流程包括离线(KDTS)和在线(KFS)两种方式,需提前配置字符集、大小写敏感性及性能参数。实战中需注意数据一致性、存储过程兼容及性能优化,迁移后需进行功能验证与性能测试以确保系统稳定。

通常,异构数据库移植的工作量繁重。这些工作量主要来源于:在数据类型、SQL 语言、PL/SQL 语言、甚至客户端应用编程接口等诸多方面对两个数据库所进行的、大量的语法或功能的对齐处理。
同样的,从 MySQL 向 KingbaseES 移植的情况也如此。为降低移植工作量,KingbaseES 在其内部实现了部分的 MySQL 兼容特性。这些特性从语法或功能上对 MySQL 提供了原生支持。因此,在移植过程中,MySQL 程序只需很少甚至不做任何改动就能在 KingbaseES 环境中运行。
此外,对未提供原生支持的 MySQL 功能,KingbaseES 也给出了相应的移植建议。
数据类型是描述数据库系统底层信息资源模式的常用手段。通常,两个数据库系统数据类型的兼容好坏直接影响移植的难易程度。KingbaseES 对 MySQL 的基本数据类型如数值类型 (整型、浮点型、定点数类型)、文本字符串类型 (CHAR、VARCHAR、TINYTEXT、MEDIUMTEXT、LONGTEXT)、位类型、日期时间类型 (YEAR、TIME、DATE、DATETIME、TIMESTAMP)、枚举类型 ENUM、集合类型 SET、二进制类型 (BINARY、VARBINARY、BLOB)、空间类型 (GEOMETRY、POINT、LINESTRING、POLYGON)、JSON 类型 (JSON 对象、JSON 数组) 可以原生支持,或者通过转换进行支持。
支持 MySQL 所有操作符,以及数据类型转换。
在实际应用中,一个 MySQL 数据库系统的移植主要包括如下内容。这些内容的迁移是存在先后顺序的。若违反该顺序,则可能导致迁移受阻。
根据迁移构成中业务是否可以停止服务,迁移又分为离线迁移和在线迁移。
数据库是各种 SQL 和 PL/SQL 数据库对象的存放容器,而用户是这些对象的管理者和使用者。因此,在迁移数据库对象之前,一般应先迁移数据库、用户。
那么,如何移植这些内容呢?应在目的数据库 KingbaseES 上创建与源数据库 MySQL 同名的数据库、用户。
另外,所创建数据库的字符集应与 MySQL 数据库字符集一致。
支持在线迁移和离线迁移。
使用 KDTS 将 MySQL 离线迁移到 KingbaseES 中。
使用 KFS 支持将 MySQL 在线迁移到 KingbaseES 中。
在完成数据库对象迁移以后,才可开始迁移应用程序,主要原因是:在用程序中,可能会访问和操作前面迁移的数据库对象。
应用程序移植是指对 MySQL API 方式或嵌入式 SQL 方式的应用程序的移植。它主要包括接口驱动程序和连接方法的移植,以及 MySQL 扩展或私有的、且 KingbaseES 未兼容的 API 移植。通常,该项任务的工作量较少。
在实际应用中,通常应用程序移植与移植系统测试与调试交叉进行。
作为一个典型的项目过程,MySQL 数据库移植应具有健全的项目团队和全面细致的的项目执行过程。通常,移植一个 MySQL 数据库主要包括以下步骤:
这些步骤指之间的关系是:前四个步骤是迁移前的准备工作,这些准备工作是确保后续 MySQL 移植顺利进行的前提条件,而最后一步是保证最终移植系统正确性和可用性的关键步骤。
迁移前,应获取源数据库 MySQL 服务名及迁移的数据规模信息。
1. 数据库、用户和模式迁移主要包括以下内容:
获取源 MySQL 数据库的 IP 地址、实例名、网络服务端口号、用户名/密码等信息。
在目的 KingbaseES 数据库上,使用 KSQL 工具上执行如下操作:
创建与源 MySQL 用户同名的用户,用户 root。
创建与源 MySQL 同名的数据库,mysql。
创建与源 MySQL 同名的模式。如果通过查询分析器或 KSQL 工具创建同名用户,则省略此步。但是,如果通过企业管理器创建同名用户,则此步则不能省略。
2. 大小写是否敏感
MySQL 通常默认是大小写不敏感,而 KingbaseES 默认是大小写敏感,可以在初始化数据库的时候进行修改。
./initdb -D /home/kingbase/Kingbase/ES/V9/data -U SYSTEM --enable-ci
3. 查询 MySQL 数据库编码方式
show variables like 'character_set_database';
【KingbaseES 初始化设置编码方式】--encoding=GBK(支持 GBK UNICODE ASCII)
4. 查看表数据量大小
查看当前用户在 MySQL 中的表大小,按从大到小排序 (单位 GB)
select table_schema, table_name, table_rows, truncate(data_length/1024/1024, 2), truncate(index_length/1024/1024,2) from information_schema.tables where table_schema = 'mysql' order by data_length desc, index_length desc;
5. 检查数据库日期格式
MySQL 数据库中 date 的默认格式为'YYYY-MM-DD',time 的默认格式为'HH:MM:SS'
KES 中时间的默认格式为:ISO,YMD
MySQL 数据库中有日期'0099-09-30 00:00:00',KingbaseES 中将 99 识别为月份报错:
ERROR: date/time field value out of range
根据实际情况,应对目的数据库 KingbaseES 进行适当的 MySQL 兼容配置。通常,应配置以下兼容参数:
1. mysql_interval_style:兼容 MySQL 的 interval 格式。
在 KingbaseES 系统参数 mysql_interval_style 的默认值为 off。
2. sql_mode:兼容 MySQL 的模式列表。
在 KingbaseES 系统参数 sql_mode 可以设置为: ONLY_FULL_GROUP_BY:如果查询的 select 列表、HAVING 条件或 ORDER BY 列表,引用了既不在 GROUP BY 子句中命名,也不再功能上依赖于 GROUP_BY 列的非聚合列,则拒绝这些查询; STRICT_ALL_TABLES:为所有存储引擎启用严格 SQL 模式,无效的数据值将被拒绝; REAL_AS_FLOAT:REAL 类型默认是 FLOAT8,开启之后为 FLOAT4; NO_AUTO_VALUE_ON_ZERO:开启时,插入 0 序列不自增,将 0 作为最终插入的值; ANSI_QUOTES:表示双引号返回标示符。如果用户取消该选项,则表示双引号返回字符常量。注意:若取消该模式,将会导致 Studio 工具新建、删除对象失败。
可以用如下方式使用 sql_mode 参数:
TEST=# set sql_mode = 'ONLY_FULL_GROUP_BY';
SET TEST=# show sql_mode;
sql_mode
-----------------------------------
ONLY_FULL_GROUP_BY (1 行记录)
在目的数据库 KingbaseES 上创建与源数据库 MySQL 同名的用户、数据库,并且授予新建用户具有使用该数据库和新建模式的所有或适当的权限。另外,所创建数据库的字符集应与 MySQL 数据库字符集一致。如果 KingbaseES 已有同名数据库,则登录该数据库后,只需创建同名用户。
配置 KingbaseES 和 MySQL 的 JDBC 数据源,并设置相关的连接信息。
为了提高迁移速度,应对目的库 KingbaseES 进行性能优化配置。
如:
在完成上述准备工作以后,用户可使用 KDTS 进行数据的离线迁移,KDTS 提供了两种形态 (BS、SHELL),可根据需要进行选择。
创建源库数据库连接。创建数据库连接界面如下,填写数据源信息,包括:'连接名称'、'数据库类型'、'数据库版本'、'服务器地址'、'端口'、'用户名'、'密码'、'数据库'、'驱动'、'URL'、'连接参数'。
创建目标数据库连接。创建数据库连接界面如下,填写数据源信息,包括:'连接名称'、'数据库类型'、'数据库版本'、'服务器地址'、'端口'、'用户名'、'密码'、'数据库'、'驱动'、'URL'、'连接参数'。
KDTS 采用向导页的方式指导用户新建迁移任务,简单易用,用户依次配置'选择数据源'-'选择模式'-'选择迁移对象'-'配置参数',即可快速配置一个迁移任务。
1. 选择数据源
填写自定义任务名称 (任务名称不能重复),选择'源数据库'和'目标数据库',或者选择'新建数据源'后使用。
2. 选择模式
根据数据迁移所需选择对应模式 (如需选择模式在系统模式中可选中'包含系统模式'复选框) 的表结构、表数据、视图、序列、函数、存储过程、程序包、同义词、自定义类型等。当模式较多时也可以通过左上方的查询框进行检索。请您至少选择一种模式,否则将收到错误提示,以至于不能完成新建任务。
3. 选择迁移对象
通过已选模式选择需要迁移数据的表,模式较多时可在已选模式搜索框内输入模式名关键字进行快速检索。
可迁移此模式下全部表,也可以指定或排除部份表,当选择'包含指定对象'或'排除指定对象'时,请您通过'从列表选择'或'从文件导入'将数据添加到包含列表中,如您未添加数据,则会收到错误提示,导致无法完成新建任务。
从列表选择对象时,可选择对应模式、检索对象名关键字进行快速检索对象。点击'添加'按钮后加入到已选列表,想要移除部份表时可以选择对应的表点击'移除'按钮取消表。选择完成后点击确定。
4. 配置参数
迁移工具提供了一系列配置参数用于迁移方案的个性化配置,满足多种迁移场景。配置参数分为'迁移配置'、'数据类型映射'、'线程配置'三个方面。
可将此任务作为预迁移任务点击'保存',或者作为执行任务点击'保存并迁移'。
迁移结束'状态'栏显示'完成',则迁移任务成功。
迁移结束'状态'栏显示'失败',则迁移任务失败。失败后可点击详情查看日志有助于解决问题。
迁移完成后,需要确认执行结果,包括迁移数据量,是否有错误发生,可以通过迁移日志和迁移结果进行查看。
'迁移日志'打印迁移任务执行后的日志,具体可分为'系统日志'、'Error 日志'、'Info 日志'。
'迁移结果'功能的工作区包括'任务执行批次'、'迁移对象'、'总数'、'成功数'、'失败数'、'略过数'、'操作'。您可以查看历史迁移任务执行的每次记录,以及每次迁移的对象、成功数、失败数、查看失败任务的错误日志。
在线迁移时,首先需要使用 KFS 完成。
若项目开发过程中,需要定期从一个指定的源数据库迁移到目的数据库中,那么根据迁移时源数据库和应用的状态,决定离线迁移还是在线迁移。
同时,由于是多次迁移,需要考虑每次迁移时数据库对象的定义是否需要迁移,若不需要,则只迁移数据就可以,使用 KDTS 和 KFS 都支持只迁移数据;若每次迁移时需要迁移对象定义,则 1)比较源和目的对象定义是否发生变更 2)对于定义发生变更的表,选择迁移定义和数据 3)对于定义没有发生变更的表,只同步数据即可。
在数字化转型的浪潮中,数据库迁移成为众多企业优化数据管理架构的关键环节。MySQL 作为广泛使用的开源数据库,随着业务发展,部分企业因性能提升、自主可控等需求,选择迁移至国产的 KingbaseES 数据库。本次实战总结将详细阐述从 MySQL 至 KingbaseES 迁移过程中的关键步骤、遇到的问题及解决方法,为有相同需求的从业者提供宝贵经验。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL 转 CSV/JSON/XML在线工具,online
CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online