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_TIMESTAMP 或 SYSTIMESTAMP。


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_TIMESTAMP 或 LOCALTIMESTAMP 代替。
    • 如果必须存 UTC,可以在应用层转换。

9. 注释

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

⚠️ 注意事项

  1. 索引

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

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

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

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

✅ 总结:迁移时必改的点

  1. 去掉 CREATE EXTENSION "uuid-ossp"
  2. uuid_generate_v4() → gen_random_uuid()
  3. jsonb → json
  4. timestamp without time zone → timestamp
  5. DEFAULT CURRENT_TIMESTAMP(0) → DEFAULT CURRENT_TIMESTAMP
  6. nextval('xxx'::regclass) → nextval('xxx') 或 IDENTITY
  7. 类型转换 :: → CAST()
  8. 去掉 AT TIME ZONE 表达式
相关推荐
2401_891409262 小时前
量化数据13:港股分钟K线、Level2逐笔Tick、十档盘口和港股通历史数据的批量提取
数据库
w-w0w-w8 小时前
SQL注入
网络·数据库·sql
tianyuanwo8 小时前
NetBox 数据库详解:当“关系型数据库”被装进一个网络运维的领域模型里
运维·数据库·netbox
一条泥憨鱼8 小时前
【计算机网络】短连接、长连接与连接池:从 TCP 握手到池化复用的完整链路
网络·数据库·网络协议·tcp/ip·计算机网络
IvorySQL9 小时前
深入 PostgreSQL WAL:从崩溃恢复到逻辑复制
数据库·postgresql
幽灵诶10 小时前
Mysql(基于测试的学习)
数据库·mysql
砚底藏山河10 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
宇宙无敌暴龙战士66611 小时前
MySQL 8 库表操作学习笔记:SQL 基础、库表管理、约束与用户授权全流程
数据库·sql·mysql·学习笔记·后端开发
猿究院_夏燊11 小时前
MySQL 的四种隔离级别
java·数据库·mysql
say_fall11 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++