KingbaseES_V8R3至V8R6迁移最佳实践.pdf
KingbaseES V8R3 至 V8R6 迁移最佳实践 金仓数据库管理系统 KingbaseES 文档版本:V8(V008R006C007B0012) 发布日期:2022 年 11 月 4 日 北京人大金仓信息技术股份有限公司 目 目 录 录 第 1 章 前言 1 1.1 适用读者 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 相关文档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.3 术语 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.4 手册约定 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 第 2 章 KingbaseES V8R3 和 V8R6 兼容性 2.1 3 KingbaseES V8R3 和 V8R6 兼容特性概览 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.1 兼容性开关 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.2 模式和对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.1.2.1 扩展数据类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.1.2.2 模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.1.2.3 大小写敏感 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.1.2.4 序列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.1.2.5 同义词 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.1.2.6 分区 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.1.2.7 全局临时表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.1.2.8 kdb_schedule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 SQL 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.1.3.1 支持 CREATE TABLE WITH OIDS 语句 . . . . . . . . . . . . . . . . . . . . . . . . 8 2.1.3.2 select * from sequencename 语句 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.1.3.3 函数 sys_guid() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.1.3.4 函数 get_byte(bit, int) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.1.3.5 操作符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 PL/SQL 语言 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.1.4.1 嵌套表定义 CHAR 类型省略长度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.1.4.2 CREATE PACKAGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.1.5 版本新增能力和变更能力明细 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.1.6 支持的客户端编程接口兼容性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.1.3 2.1.4 第 3 章 KingbaseES 移植能力支撑体系 15 I 3.1 3.2 3.3 目 录 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.1.1 数据迁移工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.1.2 手动迁移调试工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.1.3 系统割接后的数据同步工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.1.4 系统割接后系统备份工具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 KingbaseES 应用能力概述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.2.1 支持的模式对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.2.2 SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.2.3 PL/SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.2.4 客户端编程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.2.5 第三方产品和组件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.2.6 高可用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.2.7 性能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.2.8 相关技术资源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 KingbaseES 支撑系统割接能力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.3.1 应用业务割接时间短 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.3.2 割接后需要双轨运行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 迁移工具 第 4 章 KingbaseES V8R3 到 V8R6 数据库移植实战 4.1 4.2 27 主要移植内容 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.1.1 数据库、用户和模式移植 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.1.2 KingbaseES V8R3 数据迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 4.1.3 应用程序移植 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 关键移植步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 4.2.1 确定移植目标 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 4.2.2 评估移植任务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 4.2.3 组建移植团队 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 4.2.4 准备迁移环境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 4.2.4.1 部署目的数据库服务器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 4.2.4.2 获取并安装必要的软件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 4.2.5 数据库以及用户和模式迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 4.2.6 数据迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 迁移前准备 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 4.2.6.1.1 获取 V8R3 数据库的相关信息 . . . . . . . . . . . . . . . . . . . . . . . . . . 35 4.2.6.1.2 移植数据库、用户和模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 4.2.6.1.3 配置 JDBC 数据源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 4.2.6.1.4 配置目的库 KingbaseES 性能参数 . . . . . . . . . . . . . . . . . . . . . . . . 36 离线迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 4.2.6.2.1 BS 迁移步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 4.2.6.2.2 SHELL 迁移步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 在线迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 在源端数据库中创建一致性状态 . . . . . . . . . . . . . . . . . . . . . . . . . 51 4.2.6.1 4.2.6.2 4.2.6.3 4.2.6.3.1 II 目 录 4.2.6.3.2 存量数据迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.2.6.3.3 启动 KFS 完成数据追平 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 多次迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.2.7 应用代码迁移 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.2.8 测试与调试移植系统 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.2.8.1 功能测试和排错 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 4.2.8.2 性能测试和调优 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.2.6.4 版权声明 54 III 第 1 章 前言 1 第 章 前言 本文档描述了 KingbaseES V8R3 到 V8R6 的应用移植方法。 前言部分包含以下主题: • 适用读者 • 相关文档 • 术语 • 手册约定 1.1 适用读者 KingbaseES V8R3 至 V8R6 迁移最佳实践面向所有使用 KingbaseES 的用户,主要是数据库管理员和应用程序开 发人员。 1.2 相关文档 无 1.3 术语 无 1.4 手册约定 本文档中可能出现“注意、提示、警告、另请参阅”等标志,它们所代表的含义如下: 1 第 1 章 前言 注意: 用于突出重要/关键信息、最佳实践等。 提示: 用于突出小窍门、捷径等。 警告: 用于传递设备或环境安全警示信息,若不避免,可能会导致设备损坏、数据丢失、设备性能降低或其 它不可预知的结果。 另请参阅: 用于突出参考、参阅等。 以下程序代码书写约定适用于本文档: 符号 说明 [] 表示包含一个或多个可选项。不需要输入中括号本身。 {} 表示包含两个以上(含两个)的候选,必须在其中选取一个。不需要输入花括号本身。 | 分割中括号或者花括号中的两个或两个以上选项。不需要输入“|”本身。 ... 表示其之前的元素可以被重复。 斜体 表示占位符或者需要提供特定值的变量。 大写 表示系统提供的元素,以便与用户定义的元素相互区分。除出现在方括号中的元素外,应当按 照顺序逐字输入。当然,部分元素在系统中是大小写不敏感的,因此用户可以根据系统说明以 小写形式输入。 小写 表示由用户提供的元素。 2 第 2 章 KINGBASEES V8R3 和 V8R6 兼容性 2 第 章 KingbaseES V8R3 和 V8R6 兼容性 本部分包含如下章节: • KingbaseES V8R3 和 V8R6 兼容特性概览 2.1 KingbaseES V8R3 和 V8R6 兼容特性概览 本章节包含以下内容: • 兼容性开关 • 模式和对象 • SQL 语句 • PLSQL 语言 • 版本新增能力和变更能力明细 • 支持的客户端编程接口兼容性 2.1.1 兼容性开关 KingbaseES 用户可通过设置相关的数据库兼容开关,部分或全部启用 Oracle 兼容特性。在实际应用中,用户可 采用以下途径设置 Oracle 兼容开关: • 在数据库实例 data 目录下的 kingbase.conf 文件中配置 • 在数据库初始化时设置 • 在用户会话中设置 KingbaseES 提供了多个 Oracle 特性兼容开关。在 Oracle 移植过程中,用户可按需使用这些开关。下表列出 KingbaseES 提供的 Oracle 兼容特性开关。 3 第 2 章 KINGBASEES V8R3 和 V8R6 兼容性 表 2.1.1: KingbaseES V8R6 和 V8R3 兼容特性开关一览表 兼容特性开关 V8R6 V8R3 用途说明 char_default_type 不支持(oracle 兼容模式下 支持 默认就是兼容类型的设置) 设置字符串类型的长度单位 (char 或 参数 byte), 它 和 Oracle NLS_LENGTH_SEMATICS 的含义一 致(会话级参数,缺省值是 char)。 ora_func_style 不支持(oracle 兼容模式下 支持 默认就是兼容类型的设置) 开关开启时兼容 oracle 函数及 sequence 序 列(会话级参数,缺省值是 true)。 移植时人为去掉设置该参数 的 sql default_with_oids 支持 支持 开关开启时,新创建的表将包含 OID 伪 列。此外,如果创建的表没有 OID 伪列, 那么这个表也没有 ROWID 伪列。如果创建 加密表时,必须指定 WITH OID。 ora_input_emptystr_isnull 支持 支持 开关开启时,系统将输入的空串当做 NULL 处理 (会话级参数,缺省值是 true)。 ora_date_style 支 持 (KingbaseES 使用 此开关设置 数据 date 支持 开关开启时,date 类型的输出格式兼容 oracledate 类型输入格式(会话级参数,缺省 类 型 格 式 时, 需 要 先 打 开 值是 false)。 ora_style_nls_date_format 开关,且 ora_date_style 默 认时间格式为’ YYYY-MMDD HH24:mi:ss) ora_format_style nls_timestamp_format 不支持(可以使用 Oracle 模 支持 开 关 开 启 时, 格 式 化 输 出 式替代)移植时人为去掉设 (to_char,to_timestamp...) 兼 容 置该参数的 sql cle (会话级参数,缺省值是 false)。 不支持 支持 ora- 开关开启时,time stamp 类型 to_char 默 认输出格式兼容 oracle (会话级参数,缺省 值是 YYYY-MM-DDHH:MI:SS)。 nls_length_semantics 支持 不支 设置字符串类型的长度单位 (char 持 或 参数 byte), 它 和 Oracle NLS_LENGTH_SEMATICS 的含义一 致(会话级参数,缺省值是 char) ora_numop_style 不支持 支持 开关开启时,integers 操作符当做 numeric 操作符。 见续表 4 第 2 章 KINGBASEES V8R3 和 V8R6 兼容性 表 2.1.1 – 续表 兼容特性开关 V8R6 V8R3 用途说明 extra_float_digits 支持(默认值为 1) 支持 设置浮点值显示的位数。 (默 认值 为 0) 2.1.2 模式和对象 本节内容旨在为移植过程的相关模式修改操作提供参考指南。 2.1.2.1 扩展数据类型 为兼容 Oracle 的数据类型,KingbaseES 扩展了 Oracle 的 NUMBER、VARCHAR2、CHAR(n) 和 DATE 类 型。该措施使得移植 Oracle 的 Create Table 等 DDL 语句时,无需任何修改就能直接在 KingbaseES 环境中运行。 下面各表对比了 KingbaseES 和 Oracle 在各种数据类型上的异同点。 表 2.1.2: KingbaseES V8R6 与 V8R3 数值数据类型对比表 数据类型名 KingbaseES V8R6 KingbaseES V8R3 bool 不支持 bool 到 text 的隐式转换, (比 支持 bool 到 int 的隐式转换支持 如 like 等操作需要此隐式转换,可 bool 到 text 的隐式转换. 修改应用增加显示转换绕过此问题.) time,timetz 不支持 time 和 timetz 到 times- 支持 time 和 timetz 到 timestamptz tamptz 类型的隐式转换(Oracle 中 类型的隐式转换 不存在 time 和 timetz 类型,在不 影响 Oracle 兼容性的基础上保留了 原型的处理逻辑。可通过修改应用 增加显示转换来绕过此问题。) abstime 不支持 内部使用的较低精度类型 reltime 不支持 内部使用的较低精度类型 tinterval 不支持 支持 5 第 2 章 KINGBASEES V8R3 和 V8R6 兼容性 2.1.2.2 模式 V8R6 中 search_path 中的模式名,需要写成小写; 例: V8R3: show search_path ; search_path ----------------"$USER", PUBLIC (1 row) V8R6 : show search_path ; search_path ----------------"$user", public (1 row) 2.1.2.3 大小写敏感 例: V8R3: show case_sensitive ; case_sensitive ---------------on (1 row) V8R6 : show enable_ci ; enable_ci ---------------on (1 row) 6 第 2 章 KINGBASEES V8R3 和 V8R6 兼容性 序列 2.1.2.4 V8R3 中 select * from sequencename 可以得到 10 列信息,V8R6 直接 select * from sequencename 只有 3 列, 其余列可通过 select * FROM all_sequences WHERE sequence_name=UPPER(’sequencename’) 找到。 例: V8R3: CREATE SEQUENCE serial START 1; select * from serial; SEQUENCE_NAME | LAST_VALUE | START_VALUE | INCREMENT_BY | MAX_VALUE | MIN_VALUE | CACHE_VALUE | LOG_CNT | I S_CYCLED | IS_CALLED ---------------+------------+-------------+--------------+---------------------+-----------+-------------+--------+----------+----------SERIAL | 1 | 1 | 1 | 9223372036854775807 | 1 | 1 | 0 | f | f (1 row) V8R6 : CREATE SEQUENCE serial START 1; select * from serial ; last_value | log_cnt | is_called ------------+---------+----------1 | 0 | f (1 row) select * FROM all_sequences WHERE sequence_name=UPPER('serial'); sequence_owner | sequence_name | min_value | max_value | increment_by | cycle_flag | order_flag | cache_siz e | last_number ----------------+---------------+-----------+---------------------+--------------+------------+-----------+-----------+------------abcd | SERIAL | 1 | 9223372036854775807 | 1 | f | t | 1 | (1 row) 2.1.2.5 同义词 V8R6 找同义词时,对于同义词指向的对象,首先依然作为同义词进行递归查找和成环检测,而不是把同义词指 向的对象首先按照普通对象查找,这个处理顺序和 V8R3 不同。 7 第 2 章 KINGBASEES V8R3 和 V8R6 兼容性 2.1.2.6 分区 V8R6 分区支持的兼容 V8R3,支持分区的 alter,支持全局索引,支持 interval 分区,不支持 reference 分区 2.1.2.7 全局临时表 V8R3 支持本地临时表,不支持全局临时表。 V8R6 支持本地临时表和全局临时表。 2.1.2.8 kdb_schedule 目前龙芯平台没有 kdb_schedule 依赖的系统库 libboost_system.so.1.69.0,ES 安装程序将这个库放到了 Server/ lib 下,使用 kdb_schedule 之前需要设置 export LD_LIBRARY_PATH 中包含 Server/lib。 export LD_LIBRARY_PATH = $LD_LIBRARY_PATH:/Kingbase_install_dir/Server/lib 2.1.3 SQL 语句 对于大多数常用的 Oracle SQL 语句,KingbaseES 均提供了原生支持。该措施使得 Oracle 应用程序移植到 KingbaseES 系统时,通常只需很少的代码变动。 下面给出 KingbaseES 中原生支持的 Oracle SQL 语句。此外,若未做特殊说明,本节示例的代码在 KingbaseES 和 Oracle 上均可运行。 2.1.3.1 支持 CREATE TABLE WITH OIDS 语句 V8R6 支持 create table with oids,表中的系统隐含列不再包含 OID,但是这样创建的表,包含了一个用户隐含 列 oid,类型是 oid。对于 oracle rowid,需要用户创建隐含列 rowid,类型是 oid。 例: create table tt (a int) with oids; ERROR: syntax error at or near "oids" create table tt1 (a int); select oid,relname from pg_class where relname = 'tt1'; oid | relname -------+--------16403 | tt1 (1 row) 8 第 2 章 KINGBASEES V8R3 和 V8R6 兼容性 2.1.3.2 select * from sequencename 语句 V8R3 中 select * from sequencename 可以得到 10 列信息,V8R6 直接 select * from sequencename 只有 3 列, 其余列可通过 select * FROM all_sequences WHERE sequence_name=UPPER(’sequencename’) 找到。 例: V8R3: CREATE SEQUENCE serial START 1;select * from serial; SEQUENCE_NAME | LAST_VALUE | START_VALUE | INCREMENT_BY | MAX_VALUE | MIN_VALUE | CACHE_VALUE | LOG_CNT | IS_CYCLED | IS_CALLED ---------------+------------+-------------+--------------+---------------------+-----------+-------------+--------+-----------+----------SERIAL | 0 | f 1 | 1 | 1 | 9223372036854775807 | 1 | 1 | | f (1 row) V8R6 : CREATE SEQUENCE serial START 1; select * from serial ; last_value | log_cnt | is_called ------------+---------+----------1 | 0 | f (1 row) select * FROM all_sequences WHERE sequence_name=UPPER('serial'); sequence_owner | sequence_name | min_value | max_value | increment_by | cycle_flag | order_flag | cache_size | last_number | start_value ----------------+---------------+-----------+---------------------+--------------+------------+-----------+------------+-------------+------------system | SERIAL 1 | 2.1.3.3 | | 1 | 9223372036854775807 | 1 | f | t | 1 函数 sys_guid() V8R6 默认输出为 name 类型,如希望输出为 bytea 类型,需在配置文件中修改 guid_default_return_type='bytea' 并重启数据库,再通过以下命令实现: select alter_sys_guid(); 如希望输出为 name 类型,需在配置文件中修改 9 第 2 章 KINGBASEES V8R3 和 V8R6 兼容性 guid_default_return_type='name' 并重启数据库,再通过以下命令实现: select alter_sys_guid(); 2.1.3.4 函数 get_byte(bit, int) V8R6 不支持 get_byte(bit,int) 函数 V8R3: test=# SELECT GET_BYTE(X'164da53ef', 4); GET_BYTE ---------239 (1 row) V8R6 : test=# SELECT ERROR: GET_BYTE(X'164da53ef', 4) ; function get_byte(bit, integer) does not exist LINE 1: SELECT GET_BYTE(X'164da53ef', 4) ; ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. 2.1.3.5 操作符 相比 V8R3,V8R6 完善了自定义操作符的处理逻辑。对于 V8R3 中所限制的自定义操作符中最后一个字符是 ‘+’或者‘-’的,如果前面包含‘~! @ ^ & ‘ %’这些字符中的任一字符,则不可以创建自定义操作符。比如在 V8R3 中,创建自定义操作符‘~+’,将会报错,而 V8R6 中允许创建,V8R6 中禁用的自定义操作符有 10 个,包 括:”!=+”, ”!=-”, ”^=+”, ”^=-”, ”||+”, ”||-”, ”^+”, ”^-”, ” |+”, ” |-”。这样也是为了尽可能保证处理逻辑与原型一 致的基础上,还可以兼容 Oracle 的操作符。基于上面的处理逻辑,在 V8R3 中,比如遇到”%-” 这类操作符,实际上 是会被当做两个(甚至多个)独立的操作符‘%’和‘-’,而 V8R6 中会认为这是用户自定义的操作符,会当做一个 整体。所以在 V8R6 中如果想要将‘%-’操作符当做两个独立的操作符,需要修改应用,在操作符中间插入空格。这 一点影响了应用兼容性。 2.1.4 PL/SQL 语言 下面将具体指出 PLSQL 中 v8.3 到 v8.6 的迁移实践。 10 第 2 章 KINGBASEES V8R3 和 V8R6 兼容性 2.1.4.1 嵌套表定义 CHAR 类型省略长度 区别: V8R3 嵌套表定义 CHAR 类型省略长度,赋值超长,V8R3 截断 V8R6 嵌套表定义 CHAR 类型省略长度,赋值超长,V8R6 报错 升级改写方案: 嵌套表定义 CHAR 类型省略长度,赋值正确 V8R3: DO $$DECLARE TYPE type_name10 IS TABLE OF CHAR NOT NULL; nttypeelement10 type_name10:=type_name10('AAAA'); BEGIN RAISE NOTICE 'nttypeelement10(1)=%',nttypeelement10(1); EXCEPTION WHEN VALUE_ERROR THEN RAISE NOTICE 'VALUE_ERROR'; END$$; V8R6 : DO $$DECLARE TYPE type_name10 IS TABLE OF CHAR NOT NULL; nttypeelement10 type_name10:=type_name10('A'); BEGIN RAISE NOTICE 'nttypeelement10(1)=%',nttypeelement10(1); EXCEPTION WHEN VALUE_ERROR THEN RAISE NOTICE 'VALUE_ERROR'; END$$; 2.1.4.2 CREATE PACKAGE 区别: V8R3CREATE PACKAGE 中文名的包 AS a int END; 创建成功 V8R6 CREATE PACKAGE 中文名的包 AS a int END; 创建失败 升级改写方案: 由于 V8R6 在包语法解析时更加严格,因此需要在 a int 后加’;’ V8R3: 11 第 2 章 KINGBASEES V8R3 和 V8R6 兼容性 CREATE PACKAGE 中文名的包 AS a int END; V8R6 : CREATE PACKAGE 中文名的包 AS a int; END; 2.1.5 版本新增能力和变更能力明细 V8R6 和 V8R3 版本新增以及变更能力明细如下表所示: 表 2.1.3: V8R6 和 V8R3 版本新增以及变更能力明细 数据库对象类型 功能增强 实现完整性 支持全局临时表 完整实现 Oracle directory 不完整,不包括授权 支持 Generated columns; 完整实现 支持分区 不完整,不支持分区的 alter,不支 持全局索引,不支持 interval 分区和 reference 分区 兼容 oracle 默认是大写存储的行为 不完整,不支持 oracle 中大写对象 和小写对象同时存在 支持兼容 oracle 的 Force View 完整实现 服务器编码新增支持 完整实现 GBK、 GB18030 内置数据库对象 支持自动任务调度 完整实现 支持同义词 完整实现 支持 XML 函数 完整实现 支持 postgis 2.5.2 和 3.0 支持 linux 支持 oracle 系统视图 完整实现 支持兼容 Oracle 数据类型:Num- 完整实现 ber、字符类型、日期时间型、同时 支持相关的操作符、索引、函数, 支持类型转换。 见续表 12 第 2 章 KINGBASEES V8R3 和 V8R6 兼容性 表 2.1.3 – 续表 功能增强 实现完整性 支持 BLOB、CLOB、NCLOB 等大 完整实现 对象数据类型,同时支持了相关的 函数、接口。 SQL 操作 支持表达式 coalesce 完整实现 支持不指定 group by 情况下进行聚 完整实现 集操作 支持 Merge into 完整实现 支持 dml 语句使用 return 指定返回 完整实现 结果集 支持子查询自动生成别名 完整实现 支持中文的逗号和空格 完整实现 新增约束的禁用启用 完整实现 支持在 create table 时指定列为 not 完整实现 null 支持在 create user 时指定 lock 和 完整实现 unlock 2.1.6 支持在线重建 index 完整实现 支持内嵌 WITH recursive 查询; 完整实现 支持 SQL/JSON PATH 特性; 完整实现 支持的客户端编程接口兼容性 V8R6 和 V8R3 客户端编程接口兼容性如下表所示: 13 第 2 章 KINGBASEES V8R3 和 V8R6 兼容性 表 2.1.4: V8R6 和 V8R3 客户端编程接口兼容性 接口类型 V8R3 和 V8R6 的兼容性 JDBC 读写分离集群增加一个必填参数:nodelist,其它方面使用一致。 Activiti 直接使用 PG 的配置方式,使用 JDBC 的 PG 形态驱动包。 Hibernate 一致 OCI 一致 Mybatis 一致 ODBC 一致 NET NDP 一致 NET EF 一致 PHP PDO 一致 Perl PDI 一致 Nodejs 一致 Golang 一致 Python 一致 QT 一致 14 第 3 章 KINGBASEES 移植能力支撑体系 3 第 章 KingbaseES 移植能力支撑体系 本章节包含以下内容: • 迁移工具 • KingbaseES 应用能力概述 • KingbaseES 支撑系统割接能力 3.1 迁移工具 KingbaseES 支持应用系统处于离线状态的数据迁移(以下简称离线迁移)和应用系统处于在线状态的数据迁移 (以下简称在线迁移)。 离线迁移是指,应用系统在离线状态下,源数据库服务器持续提供服务时,通过 KingbaseES 的迁移工具将源数 据库的对象定义和数据搬迁到目的数据库。 在线迁移是指,应用系统处于在线状态下,源数据库服务器持续提供服务时,通过 KingbaseES 的迁移工具完成 对象和数据的搬迁。 3.1.1 数据迁移工具 KingbaseES 提供了 KDTS 和 KFS 2 个工具可以完成迁移数据任务。KDTS 可以用于离线迁移,可以完成数 据库中所有所有对象定义的迁移和数据的迁移。KFS 可以应用于数据的同步,主要应用于表结构和表数据的初始搬 迁,以及之后的数据的实时同步。KDTS 和 KFS 一起部署,可以完成一个大型系统的在线迁移。 15 第 3 章 KINGBASEES 移植能力支撑体系 工具特性对比 KDTS KFS 是否支持迁移存储过程等对象定义迁移 支持所有对象定义的迁移 支持表结构和主键的定义的迁移 同步一次,还是持续同步 一次同步 持续同步 是否需要初始状态同步 不需要 需要 跨平台 支持 支持 迁移部分表 支持 支持 迁移一个表的部分数据 支持 支持 断点续传 不支持 支持 KDTS 的核心任务是将 V8R3 中的数据迁移到 KingbaseES V8R6。它完整支持了数据迁移过程中需要的各种特 性,包括自定义数据类型映射,并行迁移数据,迁移失败后统计,支持第二次迁移,迁移结束后支持源和目的数据库 的数据对比。这个产品是迁移任务中必须使用的工具。 人大金仓提供数据同步产品 KFS。进行数据同步的第一步是完成初始数据同步,之后将利用日志分析技术增量 同步数据。KFS 可以用于 V8R3 和 V8R6 之间的数据同步,数据集中,包括同步部分数据,同步策略灵活,支持断 点续传。 3.1.2 手动迁移调试工具 KingbaseES 提供了 2 个工具可以完成手动迁移过程中的调试工作: • 命令行 SQL 交互工具 ksql • 图形界面 SQL 交互工具 Kstudio 工具特性对比 ksql Kstudio 执行 SQL 支持 支持 直接编辑数据 需要写 SQL 语句 支持,通过图形界面直接编辑 执行存储过程 支持 支持 查看 SQL 执行计划 支持 支持 调试 plsql 支持 支持 数据库状态分析 不支持 不支持 慢 SQL 分析 不支持 不支持 16 第 3 章 KINGBASEES 移植能力支撑体系 ksql 是命令行的 SQL 交互工具,轻巧速度快。 Kstudio 工具是图形界面的 SQL 交互工具,易用性较好,同时包含了 plsql 的调试功能。 3.1.3 系统割接后的数据同步工具 KingbaseES 提供了 2 个数据同步工具: • KingbaseES 内置的物理同步功能 • V8R3 和 V8R6 之间的数据库同步 KFS 产品 工具特性对比 KignbaseES 物理同步功能 KFS 跨 CPU 支持 支持 断点续传 支持 支持 同步部分对象 不支持 支持 同步所有操作 支持 支持 KingbaseES 内置物理同步,主要是针对 2 个 KingbaseES 产品之间的同步。同步的单位是 2 个 data,不支持同 步部分对象。物理同步可以同步所有用户操作,可以执行断点续传,支持重放。 KFS 产品是为了解决 V8R3 和 V8R6 之间的同步,或者同步数据源之间部分对象的同步,同步粒度更加灵活。 若应用系统割接后,用户需要双轨运行,可以视情况选择物理同步或者 KFS 产品。 3.1.4 系统割接后系统备份工具 KingbaseES 提供了 2 个备份工具: • 逻辑备份 sys_dump • 物理备份 sys_rman 工具特性对比 sys_dump sys_rman 异构数据源 不支持 不支持 支持增量 不支持 支持 支持根据日志恢复到指定时间点 不支持 支持 备份单个表 支持 不支持 可以不备份指定表 支持 不支持 17 第 3 章 KINGBASEES 移植能力支撑体系 逻辑备份 sys_dump,支持备份对象在某一个执行状态中的定义和数据。不支持增量备份,备份对象选择灵活, 可以支持单个表,单个函数等的备份。逻辑备份无法和 redo 日志一起使用。 物理备份 sys_rman 备份整个实例的数据,不支持备份单个数据库或者单个表,但是支持增量备份。 3.2 KingbaseES 应用能力概述 V8R3 的移植的工作较少,这些工作量主要来源于两方面: 1. 应用开发移植需求:在数据对象类型、SQL 语言、PL/SQL 语言、客户端应用编程接口和开发框架等诸多方面 对两个数据库所进行的、大量的语法或功能的对齐处理。同时,源应用系统使用的第三方产品或者组件,目标 数据库同样需要支持。 2. 应用系统运行需求:高可用方案是否支持,性能是否满足需求。 3.2.1 支持的模式对象 KingbaseES 支持数据库、表空间、模式、用户和角色。同时支持模式下的如下对象。 表 3.2.1: 支持的模式对象 序号 模式下对象 1 表和分区 2 视图(包含 force view) 3 可更新视图 4 触发器 5 规则 6 约束 7 索引 8 数据库连接 dblink 9 函数 10 存储过程 11 操作符 12 包 见续表 18 第 3 章 KINGBASEES 移植能力支撑体系 表 3.2.1 – 续表 序号 模式下对象 13 序列 14 同义词 15 外部数据源 16 数据类型 17 标记和策略 18 规则 rule 19 域 domain 20 扩展包 21 全局临时表 22 DUAL 表 23 Oracle 兼容视图 24 ROWNUM, LEVEL 等伪列 25 匿名块 26 表达式,包括条件表达式等 表 3.2.2: 内置数据类型 序号 KingbaseES 数据类型 1 数值型 smallint 2 integer 3 bigint 4 decimal 5 numeric 6 number 7 real 8 float 见续表 19 第 3 章 KINGBASEES 移植能力支撑体系 表 3.2.2 – 续表 序号 KingbaseES 数据类型 9 double precision 10 double 11 smallserial 12 serial 13 bigserial 14 字符型 15 character(n[char | byte]), char(n[char | byte]) character varying(n[char | byte]), varchar(n[char | byte]), varchar2(n[char | byte]) 16 nvarchar(n[char byte]) 17 text 18 大对象型 19 20 clob, nclob blob 日期时间型 timestamp [ (p) ] [ without time zone ] 21 timestamp [ (p) ] with time zone 22 date 23 time [ (p) ] [ without time zone] 24 time [ (p) ] with time zone 25 interval year 26 interval month 27 interval day 28 interval hour 29 interval minute 30 interval second 31 interval year to month 32 interval day to second 见续表 20 第 3 章 KINGBASEES 移植能力支撑体系 表 3.2.2 – 续表 序号 KingbaseES 数据类型 33 布尔型 boolean 34 二进制型 bit(n) 35 bit varying(n) 36 XML 型 xml 37 数组型 array 38 枚举型 enum 39 JSON 型 json 40 jsonb 41 UUID 型 uuid 42 GIS 型 point 43 line 44 box 45 path 46 circle 47 polygon 48 geometry KingbaseES 支持的函数和视图,请参见 KingbaseES SQL 参考手册和 KingbaseES 数据库参考手册。 3.2.2 SQL 在 KingbasES 支持的 SQL 中,除了 3.2.1 中提到的对象的 CREATE/ALTER/DROP 之外,还提供了其他 SQL 访问接口: 数据操作 • INSERT | UPDATE | DELETE • TRUNCATE • MERGE INTO • INSERT FIRST/ALL 21 第 3 章 KINGBASEES 移植能力支撑体系 • COPY • CLUSTER 数据查询 • SELECT • 层次查询 CONNECT BY • LATERAL 子句 • 外连接操作符 (‘+’) • WITH [ RECURSIVE ] 子句 • PREPARE, EXECUTE • VALUES 子句 • EXPLAIN 数据整理 • ANALYZE • VACUUM • REINDEX 事务控制语句 • BEGIN,START TRANSACTION • COMMIT • ROLLBACK • SAVEPOINT | RELEASE SAVEPOINT | ROLLBACK TO SAVEPONIT • SET TRANSACTION { READ ONLY | READ WRITE } • PREPARE TRANSACTION 权限语句 • GRANT • REVOKE 3.2.3 PL/SQL KingbaseES 支持如下 PL/SQL 的常用语法: • 赋值语句 • IF-THEN-ELSE 语句 22 第 3 章 KINGBASEES 移植能力支撑体系 • CASE 语句 • 多种循环语句,如 LOOP 语句、WHILE-LOOP 语句和 FOR LOOP 语句 • %TYPE 属性和%ROWTYPE 属性 • REF CUSOR 游标 • 预定义异常和自定义异常 • %NOTFOUND、%FOUND、%ISOPEN 和%ROWCOUNT 游标属性 • RETURNING INTO 语句 • EXECUTE IMMEDIATE 语句 • 动态 SQL • BULK COLLECT • 消息输入 RAISE • PL/SQL 支持集合类型(关联数组、嵌套表、可变数组) KingbaseES 支持如下 PL/SQL 常用对象: • 触发器(行级触发器,列级触发器,事件触发器) • 函数,嵌套函数 • 存储过程 • 匿名块 • Package • OBJECT TYPE 3.2.4 客户端编程 KingbaseES 支持如下编程接口和开发框架。 表 3.2.3: 编程接口 序号 编程语言 KingbaseES 对应支持 1 JAVA JDBC 2 .Net .Net Data Provider 3 C/C++ Pro*C 4 DCI 见续表 23 第 3 章 KINGBASEES 移植能力支撑体系 表 3.2.3 – 续表 序号 编程语言 KingbaseES 对应支持 5 ODBC 6 OCCI 7 Php pdo 8 Perl pdi 9 Python ksycopg2 10 golang gokb 11 Node.js kb 表 3.2.4: 开发框架 序号 开发框架 KingbaseES 对应支持 1 Hibernate 支持 2 Activiti 支持 3 Mybatis 支持 4 Mybatis-Plus 支持 5 Flyway 支持 6 Liquibase 支持 7 Dbunit 支持 8 Hibernate- Spatial 支持 9 Qt 支持 10 Ef6 支持 11 Efcore 支持 12 Django 支持 13 SQLAlchemy 支持 24 第 3 章 KINGBASEES 移植能力支撑体系 表 3.2.5: 连接池 3.2.5 序号 连接池 KingbaseES 对应支持 1 C3P0 支持 2 DBCP 支持 3 Druid 支持 4 HikariCP 支持 第三方产品和组件 KingbaseES 目前已经和超过 1200 家的软硬件产品完成适配,涵盖 CPU、存储、操作系统、中间件、备份软 件、办公 OA、报表、安全邮件、流版签、信息安全、地理信息等多类的主流产品都已覆盖。 支持 POSTGIS 组件。 3.2.6 高可用 KingbaseES 支持完善的高可用方案,为客户提供的一系列产品和方案能够解决无法预测的停机及计划停机造成 的常见问题,并且能以最低的成本进行部署。 支持多种物理备份和逻辑备份,支持多种集群,支持物理同步,支持逻辑同步。具体请参见 高可用。 3.2.7 性能 随着企业业务数据量呈爆炸式增长,数据库性能问题变得越来越突出。通常,数据库性能优化是一个系统工程。 而不同的场景下,对性能的关注点也会有所不同,KingbaseES 分别采用更有针对性的优化技术来保证用户的各种应 用均可得到高性能的支撑。 KingbaseES 在数据装载,事务性应用场景,分析性应用场景都有针对性的性能优化,具体请参见《KingbaseES 数据库性能调优指南》。 3.2.8 相关技术资源 本指南重点从语句兼容特性、迁移工具、迁移场景和应用程序移植等几方面描述移植的关键技术和实现方式。在 每项技术和实现方式的描述上,本指南只提供有限的内容介绍,并未提供全面的细节说明。所以,用户若需了解某些 技术的实现细节还请参照相关的技术资料,这些资料诸如: • KingbaseES 数据库管理指南:详尽和全方位地介绍如何高效管理 KingbaseES 数据库系统。其中,这些管理诸 如用户管理、存储管理、模式对象管理等。 25 第 3 章 KINGBASEES 移植能力支撑体系 • KingbaseES 开发指南:提供了 JDBC、ODBC、DCI 和 ESQL 等应用编程接口的详细使用说明。 • KingbaseES 高可用指南:详细描述了系统在高可用方面的支持。 • KingbaseES 安装指南:全面介绍了 KingnaseES 各种工具的使用方法,这些工具如 SQL 交互工具 KSQL 和数 据迁移工具 KDTS 等。 • KingbaseES 数据库调优指南:详细描述了系统提供的优化能力。 3.3 KingbaseES 支撑系统割接能力 本章主要描述除了产品对应用运行的支撑以外,对系统割接上线过程中的需求是否都满足。 3.3.1 应用业务割接时间短 应用业务无法停机,或者用于割接的时间非常端,就需要说过同步工具持续同步数据。 • 评估系统割接需要的最短时间,协调用户预留最短时间; • 做出系统割接失败的回退预案,一旦割接失败,快速退回原有系统; • 使用迁移工具 KDTS 完成历史数据迁移; • 使用 KFS 进行 V8R3 和 V8R6 的持续同步。 源数据库和目的数据库的数据差异小于预留的时间时,就可以进行系统割接。 3.3.2 割接后需要双轨运行 若应用迁移时间短,没有足够的测试时间和试运行时间,用户可以采用割接后双轨运行,应用系统运行在一个数 据库上,数据库中的数据实时同步到另一个数据库中;一旦应用出现问题,可以快速切换到另一个数据库中。 KFS 支持 KingbaseES 和异构数据库的实施同步。 26 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 4 第 章 KingbaseES V8R3 到 V8R6 数据库移 植实战 由于 KingbaseES 内部兼容特性,在实际应用中,一般只需很少甚至不做任何修改,用户便可把 V8R3 数据库移 植到 V8R6 环境中运行。不仅如此,用户还可利用 KDTS 等多种工具简化移植过程。 本节重点描述了在实际应用中移植一个 V8R3 数据库系统的完整过程,以及其中的主要移植内容和关键移植步 骤。 本章节包含以下内容: • 主要移植内容 • 关键移植步骤 4.1 主要移植内容 在实际应用中,一个 V8R3 数据库系统的移植主要包括如下内容。这些内容的迁移是存在先后顺序的。若违反该 顺序,则可能导致迁移受阻。 4.1.1 数据库、用户和模式移植 数据库和模式是各种 SQL 和 PL/SQL 数据库对象的存放容器,而用户是这些对象的管理者和使用者。因此,在 迁移数据库对象之前,一般应先迁移数据库、用户和模式。 那么,如何移植这些内容呢?应在目的数据库 KingbaseES V8R6 上创建与源数据库 V8R3 同名的数据库、用户 和模式, 并授予新建用户具有使用该数据库和新建模式的所有或适当的权限。 另外,所创建数据库的字符集应与 V8R3 数据库字符集一致。如果 KingbaseES 已有同名数据库,则登录该数据 库后,则只需创建同名用户和属主为该用户的同名模式。 27 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 4.1.2 KingbaseES V8R3 数据迁移 数据迁移时,若应用系统不在线,我们定义为离线迁移;若迁移时,应用系统在线运行,我们定义为在线迁移。 根据数据迁移时,应用系统确定使用在线迁移还是离线迁移,根据不同需要可能需要使用 KDTS 和 KFS 完成数 据库迁移。 4.1.3 应用程序移植 在完成数据迁移以后,才可开始迁移应用程序,主要原因是:在用程序中,可能会访问和操作前面迁移的数据库 对象和数据。 应用程序移植主要包括接口驱动程序和连接方法的移植,以及 V8R3 扩展或私有的、且 V8R6 未兼容的 API 移 植。通常,该项任务的工作量较少。 在实际应用中,通常应用程序移植与移植系统测试与调试交叉进行。 4.2 关键移植步骤 作为一个典型的项目过程,数据库移植应具有健全的项目团队和全面细致的的项目执行过程。通常,移植一个 V8R3 数据库主要包括以下步骤: • 确定移植目标 • 评估移植任务 • 组建移植团队 • 准备迁移环境 • 数据库以及用户和模式迁移 • 数据迁移 • 应用代码迁移 • 测试与调试移植系统 这些步骤指之间的关系是:前四个步骤是迁移前的准备工作,这些准备工作是确保后续 V8R3 移植顺利进行的前 提条件,而最后一步是保证最终移植系统正确性和可用性的关键步骤。 下面,分别对上述各个步骤进行详细说明。 4.2.1 确定移植目标 开始迁移前,应根据用户的实际需求,确定移植目标。这些目标诸如: • 迁移 V8R3 数据库的规模。 28 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 • 迁移 V8R3 数据库对象的种类和特征,如简单和复杂迁移对象所占比例等。 • 迁移的难易程度,如是否迁移大对象,是否迁移大量约束等。 • 迁移的工期要求。 • 对目标系统的技术指标要求,诸如平台、版本、应用编程接口、工具、可用性、安全性和性能指标要求等。 明确移植目标以后,则可开始移植任务评估。 4.2.2 评估移植任务 当计划把一个 V8R3 数据库系统移植到 V8R6 环境时,如果不做评估或评估不充分的话,那么整个移植工作会 存在很多潜在风险,额外增加移植工程师的工作量并且无法确认移植完成时间。因此,移植前对移植的可行性、工作 量、难易程度和工作进度等进行充分评估是非常必要的。 通常,移植评估主要包括以下内容: • 移植技术指标,如移植业务压力和性能指标等。 • 移植数据规模,如移植各类数据库对象的数量,PL/SQL 程序的规模等。 • 移植中 V8R6 不支持功能的种类和数量。 • 移植的约束种类和数量。 • 移植过程中可能遇到的其他问题。 在移植中常用的评估模板如下表所示: 29 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 表 4.2.1: 移植评估的数据库/应用概况模板 项目 描述 V8R3 数据库版本 8.3 操作系统版本 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 应用 无 监控工具 无 备份方式 Exp/imp 其它工具(备份软件等) 无 高可用要求 较高 高可用配置方案 VCS 或单机 30 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 表 4.2.2: 移植评估的移植报告总结模板 项目 描述 移植分析日期 20111009 下午 移植分析人员 KingbaseES 版本 V8R3 版本 8.3 V8R3 Schema V8R3 DB Size (GB) 几个 GB V8R3 Schema Size (MB) 几个 GB 31 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 表 4.2.3: 移植评估的对象统计模板 类型 小计 备注 Function 7 较少用 Index 有 LOB 有 Materialized View 有 >10 Pro*Cedure 25 Sequence 有 >10 Table 1660 Table Partition 无 Trigger <30 JOB 无 Package 无 Package Body 无 Type 无 View >200 Synonym >300 最大到几十 MB,主要是照片、word、视频(较少) 约束较多 对象共计 表 4.2.4: 移植评估的约束统计模板 类型 小计 备注 CHECK OR NOT NULL FOREIGN KEY PRIMARY KEY UNIQUE KEY OTHER 约束共计 32 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 表 4.2.5: 移植评估的其它方面模板 特性 小计 数据压缩 无 索引组织表 无 维度(Dimensions) 无 物化视图 无 存储概要 无 高级队列 无 空间数据管理 无 全文搜索 有 数据库链接 无 数据复制 无 RAC 有 逻辑 standby 无 物理 Standby 无 自动存储管理 ASM 无 自动工作负载信息库 AWR 无 备注 共计 4.2.3 组建移植团队 任何一个高效、成功的项目都应具备一个健全和良好的团队,V8R3 数据库移植也不例外。如果没有这样团队互 相配合和支持,那么 V8R3 数据库移植将可能存在巨大的风险。所以,组建一个高效的移植团队是非常必要的。 那么,移植团队的组成人员应具备哪些条件呢?他们应至少具备以下的知识与技能: • 熟悉 V8R3 和 V8R6 的 SQL 语言和 PL/SQL 语言特性,以及相关的 KingbaseES 版本兼容特性。 • 熟悉 V8R3 和 V8R6 的各种应用编程接口,以及相关的 KingbaseES 版本兼容特性。 • 熟悉 V8R3 和 V8R6 的相关客户端工具,以及这些工具间的相同点和异同点。 由这些优秀人员组建的团队是高效移植 V8R3 数据库的可靠保障。 33 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 4.2.4 准备迁移环境 在上述步骤完成以后,移植工程师应开始准备迁移环境了,这些准备工作诸如: 4.2.4.1 部署目的数据库服务器 部署目的数据库服务器应遵循以下原则: • 目的数据库服务器的 CPU、内存、网络环境等硬件应尽量采用较高的配置。 • 如果移植的 V8R3 数据库系统规模较大,如超过 1GB,则建议把 V8R6 和 V8R3 部署在不同的物理机器上。 • 为确保迁移效率,应尽量把 V8R6 和 V8R3 服务器部署到同一局域网内。 4.2.4.2 获取并安装必要的软件 迁移前应获取并安装如下软件:V8R3 数据库系统、V8R6 数据库系统、JDBC 和 ODBC 驱动程序、C 语言开发 工具、OCI 软件、DCI 软件、TPC-C 测试工具、LoadRunner 等。 如果迁移数据规模较大,建议对安装的 V8R6 数据库服务器进行适当的优化,如增大 shared_buffer 大小、预先 创建较大的日志文件,预先申请足够的表空间数据库文件等。 完成上述准备工作后,移植工程师便可开始 V8R3 数据库移植工作了。 4.2.5 数据库以及用户和模式迁移 数据库、用户和模式迁移主要包括以下内容: • 获取源 V8R3 数据库的 IP 地址、实例名、网络服务端口号、用户名/密码等信息。 • 在目的 V8R6 数据库上,使用 KSQL 或 KStudio 工具上执行如下操作: • 创建与源 V8R3 用户同名的用户,例如创建与 V8R3 同名的 SYSTEM 用户。 • 创建与源 V8R3 同名的数据库,例如创建与 V8R3 同名的 TEST 数据库,它的属主为 SYSTEM。 • 创建与源 V8R3 同名的模式,例如创建与 V8R3 同名的 PUBLIC 模式,它的属主为 SYSTEM。 4.2.6 数据迁移 KingbaseES 数据迁移工具 KDTS 动态加载待迁移的数据库访问接口,方便用户定制和使用。 KingbaseES 数据同步工具 KFS 支持同构数据源之间的数据迁移 KDTS 支持 KingbaseES V7 和 V8R3 到 KingbaseES V8R6 的数据迁移。 KingbaseES 数据同步工具 KFS 支持结构迁移、支持全量数据迁移、支持列名映射,支持数据迁移过滤,在配置 数据任务时,可以对迁移的表配置 where 条件、通过匹配的 where 条件过滤需要迁移的数据。 34 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 数据库迁移时需要按照用户需求确定在线迁移还是离线迁移,若是离线迁移,使用 KDTS 完成 V8R3 的完整迁 移;若是在线迁移,则首先需要使用 KDTS 完成历史数据迁移,然后使用 KFS 完成数据的在线追平。 本节包括: • 迁移前准备 • 离线迁移 • 在线迁移 • 多次迁移 4.2.6.1 迁移前准备 在使用 KDTS 迁移 V8R3 数据库之前,应先做如下准备工作。 4.2.6.1.1 获取 V8R3 数据库的相关信息 迁移前,应获取源数据库 V8R3 的登录信息以及需要迁移的数据规模信息。其中,前者用于 Kstudio 工具的登录 操作,后者用于估算数据迁移时间和设计迁移方案。 1. V8R3 数据库基本信息 获取源 V8R3 数据库的: 1). IP 地址; 2). 数据库名; 3). 网络服务端口号; 4). 用户名/密码。 在目标 V8R6 上: 1). 创建与源 V8R3 用户(如 SYSTEM)同名的用户(SYSTEM ); 2). 创建与源 V8R3 (如 TEST)同名的数据库(TEST),属主为 SYSTEM; 3). 创建与源 V8R3 同名的模式,属主为 SYSTEM。 2. 查询 V8R3 数据库编码方式 SHOW SERVER_ENCODING; 【KingbaseES 初始化设置编码方式】 --encoding=GBK(支持 GBK UNICODE ASCII) 3. 查看表数据量大小 查看当前用户在 V8R3 中的表大小 35 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 select nspname, relname, sys_size_pretty(sys_table_size(sys_class.oid::regclass)) from sys_class, sys_namespace where relnamespace not in (99, 11) and relkind = 'r' and relpersistence = 'p' and relnamespace = sys_namespace.oid; 4. 检查数据库日期格式 时间的默认格式为:ISO,MDY 在配置文件中添加: datestyle ='ISO,YMD' 修改为年月日的格式(99 会改为 1999)。 4.2.6.1.2 移植数据库、用户和模式 在目的数据库 V8R6 上创建与源数据库 V8R3 同名的用户、数据库和模式,并且授予新建用户具有使用该数据库 和新建模式的所有或适当的权限。另外,所创建数据库的字符集应与 V8R3 数据库字符集一致。如果 V8R6 已有同名 数据库,则登录该数据库后,只需创建同名用户和属主为该用户的同名模式。 4.2.6.1.3 配置 JDBC 数据源 配置 V8R3 和 V8R6 的 JDBC 数据源,并设置相关的连接信息。 4.2.6.1.4 配置目的库 KingbaseES 性能参数 为了提高迁移速度,应对目的库 KingbaseES 进行性能优化配置。 例如: 1)根据迁移数据规模的大小,迁移前可预先创建适当大小的的数据和日志文件。 开始迁移之前根据待迁移数据库的大小,保证 KingbaseES 数据目录所在位置有足够的空间。 2)根据 KingbaseES 服务器硬件配置的实际情况调整 shared_buffers 大小,默认是 128M,建议调整为内存的 1/4 大小。 4.2.6.2 离线迁移 在完成上述准备工作以后,用户可使用 KDTS 进行数据的离线迁移,KDTS 提供了两种形态(BS、SHELL), 用户可根据需要进行选择,以下章节将分别介绍 BS、SHELL 版本进行 V8R3 迁移的具体步骤。 4.2.6.2.1 BS 迁移步骤 • 创建源数据库连接 36 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 创建 源库数据 库 连接。 创建 数据 库 连接界面 如下,填 写数 据源 信息,包 括:“连接名称”、“数 据 库类型”、“数据库版本”、“服务器地址”、“端口”、“用户名”、“密码”、“数据库”、“驱 动”、“URL”、“连接参数”。 • 创建目标数据库连接 创建 目标数据 库 连接。 创建 数据 库 连接界面 如下,填 写数 据源 信息,包 括:“连接名称”、“数 据 库类型”、“数据库版本”、“服务器地址”、“端口”、“用户名”、“密码”、“数据库”、“驱 动”、“URL”、“连接参数”。 37 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 • 新建迁移任务 KDTS 采用向导页的方式指导用户新建迁移任务,简单易用,用户依次配置“选择数据源”-“选择模 式”-“选择迁移对象”-“配置参数”,即可快速配置一个迁移任务。 1) 选择数据源 填写自定义任务名称(任务名称不能重复),选择“源数据库”和“目标数据库”,或者选择“新 建数据源”后使用。 38 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 2) 选择模式 根据您的数据迁移所需选择对应模式(如需选择模式在系统模式中可选中“包含系统模式”复选 框)的表、视图、序列、函数、存储过程、程序包、同义词。当模式较多时也可以通过左上方的查 询框进行检索。请您至少选择一种模式,否则将收到错误提示,以至于不能完成新建任务。 在选择模式的前提下如您未选择“表”,即没有迁移对象,则系统将认为您不需要迁移对象,将提 示您直接跳过“选择迁移对象”进入“配置参数”。 39 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 3) 选择迁移对象 通过已选模式选择您需要迁移数据的表,模式较多时可在已选模式搜索框内输入模式名关键字进行 快速检索。 可迁移此模式下全部表,也可以指定或排除部份表,当您选择“包含指定表”或“排除指定表” 时,请您通过“从列表选择”、“从文件导入”或者在输入框内输入表名将数据添加到包含列表 中,如您未添加数据,则会收到错误提示,导致无法完成新建任务。 40 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 当您点击“包含指定表”时也可选择多种方式。可直接在输入框内填写表名,多个表用“,”分割, 回车确认;“从列表选择”可在模式中选择指定表; 从列表选择表时,可选择对应模式、检索表名关键字、数据条数限制进行快速检索对应的表。点击 “>”按钮后加入到已选列表,当您想要移除部份表时可以选择对应的表点击“<”按钮取消表。选 择完成后点击确定。 4) 配置参数 41 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 迁移工具提供了一系列配置参数用于迁移方案的个性化配置,满足多种迁移场景。配置参数分为 “迁移配置”、“数据类型映射”、“线程配置”三个方面。以下以迁移配置为例,介绍各参数的 含义。其他配置项请参考 KDTS 迁移工具使用指南。 • 表默认处理方式: 包括两个复选框项(“建表/重建表”、“导入数据”),迁移到 V8R6 数据库是否需要建表或 者重建表,以及是否只迁移表结构而不迁移数据的选择,根据您的需求选择合适的选项(默认是 全选)。 • 表排序依据: 对迁移的表进行排序,可通过“按行数和大字段大小交替”、“按行数”、“按大小”进行排序 (默认是按行数和大字段大小交替)。 • 表数据读取和写入: 对表数据的读取和写入制定规则,可操作项包括“源库游标读取记录数”(默认是 100)、“批 量写入目标库记录数”(默认是 1000)、“每次批量提交大小”(默认是 100MB)、“LOB 字 段预读取大小”(默认是 4000Byte)。 • 大表拆分阈值依据: 对大表进行拆分迁移,设置拆分界限。 • 非对象设置: 其中包含“主键”、“检查约束”、“唯一约束”、“外键”、“索引”、“触发器”、“自动 转换对象名”。您可以根据自己的需求选择是否迁移这些非对象数据(默认是全选)。 • 数据库连接数设置: 42 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 您可以限制迁移程序对源数据库和目标数据库的最大连接数(默认是 100)。 • 执行迁移任务 可将此任务作为预迁移任务点击“保存”,或者作为执行任务点击“保存并迁移”。 • 迁移完成: 迁移结束“状态”栏显示“完成”,则迁移任务成功。 • 迁移失败: 迁移结束“状态”栏显示“失败”,则迁移任务失败。失败后可点击详情查看日志有助于解决问题。 43 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 • 查看迁移报告及问题处理 迁移完成后,需要确认执行结果,包括迁移数据量,是否有错误发生,可以通过迁移日志和迁移结果进行 查看。 “迁移日志”打印迁移任务执行后的日志,具体可分为“系统日志”、“Error 日志”、“Info 日志”。 “迁移结果”功能的工作区包括“任务执行批次”、“迁移对象”、“总数”、“成功数”、“失败 数”、“略过数”、“操作”。您可以查看历史迁移任务执行的每次记录,以及每次迁移的对象、成功 数、失败数、查看失败任务的错误日志。 44 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 4.2.6.2.2 SHELL 迁移步骤 • 目录说明 • bin: 启动脚本 • conf: 配置文件 • doc: 帮助文档 • drivers: 数据库连接驱动(注意不同版本驱动的存放目录差别,详见 readme.md) • jdk: jdk • kdms: kdms 程序 • lib: 程序包 • logs: 日志 • result: 迁移报告 • JDK 安装 下载与 KDTS 安装服务器相匹配的 JDK(需要匹配操作系统和 CPU 架构,如 Liunx/AArch64、Linux/x64、 Windows/x64 等),版本选择 JDK 15 或更高。下载地址: https://jdk.java.net/archive/ 将下载的 JDK 解压到 KDTS-CLI/jdk 目录下 注意: a、请使用解压版本的 JDK,以免安装 JDK 影响服务器上的其它应用。 b、不要把当前的 JDK 加入系统环境变量,以免影响服务器上的其他应用。 c、如果需要使用服务器上已有的 JDK,配置 bin/ startup.sh(Windows 平台为 startup.bat)中的 JAVA_PATH 即可。 • 配置数据库连接信息 • 进入 KDTS-CLI/conf 目录下,打开 application.yml 文件,根据源库类型设置当前激活的源库配置 (active: kingbase),如下所示: 在正确设置 application.yml 中的 active 项后,打开对应配置文件(kdts-kingbase.yml),按实际运 行环境进行配置即可。 45 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 • 配置源端数据库连接信息、目标数据库连接信息 编辑 conf/ kdts-kingbase.yml 文件,编辑源端和目标端连接信息,包括 url、driver-class-name、username、password 信息,如下图所示: • 配置要迁移的源库模式,数据库对象,涉及到的参数见下图: 46 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 47 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 48 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 • 迁移配置参数说明 编辑 conf/kdts-kingbase.yml 文件有多个配置参数,可灵活使用。以下列举常用的配置参数。 • fetch-size: 源数据库游标读取记录数,在一定范围内增加该值可提升读取效率,但会增加内存开销。 • table-with-large-object-fetch-size: 源数据库含大对象数据表的游标读取记录数,此参数针对有大对象字段的表。 • large-table-split-threshold-rows: 大表拆分阈值行数(当表的行数超过此值时,将对表进行拆分,每块的记录数为此值和表总记录数 除以“拆分最大块数”中的最大值)。 • large-table-split-threshold-size: 大表拆分阈值大小(单位为 M),当表的数据大小(普通字段 + 大对象字段)超过此值时,将对表 进行拆分。 – large-table-split-condition-file: 大表拆分条件定义文件,优先于按行数和大小拆分。 • table-data-filter-condition-file: 表数据过滤条件定义文件。 • use-kdms: 是否使用 kdms 做转换(视图、函数、存储过程、包、触发器)。 • kdms-url: kdms 访问地址,前提是 use-kdms: true • write-batch-size: 目标数据库表数据批量提交记录数. • write-batch-size-big-lob: 目标数据库表数据批量提交记录数,特指大对象数据。 – drop-existing-object: 是否默认删除目标库中已存在的对象(如表、视图等)。 – truncate-table: 是否默认清空目标库中已存在的表数据。 • rename-object: 目标数据库对象重命名,除表名、列名外的其他对象: pk、fk、constraint、unique constraint、index 等。 49 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 • 线程相关设置 线程相关设置可根据实际服务器配置按比例调整,如果与目标数据库运行在同一服务器上,应将绝大部分资源 分配给数据库。 进入 {安装路径}/KDTS-CLI/conf 目录下,打开:kb-thread-config.xml,如下图所示: 数据迁移属于 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 – 设置 JVM 内存 根据当前服务器的配置,调整 JVM 参数 50 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 JAVA_OPT="-server -Dfile.encoding=UTF-8 -Dconfig.path=${CONFIG_DIR} -Xmx16g -Xms16g" 主要 是: -Xmx16g -Xms16g 参数 – 启动运行脚本 进入 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 工具手动 执行。 4.2.6.3 在线迁移 在线迁移时,首先需要使用 KDTS 完成历史数据搬迁,之后使用 KFS 进行在线数据追平。 4.2.6.3.1 在源端数据库中创建一致性状态 1. 连接数据库 ksql -d "host=10.10.3.3 user=SYSTEM password=123456 replication=database dbname=test_snapshots port=54366" 这里用了一种特殊的连接方式。 2. 手动创建复制槽并生成对应的快照 CREATE_REPLICATION_SLOT slot_name LOGICAL decoderbufs; slot_name | consistent_point | snapshot_name | output_plugin -----------+------------------+---------------------+--------------slot_name | 0/A705E0C8 | 0000000C-0001EEAF-1 | test_decoding 注意:此处的复制槽名称为 1.1 节中记录的复制槽名称 注意:decoderbufs.so 文件的权限需要为 664 51 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 4.2.6.3.2 存量数据迁移 1. 使用 KDTS 完成存量数据的迁移。 4.2.6.3.3 启动 KFS 完成数据追平 使用 ONLINE 命令,将源端的 KFS 拉起来。正常情况下,KFS 应该从 1.2 节中手动创建的复制槽中开始取数 据。(由于 1.2 节中的创建的快照和复制槽处于一致的数据点,即做到了使用数据库的逻辑备份还原工具 +KFS 实现 不停机的数据迁移)。 确认源端无误后,将目标端 KFS ONLINE(从源端第一条 KUFL 开始同步) 4.2.6.4 多次迁移 若项目开发过程中,需要定期从一个指定的源数据库迁移到目的数据库中,那么根据迁移时源数据库和应用的状 态,决定离线迁移还是在线迁移。 同时,由于是多次迁移,需要考虑每次迁移时数据库对象的定义是否需要迁移,若不需要,则只迁移数据就可 以,使用 KDTS 和 KFS 都支持只迁移数据;若每次迁移时需要迁移对象定义,则 1)比较源和目的对象定义是否 发生变更 2)对于定义发生变更的表,选择迁移定义和数据 3)对于定义没有发生变更的表,只同步数据即可。 4.2.7 应用代码迁移 数据移植后,需要迁移应用系统中用到的服务器应用代码和客户端应用代码迁移。KingbaseES V8R3 和 V8R6 的兼容性高,一般不需要对应用代码进行修改,就可以直接迁移。特殊情况下,不兼容部分可参考兼容性简介章 节KingbaseES V8R3 和 V8R6 兼容特性概览 。 4.2.8 测试与调试移植系统 任何一个成熟的应用系统如果代码、尤其是关键代码变动后,则应进行全面细致的测试。类似的,更换新的后台 数据库系统以后,也应对移植后的数据库系统进行全面的功能和性能测试。 4.2.8.1 功能测试和排错 功能测试是指对移植数据库系统的每一个模块和功能进行全面的系统回归测试,用以确保新系统各个功能的正确 性。 因此,完成数据库对象和应用程序迁移后,应对移植系统进行全面的功能测试,并对测出问题及时分析、排查和 修改。对那些很难定位的问题,请及时联系 KingbaseES 支持工程师。 52 第 4 章 KINGBASEES V8R3 到 V8R6 数据库移植实战 4.2.8.2 性能测试和调优 移植系统性能测试和调优是在完成移植系统功能测试后和系统上线前,在实际或模拟生产数据上,对移植系统进 行的性能测试和调优。 移植系统性能测试和调优的主要步骤如下: • 构造测试数据:若条件允许的话,建议构造与实际生产数据规模相同的数据,并模拟构造未来一年、两年、五 年或更长生命周期的数据进行测试。 • 部署测试软硬件环境:根据测试数据规模的大小,配置适当的测试软硬件环境。 • 性能测试:既可采用手动方式,也可利用 TPCC 测试工具、LoadRunner 等工具对移植系统进行自动测试。 • 性能调优:对未达到性能指标的功能模块及其 SQL 语句进行优化并给出相关建议。 通常,性能测试效果与测试数据规模、软硬件配置等因素密切相关。因此,建议性能测试时,测试数据规模、软 硬件配置应尽量与将来的实际生产环境一致。必要时,在未来一年、两年、五年等不同模拟数据规模场景下,应分别 测试移植系统的性能指标,用以保证移植系统未来仍能具有良好的性能表现。 53 版权声明 版权声明 北京人大金仓信息技术股份有限公司(简称:人大金仓)版权所有,并保留对本手册及本声明的一切权利。 未得到人大金仓的书面许可,任何人不得以任何方式或形式对本手册内的任何部分进行复制、摘录、备份、修 改、传播、翻译成其他语言、将其全部或部分用于商业用途。 免责声明 本手册内容依据现有信息制作,由于产品版本升级或其他原因,其内容有可能变更。人大金仓保留在没有任何通 知或者提示的情况下对手册内容进行修改的权利。 本手册仅作为使用指导,人大金仓在编写本手册时已尽力保证其内容准确可靠,但并不确保手册内容完全没有错 误或遗漏,本手册中的所有信息也不构成任何明示或暗示的担保。 技术支持 • 人大金仓官方网站:http://www.kingbase.com.cn/ • 人大金仓文档中心:http://help.kingbase.com.cn/ • 全国服务热线:400-601-1188 • 人大金仓技术支持与反馈信箱:support@kingbase.com.cn 54