

从 Oracle 到 KingbaseES:GIS 数据迁移最佳实践与避坑指南
本文详细介绍了 Oracle 11g(Linux x86 平台)含 GIS 数据迁移至 KingbaseES 的完整实践方案,KingbaseES 已适配 ArcGIS/GeoScene 等主流 GIS 平台。迁移需遵循前置工作、非 GIS 数据迁移、GIS 数据迁移的流程,且 GIS 数据迁移依赖非 GIS 数据,需确保源端与目标端数据库正常服务并存在对应地理信息数据库。前置工作包括配置 PostGIS 插件、初始化数据库、创建必要用户与插件;非 GIS 数据通过 KDTS 工具配置源端与目标端信息及数据类型映射后执行迁移;GIS 数据迁移需借助 ArcGIS/GeoScene 平台,通过脚本执行并验证。文中还针对迁移过程中出现的 ERROR 001050、ERROR 001400、ERROR 999999 等常见报错,提供了对应的原因分析与解决方案,为相关技术人员提供实操参考。

前言

中电科金仓(北京)科技股份有限公司(以下简称“电科金仓”)成立于1999年,是成立最早的拥有自主知识产权的国产数据库企业,也是中国电子科技集团(CETC)成员企业。电科金仓以“提供卓越的数据库产品助力企业级应用高质量发展”为使命,致力于“成为世界卓越的数据库产品与服务提供商”。
电科金仓自成立起始终坚持自主创新,专注数据库领域二十余载,具备出色的数据库产品研发及服务能力,核心产品金仓数据库管理系统KingbaseES(简称“KES”)是面向全行业、全客户关键应用的企业级大型通用数据库。KES产品V9版本已通过国家权威机构认证,产品核心源代码自主率达到100%。2018年,电科金仓申报的“数据库管理系统核心技术的创新与金仓数据库产业化”项目荣获国家科学技术进步二等奖。金仓数据库管理系统KES于2022年入选国务院国资委发布的十项国有企业数字技术典型成果,彰显数据库领域国家队硬实力。继2023年金仓数据库管理系统V8通过第一批《安全可靠测评》后,2024年金仓数据库管理系统V9、金仓分布式HTAP数据库软件集群V3再度入围,至此电科金仓共计2款产品3个版本通过《安全可靠测评》*。

