大数跨境

OMS 4.3.2 迁移坑:OBOracle 同名 PK/UK 引发全量迁移错误

OMS 4.3.2 迁移坑:OBOracle 同名 PK/UK 引发全量迁移错误 瑞蓝创软件
2026-09-11
2
导读:OBOracle 同名 PK/UK 引发 OMS 迁移故障
图片

作者简介陈世岚瑞蓝创数据库工程师















原创内容未经授权不得随意使用,转载请联系小编并注明来源


问题现象

触发场景:OMS 4.3.2 全量迁移,源端和目标端均为 OBOracle 租户,对同一张表进行迁移时,切片索引选择在不同链路配置下表现不一致。

具体表现

  • 单链路配置四个表时,表 SCH1.TBL_01 的切片索引选择 __pk_increment(无主键增量列),因表实际无该字段导致迁移报错卡住

  • 单链路配置单个表(同一张表)时,切片索引正常选择主键 PK_TBL_01,迁移可正常进行

  • 本质是 OMS meta-query 在识别表约束时,无法正确区分同名的 PK(主键)和 UK(唯一约束)

影响范围:所有在 OBOracle 源端同时存在同名 PK 和 UK 约束的表,在全量迁移时可能出现切片索引选择异常,导致迁移任务卡住。

发生频率:必现(只要同一张表存在同名 PK 和 UK 约束,且该表在单链路多表场景下被元数据查询判定为"无主键表"时触发)

问题原因

根因分析

OBOracle 允许对同一张表创建同名的 PK 约束和 UK 约束,导致系统视图 ALL_CONSTRAINT 和 ALL_CONS_COLUMNS 中 CONSTRAINT_NAME 相同,外部查询无法通过名称区分主键和唯一约束。OMS meta-query 返回结果时,P(主键)和 U(唯一约束)哪个在结果集中靠后,哪个就被当作最终结果。

技术原理

  1. OMS 全量迁移时,需要通过 meta-query 查询源端表的约束信息,确定切片索引(用于并行分片读取数据)。
  2. 当查询到表有主键(PK)约束时,OMS 优先使用主键作为切片索引。
  3. 当查询到表"无主键"时,OMS 回退使用 __pk_increment(增量列)作为切片索引。
  4. 由于 PK 和 UK 同名,meta-query 返回结果集的顺序不确定(取决于字典序或查询返回顺序):
    • 如果 UK 记录排在 PK 记录之后 → meta-query 认为该表无主键 → 使用 __pk_increment → 报错
    • 如果 PK 记录排在 UK 记录之后 → meta-query 正确识别主键 → 正常迁移
  5. 查询结果顺序可能受链路中表数量、查询并发等因素影响,导致同一张表在不同链路配置下表现不一致。

对比 Oracle 行为

场景
Oracle 原生行为
OBOracle 行为
相同列上创建同名 PK + UK
PK 约束覆盖 UK 索引(不产生重复)
已验证通过创建唯一键后修改唯一键为主键,可以实现同名唯一键和主键
不同列上创建同名 PK + UK
禁止创建
禁止创建
-- STEP 1: 创建无主键表
CREATE TABLE test_tab (
    col1 NUMBER(10),
    col2 VARCHAR2(100),
    col3 DATE DEFAULT SYSDATE
);

-- STEP 1: 创建无主键表
CREATE UNIQUE INDEX idx_test_tab_uq_pk ON test_tab(col1);

-- STEP 2: 将 col1/col2 修改为主键
ALTER TABLE test_tab ADD CONSTRAINT idx_test_tab_uq_pk PRIMARY KEY (col1/col2);

-- STEP 3: 查看表的完整 DDL
SELECT DBMS_METADATA.GET_DDL('TABLE', 'TEST_TAB') AS ddl FROM DUAL;

相同列上创建同名 PK + UK

不同列上创建同名 PK + UK

关键信息

诊断方法

查看 OMS 全量迁移组件的切片索引选择

在 OMS 控制台 → 迁移链路 → 全量迁移组件详情中,查看表的切片索引选择结果:

  • 正常情况:切片索引 = 主键名称
  • 异常情况:切片索引 = __pk_increment

问题的风险及影响

业务影响程度:高。全量迁移卡住导致整个迁移链路无法推进,阻塞数据迁移项目进度。

系统风险评估:中。仅影响存在同名 PK/UK 约束的特定表,其他表的迁移不受影响。

数据丢失风险:无。问题发生在全量迁移阶段,源端数据完整。

适用版本

受影响版本:OMS 4.3.2(OBOracle → OBOracle 全量迁移场景)

解决方法

目前提供:删除源端同名 UK 约束

在源端 OBOracle 租户中,删除与 PK 同名的 UK 约束,仅保留 PK 约束:

-- 删除同名的唯一约束
ALTER TABLE SCH1.TBL_01 DROP CONSTRAINT ;

注意:操作前需确认该 UK 约束的业务必要性,确保删除后不影响源端业务逻辑。 >

根本解决

待 OBOracle 内核修复同名 PK/UK 约束在系统视图中的返回结果,确保 meta-query 能正确区分主键和唯一约束。

规避方式

在 OBOracle 租户中避免创建与主键同名的唯一约束。若业务需要唯一性保证,可直接依赖主键(主键本身就具备唯一性)。

若需要唯一约束,建议使用与主键不同的约束名称(如 PK_xxx 和 UK_xxx),避免同名。


如果在操作过程中遇到问题,欢迎在评论区留言交流,后续我们会持续分享更多实战运维干货,记得关注不迷路,下次见~

END


瑞蓝创 OceanBase OBCP V4 精英训练营

点击下方图片立即了解详情

瑞蓝创02.png


··
·

·

▼ 点击「阅读原文」,了解更多产品技术文章

【声明】内容源于网络
0
0
瑞蓝创软件
专注于企业信息科技战略咨询、数据中心规划及运维、智能化软件产品研发,致力于为金融、能源、电信、制造等行业提供智能的业务永续及流程自动化解决方案。
内容 74
粉丝 0
瑞蓝创软件 专注于企业信息科技战略咨询、数据中心规划及运维、智能化软件产品研发,致力于为金融、能源、电信、制造等行业提供智能的业务永续及流程自动化解决方案。
总阅读903
粉丝0
内容74