PGSQL空间数据表迁移到达梦数据库以及超图SuperMap导数据到达梦数据库的过程步骤以及实际操作中出现的常见问题解决方案

该文章已生成可运行项目,

一、PGSQL空间数据表迁移达梦

最近在做国产化改造项目,mysql、pgsql迁移到达梦,起初进展一切顺利,我们都是通过sqlark工具去迁移的,mysql完全没问题,因为没有涉及空间数据,但是在pgsql中会有一些小问题,比如下图:

(这个问题只需要把"public".“geometry"修改成st_geometry即可创建表成功)
在这里插入图片描述
(但是在迁移数据的时候明明已经改了"public”."geometry"修改成st_geometry还是报错,没得到解决,最终我们打算手动些脚本去插入数据)
在这里插入图片描述

pg的geometry类型需要适配达梦的st_geometry才能建表成功,此外在inser插入数据的时候还需要包裹一下pg原有的wkb,所以sqlark无法迁移,我们手动的对几个表进行了处理。

1、先去pg数据库中把表数据ddl拷贝出来

在这里插入图片描述

2、通过java脚本修改sql脚本,把wkb包裹适配达梦insert语句

package com.yutu.icp.wisdomwater.utils;

import java.io.*;
import java.util.*;
import java.util.regex.*;

public class MyDMOut {
    public static void main(String[] args) {
        String inputFile = "C:\\Users\\Admin\\Desktop\\address.sql"; //原sql文件
        String outputFile = "C:\\Users\\Admin\\Desktop\\address_out.sql"; //修改后输出sql文件
        int targetPosition = 3; //从values开始数,wkb在第几列(从1数)

        try {
            convertSqlFile(inputFile, outputFile, targetPosition);
            System.out.println("转换完成,结果已保存到: " + outputFile);
        } catch (IOException e) {
            System.err.println("处理文件时出错: " + e.getMessage());
        }
    }

    public static void convertSqlFile(String inputFile, String outputFile, int targetPosition)
            throws IOException {
        // 匹配INSERT语句的正则表达式
        Pattern insertPattern = Pattern.compile(
                "(INSERT INTO \\\".+?\\\"\\(.*?\\)\\s*VALUES\\s*\\()(.*?)(\\)\\s*;)",
                Pattern.CASE_INSENSITIVE
        );

        try (BufferedReader reader = new BufferedReader(new FileReader(inputFile));
             BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {

            String line;
            while ((line = reader.readLine()) != null) {
                Matcher matcher = insertPattern.matcher(line);
                if (matcher.find()) {
                    // 分割VALUES部分
                    String valuesPart = matcher.group(2);
                    List<String> values = splitValues(valuesPart);

                    // 检查目标位置是否有效
                    if (values.size() > targetPosition - 1) {
                        String targetValue = values.get(targetPosition - 1).trim();

                        // 添加DMGEO函数包装
                        values.set(targetPosition - 1, "DMGEO.ST_GEOMFROMWKB(" + targetValue + ",4326)");

                        // 重组SQL语句
                        String newValuesPart = String.join(",", values);
                        String newLine = matcher.group(1) + newValuesPart + matcher.group(3);
                        writer.write(newLine);
                    } else {
                        writer.write(line);
                    }
                } else {
                    writer.write(line);
                }
                writer.newLine(); // 保持原样换行
            }
        }
    }

    // 处理包含逗号的复杂VALUES分割
    private static List<String> splitValues(String valuesPart) {
        List<String> values = new ArrayList<>();
        boolean inQuotes = false;
        int start = 0;

        for (int i = 0; i < valuesPart.length(); i++) {
            char c = valuesPart.charAt(i);
            if (c == '\'') {
                inQuotes = !inQuotes;
            } else if (c == ',' && !inQuotes) {
                values.add(valuesPart.substring(start, i).trim());
                start = i + 1;
            }
        }
        // 添加最后一个值
        values.add(valuesPart.substring(start).trim());

        return values;
    }
}

你将会得到以下内容(原address.sql、修改后address_out.sql)

在这里插入图片描述
在这里插入图片描述

3、在达梦中执行sql脚本文件,我这里用的sqlark工具连的达梦,执行完后会得到这样的数据

在这里插入图片描述

并且可以使用dmgeo的函数进行wkb转wkt

在这里插入图片描述

起初以为一切进展都顺利的,但是突然发现有些表是通过超图导入的,这东西导入出现了一些问题。。。

二、超图导入数据到达梦

1、在超图中连接数据源

(如果你的DMPlus是灰色的,需要安装DM驱动放到bin目录下)

通过网盘分享的文件:超图达梦依赖.zip
链接: https://pan.baidu.com/s/1ZfQzAVN7X5Swfy5yCFlKyw?pwd=9nss 提取码: 9nss

下载后把


在这里插入图片描述

注意了,在超图中必须选择新建数据库型数据源!!而不是打开数据库型数据源,不然会报没有系统表,且非扩展打开!!

当我们新建数据源的时候超图会自动在达梦的这个数据库中生成一堆相关的表(依赖),如果你的数据库已经有这些表了那么就可以选择打开数据库型数据源。

在这里插入图片描述

这些表的解释你可以看这个 https://blog.51cto.com/u_16099350/11427089 都有介绍

2、导入shp文件(测试使用,一般都是使用gdb)

在这里插入图片描述
导入之后会同步到达梦数据库中

在这里插入图片描述

但是问题又来了,使用超图导入到达梦,会发现超图生成保存空间数据的字段SmGeometry是image类型?如下图

在这里插入图片描述

你会发现这个类型我们无法使用dmgeo的函数进行转换

在这里插入图片描述

出现这个问题,是因为在超图中选择错数据源了!!!注意,不要选择DMPlus,要选择DMSpatial!!!不然就会出现类型不对。。

三、解决超图导入数据到达梦空间数据类型不对的问题(Image类型->SmGeometry)

下面给大家写个超图导入数据到超图的步骤

1、先在DM中创建模式、用户、表空间、分配角色

在这里插入图片描述

2、到超图中使用DMSpatial连接,一定要使用DMSpatial连!!

在这里插入图片描述

3、导入数据

在这里插入图片描述

4、在达梦中查看

在这里插入图片描述

你会发现,居然成功了。。。。。。历经好几天的排查,搜百度,终于发现了。。。

另外配一张我用户分配的权限仅供参考!
在这里插入图片描述


建议先使用sqlark迁移业务表(也就是没有空间数据的表,注意sm开头的表以及postgis生成的表都不要导过来,删除也行),然后再使用超图创建连接达梦进行导入空间数据表

四、超图SHP文件数据集同步到达梦数据库时表名超过17长度被截取丢失问题,但是同步到PG是正常的

问题截图

超图软件

在这里插入图片描述

达梦数据库

在这里插入图片描述

少量表名超17字符的解决方案

手动修改注册表

查询表名不对问题的数据:

SELECT SmDatasetName, SmTableName FROM SmRegister WHERE SmDatasetName LIKE 't_run_possess_greenland';

在这里插入图片描述

更新注册表表名:

UPDATE SmRegister SET SmTableName = 'T_RUN_POSSESS_GREENLAND' WHERE SmDatasetName = 't_run_possess_greenland';

在这里插入图片描述

修改新表名:

ALTER TABLE T_RUN_POSSESS_GRE RENAME TO T_RUN_POSSESS_GREENLAND;

在这里插入图片描述

超图软件中重新加载

1. 一定要先关闭当前连接

在这里插入图片描述

2. 重新连接

在这里插入图片描述

3. 修改成功

服务正常加载,表数据正常加载

在这里插入图片描述

五、字段名被截取以及字段丢失

1. 字段名被截取

这个问题一般是使用了shp格式导出、导入
解决办法就是直接在导出和导入的时候使用gdb格式就好了

在这里插入图片描述

在这里插入图片描述

2. 字段名丢失

这个问题一般是数据类型引起的,看超图中的控制台输出报错信息,数据精度超出范围,导致字段创建失败

在这里插入图片描述
问题原因以及解决办法直接看我的文章:https://blog.youkuaiyun.com/weixin_44912902/article/details/153315449

六、dmgeo.st_astext(wkb)括号前空格问题

在这里插入图片描述

解决:直接匹配替换

空格替换 以及 MULTIPOLYGON多个点的时候逗号后面也会出现空格,也替换掉!!!

SELECT REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(dmgeo.st_astext(SmGeometry), 'POINT (', 'POINT('), 'LINESTRING (', 'LINESTRING('), 'POLYGON ((', 'POLYGON(('), 'MULTIPOLYGON (((', 'MULTIPOLYGON((('), ', ', ','), * FROM address;

