# 从 Oracle 到 KingbaseES:GIS 数据全流程迁移实操
在信创战略深入推进的背景下,地理信息系统(GIS)的数据库国产化替代已成为自然资源、城市规划等领域的必答题。Oracle Spatial凭借成熟的空间数据管理能力被广泛采用,但其高昂的许可费用和封闭的生态体系,让越来越多的用户开始寻求替代方案。KingbaseES凭借对Oracle语法的深度兼容和KGIS空间引擎的完善能力,正成为GIS数据迁移的热门选择。本文以实际项目为例,复盘从Oracle Spatial到KingbaseES的全流程迁移实操经验。
## 迁移前的准备工作
在动手迁移之前,目标端的环境准备至关重要。GIS数据的迁移依赖于KGIS插件,需要在KingbaseES中完成一系列前置配置。
首先,解压数据库安装包后,需要将PostGIS相关的插件库拷贝到数据库目录中:
```bash
# 解压数据库包
tar -xvf kingbase-server-linux-x86_64.tar
# 拷贝PostGIS插件包
cp /home/kingbase/postgis_libs/* /home/kingbase/kingbase/lib/
cp /home/kingbase/postgis-3.1.2/bin/* /home/kingbase/kingbase/bin/
cp /home/kingbase/postgis-3.1.2/lib/* /home/kingbase/kingbase/lib/
cp /home/kingbase/postgis-3.1.2/share/extension/* /home/kingbase/kingbase/share/extension/
```
完成文件拷贝后,初始化数据库并创建GIS相关扩展:
```sql
-- 创建GIS操作用户和模式
create user sde superuser password 'your_password';
create schema sde authorization sde;
<"eav.a8k1.org.cn"><"efg.a8k1.org.cn"><"wwf.a8k1.org.cn">
-- 创建GIS扩展
create extension postgis;
create extension postgis_raster;
create extension postgis_sfcgal;
create extension fuzzystrmatch;
create extension postgis_tiger_geocoder;
create extension postgis_topology;
-- 验证插件安装
select oid, proname from sys_proc where proname like '%addgeometrycolumn%';
```
对于从Oracle迁移的场景,还需要创建一个关键的自定义函数,用于将SDE数据中的SRID拼接到WKB中,保障空间数据的完整性:
```sql
CREATE OR REPLACE FUNCTION append_srid(srid IN INTEGER, kwb IN blob)
RETURN blob AS
re blob;
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;
```
## 两阶段迁移策略
GIS数据的迁移通常分为两步走:先迁移非GIS数据,再迁移GIS数据。这是因为GIS数据依赖于底层的空间表和元数据,若顺序颠倒可能引发未知错误。
### 第一阶段:非GIS数据迁移
对于数据量大、表结构复杂的场景,推荐使用金仓KDTS(KingbaseES Data Transfer Service)迁移工具。KDTS支持从Oracle到KingbaseES的结构迁移和全量数据迁移,实测在亿级地类图斑数据场景下,迁移效率较传统方法提升4到5倍。
配置KDTS迁移任务时,需要分别指定源库和目标库的连接信息:
```yaml
# 源端Oracle配置(conf/datasource-oracle.yml)
sources:
- dbType: oracle
dbVersion: 11g
url: jdbc:oracle:thin:@oracle_ip:1521/orcl
username: SDE
password: password
schemas: SDE
table-includes: POINT,LINE,POLYGONT # 先迁移非空间表
<"wfe.a8k1.org.cn"><"sad.a8k1.org.cn"><"wqa.a8k1.org.cn">
# 目标端KingbaseES配置
target:
dbType: KINGBASE
dbVersion: V9
url: jdbc:kingbase8://kes_ip:54321/kingbase
username: SDE
password: password
schemas: SDE
```
考虑到Oracle中大量使用NUMBER(38,0)作为整型字段,可以在数据类型映射文件中调整映射关系,避免迁移后字段类型过大影响性能:
```json
{
"sourceType": {
"name": "NUMBER",
"precisionMin": 0,
"precisionMax": 38,
"scaleMin": 0,
"scaleMax": 0
},
"targetType": {
"name": "int"
}
}
```
配置完成后,执行迁移脚本启动任务:
```bash
./bin/startup.sh
```
### 第二阶段:GIS数据迁移
非GIS数据迁移完成后,需要借助ArcGIS平台完成空间数据的迁移。这一阶段的核心是将Oracle Spatial中的地理数据库注册到KingbaseES中。
操作步骤如下:
1. **连接数据库**:在ArcMap或ArcCatalog中,分别建立与Oracle和KingbaseES的数据库连接。连接KingbaseES时,需要注意端口号若非默认5432,需在Instance中明确指定,例如`192.168.4.30,5444`。
2. **启动地理数据库**:在已连接的KingbaseES数据库上右键选择"启动地理数据库",这一步会在目标库中创建ArcGIS运行所需的系统表和元数据。
3. **拖拽迁移**:在SuperMap或ArcGIS工作空间中,直接选中需要迁移的数据集,拖拽到KingbaseES目标库中,弹出复制对话框后确认即可完成迁移。
4. **注册数据**:这是GIS数据迁移最关键的一步。迁移工具会自动生成注册脚本,位于迁移结果目录下,如`result/2021-12-02_15-15-15/SDE/AcrpyRegisterScript/acrpyRegisterWithGeodatabase.py`。将该脚本拷贝到ArcGIS所在机器,编辑其中的连接信息后执行:
```bash
python acrpyRegisterWithGeodatabase.py
```
执行完成后,空间数据才能被ArcGIS正常识别和调用。
## 迁移结果验证
数据迁移完成后,需要进行双重验证:
- **可视化校验**:在ArcMap或QGIS中打开迁移后的图层,查看空间位置、属性信息是否正确显示。
- **操作验证**:对迁移数据进行增、删、改、查操作,验证空间分析功能是否正常。
- **应用验证**:运行依赖GIS数据的业务系统,确保前端功能不受影响。
## 常见问题与处理
在实际迁移过程中,可能会遇到一些典型问题:
- **ERROR 001050**:注册脚本中`arcpy.env.workspace`值与实际数据库连接信息不一致,需检查并修正。
- **ERROR 001400**:将GIS数据迁移到了非sde模式下。解决方法是重新将数据迁移至sde模式,或修改模式归属。
- **ERROR 999999**:报错原因较复杂,常见情况包括表未指定Objectid为主键、Objectid字段非int类型、未启动地理信息数据库等,需逐一排查。
## 结语
从Oracle Spatial到KingbaseES的GIS数据迁移,并非简单的"导入导出",而是一个涉及环境准备、数据分层迁移、空间数据注册的系统工程。依托KingbaseES对Oracle语法的高兼容性和KDTS工具的高效迁移能力,配合ArcGIS/SuperMap等平台的支持,GIS数据国产化替代已经具备了成熟的技术路径。对于正在规划GIS数据库国产化改造的团队,建议遵循"先评估后行动、非GIS与GIS分层迁移、重视注册验证"的原则,让迁移过程更平稳、结果更可靠。