🥇 点击进入金仓数据库专栏,本专栏聚焦金仓数据库(KingbaseES)这一国产企业级融合数据库,为开发者及技术决策者提供从基础操作到架构设计的系统化学习路径。从多语法兼容(Oracle/MySQL/PostgreSQL)、多模数据存储(关系 / 文档 / 时序 / GIS)等功能展开讲解!
KingbaseES已适配主流GIS平台(ArcGIS/GeoScene),目前支持将使用该平台的Oracle或PostgreSQL数据库迁移至KingbaseES数据库。
GIS数据的迁移依赖于非GIS数据,若在非GIS数据迁移完成之前迁移GIS数据,可能会引发未知报错。 GIS数据的迁移需保证源端数据库和目标端数据库都是开启且正常提供服务的,并且GIS平台上存在两个数据库的地理信息数据库。
一、前置工作
在进行包含GIS数据的数据库迁移前,需要先在目标数据库做一些前置操作,并确认数据库对GIS平台的适配度。
准备目标数据库
软件准备: kingbase-server-linux-x86_64.tar 和 postgis_libs.tar 包。
配置postgis插件和初始化数据库
- 配置postgis参数
## 解压缩数据库包
tar -xvf kingbase-server-linux-x86_64.tar
## 拷贝插件包,若数据库目录(lib、bin、extension)下已有postgis相关的包,则不需要再拷贝
cp /home/kingbase/20220105/lib/postgis_libs/* /home/kingbase/20220105/lib/
cp /home/kingbase/20220105/postgis-3.1.2/bin/* /home/kingbase/20220105/bin/
cp /home/kingbase/20220105/postgis-3.1.2/lib/* /home/kingbase/20220105/lib/
cp /home/kingbase/20220105/postgis-3.1.2/share/extension/* /home/kingbase/20220105/share/extension/
- 初始化数据库
## 初始化数据库并修改端口
./initdb -U system -D data;
vim kingbase.conf
## 启动数据库, 使用ksql工具连接到数据库中
./sys_ctl -D data start
./ksql -Usystem -p54321 test
创建前置对象
使用Ksql进入数据库后,需要创建GIS所需的前置对象,以确保包含GIS数据的对象迁移成功。
-- 创建操作用户
create user sde superuser;
alter user sde password '123456';
create user rds_superuser superuser ;
alter user rds_superuser password '123456';
-- 创建模式并修改其所有者
create schema sde;
alter schema sde owner to sde;
-- 创建数据库和插件
create database kingbase;
create extension postgis;
create extension postgis_raster;
create extension postgis_sfcgal;
create extension fuzzystrmatch;
create extension postgis_tiger_geocoder;
set exclude_reserved_words = 'level';
create extension postgis_topology;
create extension address_standardizer;
create extension address_standardizer_data_us;
-- 测试插件是否安装成功
select oid, proname, proargtypes, proisstrict from sys_proc where proname ilike '%addgeometrycolumn%';
## update sys_proc set proisstrict = false where oid = 上一条sql的oid
update sys_proc set proisstrict = false where oid = 16705;
仅源库为Oracle,且存在sde类型作为表类型时,需要创建公共函数append_srid:
-- 此函数功能是将sde数据中的srid拼接到wkb(blob)中,保障数据的完整性。
CREATE OR REPLACE FUNCTION append_srid(srid IN INTEGER,kwb IN blob) RETURN blob AS
re blob;
srid_ integer;
BEGIN
IF kwb IS NULL then
RETURN NULL;
END IF;
re := to_blob(UTL_RAW.cast_from_binary_integer(srid,utl_raw.little_endian));
dbms_lob.append(re,kwb);
RETURN re;
END;
执行测试
./pgsql2shp -f /home/gpadmin/kes/v9/Server/test2.shp -u system -p 54321 test "select * from test.sde.dltb2"
创建地理信息数据库
当前步骤旨在验证目标数据库对于GIS平台的适配度,并为GIS数据的迁移做一些前置准备。步骤如下:
- 打开 ArcMap 软件,新建数据库。

- ArcMap 软件中启动 Kingbase 地理信息数据库。(此步骤不可省略)
二、迁移非GIS数据
迁移非GIS数据需要使用kdts(使用请查阅 SHELL端工具访问及使用 ),此处以KDTS SHELL访问方法举例:
配置源端数据库
- 进入kdts-plus目录,编辑 conf/application.yml 文件,将 active 值设置为 Oracle。
active: oracle
- 编辑 conf/datasource-oracle.yml 文件,修改源库信息,并指定要迁移的表(POINT、LINE、POLYGONT)。
sources:
- dbType: oracle
dbVersion: 11g
url: jdbc:oracle:thin:@ip:port/dbName
driver-class-name: oracle.jdbc.oracleDriver
username: SDE
password: password
schemas: SDE
talbe-includes: POINT,LINE,POLYGONT
备注
请使用 Oracle 的 SDE 用户进行迁移工作,以避免其他用户权限不足,读取 GIS 数据失败。
配置目标端数据库
- 编辑 conf/datasource-oracle.yml 文件,修改目标库信息。
target:
dbType: KINGBASE
dbVersion: V9
url: jdbc:kingbase8://ip:port/dbName
driver-class-name: com.kingbase8.Driver
username: SDE
password: password
schemas: SDE
备注
请使用 SDE 用户进行迁移工作,并且迁移至 SDE 模式下。(避免迁移至其他模式下注册数据信息失败)。
配置数据类型映射文件
- 将 Oracle 的 numeric(38, 0) 类型映射为 Kingbase 的 int 类型,编辑 conf/mapping_rule/data_type/oracle_to_kingbase.json 文件,增加以下内容:
{
"sourceType": {
"name": "NUMBER",
"precisionMin": 0,
"precisionMax": 38,
"scaleMin": 0,
"scaleMax": 0
},
"targetType": {
"name": "int"
}
}
执行迁移任务
- 迁移配置完成后,执行以下命令,运行迁移任务。
./bin/startup.sh
三、迁移GIS数据
源数据库的非GIS数据迁移至目标数据库后,可以在ArcGIS / GeoScene 平台上进行GIS数据迁移。此步骤完成,后续应用才能正常使用。GIS数据迁移步骤如下:
- 迁移后,在形如 “result/2021-12-02_15_15_15/SDE/AcrpyRegisterScript/” 目录下的 acrpyRegisterWithGeodatabase.py 文件拷贝到 ArcGIS 所在的机器上,放到形如:“c:/python27/ArcGIS10.0” 目录下:

- 查看ArcMap的kingbase数据库连接信息,并拷贝。

- 编辑acrpyRegisterWithGeodatabase.py文件,将上一步复制的内容粘贴到以下位置,保存文件。

- 执行acrpyRegisterWithGeodatabase.py脚本,将源数据库的地理信息库中的数据迁移到目标数据库的ArcGIS地理信息库中。

- 执行完成后使用ArcMap软件进行验证,能否正常显示图层信息,正常显示说明GIS数据已经迁移成功(或对比GIS平台下,迁移的数据要素集在两个数据库下是否一致)。
备注
GIS平台平时运行就会在其日志里留下很多报错,这似乎是它试探所需对象在不在,然后决定下一步流程的方式,因此,在日志中看到 does not exists 的报错但目标端数据库的应用已经正常显示地理数据信息,请不要害怕。
四、常见问题
执行acrpyRegisterWithGeodatabase.py脚本时报错"ERROR 001050"。

原因分析: acrpyRegisterWithGeodatabase.py脚本内容有误。
解决方案: 请检查是否已修改arcpy.env.workspace值,是否与ArcMap的kingbase库连接信息一致。
执行acrpyRegisterWithGeodatabase.py脚本时报错"ERROR 001400"。

原因分析: 将GIS数据迁移到了kingbase的非sde模式下.
解决方案: 请将非GIS数据重新迁移至sde模式下,再进行GIS数据迁移。
执行acrpyRegisterWithGeodatabase.py脚本时报错"ERROR 999999"。

原因分析及解决方案: 报错“999999”原因比较复杂,一般有以下原因:
- 该表未指定objectid为唯一键,可以手动修改表定义,指定objectid字段为主键或者唯一约束。
- 该表的objectid字段的数据类型非int类型。可以ksql手动修改该字段类型为int或者修改KDTS的数据类型映射文件,重新进行迁移。
- 如果是所有表均报以上错误,则可能是未启动地理信息数据库,可以通过ArcMap软件,在kingbase数据库连接上右键,点击启动地理信息数据库。
- 如果不是以上原因,可以通过ArcMap软件手动注册。
联系博主
xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在CSDN、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。
亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。
愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。
至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。
💞 关注博主 🌀 带你实现畅游前后端!
🥇 从零到一学习Python 🌀 带你玩转Python技术流!
🏆 人工智能学习合集 🌀 搭配实例教程与实战案例,帮你构建完整 AI 知识体系
💦 注:本文撰写于CSDN平台,作者:xcLeigh(所有权归作者所有) ,https://xcleigh.blog.csdn.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。

📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌
2万+





