MySQL至KingbaseES迁移最佳实践.pdf
MySQL 至 KingbaseES 迁移最佳实践 金仓数据库管理系统 KingbaseES 文档版本:V9(V009R001C001B0024) 发布日期:2023 年 10 月 12 日 北京人大金仓信息技术股份有限公司 目 目 录 录 第 1 章 前言 1 1.1 适用读者 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 相关文档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.3 术语 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.4 手册约定 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 第 2 章 概述 2.1 2.2 2.3 3 MySQL 兼容特性概览 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.1 数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.2 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.3 SQL 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.1.4 PL/SQL 语法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.1.5 PL/SQL 对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.1.6 客户端 SQL 交互工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 MySQL 特性改写方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2.1 SQL 语句中变量 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2.2 PLSQL 中的 DECLARE CONDITION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2.3 SIGNAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 相关技术资源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 第 3 章 MySQL 数据库移植实战 3.1 3.2 7 主要移植内容 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.1.1 数据库、用户移植 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.1.2 MySQL 数据迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.1.3 应用程序移植 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 关键移植步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3.2.1 确定移植目标 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3.2.2 评估移植任务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.2.3 组建移植团队 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.2.4 准备迁移环境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 部署目的数据库服务器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.2.4.1 I 目 录 获取并安装必要的软件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.2.5 数据库用户迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.2.6 数据迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 迁移前准备 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.2.6.1.1 获取 MySQL 数据库的相关信息 . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.2.6.1.2 配置 KingbaseES 的 MySQL 兼容开关 . . . . . . . . . . . . . . . . . . . . . 15 3.2.6.1.3 移植数据库、用户 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.2.6.1.4 配置 JDBC 数据源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.2.6.1.5 配置目的库 KingbaseES 性能参数 . . . . . . . . . . . . . . . . . . . . . . . . 16 离线迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.2.6.2.1 BS 迁移步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.2.6.2.2 SHELL 迁移步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.2.6.3 在线迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.2.6.4 多次迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 应用程序迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 API 方式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.2.4.2 3.2.6.1 3.2.6.2 3.2.7 3.2.7.1 3.2.7.1.1 3.2.7.1.1.1 JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.2.7.1.1.2 Hibernate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.2.7.1.1.3 MyBatis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 修改应用框架 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 测试与调试移植系统 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.2.8.1 功能测试和排错 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.2.8.2 性能测试和调优 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.2.7.2 3.2.8 版权声明 33 服务周期承诺 34 II 第 1 章 前言 1 第 章 前言 本文档描述了基于 MySQL 数据库的应用系统如何移植到 KingbaseES 上运行。 前言部分包含以下主题: • 适用读者 • 相关文档 • 术语 • 手册约定 1.1 适用读者 MySQL 至 KingbaseES 迁移最佳实践面向所有使用 KingbaseES 的用户,主要是数据库管理员和应用程序开发 人员。 1.2 相关文档 无 1.3 术语 无 1.4 手册约定 本文档中可能出现“注意、提示、警告、另请参阅”等标志,它们所代表的含义如下: 1 第 1 章 前言 注意: 用于突出重要/关键信息、最佳实践等。 提示: 用于突出小窍门、捷径等。 警告: 用于传递设备或环境安全警示信息,若不避免,可能会导致设备损坏、数据丢失、设备性能降低或其 它不可预知的结果。 另请参阅: 用于突出参考、参阅等。 以下程序代码书写约定适用于本文档: 符号 说明 [] 表示包含一个或多个可选项。不需要输入中括号本身。 {} 表示包含两个以上(含两个)的候选,必须在其中选取一个。不需要输入花括号本身。 | 分割中括号或者花括号中的两个或两个以上选项。不需要输入“|”本身。 ... 表示其之前的元素可以被重复。 斜体 表示占位符或者需要提供特定值的变量。 大写 表示系统提供的元素,以便与用户定义的元素相互区分。除出现在方括号中的元素外,应当按 照顺序逐字输入。当然,部分元素在系统中是大小写不敏感的,因此用户可以根据系统说明以 小写形式输入。 小写 表示由用户提供的元素。 2 第 2 章 概述 2 第 章 概述 本章节包含以下内容: • MySQL 兼容特性概览 • 相关技术资源 2.1 MySQL 兼容特性概览 通常,异构数据库移植的工作量繁重。这些工作量主要来源于:在数据类型、SQL 语言、PL/SQL 语言、甚至 客户端应用编程接口等诸多方面对两个数据库所进行的、大量的语法或功能的对齐处理。 同样的,从 MySQL 向 KingbasES 移植的情况也如此。为降低移植工作量,KingbaseES 在其内部实现了部分的 MySQL 兼容特性。这些特性从语法或功能上对 MySQL 提供了原生支持。因此,在移植过程中,MySQL 程序只需 很少甚至不做任何改动就能在 KingbaseES 环境中运行。 此外,对未提供原生支持的 MySQL 功能,KingbaseES 也给出了相应的移植建议。 2.1.1 数据类型 数据类型是描述数据库系统底层信息资源模式的常用手段。通常,两个数据库系统数据类型的兼容好坏直接影 响移植的难易程度。KingbaseES 对 MySQL 的基本数据类型如数值类型(整型、浮点型、定点数类型)、文本字 符串类型(CHAR、VARCHAR、TINYTEXT、MEDIUMTEXT、LONGTEXT、UNSIGNED)、位类型、日期时 间类型 (YEAR、TIME、DATE、DATETIME、TIMESTAMP)、枚举类型 ENUM、集合类型 SET、二进制类型 (BINARY、VARBINARY、BLOB)、JSON 类型(JSON 对象、JSON 数组)可以原生支持,或者通过转换进行 支持。 支持 MySQL 所有操作符,以及数据类型转换。 2.1.2 函数 • 兼容 MySQL 常用的日期时间函数 3 第 2 章 概述 • 兼容 JSON 函数 • 兼容和 base64 的转换函数:to_base64、from_base64。 2.1.3 SQL 语句 在 KingbasES 中,对大多数常用的 MySQL 特有 SQL 语句均提供了原生支持。这项措施使得 MySQL 应用程序 在 KingbaseES 系统中通常只需很少的代码变动就可正常运行。 KingbaseES 主要兼容如下 MySQL 的 SQL 语句: • insert ... set 语句 • select...limit 语句 • replace into 语句 • on duplicate key update 语句 • delete from partition 语句 • insert into partition 语句 2.1.4 PL/SQL 语法 KingbaseES 支持如下 MySQL 过程化语言的常用语法: • 赋值语句 • IF 语句 • CASE 语句 • 循环语句 • EXECUTE 语句 • 动态 SQL 2.1.5 PL/SQL 对象 KingbaseES 支持如下 MySQL 过程化语言对象: • 内置标量函数 • 触发器 • 匿名块 • 存储过程 • 函数 4 第 2 章 概述 2.1.6 客户端 SQL 交互工具 在实际应用中,通常客户 DDL 脚本和报表是通过 SQL 交互工具移植的。针对这种情况,KingbaseES 提供了如 下 SQL 交互工具: • ksql:命令行的 SQL 交互工具,类似 MySQL 的命令行。 • Kstudio:图形化的 SQL 交互工具,类似 MySQL 的图形化工具。 通过上述工具,用户可连接数据库服务器,运行数据库实用程序,发送 SQL 语句,运行 SQL 脚本,或运行 KingbaseES 数据库管理命令实施数据库管理等。 2.2 MySQL 特性改写方法 2.2.1 SQL 语句中变量 MySQL 的 SQL 语句中支持使用 @var 定义变量,并通过 set 或者 select into 语句赋值。 KingbaseES 目前不支持 SQL 语句中直接使用变量,对于这种应用,可以使用 Oracle 的 context 来改写。 2.2.2 PLSQL 中的 DECLARE CONDITION MySQL 中 PLSQL 中可以使用: • DECLARE …. CONDITION 语句 • DECLARE …HANDLER 语句 KingbaseES 中可以使用自定义异常来转换对应语句。 2.2.3 SIGNAL MySQL 中 SIGNAL 语句可以定义向应用返回的消息和 SQLSTATE, 而 KingbaseES 中可以使用 RAISE 语句转 换,例如: RAISE EXCEPTION, RAISE SQLSTATE。 2.3 相关技术资源 本指南重点从语句兼容特性、迁移工具、迁移场景和应用程序移植等几方面描述 MySQL 移植的关键技术和实现 方式。在每项技术和实现方式的描述上,本指南只提供有限的内容介绍,并未提供全面的细节说明。所以, 用户若需了解某些技术的实现细节还请参照相关的技术资料,这些资料诸如: 5 第 2 章 概述 • KingbaseES 数据库管理员指南:详尽和全方位地介绍如何高效管理 KingbaseES 数据库系统。其中,这些管理 诸如用户管理、存储管理、模式对象管理等。 • KingbaseES 数据库开发指南:提供了 JDBC、ODBC、DCI 和 ESQL 等应用编程接口的使用说明。 • KingbaseES 高可用概述:详细描述了系统在高可用方面的支持。 6 第3章 3 第 章 MYSQL 数据库移植实战 MySQL 数据库移植实战 由于 KingbaseES 利用 KDTS 等多种工具简化移植过程。 本节重点描述了在实际应用中移植一个 MySQL 数据库系统的完整过程,以及其中的主要移植内容和关键移植步 骤。 本章节包含以下内容: • 主要移植内容 • 关键移植步骤 3.1 主要移植内容 在实际应用中,一个 MySQL 数据库系统的移植主要包括如下内容。这些内容的迁移是存在先后顺序的。若违反 该顺序,则可能导致迁移受阻。 根据迁移构成中业务是否可以停止服务,迁移又分为离线迁移和在线迁移。 3.1.1 数据库、用户移植 数据库是各种 SQL 和 PL/SQL 数据库对象的存放容器,而用户是这些对象的管理者和使用者。因此,在迁移数 据库对象之前,一般应先迁移数据库、用户。 那么,如何移植这些内容呢?应在目的数据库 KingbaseES 上创建与源数据库 MySQL 同名的数据库、用户。 另外,所创建数据库的字符集应与 MySQL 数据库字符集一致。 3.1.2 MySQL 数据迁移 支持在线迁移和离线迁移。 使用 KDTS 将 MySQL 离线迁移到 KingbaseES 中。 使用 KFS 支持将 MySQL 在线迁移到 KingbaseES 中。 7 第3章 3.1.3 MYSQL 数据库移植实战 应用程序移植 在完成数据库对象迁移以后,才可开始迁移应用程序,主要原因是:在用程序中,可能会访问和操作前面迁移的 数据库对象。 应用程序移植是指对 MySQL API 方式或嵌入式 SQL 方式的应用程序的移植。它主要包括接口驱动程序和连接 方法的移植,以及 MySQL 扩展或私有的、且 KingbaseES 未兼容的 API 移植。通常,该项任务的工作量较少。 在实际应用中,通常应用程序移植与移植系统测试与调试交叉进行。 3.2 关键移植步骤 作为一个典型的项目过程,MySQL 数据库移植应具有健全的项目团队和全面细致的的项目执行过程。通常,移 植一个 MySQL 数据库主要包括以下步骤: • 确定移植目标 • 评估移植任务 • 组建移植团队 • 准备迁移环境 • 数据库用户迁移 • 数据迁移 • 应用程序迁移 • 测试与调试移植系统 这些步骤指之间的关系是:前四个步骤是迁移前的准备工作,这些准备工作是确保后续 MySQL 移植顺利进行的 前提条件,而最后一步是保证最终移植系统正确性和可用性的关键步骤。 下面,分别对上述各个步骤进行详细说明。 3.2.1 确定移植目标 开始迁移前,应根据用户的实际需求,确定移植目标。这些目标诸如: • 迁移 MySQL 数据库的规模。 • 迁移 MySQL 数据库对象的种类和特征,如简单和复杂迁移对象所占比例等。 • 迁移的难易程度,如是否迁移大对象,是否迁移大量约束等。 • 迁移的工期要求。 • 迁移数据时是在线迁移还是离线迁移。 • 对目标系统的技术指标要求,诸如平台、版本、应用编程接口、工具、可用性、安全性和性能指标要求等。 8 第3章 3.2.2 MYSQL 数据库移植实战 评估移植任务 明确移植目标以后,则可开始移植任务评估。 当计划把一个 MySQL 数据库系统移植到 KingbaseES 环境时,如果不做评估或评估不充分的话,那么整个移 植工作会存在很多潜在风险,额外增加移植工程师的工作量并且无法确认移植完成时间。因此,移植前对移植的可行 性、工作量、难易程度和工作进度等进行充分评估是非常必要的。 通常,移植评估主要包括以下内容: • 移植技术指标,如移植业务压力和性能指标等。 • 移植数据规模,如移植各类数据库对象的数量,PL/SQL 程序的规模等。 • 移植中 KingbaseES 不支持功能的种类和数量。 • 移植的约束种类和数量。 • 移植过程中可能遇到的其他问题。 在 MySQL 移植中常用的评估模板如下表所示: 9 第3章 MYSQL 数据库移植实战 表 3.2.1: 移植评估的数据库/应用概况模板 项目 描述 数据库版本 8.0 操作系统版本 Winodws 2000/2003 Server 服务器型号 联想/SUN 备注 CPU 配置 内存(RAM) 磁盘(Disk Profile) 服务器个数(# of Servers) 1或2 用户数/天(# Users/Day) 几十/天 事务量/天(# Transactions / Day) 当前数据库大小 几个 GB 数据库增长速率(#GB/month) 目标用户(Schema) 应用方式(OLTP/OLAP) OLTP 应用服务器(中间件) 无 客户端应用类型(C/S,B/S) C/S 客户端应用编程语言 Delphi7 客户端应用连接接口 ODAC/ADO 是否深入的 SQL 应用 无 监控工具 无 备份方式 其它工具(备份软件等) 无 高可用要求 较高 高可用配置方案 VCS 或单机 10 第3章 MYSQL 数据库移植实战 表 3.2.2: 移植评估的移植报告总结模板 项目 描述 移植分析日期 20220105 下午 移植分析人员 ABC KingbaseES 版本 MySQL 版本 8.0 Schema DB Size (GB) 几个 GB Schema Size (MB) 几个 GB 表 3.2.3: 移植评估的对象统计模板 类型 小计 备注 Function 7 较少用 Index 有 LOB 有 Materialized View 有 >10 Procedure 25 Table 1660 Table Partition 无 Trigger <30 Type 无 View >200 最大到几十 MB,主要是照片、word、视频(较少) 约束较多 对象共计 11 第3章 MYSQL 数据库移植实战 表 3.2.4: 移植评估的约束统计模板 类型 小计 备注 CHECK OR NOT NULL FOREIGN KEY PRIMARY KEY UNIQUE KEY OTHER 约束共计 表 3.2.5: 移植评估的其它方面模板 特性 小计 数据压缩 无 索引组织表 无 物化视图 无 存储概要 无 空间数据管理 无 全文搜索 有 数据库链接 无 数据复制 无 备注 共计 3.2.3 组建移植团队 任何一个高效、成功的项目都应具备一个健全和良好的团队,MySQL 数据库移植也不例外。如果没有这样团队 互相配合和支持,那么 MySQL 数据库移植将可能存在巨大的风险。所以,组建一个高效的移植团队是非常必要的。 那么,移植团队的组成人员应具备哪些条件呢?他们应至少具备以下的知识与技能: • 熟悉 MySQL 和 KingbaseES 的 SQL 语言和 PL/SQL 语言特性,以及相关的 MySQL 兼容特性。 • 熟悉 MySQL 和 KingbaseES 的各种应用编程接口,以及相关的 MySQL 兼容特性。 • 熟悉 MySQL 和 KingbaseES 的相关客户端工具,以及这些工具间的相同点和异同点。 12 第3章 MYSQL 数据库移植实战 由这些优秀人员组建的团队是高效移植 MySQL 数据库的可靠保障。 准备迁移环境 3.2.4 在上述步骤完成以后,移植工程师应开始准备迁移环境了,这些准备工作诸如: 3.2.4.1 部署目的数据库服务器 部署目的数据库服务器应遵循以下原则: • 目的数据库服务器的 CPU、内存、网络环境等硬件应尽量采用较高的配置。 • 如果移植的 MySQL 数据库系统规模较大,如超过 1GB,则建议把 MySQL 和 KingbaseES 部署在不同的物理 机器上。 • 为确保迁移效率,应尽量把 KingbaseES 和 MySQL 服务器部署到同一局域网内。 3.2.4.2 获取并安装必要的软件 迁移前应获取并安装如下软件:MySQL 数据库系统、KingbaseES 数据库系统、JDBC 和 ODBC 驱动程序、C 语言开发工具、TPC-C 测试工具、LoadRunner 等。 如果迁移数据规模较大,建议对安装的 KingbaseES 数据库服务器进行适当的优化,如增大 shared_buffer 大 小、预先创建较大的日志文件,预先申请足够的表空间数据库文件等。 完成上述准备工作后,移植工程师便可开始 MySQL 数据库移植工作了。 3.2.5 数据库用户迁移 数据库、用户和模式迁移主要包括以下内容: • 获取源 MySQL 数据库的 IP 地址、实例名、网络服务端口号、用户名/密码等信息。 • 在目的 KingbaseES 数据库上,使用 KSQL 工具上执行如下操作: – 创建与源 MySQL 用户同名的用户,用户 root。 – 创建与源 MySQL 同名的数据库,mysql。 – 创建与源 MySQL 同名的模式。 • 大小写处理。 • 迁移 MySQL 时,注意 Kingbase 的 data 需要使用指定的初始化参数来初始化数据库。 initdb --enable-ci --dbmode=mysql 13 第3章 3.2.6 MYSQL 数据库移植实战 数据迁移 KingbaseES 数据迁移工具 KDTS 动态加载待迁移的数据库访问接口,方便用户定制和使用。 KingbaseES 数据同步工具 KFS 支持同、异构数据源之间的数据迁移 同构数据源间数据迁移:支持 KingbaseES V7 和 V8R3 到 KingbaseES V9 的数据迁移。 异构数据源之间的数据迁移:支持 MySQL5、MySQL8 到 KingbaseES V9 的数据迁移。 KingbaseES 数据同步工具 KFS 支持结构迁移、支持全量数据迁移、支持列名映射,支持数据迁移过滤,在配置 数据任务时,可以对迁移的表配置 where 条件、通过匹配的 where 条件过滤需要迁移的数据。 数据库迁移时需要按照用户需求确定在线迁移还是离线迁移,若是离线迁移,使用 KDTS 完成 MySQL 的完整 迁移;若是在线迁移,目前支持使用 KFS 完成,注意这种情况下无法迁移 plsql 等复杂对象。 本节包括: • 迁移前准备 • 离线迁移 • 在线迁移 3.2.6.1 迁移前准备 在使用 KDTS 迁移 MySQL 数据库之前,应先做如下准备工作: 3.2.6.1.1 获取 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 数据库编码方式 14 第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; # TABLE_SCHEMA TABLE_NAME TABLE_ROWS truncate(data_length/1024/1024, 2) truncate(index_length/1024/ 1024,2) mysql help_topic mysql help_keyword 817 1.51 0.09 938 0.12 0.12 mysql help_relation 1723 0.09 mysql innodb_index_stats 158 0.06 mysql global_grants 47 mysql proxies_priv mysql db 0.04 0.00 0.00 1 0.01 2 0.01 0.00 0.01 0.01 mysql replication_asynchronous_connection_failover mysql procs_priv 0 0.01 mysql help_category 53 0.01 0.01 mysql tables_priv 2 0.01 0.01 mysql engine_cost 2 0.01 0.00 0 0.01 0.01 0.01 mysql replication_group_member_actions mysql func 0 0.01 2 0.01 0.01 0.00 mysql gtid_executed 0 0.01 0.00 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 3.2.6.1.2 配置 KingbaseES 的 MySQL 兼容开关 根据实际情况,应对目的数据库 KingbaseES 进行适当的 MySQL 兼容配置。通常,应配置以下兼容参数: 1. mysql_interval_style:兼容 MySQL 的 interval 格式。 15 第3章 MYSQL 数据库移植实战 在 KingbaseES 系统参数 mysql_interval_style 的默认值为 off。 2. sql_mode:兼容 MySQL 的模式列表。 在 KingbaseES 系统参数 sql_mode 的默认值为 ONLY_FULL_GROUP_BY。 可以用如下方式使用 sql_mode 参数: TEST=# set sql_mode = 'ONLY_FULL_GROUP_BY'; SET TEST=# show sql_mode; sql_mode ----------------------------------ONLY_FULL_GROUP_BY (1 行记录) 3.2.6.1.3 移植数据库、用户 在目的数据库 KingbaseES 上创建与源数据库 MySQL 同名的用户、数据库,并且授予新建用户具有使用该数 据库和新建模式的所有或适当的权限。另外,所创建数据库的字符集应与 MySQL 数据库字符集一致。如果 KingbaseES 已有同名数据库,则登录该数据库后,只需创建同名用户。 3.2.6.1.4 配置 JDBC 数据源 配置 KingbaseES 和 MySQL 的 JDBC 数据源,并设置相关的连接信息。 3.2.6.1.5 配置目的库 KingbaseES 性能参数 为了提高迁移速度,应对目的库 KingbaseES 进行性能优化配置。 例如: 1. 根据迁移数据规模的大小,迁移前可预先创建适当大小的的数据和日志文件。 开始迁移之前根据待迁移数据库的大小,保证 KingbaseES 数据目录所在位置有足够的空间。 2. 根据 KingbaseES 服务器硬件配置的实际情况调整 shared_buffers 大小,默认是 128M,建议调整为内存的 1/4 大小。 3.2.6.2 离线迁移 在完成上述准备工作以后,用户可使用 KDTS 进行数据的离线迁移,KDTS 提供了两种形态(BS、SHELL), 用户可根据需要进行选择,以下章节将分别介绍 BS、SHELL 版本进行 MySQL 迁移的具体步骤。 16 第3章 MYSQL 数据库移植实战 3.2.6.2.1 BS 迁移步骤 • 创建源数据库连接 创建 源库数据 库 连接。 创建 数据 库 连接界面 如下,填 写数 据源 信息,包 括:“连接名称”、“数 据 库类型”、“数据库版本”、“服务器地址”、“端口”、“用户名”、“密码”、“数据库”、“驱 动”、“URL”、“连接参数”。 • 创建目标数据库连接 创建 目标数据 库 连接。 创建 数据 库 连接界面 如下,填 写数 据源 信息,包 括:“连接名称”、“数 据 库类型”、“数据库版本”、“服务器地址”、“端口”、“用户名”、“密码”、“数据库”、“驱 动”、“URL”、“连接参数”。 17 第3章 MYSQL 数据库移植实战 • 新建迁移任务 KDTS 采用向导页的方式指导用户新建迁移任务,简单易用,用户依次配置“选择数据源”-“选择模 式”-“选择迁移对象”-“配置参数”,即可快速配置一个迁移任务。 1) 选择数据源 填写自定义任务名称(任务名称不能重复),选择“源数据库”和“目标数据库”,或者选择“新 建数据源”后使用。 18 第3章 MYSQL 数据库移植实战 2) 选择模式 根据您的数据迁移所需选择对应模式(如需选择模式在系统模式中可选中“包含系统模式”复选 框)的表结构、表数据、视图、序列、函数、存储过程、程序包、同义词、自定义类型等。当模式 较多时也可以通过左上方的查询框进行检索。请您至少选择一种模式,否则将收到错误提示,以至 于不能完成新建任务。 19 第3章 MYSQL 数据库移植实战 3) 选择迁移对象 通过已选模式选择您需要迁移数据的表,模式较多时可在已选模式搜索框内输入模式名关键 字进行快速检索。 可迁移此模式下全部表,也可以指定或排除部份表,当您选择“包含指定对象”或“排除指定对 象”时,请您通过“从列表选择”或“从文件导入”将数据添加到包含列表中,如您未添加数据, 则会收到错误提示,导致无法完成新建任务。 20 第3章 MYSQL 数据库移植实战 从列表选择对象时,可选择对应模式、检索对象名关键字进行快速检索对象。点击“添加”按钮后 加入到已选列表,当您想要移除部份表时可以选择对应的表点击“移除”按钮取消表。选择完成后 点击确定。 4) 配置参数 迁移工具提供了一系列配置参数用于迁移方案的个性化配置,满足多种迁移场景。配置参数分为 “迁移配置”、“数据类型映射”、“线程配置”三个方面。具体配置项信息请参考 KDTS 迁移工 具使用指南。 21 第3章 MYSQL 数据库移植实战 • 执行迁移任务 可将此任务作为预迁移任务点击“保存”,或者作为执行任务点击“保存并迁移”。 • 迁移完成: 迁移结束“状态”栏显示“完成”,则迁移任务成功。 • 迁移失败: 22 第3章 MYSQL 数据库移植实战 迁移结束“状态”栏显示“失败”,则迁移任务失败。失败后可点击详情查看日志有助于解决问题。 • 查看迁移报告及问题处理 迁移完成后,需要确认执行结果,包括迁移数据量,是否有错误发生,可以通过迁移日志和迁移结果进行 查看。 “迁移日志”打印迁移任务执行后的日志,具体可分为“系统日志”、“Error 日志”、“Info 日志”。 “迁移结果”功能的工作区包括“任务执行批次”、“迁移对象”、“总数”、“成功数”、“失败 数”、“略过数”、“操作”。您可以查看历史迁移任务执行的每次记录,以及每次迁移的对象、成功 数、失败数、查看失败任务的错误日志。 23 第3章 MYSQL 数据库移植实战 3.2.6.2.2 SHELL 迁移步骤 • 目录说明 • bin: 启动脚本 • conf: 配置文件 • doc: 帮助文档 • drivers: 数据库连接驱动(注意不同版本驱动的存放目录差别,详见 readme.md) • jdk: jdk • kdms: kdms 程序 • lib: 程序包 • logs: 日志 • result: 迁移报告 • 配置数据库连接信息 • 进入 KDTS-CLI/conf 目录下,打开 application.yml 文件,根据源库类型设置当前激活的源库配置 (active: mysql),如下所示: 24 第3章 MYSQL 数据库移植实战 在正确设置 application.yml 中的 active 项后,打开对应配置文件(datasource-mysql.yml),按实际 运行环境进行配置即可。 • 配置源端数据库连接信息、目标数据库连接信息 编辑 conf/datasource-mysql.yml 文件,编辑源端和目标端连接信息,包括 url、driver-class-name、username、password 信息,如下图所示: • 配置要迁移的源库模式,数据库对象,涉及到的参数见下图: 25 第3章 MYSQL 数据库移植实战 • 迁移配置参数说明 编辑 conf/datasource-mysql.yml 文件有多个配置参数,可灵活使用。以下列举常用的配置参数。 • fetchSize: 游标提取记录数(每次和服务器交互提取的数据行数,加大该值可提升读取效率,但会增加内存开 销(一次将指定数量的数据取回放在缓存中))。 • tableWithLargeObjectFetchSize: 含大对象数据表的游标提取记录数(同上,只是此参数针对有大对象字段的表)。 • tableWithBigLargeObjectFetchSize: 大表拆分阈值行数(当表的行数超过此值时,将对表进行拆分,每块的记录数为此值和表总记录数 除以“拆分最大块数”中的最大值)。 • largeTableSplitThresholdRows: 大表拆分阈值行数(当表的行数超过此值时,将对表进行拆分,每块的记录数为此值和表总记录数 除以“拆分最大块数”中的最大值)。 • largeTableSplitThresholdSize: 26 第3章 MYSQL 数据库移植实战 大表拆分阈值大小(单位为 M)(当表的数据大小(普通字段 + 大对象字段)超过此值时,将对表 进行拆分)。 • largeTableSplitMaxChunkNum: 大表拆分最大块数(每张表的最大拆分块数,应不超过总的读线程数)。 • largeTableSplitConditionFile: 大表拆分条件定义文件(优先于按行数和大小拆分)。 • tableDataFilterConditionFile: 表数据过滤条件定义文件。 • useKdms: 是否使用 kdms 做转换(视图、函数、存储过程、包、触发器)。 • kdmsUrl: kdms 访问地址,前提是 useKdms: true • writeBatchSize: 批量提交记录数(行数据)。 • writeBatchByteSize: 批量提交数据大小(单位 M)。 • lobInMemoryThresholdSize: 大对象数据读入内存阈值(单位兆,默认 128M)。 • dropExistingObject: 删除目标库中已存在的对象(如表、视图等)。 • truncateTable: 是否默认清空目标库中已存在的表数据。 • renameObject: 目标数据库对象重命名,除表名、列名外的其他对象: pk、fk、constraint、unique constraint、index 等。 • 线程相关设置 线程相关设置可根据实际服务器配置按比例调整,如果与目标数据库运行在同一服务器上,应将绝大部分资源 分配给数据库。 进入 KDTS-CLI/conf 目录下,参照 thread-config_sample.json 文件新建 thread-config.json 文件,设置线程池 配置,如下图所示: 27 第3章 MYSQL 数据库移植实战 数据迁移属于 IO 密集型操作,涉及网络络 IO 和磁盘 IO 的交互,一旦发生 IO,线程就会处于等待状态,当 IO 结束,数据准备好后,线程才会继续执行。为提升数据迁移的效率可以多设置�些线程池中线程的数量,避 免任务等待,线程可以去做更多的迁移任务,提高并发处理效率。但不是线程数设置的越高,效率就越高,线 程上下文切换是有代价的。对于 IO 密集型线程数的设置公式为:线程数 = CPU 核心数/(1-阻塞系数) ,其中 阻塞系数一般为 0.8~0.9 之间,取 0.9 则: 双核 CPU:2/(1-0.9) = 20 64 核 2 路 CPU:64*2/(1-0.9) = 1280 • 启动脚本 – 进入 KDTS-CLI/bin 目录下,编辑: startup.sh – 检查 JDK 的路径是否正确 JAVA_PATH=${BASE_PATH}/jdk – 启动运行脚本 进入 KDTS-CLI/bin 目录,执行: ./startup.sh • 查看迁移报告及问题处理 可以在运行日志(kdts_plus_***.log)中查看到迁移整个过程的信息,包括任务启动、迁移进程、结果汇总 可查看 result 下的迁移结果(在形如“result/2021-12-02_15-15-15/Sehcma1”目录下) • index.html--报告主页面 • detail_XXX.html--XXX 详细信息(如表结构、表数据、表主键等) • FailedScript--失败脚本目录 • IgnoredScript--略过脚本目录 • SuccessScript--成功脚本目录 在迁移过程中一旦某个对象创建失败,KDTS 会将该对象的创建 sql 保留到本次迁移任务文件 夹下的 FailedScript 目录下 *.sql 文件,用户可以手动修改后通过 Ksql 或者 KStudio 工具手动 执行。 3.2.6.3 在线迁移 在线迁移时,首先需要使用 KFS 完成。 具体参见 KFS 产品的 MYSQL 在线迁移指南。 28 第3章 3.2.6.4 MYSQL 数据库移植实战 多次迁移 若项目开发过程中,需要定期从一个指定的源数据库迁移到目的数据库中,那么根据迁移时源数据库和应用的状 态,决定离线迁移还是在线迁移。 同时,由于是多次迁移,需要考虑每次迁移时数据库对象的定义是否需要迁移,若不需要,则只迁移数据就可 以,使用 KDTS 和 KFS 都支持只迁移数据;若每次迁移时需要迁移对象定义,则 1)比较源和目的对象定义是否 发生变更 2)对于定义发生变更的表,选择迁移定义和数据 3)对于定义没有发生变更的表,只同步数据即可。 3.2.7 应用程序迁移 在应用编程接口方面,KingbaseES 与 MySQL 兼容程度较高,所以,一般情况下,应用程序迁移比较容易。应 用程序迁移通常应和移植系统测试同时进行。这样可及时修改测试过程中发现的问题。 3.2.7.1 概述 如何在一个应用程序中访问和操纵数据库呢?通常,可采用以下方式: 3.2.7.1.1 API 方式 该方式通过数据库厂商提供的各种标准应用编程接口在应用程序中与数据库进行交互。常用的应用编程接口如 JDBC 和 ODBC 等。目前,大多数数据库厂商均提供很多标准的数据库 API 及其驱动程序。 在实际应用中,应首先加载驱动程序。加载成功后,利用 API 函数与数据库交互并完成对数据库数据的操作。 详细参考《客户端编程接口》。 29 第3章 MYSQL 数据库移植实战 3.2.7.1.1.1 JDBC 说明 基 JDBC MySQL KingbaseES --声明连接 --声明连接 Connection con; Connection con; --加载驱动程序 --加载驱动程序 Class.forName("com.mysql.jdbc.Driver Class.forName("com.kingbase8.Driver"); 本使用 "); --连接串 --连接串 String url="jdbc:mysql://192.168.0.1: String url="jdbc:kingbase8://192.168.0.1: 3306:databasename"; 54321/databasename"; --获得连接 --获得连接 con= DriverMan- con= DriverManager.getConnection(url,user,pwd); ager.getConnection(url,user,pwd); 其它问题请参考《JDBC 指南》 3.2.7.1.1.2 Hibernate 说 MySQL KingbaseES 明 Hi- 定义 hibernate 配 置 文 件, 根 据 用 户 选 择 更 ber- 改 以 下 配 置 文 件。 在 hibernate.properties nate 增 加 如 下 声 明:hibernate.dialectorg 中 .hiber- 定义 hibernate 配置文件,根据用户选择更改以下 配 置 文 件。 在 hibernate.properties 明:hibernate.dialectorg 中增加如下声 .hibernate.dialect .King- 基 nate.dialect .MySQLDialect 在 hibernate.cfg.xml base8Dialect 在 hibernate.cfg.xml 中增加如下声明: 本 中 增 加 如 下 声 明:

MySQL至KingbaseES迁移最佳实践.pdf