在这里插入图片描述
在这里插入图片描述

七、超图yhld表增加字段start_curing_time varchrt(255)类型,达梦中ID自增失效,需要重新手动勾选ID自增

在这里插入图片描述

本文章已经生成可运行项目
### 迁移PostgreSQL至达梦数据库的方法 #### 数据库迁移概述 将PostgreSQL数据库迁移到达数据库是一项复杂的工作,涉及到多个方面,包括但不限于前期准备、选择合适的迁移工具、处理数据兼容性问题以及最终的测试和验证。为了确保迁移的成功率,在整个过程中需要考虑多种因素。 #### 前期准备工作 在开始实际的数据迁移之前,了解两个系统的差异是非常重要的。这不仅限于SQL语句的不同之处,还包括存储过程、触发器以及其他特定功能上的区别。对于从PostgreSQL向达梦数据库迁移来说,应当先评估现有的应用程序依赖程度,并制定详细的迁移计划[^1]。 #### 工具的选择 针对不同的需求可以选择相应的迁移工具。虽然pgloader主要用于跨平台之间的迁移如MySQL到openGauss,但对于某些场景下也可以作为参考;然而,当面对PostgreSQL与达间的转换时,则可能更适合采用专门为此设计的应用程序或服务。此外,还可以利用一些通用型ETL(Extract, Transform, Load)工具来进行定制化的开发以满足特殊的需求[^2]。 #### 处理兼容性和数据转换 由于两者间存在一定的技术架构差异,因此不可避免地会遇到兼容性挑战: - **模式转换**:这是指将原有的PostgreSQL表定义及其他对象结构调整成适合新环境的形式。可以通过编写脚本来自动化这一过程的一部分工作量。 - **函数映射**:如果应用中有大量自定义函数或者使用到了PL/pgSQL特性的话,则需仔细分析这些代码片段能否直接移植或是要重写为DM PL/SQL风格。 - **类型匹配**:注意检查每种数据类型的对应关系,因为即使名称相同也可能有不同的内部表示形式,从而影响查询性能甚至导致错误的结果集返回。 - **字符编码一致性**:确认源端使用的字符集能够在目标环境中得到良好支持,防止乱码现象的发生[^3]。 ```sql -- 示例:创建一个简单的表结构转换脚本 CREATE TABLE dm_example ( id INT PRIMARY KEY, name VARCHAR(50), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 注意时间戳默认值表达方式的变化 ); ``` #### 测试与验证阶段 完成初步的数据转移之后,必须进行全面的功能性测试来保证业务逻辑正常运作。同时也要执行压力测试检验系统稳定性,最后通过对比前后两端的关键指标(比如响应速度、吞吐量等),进一步优化配置参数直至达到预期效果为止。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

劝导小子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值