postgress数据迁移gaussdb注意事项

我们目标是 把 PostgreSQL 的 SQL dump 适配到 openGauss。openGauss 是基于 PostgreSQL 9.2 分支演化的,但它并不是 100% 兼容,需要特别注意。结合你提供的 dump 文件和 openGauss 的兼容性,我总结如下:


🔑 需要修改的部分

1. 扩展(Extension)

  • PostgreSQL 里:

    sql 复制代码
    CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
  • openGauss 不支持 extension,uuid-ossp 也不可用。

  • 解决办法 :用 openGauss 内置的 gen_random_uuid()sys_guid() 替代。

    scss 复制代码
    id uuid DEFAULT gen_random_uuid() NOT NULL

2. UUID

  • PostgreSQL:uuid DEFAULT uuid_generate_v4()

  • openGauss:支持 uuid 类型,但没有 uuid_generate_v4()

  • 修改

    scss 复制代码
    DEFAULT uuid_generate_v4()  →  DEFAULT gen_random_uuid()

3. JSON 与 JSONB

  • PostgreSQL 支持 json / jsonb

  • openGauss 只支持 json ,不支持 jsonb

  • 修改

    复制代码
    jsonb → json

4. 时间类型

  • PostgreSQL:

    sql 复制代码
    timestamp without time zone
  • openGauss:只支持 timestamp,语法中没有 without time zone 这一套。

  • 修改

    sql 复制代码
    timestamp without time zone → timestamp
    timestamp(6) without time zone → timestamp(6)
  • 同时,CURRENT_TIMESTAMP(0) 在 openGauss 里直接用 CURRENT_TIMESTAMPSYSTIMESTAMP


5. 序列与自增

  • PostgreSQL:

    bash 复制代码
    id integer DEFAULT nextval('public.task_id_sequence'::regclass)
  • openGauss:支持 CREATE SEQUENCE,但推荐用 IDENTITY 列。

  • 修改

    vbnet 复制代码
    id integer GENERATED BY DEFAULT AS IDENTITY

    或保持 create sequence + nextval('xxx'),但要去掉 ::regclass


6. 二进制类型

  • PostgreSQL:bytea
  • openGauss:支持 bytea,但在某些版本里更推荐 blob
  • 修改建议 :保留 bytea(兼容),如果报错则替换成 blob

7. 类型强制转换

  • PostgreSQL 常见:

    php 复制代码
    'active'::character varying
    '{}'::text
  • openGauss 不支持 :: 这种写法,要改成 CAST(...).

  • 修改

    sql 复制代码
    'active'::character varying  →  CAST('active' AS varchar)
    '{}'::text                  →  CAST('{}' AS text)

8. 系统函数

  • PostgreSQL dump 中有:

    arduino 复制代码
    (now() AT TIME ZONE 'UTC'::text)
  • openGauss 不支持 AT TIME ZONE

  • 修改

    • CURRENT_TIMESTAMPLOCALTIMESTAMP 代替。
    • 如果必须存 UTC,可以在应用层转换。

9. 注释

  • COMMENT ON EXTENSIONCOMMENT ON COLUMN 保持兼容,一般不用修改。

⚠️ 注意事项

  1. 索引

    • 如果 dump 文件里有 USING ginUSING gist 之类的索引,openGauss 不完全支持,需要调整。
    • JSONB 的 GIN 索引不可用。
  2. 函数与触发器

    • PostgreSQL 自定义函数(如 plpgsql)可能需要改为 openGauss 兼容语法。
  3. 大小写

    • openGauss 默认把未加引号的表名/列名转小写,迁移时要注意是否需要加 "" 保留大小写。
  4. 性能参数

    • PostgreSQL 的 WITH (OIDS=FALSE)TABLESPACEFILLFACTOR 在 openGauss 里大多无效,需删除。

✅ 总结:迁移时必改的点

  1. 去掉 CREATE EXTENSION "uuid-ossp"
  2. uuid_generate_v4()gen_random_uuid()
  3. jsonbjson
  4. timestamp without time zonetimestamp
  5. DEFAULT CURRENT_TIMESTAMP(0)DEFAULT CURRENT_TIMESTAMP
  6. nextval('xxx'::regclass)nextval('xxx')IDENTITY
  7. 类型转换 ::CAST()
  8. 去掉 AT TIME ZONE 表达式
相关推荐
Java爱好狂.7 小时前
分布式ID|从源码角度深度解析美团Leaf双Buffer优化方案
java·数据库·分布式·分布式id·es·java面试·java程序员
Elastic 中国社区官方博客7 小时前
通过混合搜索重排序提升多语言嵌入模型的相关性
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
倔强的石头1068 小时前
KingbaseES:从兼容到超越,详解超越MySQL的权限隔离与安全增强
数据库·mysql·安全·金仓数据库
小鸡毛程序员8 小时前
我在CSDN学MYSQL之----数据库基本概念和基本知识(下)
数据库·mysql
程序定小飞9 小时前
基于springboot的web的音乐网站开发与设计
java·前端·数据库·vue.js·spring boot·后端·spring
小灰灰搞电子9 小时前
Rust 操作Sqlite数据库详细教程
数据库·rust·sqlite
IvorySQL9 小时前
你真的知道你正在运行哪个 PostgreSQL吗?
数据库·postgresql
l1t9 小时前
利用DeepSeek采用hugeint转字符串函数完善luadbi-duckdb的decimal处理
数据库·lua·c·duckdb·deepseek
无敌最俊朗@10 小时前
Qt 开发终极坑点手册图表版本
数据库
老衲提灯找美女10 小时前
MySQL数据库基础操作:
数据库·mysql·oracle