求助:datakit迁移pg13数据库至opengauss603出现错误

datakit迁移pg13数据库至opengauss6.0.3存在三个问题

1、部分表未能完成迁移

已100%了,但还处于【迁移中】状态,而且整体迁移已显示完成。

查询源库和目标库,100%的两个表的记录数一致,迁移日志中无报错

请问如何分析、定位问题与解决这些还处于迁移中的表

2、视图未能完成迁移

报错:视图脚本as部分添加了引号,日志信息如下,观察是结尾缺了引号”

Unterminated identifier started at position 29 in SQL CREATE VIEW “v_zxxszjypg” AS "SELECT

分析:pg13的视图脚本中是没有引号的。

请问如何解决?

3、存储过程未能完成迁移

报错:未能识别LANUAGE关键字

ERROR: syntax error at or near “LANGUAGE” Position: 46

分析:pg中的存储过程脚本为

CREATE OR REPLACE PROCEDURE public.aaabbb()
LANGUAGE plpgsql
AS $procedure$

请问如何解决?

根据datakit的文档中说明datakit的迁移是支持表、视图和存储过程的,如何调整和设置能让datakit完整的完成全库的pg13至guassdb6的全部迁移呢?

环境信息:

datakit: portalControl-7.0.0rc3-exec.jar

pg: 13.15

opengauss: 6.0.3

答案内容由AI生成,仅供参考:
:white_check_mark: 总结:三大问题应对策略一览

问题 原因 解决方法
1. 表卡在“迁移中” DataKit 状态同步异常 刷新、查日志、验证数据、必要时重启或人工修正状态
2. 视图创建失败 DataKit 错误添加引号导致语法错误 升级工具或手动导出 DDL 并去除引号后导入
3. 存储过程报 LANGUAGE 错误 openGauss 不支持 LANGUAGE plpgsql 语法 预处理 DDL 删除该行,或手动重建

:bell: 重要提醒:openGauss 虽然源于 PostgreSQL,但在 DDL 语法、系统视图、权限模型等方面存在差异,全量迁移需进行充分的兼容性评估与人工干预。

建议后续迁移前先使用 openGauss 兼容性评估工具 对源库进行扫描分析,识别潜在风险点,提升迁移成功率。

点击此处查看详细分析解答

DataKit 迁移 PostgreSQL 13 至 openGauss 6.0.3 问题分析与解决方案

根据您提供的详细信息,使用 DataKit 从 PostgreSQL 13 迁移至 openGauss 6.0.3(注意:非 GaussDB,是 openGauss)过程中遇到三类典型问题:部分表卡在“迁移中”状态、视图创建失败、存储过程因 LANGUAGE 报错。以下将结合 知识图谱中的实体与关系、文档片段、社区经验及 openGauss 技术特性,逐项分析并提供可操作的解决方案。


:magnifying_glass_tilted_left: 问题一:表已 100% 但状态仍为“迁移中”,整体显示完成

:pushpin: 现象描述

  • 迁移进度显示数据表“100.00%”且源目标记录数一致。
  • 子任务状态仍为“迁移中”。
  • 实际上部分对象未成功标记为“完成”。

:warning: 可能原因分析(基于上下文)

  1. DataKit 内部状态机未正确更新

    • DataKit 在任务执行过程中依赖异步状态上报机制。即使数据已传输完成,若元数据更新失败或网络延迟,可能导致界面状态卡顿。
    • 已知 DataKit 存在“任务执行成功但状态不更新”的历史问题(类似 Task 202512301705 的预检失败未被及时反馈)。
  2. 后台任务未触发完成信号

    • 尽管数据行已完成复制,但可能某些辅助任务(如索引创建、约束同步、统计信息更新)仍在运行或阻塞,导致整体状态未置为“成功”。
  3. opengauss 端响应延迟或锁等待

    • openGauss 在高并发写入后可能出现事务未及时提交或锁未释放,影响 DataKit 判断任务结束。

