问题描述
群里有大佬问从oracle迁数据到金仓,有个表有geometry ERROR: type "geometry" does not exist
问题分析
这个错误是因为 Oracle 中的空间数据表迁移到金仓数据库后,目标库缺少对应的 geometry****数据类型支持。
简单来说:Oracle 源库中的表使用了 SDO_GEOMETRY 空间数据类型,但在金仓数据库中,这个类型需要通过加载 KingbaseGIS 空间扩展才能被识别和使用

迁移工具在解析 Oracle 源表结构时,发现目标库中没有 geometry 类型,因此跳过了这些空间表的迁移。
场景模拟
Oracle 11g 默认安装了 Spatial 组件,可通过以下 SQL 确认:
SELECT comp_id, comp_name, version
FROM dba_registry
WHERE comp_id = 'SDO';
如果返回结果中包含 SDO 相关记录,说明 Spatial 组件已安装。
-- 1. 创建表
CREATE TABLE cola_markets (
mkt_id NUMBER PRIMARY KEY,
name VARCHAR2(32),
shape MDSYS.SDO_GEOMETRY
);
-- 2. 插入数据(矩形、多边形、点)
INSERT INTO cola_markets VALUES(1, 'cola_a',
MDSYS.SDO_GEOMETRY(2003, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),
MDSYS.SDO_ORDINATE_ARRAY(1,1, 5,7)));
INSERT INTO cola_markets VALUES(2, 'cola_b',
MDSYS.SDO_GEOMETRY(2003, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),
MDSYS.SDO_ORDINATE_ARRAY(5,1, 8,1, 8,6, 5,7, 5,1)));
-- 3. 配置元数据
INSERT INTO USER_SDO_GEOM_METADATA VALUES(
'cola_markets', 'shape',
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT('X', 0, 20, 0.005),
MDSYS.SDO_DIM_ELEMENT('Y', 0, 20, 0.005)),
NULL);
-- 4. 创建空间索引
CREATE INDEX cola_spatial_idx ON cola_markets(shape)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;
-- 5. 验证插入(查询所有数据)
SELECT mkt_id, name, shape FROM cola_markets;
通过KDTS迁移工具复现迁移报错:


解决办法
确认金仓数据库版本和环境
首先,确认你的金仓数据库版本和服务器架构,以便获取正确的 GIS 插件:
SELECT version();
记录下版本号(如 V008R006C008B0020)和操作系统架构(x86_64 或 aarch64)。
安装 KingbaseGIS 扩展
获取 GIS 插件包
重点强调:gis版本要与数据库版本保持一致,不能混用
方式一:获取 GIS 插件包(推荐)
金仓数据库的 GIS 功能需要单独安装插件包,安装包需要向金仓官方获取:
- 官方技术支持电话 :13811379954-3
- 社区渠道:可通过金仓社区 QQ 群获取,需提供数据库版本和 CPU 架构信息
通过网盘分享的文件:postgis-3.1.2_X86_V008R006C009B0014.tar.gz
链接: https://pan.baidu.com/s/15Nm1pQQqmiEgP9mcZWYdyg?pwd=3sw4 提取码: 3sw4
下载并上传到/home/kingbase/software目录下
通过网盘分享的文件:postgis-3.1.2_X86_V009R001C002B0014.tar.gz
链接: https://pan.baidu.com/s/1WelrnJvljRNBeSMHewlGaA?pwd=mxsh 提取码: mxsh
方式二:检查是否已有插件但未启用
某些版本的安装包可能已包含 GIS 扩展文件但未启用。检查数据库安装目录下是否存在插件文件:
# 检查 extension 目录下是否有 postgis 相关文件
ls $KINGBASE_HOME/share/extension/postgis*
--扩展
查看已安装的扩展
SELECT * FROM sys_available_extensions WHERE name LIKE '%postgis%';
查看当前数据库已创建的扩展
SELECT * FROM sys_extension WHERE extname LIKE '%postgis%';
如果存在,可以直接在数据库中创建扩展。
安装 GIS 插件
备份安装目录(必须)
重点强调:生产环境的话,装gis一定要先备份一份Server目录
cd /home/kingbase/ESV8R6/
cp -r Server Serverbak`date +%Y%m%d`
配置postgis插件
将获取的 GIS 插件包解压,将 bin、lib、share/extension 目录下的文件分别复制到数据库安装目录的对应位置。
cd /home/kingbase/software/
## 解压缩数据库包
tar -xzvf postgis-3.1.2_X86_V008R006C009B0014.tar.gz
## 拷贝插件包,若数据库目录(lib、bin、extension)下已有postgis相关的包,则不需要再拷贝
cd postgis-3.1.2
cp bin/* /home/kingbase/ESV8R6/Server/bin/
cp lib/* /home/kingbase/ESV8R6/Server/lib/
cp share/extension/* /home/kingbase/ESV8R6/Server/share/extension/
创建空间扩展
连接到业务库数据库,执行以下命令创建空间扩展:
--切换至业务库 必须切换至对应库
\c dxj system
-- 启用 KingbaseGIS 空间扩展
CREATE EXTENSION IF NOT EXISTS kingbase_spatial;
或
-- 或者使用 postgis 扩展名(根据插件包而定) 建议
CREATE EXTENSION IF NOT EXISTS postgis;
验证安装
-- 查看已安装的扩展
\dx
-- 验证 geometry 类型是否存在
SELECT typname FROM pg_type WHERE typname = 'geometry';
第四步:重新执行数据迁移
GIS 扩展安装完成后,重新迁移成功
