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

相关推荐
mldlds2 小时前
使用 Qt 插件和 SQLCipher 实现 SQLite 数据库加密与解密
数据库·qt·sqlite
大空大地20263 小时前
Entity Framework
数据库
王仲肖3 小时前
PostgreSQL 事务 ID 年龄增长与冻结机制分析
数据库·postgresql
好家伙VCC3 小时前
**CQRS模式实战:用Go语言构建高并发读写分离架构**在现代分布式系统中,随着业务复杂度的提升和用户量的增长,传统的单数据库模型逐
java·数据库·python·架构·golang
不剪发的Tony老师3 小时前
pgmetrics:一款免费开源的PostgreSQL统计指标采集工具
数据库·postgresql
@insist1233 小时前
数据库系统工程师-必知的系统开发知识
数据库·oracle·软考·数据库系统工程师·软件水平考试
星辰_mya3 小时前
数据库运维与数据安全:备份恢复、日志分析与故障排查
运维·数据库·后端·面试·架构师
|华|3 小时前
MySQL高可用详细解析
数据库·mysql
白露与泡影3 小时前
InnoDB、PostgreSQL 与存算分离:刷脏保序的抉择
数据库·postgresql