前言
KingbaseES 内置了丰富的 Oracle 兼容特性,迁移过程中通常仅需少量脚本修改(全兼容场景可实现零修改)。结合 KDTS、KFS 等迁移工具,可以大幅简化迁移流程、提升效率。
本文系统梳理了从 Oracle 迁移至 KingbaseES 的完整流程、核心步骤与关键技术细节,并附带常见问题排查与避坑指南,适合数据库管理员、开发人员及迁移项目组直接参考使用。
一、核心迁移内容
迁移应按照 数据库 → 用户 → 数据 → 应用程序 的顺序进行,确保基础环境就绪后再开展数据与应用迁移,避免因依赖关系导致迁移失败或数据不一致。
1.1 数据库、用户和模式迁移
核心操作:在 KingbaseES 中创建与 Oracle 同名的数据库和用户,并赋予相应权限。
关键注意事项
- 字符集一致性:KingbaseES 数据库字符集必须与 Oracle 源库保持一致,否则可能出现中文乱码或数据截断问题。
- 同名处理:若 KingbaseES 中已存在同名数据库,可直接在该库下创建相应用户,无需重复建库。
- 权限完整:需授予用户对该数据库的 CONNECT、CREATE 权限,并在对应模式上授予 USAGE 及对象操作权限,避免后续迁移过程中出现权限不足错误。
1.2 Oracle 数据迁移
核心操作:根据业务对停机时间的接受程度,选择 离线迁移(推荐可停机场景) 或 在线迁移(业务零中断)。
迁移工具说明
- KDTS(Kingbase 数据迁移服务):支持全版本 Oracle 数据库的离线迁移,提供可视化(WEB)与命令行(SHELL)两种操作方式。
- KFS(Kingbase 数据同步服务):用于在线迁移中的增量数据实时同步,确保源端与目标端数据最终一致。
1.3 应用程序移植
核心操作:将应用程序中访问 Oracle 的接口(如 JDBC、ODBC、OCI 等)适配至 KingbaseES,并对少量不兼容语法进行改写。
优化提示:KingbaseES 与 Oracle 的接口兼容性很高,通常移植工作量较小。建议将移植工作与系统测试同步开展,边改边测,提高效率。
二、关键迁移步骤
完整的迁移流程分为 迁移评估 → 迁移准备 → 数据迁移 → 应用迁移 → 测试调试 五个阶段,每个阶段均需严格执行,确保迁移平稳可靠。
2.1 迁移评估
本阶段旨在明确迁移范围、评估工作量、识别潜在风险,并制定可行的迁移方案。
2.1.1 确定迁移目标
需明确以下信息并形成书面记录:
- 迁移规模:数据库总量、表数量、存储过程/函数数量、预估数据量(GB/TB级)。
- 对象特征:是否包含大对象(LOB)、分区表、物化视图、高级复制等复杂对象。
- 业务约束:允许的停机时间窗口、项目整体工期要求。
- 目标环境:KingbaseES 版本、部署平台(物理机/虚拟机/云)、性能与安全基线要求。
2.1.2 评估迁移任务
重点评估以下方面,提前识别并规避风险:
- 性能指标:业务峰值 QPS、TPS、并发连接数、关键事务响应时间要求。
- 兼容性风险:通过工具扫描,识别 KingbaseES 暂不支持的 Oracle 语法或功能。
- 数据复杂度:约束(主键、外键、检查约束)数量、触发器数量、历史数据归档策略。
- 非技术因素:硬件资源是否充足、网络带宽是否满足迁移数据流量、备份与回退方案。
📌 迁移评估表示例(可直接套用)
| 评估项 | 内容说明 | 评估项 | 内容说明 |
|---|---|---|---|
| Oracle 版本 | 11.2.0.4 / 19c 等 | 操作系统 | Red Hat Linux 7.6 |
| 服务器配置 | CPU 核数/内存/磁盘类型与大小 | 用户规模 | 并发用户数/日均事务量 |
| 数据库大小 | 总量 XX GB,月增 XX GB | 应用架构 | B/S(Java)或 C/S(.NET) |
| 连接方式 | JDBC / ODBC / OCI 等 | 高可用要求 | RAC → 集群,Data Guard → 流复制 |
| 主要业务模块 | 模块1、模块2… | 特殊对象 | 分区表、高级队列、XMLType 等 |
2.1.3 组建迁移团队
建议团队包含以下角色:
- 项目经理:负责进度、资源和风险管理。
- DBA(Oracle & KingbaseES):负责环境准备、数据迁移、性能调优。
- 开发工程师:负责应用程序代码适配、存储过程/函数调试。
- 测试工程师:负责功能验证、性能测试及数据一致性核对。
2.2 迁移准备
本阶段目标是完成目标环境搭建、兼容参数配置,并采集源库关键信息。
2.2.1 准备迁移环境
- 部署 KingbaseES 目标服务器
- 硬件建议:CPU、内存、磁盘 I/O 性能不低于源库,迁移过程中建议独占资源。
- 网络建议:源库与目标库服务器置于同一局域网,确保网络延迟低、带宽充足(千兆以上)。
- 安装必要软件
- 数据库:Oracle Client、KingbaseES。
- 客户端工具:PL/SQL Developer、KStudio(KingbaseES 管理工具)。
- 驱动与接口:JDBC Driver、ODBC Driver、OCI/DCI 开发包。
- 测试工具:TPCC、HammerDB 或业务自研压测工具。
- KingbaseES 性能预调优(针对大数据量)
-- 调整共享缓冲区(通常设为物理内存的 1/4) ALTER SYSTEM SET shared_buffers = '8GB'; -- 预分配大文件,避免迁移期间频繁扩展 CREATE TABLESPACE migration_data LOCATION '/kingbase_data' WITH (seq_page_cost=0.5);
2.2.2 获取 Oracle 源库关键信息
-
连接信息 主机IP:192.168.1.100 端口:1521 服务名/SID:ORCL 用户名/密码:scott/tiger
-
字符集(关键)
SELECT USERENV('language') FROM dual; -- 结果示例:SIMPLIFIED CHINESE_CHINA.ZHS16GBK -
数据量评估
-- 按表统计大小(GB) SELECT segment_name, ROUND(bytes/1024/1024/1024, 2) AS size_gb FROM user_segments WHERE segment_type = 'TABLE' ORDER BY bytes DESC; -
日期格式(避免迁移后报错)
常见问题:Oracle 中
0099-09-30这类日期在 KingbaseES 中可能被解析为99-09-30,因月份无效而报错 “date/time field value out of range”。-- 在 KingbaseES 会话中设置 SET datestyle = 'ISO,YMD'; -- 或在 kingbase.conf 中永久配置 datestyle = 'iso, ymd'
2.2.3 配置 KingbaseES Oracle 兼容开关
在 KingbaseES 的 kingbase.conf 中配置以下参数,以更好地兼容 Oracle 行为:
| 参数 | 作用 | 建议值 |
|---|---|---|
nls_length_semantics | 控制 CHAR/VARCHAR2 类型长度语义(CHAR 表示字符,BYTE 表示字节) | 与 Oracle 源库设置一致(通常为 BYTE) |
search_path | 模式搜索路径,影响对象解析顺序 | "$user", public, oracle_schema |
default_with_oids | 是否为表创建 OID 系统列(部分工具依赖) | on |
ora_date_style | 启用 Oracle 日期格式兼容 | on |
2.2.4 数据库、用户和模式迁移
-- 1. 使用 system 管理员登录模板库
ksql -U system -d template1 -h 192.168.1.200 -p 54321
-- 2. 创建目标数据库(与 Oracle 同名)
CREATE DATABASE orcl OWNER scott ENCODING 'UTF8';
-- 3. 创建迁移用户并授权
CREATE USER scott WITH PASSWORD 'tiger';
GRANT CONNECT, CREATE ON DATABASE orcl TO scott;
-- 4. 切换到目标库,创建同名模式并授权
\c orcl
CREATE SCHEMA AUTHORIZATION scott;
GRANT USAGE ON SCHEMA scott TO scott;
GRANT CREATE ON SCHEMA scott TO scott;
2.3 数据迁移
根据业务连续性要求,选择离线迁移或在线迁移方案。
2.3.1 离线迁移
方案一:WEB 版 KDTS(图形化操作,适合新手)
(1)创建源数据库连接:在创建数据库连接界面填写数据源信息,包括“连接名称”、“数据库类型”、“数据库版本”、“服务器地址”、“端口”、“用户名”、“密码”、“数据库”、“连接参数”。
(2)创建目标数据库连接:在创建数据库连接界面填写数据源信息,包括“连接名称”、“数据库类型”、“数据库版本”、“服务器地址”、“端口”、“用户名”、“密码”、“数据库”、“驱动”、“URL”、“连接参数”。
(3)新建迁移任务:KDTS采用向导页的方式引导用户新建迁移任务,操作简便。用户依次配置“选择数据源”-“选择模式”-“选择迁移对象”-“配置参数”,即可快速完成迁移任务的设置。
- 选择数据源:填写自定义任务名称(任务名称不能重复),选择“源数据库”和“目标数据库”,或者选择“新建数据源”后使用。
- 选择模式:选择需迁移的模式(如需选择模式在系统模式中可选中“包含系统模式”复选框)的表、视图、序列、函数、存储过程、程序包、同义词。当模式较多时也可以通过左上方的查询框进行检索。 请至少选择一种模式,否则将收到错误提示,以至于不能完成新建任务。
- 选择迁移对象:通过已选模式选择需要迁移数据的表,模式较多时可在已选模式搜索框内输入模式名关键字进行快速检索。
可迁移此模式下全部表,也可以指定或排除部份表,当选择“包含指定表”或“排除指定表”时,请通过“从列表选择”、“从文件导入”或者在输入框内输入表名将数据添加到包含列表中,若未添加数据,则会提示错误导致无法进行下一步并完成新建任务。
点击“包含指定表”时也可选择多种方式。可直接在输入框内填写表名,多个表用“,”分割,回车确认;“从列表选择”可在模式中选择指定表;若需“从文件导入”,可点击“下载导入模板”,根据导入模板规则填写,然后从文件导入该模板。当需要“排除指定表”时,同指定部份表相同操作,但结果相反。
从列表选择表时,可选择对应模式、检索表名关键字、数据条数限制进行快速检索对应的表。点击“添加”按钮后加入到已选列表,当想要移除部份表时可以选择对应的表点击“移除”按钮取消表。选择完成后点击确定。
- 配置参数
迁移工具提供了一系列配置参数用于迁移方案的个性化配置,满足多种迁移场景。配置参数分为“迁移配置”、“数据类型映射”、“线程配置”三个方面。以下以迁移配置为例,介绍各参数的含义。其他配置项请参考工具-迁移工具章节描述。
- 表默认处理方式,包括两个复选框项(“建表/重建表”、“导入数据”),迁移到KingbaseES数据库是否需要建表或者重建表,以及是否只迁移表结构而不迁移数据的选择,根据实际需求选择合适的选项(默认是全选)。
- 表排序依据,对迁移的表进行排序,可通过“按行数和大字段大小交替”、“行数”、“大小进行排序”(默认是按行数和大字段大小交替)。
- 表数据读取和写入,对表数据的读取和写入制定规则,可操作项包括“源库游标读取记录数”(默认是100)、“批量写入目标库记录数”(默认是1000)、“每次批量提交大小”(默认是100MB)、“LOB字段预读取大小”(默认是4000Byte)。
- 大表拆分阈值依据,对大表进行拆分迁移,设置拆分界限。
- 非对象设置包含“主键”、“检查约束”、“唯一约束”、“外键”、“索引”、“触发器”、“自动转换对象名”,可以根据自己的需求选择是否迁移这些非对象数据(默认是全选)。
- 数据库连接数设置,可以限制迁移程序对源数据库和目标数据库的最大连接数(默认是100)。
执行迁移任务
,可将此任务作为预迁移任务点击“保存”,或者作为执行任务点击“保存并迁移”。迁移完成后任务状态将变成:
- 迁移完成,迁移结束“状态”栏显示“成功”,则迁移任务成功。
- 迁移失败,迁移结束“状态”栏显示“失败”,则迁移任务失败。失败后可点击详情查看日志有助于解决问题。
查看迁移报告及问题处理
,迁移完成后,需要确认执行结果,包括迁移数据量,是否有错误发生,可以通过迁移日志和迁移结果进行查看。
“迁移日志”打印迁移任务执行后的日志,具体可分为“系统日志”、“Error日志”、“Info日志”。
“迁移结果”功能的工作区包括“任务执行批次”、“迁移对象”、“总数”、“成功数”、“失败数”、“略过数”、“操作”,可以查看历史迁移任务执行的每次记录,以及每次迁移的对象、成功数、失败数、查看失败任务的错误日志。
方案二:SHELL 版 KDTS(适合批量、自动化迁移)
5. 环境准备:确保 JDK 11+ 已安装并配置在 KDTS-CLI/jdk 目录。
- 配置文件调整:
conf/application.yml:激活oracle配置文件。conf/datasource-oracle.yml:配置源库与目标库的 JDBC 连接信息。conf/migration.yml:设置迁移模式、包含的表、是否清空目标表等。
- 启动迁移:
cd KDTS-CLI/bin chmod +x startup.sh ./startup.sh - 查看报告:结果输出在
result/日期_时间/目录,包含 HTML 报告及失败脚本。
2.3.2 在线迁移
步骤概览:
- 准备阶段:在 Oracle 端创建 KFS 用户并授予必要权限。
- 存量迁移:使用
expdp(数据泵)按一致性 SCN 导出源库数据,还原至中间库,再通过 KDTS 迁移至 KingbaseES。 - 增量同步:启动 KFS,从之前记录的 SCN 开始,将 Oracle 的增量变更实时同步至 KingbaseES。
- 追平与切换:确认增量延迟为 0 后,暂停应用,等待最后一批数据同步完成,切换应用连接至 KingbaseES。
关键命令示例:
-- 1. 获取一致性 SCN(Oracle 端)
ALTER SYSTEM CHECKPOINT GLOBAL;
SELECT checkpoint_change# FROM v$database;
-- 2. 按 SCN 导出(确保数据一致性)
expdp kfs_user/xxx DIRECTORY=dump_dir DUMPFILE=full.dmp FLASHBACK_SCN=<SCN号>
-- 3. 启动 KFS 同步(从指定 SCN 开始)
fsrepctl -service oracle online -from-event ora:<SCN>:<SCN>
2.4 应用代码迁移
2.4.1 服务器端代码(PL/SQL)迁移
- 整体兼容性高:KingbaseES 兼容绝大多数 Oracle PL/SQL 语法。
- 注意差异:
- 包(Package)中不允许存在同名同参数的函数与存储过程,需重命名。
- 不支持对象方法的链式调用,需拆分为多个赋值语句。
- 少数内置函数名不同(如
NVL→COALESCE),可使用 KingbaseES 的兼容模式自动转换。
2.4.2 客户端接口迁移
1. ODBC 迁移
- Windows:在“ODBC 数据源管理器”中创建系统 DSN,选择 KingbaseES ODBC 驱动,填写连接信息。
- Linux:编辑
odbc.ini与odbcinst.ini,配置驱动路径与连接参数。
2. JDBC 迁移
// 原 Oracle 连接
String url = "jdbc:oracle:thin:@//192.168.1.100:1521/ORCL";
Class.forName("oracle.jdbc.OracleDriver");
// 改为 KingbaseES 连接
String url = "jdbc:kingbase8://192.168.1.200:54321/orcl";
Class.forName("com.kingbase8.Driver");
注意:更换 JDBC 驱动 jar 包,连接参数(如用户名、密码)一般保持不变。
3. OCI 迁移
KingbaseES 提供 DCI(Database Call Interface)驱动,兼容 Oracle OCI 接口。
- 替换 OCI 库文件为 DCI 库。
- 修改连接字符串格式,指向 KingbaseES 服务器。
- 对于少数不兼容的 OCI 函数,参考《KingbaseES DCI 开发手册》进行适配。
2.5 测试与调试
2.5.1 功能测试与排错
- 测试重点:数据完整性、业务功能正确性、约束与触发器生效情况。
- 数据比对:使用工具对关键表进行全量或抽样比对,确保迁移前后数据一致。
- 问题排查:查看应用日志与数据库日志(KingbaseES 日志位于
data/sys_log),常见问题包括权限不足、语法不兼容、字符集不一致等。
2.5.2 性能测试与调优
- 构造测试数据:模拟生产数据量与分布。
- 基准测试:使用 TPCC、HammerDB 等工具,对比迁移前后 TPS、响应时间等关键指标。
- SQL 调优:针对慢查询,通过执行计划分析,添加索引或重写 SQL。
- 数据库参数调优:根据测试负载调整
shared_buffers、work_mem、maintenance_work_mem等参数。 - 硬件优化:如性能仍不达标,考虑升级 CPU、内存或使用 SSD 磁盘。
三、总结与避坑指南
核心总结:成功迁移的关键在于 充分的评估准备、合理的工具选型、细致的兼容配置以及严格的测试验证。KingbaseES 的高度兼容性与配套工具能有效降低迁移难度与风险。
⚠️ 常见坑点与解决方案速查表
| 常见问题 | 现象/报错 | 解决方案 |
|---|---|---|
| 中文乱码 | 查询结果或应用显示乱码 | 确保 KingbaseES 数据库、客户端编码与 Oracle 源库字符集(如 ZHS16GBK)完全一致。 |
| 日期格式错误 | “date/time field value out of range” | 设置 SET datestyle='ISO,YMD'; 或配置 ora_date_style=on。 |
| CHAR 类型长度不一致 | 插入数据提示长度超长或末尾多空格 | 设置 nls_length_semantics='BYTE'(与 Oracle 保持一致)。 |
| 迁移工具报错 | 表或对象迁移失败 | 查看 KDTS 失败脚本,通常为不兼容 DDL,手动调整后执行。 |
| 性能下降 | 相同业务响应变慢 | 检查执行计划,优化慢 SQL;调整数据库内存参数;必要时升级硬件。 |
💡 最后建议
- 先试后迁:在生产迁移前,先使用非关键业务或测试库进行全流程演练。
- 备份为王:迁移前务必对 Oracle 源库进行完整备份,确保可快速回退。
- 分段上线:大型系统可采用分模块、分批次迁移上线,降低整体风险。