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

相关推荐
qq_342295828 小时前
CSS如何制作点击展开时的手风琴动画_平滑过渡max-height高度
jvm·数据库·python
Lucifer三思而后行8 小时前
zCloud 纳管 MySQL 8.4 数据库
数据库·mysql·oracle
我是菜菜呀呃8 小时前
达梦数据库日常运维SQL和问题排查
数据库
m0_748920369 小时前
Golang goquery怎么解析HTML_Golang goquery教程【核心】
jvm·数据库·python
m0_746752309 小时前
golang如何编写Markdown转HTML工具_golang Markdown转HTML工具编写详解
jvm·数据库·python
weixin_424999369 小时前
C#怎么使用TopLevel顶级语句 C#顶级语句怎么写如何省略Main方法简化控制台程序【语法】
jvm·数据库·python
qq_372154239 小时前
如何利用Bootstrap的Flex工具类快速排版
jvm·数据库·python
qq_654366989 小时前
golang如何实现菜单权限动态加载_golang菜单权限动态加载实现详解
jvm·数据库·python
arronKler9 小时前
大数据量高并发的数据库优化
服务器·数据库·oracle
祖传F8710 小时前
SQL DATE()函数会抹去时间戳
数据库·sql