:white_check_mark: 解决方案建议

1. 强制刷新并检查日志

  • 手动点击页面上的 “刷新”按钮(文档中有提示:“当前显示数据仅在首次加载时自动获取,若需更新数据请点击刷新按钮。”)
  • 检查 DataKit 的 后端日志文件(通常位于安装目录 logs/ 下),搜索关键词:
    [INFO] Sub-task completed for table: sp_base_xsxxxb
    [DEBUG] Sending status update to UI
    
  • 若发现已完成的消息未上报,则可能是前端缓存或 WebSocket 断连。

2. 直接查询 openGauss 验证数据完整性

-- 查询目标表行数
SELECT COUNT(*) FROM public.sp_base_xsxxxb;

若与源库一致,并且索引、约束均存在,则可判定 实际迁移已完成,仅为 界面状态异常

3. 重启 DataKit 或清理缓存

  • 如多个子任务持续卡住,尝试重启 DataKit 服务。
  • 清除浏览器缓存或更换浏览器访问控制台。

4. 人工干预(最终手段)

  • 若确认所有数据已落库,可联系技术支持通过数据库直接修改 DataKit 的任务状态表(如 t_task_status),将对应子任务设为 SUCCESS

:wrench: 问题二:视图创建失败 —— “Unterminated identifier” 错误

:pushpin: 错误详情

ERROR: Unterminated identifier started at position 29 in SQL CREATE VIEW "v_zqszjypg" AS "SELECT ...

:warning: 根本原因分析

  • DataKit 在迁移视图时错误地对 SELECT 语句内容加了双引号 "...",将其当作标识符处理,而非 SQL 主体。
  • 原始语句:
    CREATE VIEW v_zqszjypg AS
    SELECT sp.id AS xkid, sp.code AS xxbsm, ...
    FROM szcj_scorever ...
    
  • 被错误转换为:
    CREATE VIEW "v_zxxszjypg" AS "SELECT ... FROM ..."
    
    "SELECT ..." 被解析为一个未闭合的标识符(identifier),缺少结尾的引号,因此报错。

这是一种典型的 DataKit 解析器 bug转义逻辑缺陷,尤其在处理复杂视图定义时易出现。


:white_check_mark: 解决方案

1. 升级或更换 DataKit 版本

  • 您当前使用的是 portalControl-7.0.0rc3-exec.jar,属于 RC(Release Candidate)版本,可能存在已知缺陷。
  • 建议升级到 GA 稳定版,或尝试使用官方推荐的其他工具组合。

2. 手动导出导入视图定义(推荐临时方案)

参考知识库中“导出表 DDL 和数据”的操作方式,但适用于视图。

步骤如下:
  1. 在 PostgreSQL 13 导出视图 DDL:

    pg_dump -h host -U user -d jydddbclone \
      --no-owner --no-privileges \
      -t 'v_*' --view-only > views.sql
    
  2. 手动修正 DDL:

    • 移除额外引号,确保语法为:
      CREATE OR REPLACE VIEW public.v_zqszjypg AS
      SELECT ...
      
  3. 在 openGauss 6.0.3 中执行:

    gsql -h target_host -U user -d jydddb -f views.sql
    

3. 反馈至社区或厂商

  • 将此错误日志提交至 openGauss 官方 GitCode 或 DataKit 支持渠道,标记为“视图 DDL 引号注入 BUG”。

:collision: 问题三:存储过程迁移失败 —— “syntax error at or near LANGUAGE”

:pushpin: 错误详情

ERROR: syntax error at or near "LANGUAGE" Position: 46

:memo: 源存储过程定义

CREATE OR REPLACE PROCEDURE public.aaabbb()
LANGUAGE plpgsql
AS $procedure$
BEGIN
  ...
END;
$procedure$

:warning: 原因分析(关键!openGauss 兼容性差异)

