PGSQL迁移 OB,主键为UUID类型,迁移报错

【 使用环境 】生产环境 or 测试环境
【 OB or 其他组件 】OMS4.2.11_CE OB 4.5.0.0
【 使用版本 】
【问题描述】POSTGRES迁移到OB时,主键是UUID是报错
【复现路径】正常通过OMS配置,做全量数据迁移,如果表主键不是UUID已正常迁移,如果表中有字段为UUID,不是主键,也可以正常迁移,但是主键是UUID时,迁移会报错,长时间卡信
【附件及日志】879
[2026-01-15 10:19:56.488] [WARN] [slice-worker-3] [retryTask task run error : ]
880
java.lang.Exception: dify.public.apps PK error from id:30303436326131332D336339632D346432332D613966312D653561613535633365623737
881
at com.oceanbase.oms.dataflow.slice.AbstractSliceService.sliceException(AbstractSliceService.java:133)
882
at com.oceanbase.oms.dataflow.slice.PkSliceService.lambda$slice$2(PkSliceService.java:233)
883
at com.oceanbase.oms.connector.common.util.RetryUtil.retryTask(RetryUtil.java:33)
884
at com.oceanbase.oms.dataflow.slice.PkSliceService.slice(PkSliceService.java:226)
885
at com.oceanbase.oms.dataflow.slice.LocalSliceProvider.provider(LocalSliceProvider.java:58)
886
at com.oceanbase.oms.connector.source.dataflow.DataFlowSliceTask.doSlice(DataFlowSliceTask.java:66)
887
at com.oceanbase.oms.connector.source.dataflow.SliceTaskManager$InnerSliceTask.run(SliceTaskManager.java:759)
888
at java.lang.Thread.run(Thread.java:853)
889
Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: uuid > bytea
890
Hint: No operator matches the given name and argument types. You might need to add explicit type casts.
891
Position: 62
892
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2713)
893
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2401)
894
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:368)
895
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:498)
896
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:415)
897
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:190)
898
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:134)
899
at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:227)
900
at com.oceanbase.oms.dataflow.jdbcclient.AbstractJDBCClient.nextSlicePkTop(AbstractJDBCClient.java:1448)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

1 个赞

这个问题看起来并不是直接与 obdiag 工具相关的,而是与 PostgreSQL 到 OceanBase 迁移过程中的兼容性问题有关。当主键类型为 UUID 时,可能会出现类型转换或操作符不匹配的问题,因为不同数据库系统对相同数据类型的处理可能有所不同。

解决方案

  1. 检查数据类型映射:确保在从 PostgreSQL 迁移到 OceanBase 时,UUID 类型被正确地映射。OceanBase 支持 UUID 类型,但需要确保在迁移过程中没有类型转换错误。
  2. 修改 SQL 语句:如果是在迁移过程中生成的 SQL 语句中出现了类型不匹配,可以手动调整这些 SQL 语句,确保它们在 OceanBase 中能够正确执行。
  3. 使用中间件或工具:如果使用了迁移工具,检查该工具是否支持从 PostgreSQL 到 OceanBase 的 UUID 类型转换。如果不支持,可能需要自定义转换逻辑。

向用户提几个问题以获取更多信息

  1. 您能否提供具体的错误日志或 SQL 语句,以便我们更详细地了解问题的具体情况?
  2. 您使用的迁移工具是什么?是否有特定的配置文件或选项?
  3. 在 PostgreSQL 中,UUID 主键是如何定义的?例如,它是使用 uuid 类型还是 bytea 类型?
  4. 您是否尝试过手动创建表并插入数据,以验证 UUID 类型在 OceanBase 中的兼容性?

如果您需要进一步的帮助或有其他问题,请随时告诉我。

附上敏捷诊断工具 obdiag 使用帮助链接

主键不兼容吗

迁移的时候直接报错

学到了

找不到好的解决方案,只能先在源库PGSQL中手动删除主键,待数据迁移 完成成,再在目标端手动增加主键,虽然方法有点笨,但是也算先解决问题,希望官方有更好的处理办法。

uuid类型目前还不支持 后期会迭代支持的