×
技术社区 >  技术博客 >  OMS 4.3.2 迁移坑:OBOracle 同名 PK/UK 引发全量迁移错误

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

问题现象

触发场景: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),避免同名。

精选推荐