虽然 openGauss 兼容 PostgreSQL 协议(支持 PostgreSQL 15+),但它 并非完全等同于 PostgreSQL,尤其在语法细节上有差异。

:cross_mark: openGauss 不支持 LANGUAGE plpgsql 写法用于存储过程!

:white_check_mark: openGauss 存储过程正确语法(PL/pgSQL)

CREATE OR REPLACE PROCEDURE public.aaabbb()
AS $procedure$
DECLARE
BEGIN
  -- 逻辑代码
END;
$procedure$;
  • 不需要也不能指定 LANGUAGE plpgsql
  • openGauss 自动识别 $...$ 块内的 PL/pgSQL 语法。

:light_bulb: 补充说明:openGauss 支持的是其自研的 PL/pgSQL 扩展方言,虽然源自 PostgreSQL,但 LANGUAGE 子句在存储过程中被禁用。

:books: 参考文档:《openGauss 存储过程》


:white_check_mark: 解决方案

1. 修改 DataKit 导出脚本(预处理)

  • 使用脚本预处理工具(如 Python、awk、sed)批量替换迁移前的 DDL:
    sed -i '/LANGUAGE plpgsql/i \\' views_procs.sql
    sed -i '/LANGUAGE plpgsql/d' views_procs.sql
    
    或更安全地使用正则替换:
    perl -pi -e 's/\s+LANGUAGE\s+plpgsql(\s+AS|$)/\\nAS/i' procs.sql
    

2. 使用 gs_dump + 自定义过滤规则

  • 使用 gs_dump 工具从 PostgreSQL 导出(注意:非 pg_dump):
    gs_dump -h pg_host -U user -d db_name \
      --include-procedure='*' \
      --format=p > procs.sql
    
  • 再用脚本清除所有 LANGUAGE plpgsql 行。

3. 手动创建 + 校验逻辑一致性

  • 对于关键业务过程,建议在迁移后 手动重建,并进行逻辑对比测试。

:hammer_and_wrench: 综合建议:如何保障完整迁移?

项目 推荐做法
:white_check_mark: 工具选择 避免仅依赖 DataKit 单一工具;可结合 gs_dump / gsql 脚本迁移核心对象
:white_check_mark: 版本稳定性 使用 GA 正式版 DataKit,避免 RC 版本的隐蔽缺陷
:white_check_mark: 对象分类迁移
- 表/数据:DataKit 全量迁移
- 视图/函数/存储过程:导出 DDL 后人工清洗再导入
:white_check_mark: DDL 清洗工具 编写自动化脚本处理兼容性问题:
- 删除 LANGUAGE plpgsql
- 修复视图引号包裹问题
- 处理序列、自增字段等
:white_check_mark: 验证机制 执行后进行:
- 行数核对
- DDL 结构比对
- 存储过程逻辑调用测试

:books: 参考资源


:white_check_mark: 总结:三大问题应对策略一览

问题 原因 解决方法
1. 表卡在“迁移中” DataKit 状态同步异常 刷新、查日志、验证数据、必要时重启或人工修正状态
2. 视图创建失败 DataKit 错误添加引号导致语法错误 升级工具或手动导出 DDL 并去除引号后导入
3. 存储过程报 LANGUAGE 错误 openGauss 不支持 LANGUAGE plpgsql 语法 预处理 DDL 删除该行,或手动重建

:bell: 重要提醒:openGauss 虽然源于 PostgreSQL,但在 DDL 语法、系统视图、权限模型等方面存在差异,全量迁移需进行充分的兼容性评估与人工干预。

建议后续迁移前先使用 openGauss 兼容性评估工具 对源库进行扫描分析,识别潜在风险点,提升迁移成功率。

这些应该是迁移工具本身的缺陷,可以提供最小化用例复现一下。

也可以直接在社区提单,开发会解决,提单时请详细描述表结构,存储过程语句等,便于开发分析