Oracle迁移KES提示ERROR: type “geometry“ does not exist

问题描述

群里有大佬问从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 插件包解压,将 binlibshare/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 扩展安装完成后,重新迁移成功

参考链接:https://docs.kingbase.com.cn/cn/KES-V9R1C10/application/application-develop-guide/tools/migrate/start_quickly_best_practise

相关推荐
kexnjdcncnxjs9 分钟前
如何用SQL统计每组的平均值同时显示原行_OVER子句
jvm·数据库·python
阿坤带你走近大数据11 分钟前
DM达梦数据库的介绍
数据库·mysql·oracle·国产信创
CLX050511 分钟前
Redis如何防范脑裂导致的数据丢失_配置min-replicas-to-write强制要求可用从节点数
jvm·数据库·python
毋语天21 分钟前
从零搭建 RAG 系统:Milvus 向量数据库 + 大模型完整实战指南
数据库·milvus
环流_25 分钟前
Redis ZSet
数据库·redis·缓存
m0_631529821 小时前
如何在非组件文件中动态读取 Redux Store 中的值以配置主题颜色
jvm·数据库·python
m0_733565461 小时前
SQL如何统计每日新增用户数_窗口函数与日期维度的结合
jvm·数据库·python
古怪今人1 小时前
etcd分布式键值存储系统 Windows下搭建etcd集群
数据库·分布式·etcd
我科绝伦(Huanhuan Zhou)1 小时前
oracle linux8.8一键部署oracle 11g
数据库·oracle
lolo大魔王1 小时前
Go语言数据库操作之GORM框架从入门到生产实战(完整版)
开发语言·数据库·golang