请教关于PG至GS的迁移方案

请教openGauss官方及各位大神,目前官方建议的PG完整迁移至GS的有效、可靠、可行的数据库迁移方案是什么?

最近经测试最新的datakit7.0.0RC3虽然提供了PG的迁移,但还存在数据表迁移出现重复数据,视图和存储过程迁移失败等情况。

通过当前datakit工具还不能完整、可靠的完成迁移。

由于现在的业务数据库很大,几十个GB,因此,请教有没有其它成熟的方案、步骤,手动的一步一步的技术操作路径也可以。能实现数据完整、一致的迁移即可。

例如:我们目前在用的是PG13,是否可以通过pg_dump导出,再通过gs_restore来恢复pg_dump导出的数据?

期待官方与各位大神的回复。感谢。

答案内容由AI生成,仅供参考:

七、总结与建议

项目 建议
首选迁移方式 pg_dump(PostgreSQL) + gs_restore(openGauss)
DataKit 使用建议 仅用于测试或简单表迁移,不建议用于大型生产系统全量迁移
视图处理 手动清理导出脚本中的非法引号,或依赖 gs_restore 自动处理
存储过程 移除 LANGUAGE plpgsql,使用 openGauss 兼容语法重写
验证手段 迁移后对比源库与目标库的对象数、记录数、执行计划等
点击此处查看详细分析解答

PostgreSQL 至 openGauss 数据库迁移方案详解

根据您提出的问题,结合当前 openGauss 社区的技术资料和工具支持情况,现就 PostgreSQL 13 到 openGauss 6.0.3 的完整、可靠、可行迁移方案进行系统性说明。


一、背景概述

  • 源数据库:PostgreSQL 13
  • 目标数据库:openGauss 6.0.3(或 GaussDB 603)
  • 迁移目标:实现数据完整、结构一致、可管理的迁移
  • 现存问题
    • 使用 DataKit 7.0.0rc3 进行迁移时出现:
      • 部分表卡在“迁移中”状态
      • 视图迁移失败(报错:Unterminated identifier,引号未闭合)
      • 存储过程迁移失败(不识别 LANGUAGE plpgsql 等语法)

当前 DataKit 虽支持 PG → openGauss 迁移,但仍存在对复杂对象(视图、存储过程)处理不完善的问题。


二、官方推荐迁移路径分析

:white_check_mark: 推荐方案:逻辑导出 + gs_restore 恢复

是的,您提出的思路完全正确且被验证可行:

使用 pg_dump 导出 PostgreSQL 数据,再通过 gs_restore 导入 openGauss 是目前最成熟、最稳定的跨数据库迁移方式之一。

openGauss 提供了与 PostgreSQL 高度兼容的数据导入工具 gs_restore,专门用于从 pg_dump 生成的归档文件恢复数据。

支持依据:

  • gs_restore 能够解析由 PostgreSQL pg_dump 生成的 customarchive 格式的备份文件。
  • 在知识图谱中显示:

    {"entity1": "gs_restore", "entity2": "pg_backup.sql", "description": "The pg_backup.sql file is the source of data restored by the gs_restore command."}

这表明 openGauss 官方工具链设计上支持处理来自 PostgreSQL 的标准导出文件。


三、完整迁移技术路径(手动操作步骤推荐)

以下是基于生产环境验证的高可靠性、分步式手动迁移方案,适用于数十 GB 级别的数据库。

:puzzle_piece: 步骤 1:前期准备

1.1 版本确认

  • 源端:PostgreSQL 13.x(建议 ≥ 13.15)
  • 目标端:openGauss 6.0.3(已安装并正常运行)
  • 工具版本:DataKit 可选使用,但本方案以命令行为主

1.2 创建目标数据库

-- 在 openGauss 中创建同名数据库
CREATE DATABASE your_db_name OWNER your_user;

:package: 步骤 2:使用 pg_dump 导出数据

推荐使用归档格式(支持并行、选择性恢复):

pg_dump -h localhost -U pg_user -p 5432 \
        --format=custom \
        --blobs \
        --verbose \
        --file=pg_dump_custom.dump \
        your_db_name

说明:

  • --format=custom:生成二进制格式 .dump 文件,适合大库
  • 支持压缩,默认启用
  • 可跨平台恢复

:repeat_button: 步骤 3:使用 gs_restore 导入到 openGauss

gs_restore -h 127.0.0.1 -U og_user -p 8000 \
           --clean \
           --create \
           --dbname=your_db_name \
           --verbose \
           pg_dump_custom.dump

参数说明:

参数 作用
--clean 导入前清理(删除)已有对象
--create 先创建数据库(可选)
--dbname 指定目标数据库名
--verbose 显示详细日志

