联系我们
18591797788
hubin@rlctech.com
北京市海淀区中关村南大街乙12号院天作国际B座1708室
18681942657
lvyuan@rlctech.com
上海市浦东新区商城路660号乐凯大厦26c-1
18049488781
xieyi@rlctech.com
广州市越秀区东风东路华宫大厦808号1608房
029-81109312
service@rlctech.com
西安市高新区天谷七路996号西安国家数字出版基地C座501
触发场景: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(唯一约束)哪个在结果集中靠后,哪个就被当作最终结果。
技术原理:
__pk_increment(增量列)作为切片索引。__pk_increment → 报错对比 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 全量迁移场景)
在源端 OBOracle 租户中,删除与 PK 同名的 UK 约束,仅保留 PK 约束:
-- 删除同名的唯一约束
ALTER TABLE SCH1.TBL_01 DROP CONSTRAINT ;
注意:操作前需确认该 UK 约束的业务必要性,确保删除后不影响源端业务逻辑。
>
待 OBOracle 内核修复同名 PK/UK 约束在系统视图中的返回结果,确保 meta-query 能正确区分主键和唯一约束。
在 OBOracle 租户中避免创建与主键同名的唯一约束。若业务需要唯一性保证,可直接依赖主键(主键本身就具备唯一性)。
若需要唯一约束,建议使用与主键不同的约束名称(如 PK_xxx 和 UK_xxx),避免同名。