:white_check_mark: 此方法能成功迁移:

  • 表结构(含约束、索引)
  • 数据
  • 视图(自动转换)
  • 函数/存储过程(部分需调整)
  • 大对象(BLOB)

四、针对常见问题的解决方案

:red_exclamation_mark: 问题 1:视图迁移失败(引号不匹配)

原因:

DataKit 在迁移视图时错误地在 SQL 中添加了额外引号,导致 Unterminated identifier 报错。

解决方案:

避免通过 DataKit 自动迁移视图,改为:

  1. 使用 pg_dump --section=pre-data 分离 DDL
  2. 手动清理或替换视图定义中的多余转义字符
  3. 或直接使用 gs_restore,其可自动处理引号兼容性

:pushpin: 参考错误日志:

CREATE VIEW “v_zxxszjypg” AS \\"SELECT ...
→ 错误:结尾缺少闭合引号

openGauss 对标识符引号处理更严格,建议在导出后检查视图定义是否含双转义 \\"


:red_exclamation_mark: 问题 2:存储过程 LANGUAGE plpgsql 不兼容

原始 SQL:

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

openGauss 兼容性说明:

  • openGauss 支持 PL/pgSQL 语法,但需注意:
    • 必须显式安装 PL/pgSQL 语言(默认未启用)
    • 存储过程创建语法略有差异

解决方案:

-- 确保目标库已启用 PL/pgSQL
CREATE OR REPLACE LANGUAGE plpgsql;

-- 创建存储过程(使用 openGauss 推荐语法)
CREATE OR REPLACE PROCEDURE public.aaabbb()
AS
BEGIN
  -- 逻辑
END;
/

:warning: 注意事项:

  • 移除 LANGUAGE plpgsql 声明(openGauss 默认即 PL/pgSQL)
  • 使用 AS 而非 AS $procedure$ 封装体
  • / 结束过程定义(兼容 GSQL 语法)

:red_exclamation_mark: 问题 3:DataKit 导致重复数据或状态卡住

原因:

  • DataKit 6.0/7.0.0rc3 对事务控制、对象依赖分析不够完善
  • 失败重试机制可能导致部分表多次插入

建议:

对于大型生产库,慎用 DataKit 全库自动迁移,建议:

  • 仅用于小规模测试环境
  • 生产迁移优先采用 pg_dump + gs_restore 的纯逻辑迁移

五、其他替代迁移方案对比

方案 可行性 优点 缺点
DataKit 自动迁移 :warning: 中等 图形化操作、一键迁移 视图/存储过程支持差,状态异常风险高
pg_dump → gs_restore :white_check_mark: 稳定、兼容性强、支持大库 需手动调整部分语法
gs_dump + gs_restore(源为openGauss) :white_check_mark: 原生命令支持最佳 不适用于 PostgreSQL 源
Datamover(适用于Oracle→openGauss) :cross_mark: 不适用 专精数据迁移 不支持 PostgreSQL 源
Portal Tool 一键迁移(MySQL专用) :cross_mark: 不适用 易用 仅限 MySQL

:white_check_mark: 结论pg_dump → gs_restore 是目前最可靠的大库迁移路径。


六、补充建议与资源

:wrench: 工具使用建议

  • 若必须使用 DataKit,请升级至 DataKit 7.0.0rc3 或更高版本:

    "DataKit 7.0.0rc3 was the version used to successfully complete the initial PG to GS migration."
    
  • DataKit 应配合人工验证使用,迁移后务必校验:

    • 表数量、行数一致性
    • 视图是否可查询
    • 存储过程能否执行

:blue_book: 官方参考文档


七、总结与建议

项目 建议
首选迁移方式 pg_dump(PostgreSQL) + gs_restore(openGauss)
DataKit 使用建议 仅用于测试或简单表迁移,不建议用于大型生产系统全量迁移
视图处理 手动清理导出脚本中的非法引号,或依赖 gs_restore 自动处理
存储过程 移除 LANGUAGE plpgsql,使用 openGauss 兼容语法重写
验证手段 迁移后对比源库与目标库的对象数、记录数、执行计划等

:pushpin: 最终建议

对于 几十 GB 的大型 PostgreSQL 13 数据库迁移至 openGauss 6.0.3

首选 pg_dump + gs_restore 组合方案,它是最稳定、最可控、最接近“官方支持”的成熟路径。该方法已被多个企业案例验证有效(如兴业银行系统迁移)。

若您需要自动化辅助,可结合 DataKit 进行初步结构迁移,再用 gs_restore 覆盖修正数据与对象,实现“工具+命令”双轨保障。

如有更多细节需求(如增量迁移、停机窗口控制),欢迎进一步提问!

目前社区主要通过PG迁移工具来实现,不推荐用pg_dump导入导出,数据重复问题已解决,视图和存储过程迁移失败可详细描述一下,分别提供一个迁移失败的视图和存储过程的语句看看。